Page 32 - 4820
P. 32

ЛАБОРАТОРНА РОБОТА № 6
                            ПРОЦЕСИ В ОС UNIX І КЕРУВАННЯ НИМИ

                   Мета  роботи:  оволодіння  практичними  навичками  роботи  з  процесами  —
            створення і знищення, керування процесами і їхній аналіз

                   6.1 Теоретичні відомості
                   UNIX  –  багатозадачна  система  з  розділенням  часу.  Це  означає,  що  в  системі
            одночасно  виконується  багато  процесів.  Кожний  процес  асоційований  з  певним
            користувачем,  від  імені  якого  цей  процес  діє.  Для  того,  щоби  переглянути  список
            процесів,  існує  команда  ps.  Ця  команда  має  багато  ключів-модифікаторів,  які
            визначають,  яку  саме  інформацію  про  процеси  повинна  виводити  команда.  Слід
            зазначити, що в різних системах UNIX значення цих ключів може суттєво відрізнятись.
            Типові ключі: -a виводить інформацію про всі процеси, а не лише про процеси даного
            користувача, -l та -x виводять розширену інформацію про процес.
                   Кожний  процес  у  системі  має  свій  унікальний  ідентифікатор  –  PID.  За  цим
            ідентифікатором можна звертатись до процесу. Крім того, кожний процес виникає не
            сам  по  собі  –  він  має  так  званий  батьківський  процес,  що  характеризується
            ідентифікатором PPID (parent process ID). Таким чином, утворюється ієрархія процесів,
            що бере початок від початкового процесу init.
                   Створення нового процесу у системі UNIX виконується у два етапи. Спочатку
            системний  виклик  fork()  викликає  “розщеплення”  поточного  процесу  на  два  тотожні
            (різниця  буде  лише  у  тому,  що  процес-“нащадок”  має  інші  PID  і  PPID).  Далі
            виконується  системний  виклик  exec(),  який  “підміняє”  контекст  поточного  процесу
            іншим контекстом. Розглянемо типовий приклад, коли один процес має запустити на
            виконання інший – командна оболонка sh виконує команду ls, для чого утворює новий
            процес, в якому виконується програма /usr/bin/ls. Для цього програміст, який пише код
            sh, повинен передбачити такі кроки:
                   1.      Якщо  під  час  синтаксичного  аналізу  командного  рядка  виявлено,  що
                   необхідно запустити на виконання деяку команду, то виконується виклик fork().
                   2.      Наступна  за  fork()  інструкція  перевіряє  значення,  що  повернув  виклик.
                   Якщо виклик fork() був успішний, то в результаті його виконання утворюється
                   новий процес, тотожній батьківському, і операційна система буде виконувати їх
                   обидва  (в  режимі  розділення  часу).  Для  процесу-“нащадка”  значення,  що
                   повертає  fork(),  дорівнює  0,  для  батьківського  процесу  повертається  значення
                   PID нащадка.
                   3.      Якщо  це  процес-нащадок,  то  виконується  виклик  exec(),  якому  як
                   параметр  передається  ім’я  файлу  програми,  яку  необхідно  запустити  на
                   виконання (в нашому прикладі – /usr/bin/ls). Якщо виклик був успішний, то на
                   цьому виконання коду sh припиняється, і на його місце завантажується код ls.
                   Якщо це батьківський процес, то його дії залежать від того, які параметри були у
                   командному рядку. Зокрема, якщо ls було запущено у пріоритетному режимі5,
                   то  виконання  sh  призупиняється  до  завершення  процесу-нащадка,  якщо  ж  ls
                   було  запущено  у  фоновому  режимі,  то  sh  видає  необхідні  повідомлення  про
                   запуск  фонового  процесу  і  продовжує  свою  роботу,  тобто  знову  приймає  і
                   редагує командний рядок.

            5  Про пріоритетний і фоновий режими див. далі
                                                        30
   27   28   29   30   31   32   33   34   35   36   37