Page 43 - 4868
P. 43

41                                                               Ошибка! Стиль не определен.

                     while (!EOF) {
                       coшукати pattern в line1;
                         if (patternє вline1)вивести line1;
                       // прочитати наступний рядок вводу і записати його вline2;
                     oc;
                     }
                     Тепер ці два процеси працюють з різними рядками, записаними в змінні

               line1  і  line2.Отже,  процеси  можуть  виконуватися  паралельно.Але  чи
               правильна  ця  програма?Звісно,  що  ні,  оскільки  перший  процес  весь  час
               виконує пошук в line1, тоді як другий постійно виконує запис в line2.
                     Рішення  даної  проблеми  є  відносно  простим:  поміняємо  ролі  рядків
               даних в кінці кожного циклу, щоб перший процес завжди перевіряв останній
               зчитаний  з  файлу  рядок,  а  другий  процес  завжди  виконував  запис  в  іншу
               змінну.
                     string line1, line2;
                     прочитати рядок вводу зstdinв line1;
                     while (!EOF) {
                       coшукати patternв line1;
                       if (patternє вline1)вивести line1;
                       // прочитати наступний рядок вводу вline2;
                     oc;
                     line1 = line2;
                     }
                     Наприкінці  кожного  циклу  і  після  завершення  кожного  процесу  вміст
               line2 копіюється в line1.Процеси всередині оператора co тепер незалежні,
               але  їхні  дії  пов’язані  через  останній  оператор  циклу,  який  копіює  line2  в

               line1.
                     Паралельна  програма,  наведена  вище,  вірна,  але  абсолютно
               неефективна.По-перше,  в  останньому  рядку  циклу  вміст  змінної  line2

               копіюється в змінну line1.Така послідовна дія відсутня в першій програмі, і
               в загальному випадку вона вимагає копіювання великої  кількості символів,
               що призводить до накладних часових затрат процесора.По-друге, в тілі циклу
               міститься  оператор  co,  а  це  означає,  що  при  кожному  повторенні  циклу
               while  будуть  створюватися,  виконуватися  і  знищуватися  по  два
               процеси.Копіювання можна зробити набагато  ефективнішим, використавши
               для  цього  масив  з  двома  рядками.Індекси  в  кожному  з  процесів  повинні
               вказувати  на  різні  рядки  масиву,  а  останній  рядок  визначається  шляхом
               простого  обміну  значень  індексів  між  собою.Однак  і  в  цьому  випадку
               створювати  процеси  досить  накладно,  оскільки  створення  і  знищення
               процесу займає набагато більше часу, ніж виклик процедури або виконання
               лінійної ділянки коду.
                     Отже, чи існує ще один шлях розпаралелювання програми, що дозволяє
               не  використовувати  оператор  co  всередині  циклу?Замість  використання
               оператора co всередині циклу while, можна помістити цикли while в кожну
   38   39   40   41   42   43   44   45   46   47   48