Процеси в Linux, Система, ядро, утиліти, Статті, Бібліотека Лінуксцентру - експерт з Linux і

Сухе формулювання говорить нам щопроцес це - сукупність програмного коду та даних, завантажених на згадку про ЕОМ. На перший погляд процес - це запущена програма (додаток) або команда. Але це зовсім так. Деякі програми можуть створювати кілька процесів одночасно.

Код процесу не обов'язково повинен виконуватися в даний момент часу, оскільки процес може перебувати у стані сплячого. І тут виконання коду такого процесу призупинено. Існує всього 3 стани, в яких може перебувати процес:

Робота процес - в даний момент код процесу виконується.

Сплячий процес - в даний момент код процесу не виконується в очікуванні якоїсь події (натискання клавіші на клавіатурі, надходження даних з мережі тощо)

Процесс-зомби - сам процес не існує, його код і дані вивантажені з оперативної пам'яті, але запис у таблиці процесів залишається з тих чи інших причин.

-а чи -e - показати всі процеси

-f - повний лістинг

-w – показати повні рядки опису процесів. Якщо вони перевищують довжину екрана, то перенести опис на наступний рядок.

Це не всі параметри команди ps. Інші параметри Ви можете дізнатися просто набравши man ps.

Приклад1:

[gserg@WEBMEDIA gserg]$ ps

PID TTY TIME CMD

3126 pts/2 00:00:00 bash

3158 pts/2 00:00:00 ps

Приклад2:

[gserg@WEBMEDIA gserg]$ ps 3126

PID TTY STAT TIME COMMAND

3126 pts/2 S 0:00 /bin/bash

Приклад3:

[gserg@WEBMEDIA gserg]$ ps -ef

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 10:01 ? 00:00:03 init [5]

root 2 1 0 10:01 ? 00:00:00 [keventd]

root 3 1 010:01 ? 00:00:00 [kapmd]

root 4 1 0 10:01 ? 00:00:00 [ksoftirqd_CPU0]

root 5 1 0 10:01 ? 00:00:24 [kswapd]

root 6 1 0 10:01 ? 00:00:00 [bdflush]

gserg 3126 3124 0 17:56 pts/2 00:00:00 /bin/bash

gserg 3160 3126 0 17:59 pts/2 00:00:00 ps -ef

Приклад4:

[gserg@WEBMEDIA gserg]$ ps -efw

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 10:01 ? 00:00:03 init [5]

root 2 1 0 10:01 ? 00:00:00 [keventd]

root 3 1 0 10:01 ? 00:00:00 [kapmd]

root 4 1 0 10:01 ? 00:00:00 [ksoftirqd_CPU0]

root 5 1 0 10:01 ? 00:00:24 [kswapd]

root 1130 1 0 10:02 ? 00:00:00 /usr/sbin/apmd -p 10 -w 5 -W -P /etc/sysconfig/apm-scripts/apmd_proxy

gserg 3172 3126 0 18:01 pts/2 00:00:00 ps -efw

Процеси в ОС Linux мають ті ж права, якими володіє користувач, від імені якого було запущено процес.

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

Для визначення імені користувача, що запустив процес, операційна система використовуєреальні ідентифікатори користувача та групи, що призначаються процесу. Але ці ідентифікатори є вирішальними щодо прав доступу. Для цього кожен процес має іншу групу ідентифікаторів -ефективні.

Як правило, реальні та ефективні ідентифікатори процесів однакові, але є й винятки. Наприклад, для роботи утиліти passwd необхідно використовуватиідентифікатор суперкористувача, тому що тільки суперкористувач має право на запис у файли паролів. І тут ефективні ідентифікатори процесу відрізнятимуться від реальних. Виникає резонне питання – як це було реалізовано?

Кожен файл має набір спеціальних прав доступу - біти SUID і SGID. Ці біти дозволяють при запуску програми присвоїти їй ефективні ідентифікатори власника та групи-власника відповідно та виконувати процес із правами доступу іншого користувача. Так як файл passwd належить користувачеві root і в нього встановлений біт SUID, то при запуску процес passwd матиме права користувача root.

Встановлюються біти SGID та SUID командою chmod:

chmod u+s filename - установка біта SUID

chmod g+s filename - встановлення біта SGID

Ми з вами розглянули поняття процесу, способи відображення процесів та права доступу. Але для комфортної роботи в операційній системі цього, погодьтеся, замало. Потрібно ще ефективно керувати процесами. А для реалізації управління ми спочатку розглянь будову таблиці процесів:

Батьком всіх процесів у системі є процес init. Його PID завжди 1, PPID - 0. Всю таблицю процесів можна уявити у вигляді дерева, у якому коренем буде процес init. Цей процес хоч і не є частиною ядра, але виконує в системі дуже важливу роль - визначає поточний рівень ініціалізації системи та стежить, щоб були запущені програми, що дозволяють користувачу спілкуватися з комп'ютером (mingetty, X або інші).

Процеси, імена яких укладено у квадратні дужки, наприклад "[keventd]" - це процеси ядра. Ці процеси керують роботою системи, а точніше такими її частинами, як менеджер пам'яті, планувальник часу процесора, менеджери зовнішніх пристроїві так далі.

Інші процеси є користувальницькими, запущеними або з командного рядка, або під час ініціалізації системи.

Життя кожного процесу представлено наступними фазами:

Створення процесу - цьому етапі створюється повна копія того процесу, який створює новий. Наприклад, ви запустили з інтерпретатора виконання команду ls. Командний інтерпретатор створює повну копію.

Завантаження коду процесу та підготовка до запуску - копія, створена на першому етапі замінюється кодом завдання, яке необхідно виконати та створюється її оточення - встановлюються необхідні змінні тощо.

Виконання процесу

Стан зомбі - цьому етапі виконання процесу закінчилося, його код вивантажується з пам'яті, оточення знищується, але запис у таблиці процесів залишається.

Вмирання процесу - після всіх завершальних стадій видаляється запис із таблиці процесів - процес завершив свою роботу.

Під час роботи процесу ядро ​​контролює його стан і в разі виникнення непередбаченої ситуації керує процесом за допомогою посилки йому сигналу.Сигнал - це найпростіший спосіб міжпроцесорної (тобто між процесами) взаємодії. Існує кілька типів сигналів. Для кожного з типів передбачено стандартну дію. Процес може скористатися дією за замовчуванням, або, якщо він має обробник сигналу, він може перехопити і обробити чи ігнорувати сигнал. СигналиSIGKILL і SIGSTOP неможливо перехопити, ні ігнорувати.

За замовчуванням можливі кілька дій:

ігнорувати - продовжувати роботу, незважаючи на те, що отримано сигнал.

завершити - завершити роботу процесу.

завершити + core - завершити роботу процесу та створити файл у поточному каталозі з ім'ям core, що містить образ пам'яті процесу (код та дані).

зупинити - призупинити виконання процесу, але не завершувати його роботу та не вивантажувати код із пам'яті.

Ось список усіх сигналів, що існують у системі на сьогоднішній день: