русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Створення процесу


Дата додавання: 2014-11-28; переглядів: 929.


 

Процес породжується за допомогою системного виклику fork(). При цьому виклику відбувається перевірка на наявність вільної пам'яті, доступної для розміщення нового процесу. Якщо необхідна пам'ять доступна, то створюється процес-нащадок поточного процесу, що представляє собою точну копію процесу, що викликається При цьому в таблиці процесів для нового процесу будується відповідна структура. Нова структура створюється також у таблиці користувача. При цьому всі змінні ініціалізуються нулями. Цьому процесу присвоюється новий унікальний ідентифікатор, а ідентифікатор батьківського процесу запам'ятовується в блоці керування процесом.

Процеси, що виконують різні програми, утворюються завдяки застосуванню наявних у стандартній бібліотеці Linux функцій “сімейства ехес”: ехесl, ехесlр, ехесlе, ехесv, ехесvе, ехесvр. Ці функції відрізняються форматом виклику, але в остаточному підсумку виконують одну задачу: заміщають всередині поточного процесу код, що виконується, на код, що міститься в зазначеному файлі. Цей файл може бути не тільки двійковим файлом Linux, що виконується (аналог файла *.exe в системі Windows), але і сценарієм командного інтерпретатора, і двійковим файлом іншого формату (наприклад, класом java, що виконується файлом DOS).

Таким чином, якщо операція запуску програми у DOS і Windows виконується як єдине ціле, то у Linux (і в Unix взагалі) розділена на два етапи: спочатку здійснюється запуск, а потім визначається, яка програма буде працювати. Чи є в цьому сенс і чи не занадто великі додаткові витрати? Адже створення копії процесу передбачає копіювання дуже значного обсягу інформації.

Сенс у даному підході є суттєвий. Дуже часто програма повинна зробити деякі дії ще до того, як почнеться власне її виконання. Наприклад, створити непоіменований канал для спілкування з іншими процесами. Реалізується це дуже просто: спочатку “відмежовуються” процеси, потім виконується системний виклик рiре() для створення каналу - і тільки після цього запускається програма із функції еxес().

Стосовно додаткових витрат, то вони найчастіше виявляються надто малими: при створенні копії процесу його індивідуальні дані фізично нікуди не копіюються. Замість цього використовується техніка, відома за назвою сору-оn-write(копіювання при записі): сторінки даних обох процесів особливим чином позначаються, і тільки тоді, коли один процес намагається змінити вміст будь-якої своєї сторінки, він дублюється. Щоб створити новий активний процес рядовому користувачеві зовсім не обов’язково знати про всі ці системні виклики. Йому достатньо лише ініціювати виконання команди або програми, набравши в командному рядку відповідне ім’я файла, або натиснувши на відповідну піктограму на робочому столі. Приклад запуску годинника:

xclock

Для запуску процесу у фоновому режимі необхідно після імені команди чи імені файла ввести символ & і лише потім натиснути на клавішу <Enter>. Приклад запуску годинника в фоновому режимі:

xclock &

Щоб призупинити активний процес необхідно одночасно натиснути клавіші <Ctrl><Z>. Поки процес зупинено на нього не витрачається час процесора. Але визавжди можете відновити процес, причому як на передньому плані, так і в фоні. Для поновлення процесу в активному режимі використовується команда fg (“foreground” - передній план), а в фоновому режимі – команда bg (“background” - задній план).

Ще одне зауваження. Команди fg і bg звичайно переводять на передній план чи у фоновий режим процеси, що були зупинені останніми (що визначається символом “+” після номера роботи при використанні команди jobs).

Якщо ви виконуєте багато процесів (робіт) одночасно, ви можете перевести на передній план чи, навпаки, у фоновий режим конкретну роботу із заданням її номера як аргумента команд fg або bg:

fg %2 (переведення на передній план роботи номер 2),

bg %3 (переведення у фон роботи номер 3).

Для цих команд не можна використовувати ідентифікатори процесів. Крім того, використання тільки номерів робіт, наприклад

%2

еквівалентно команді

fg %2

Тип процесу (роботи) можна легко визначити за допомогою команди jobs. Наприклад, якщо після виконання цієї команди ми отримали на екрані дисплея інформацію

[1]- Running xclock

[2]- Running xeyes &

[3]+ Stopped xcalc

то це означає, що перший процес (робота) в даний момент є активним, другий процес (робота) – фоновим, а третій процес (робота) – відкладений.

Можна також отримати список процесів (робіт) лише одного типу, вказавши відповідну опцію в команді jobs:

jobs –r - видача лише активних процесів (робіт),

jobs –s - видача лише відкладених процесів (робіт).

Пам’ятайте, що керування роботами, це властивість оболонки операційної системи. Команди fg, bg і jobs - внутрішні команди оболонки bash. Якщо з якоїсь причини ви використовуєте текстову оболонку, що не підтримує керування роботами, там ви не знайдете цих команд. На додаток до цього, є деякі аспекти керування роботами, що розрізняються в оболонках bash і tcsh. Деякі оболонки не здатні керувати роботами, хоча більшість оболонок Linux мають таку можливість.

 


<== попередня лекція | наступна лекція ==>
Активні, фонові та відкладені процеси (роботи) | Завершення процесів


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн