Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Процеси в Linux

leave a comment »

Від останньої сесії залишилась шпаргалка по Unix записана по Зільбершатцу (ще раз дякую Діма), яку потрібно все викинути, а мені все шкода. Тому опублікую тут, може хоча б підготовка до екзамену буде недаремною… Ну, і варто ж продемонструвати собі, що я таки періодично буваю не лінивим.

Перше що потрібно знати – це те, що в Linux немає такого поняття як нить (thread), а точніше те що в windows називають ниттю, і процесом в Linux називають задачею (task). В Windows один процес може містити багато нитей, а в Linux одна задача може мати задачі які ділять з нею спільний контекст. Про те що таке контектст – далі.

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

  • Identity:
    • PID – ідентифікатор процесу
    • UID – ідентифікатор користувача процесу (буває ефективний, і того хто запустив)
    • GUID – ідентифікатор групи користувача
    • Personality – два байти що ідентифікують ОС, та серія однобітних прапорів, які описують бажану для задачі поведінку ОС.
  • Environment:
    • argv – параметри з якими запущена програма (в тому числі її ім’я)
    • Змінні середовища
  • Context:
    • Scheduling context: вміст регістрів, пріоритет, отримані сигнали, стек процесу (kernel stack)
    • Accounting context: скільки ресурсів програма зохавала.
    • File table: Набір вказівників на відкриті файли. (CLONE_FILES про ідентифікатори в дужках – нижче.)
    • Filesystem context: поточна робоча директорія і напевне змонтовані файлові системи, але в останньому вже не впевнений. (CLONE_FS)
    • Signal handlers: набір посилань на функції що обробляють переривання сигналів. (CLONE_SIGHAND)
    • Virtual memory context: інформація про виділення пам’яті (які сторінки належать процесу) (CLONE_VM)

Отож, що таке контекст – розібрались. Тепер, щоб створити новий процес можна використати функцію fork() – функцію без параметрів що просто створює копію процесу, і повертає 0, якщо це новий процес, а в батьківському процесі повертає PID новоствореного процесу. В обох виконання продовжується одразу після виклику fork(). Функція працює швидко, тому що для створення копії використовується оптимізація “copy on write”, коли копія об’єкта створюється лише тоді, коли якийсь з процесів захоче його змінити. Часто після fork() викликають exec() щоб замістити поточний процес кодом якогось іншого.

clone() – функція аналогічна до fork(), але їй можна вказати які елементи задачі копіювати, а які залишити спільними. Вона приймає диз’юнкцію з прапорів CLONE_FS, CLONE_VM, CLONE_SIGHAND, CLONE_FILES, які згадувались в дужках біля різних частин контексту вище, та інших подібних прапорів. Вони визначають які частини контексту будуть спільними для обох задач. Також clone() передає виконання у вказану функцію, а не продовжує з місця одразу після виклику. В інших ОС те що він робить називають створенням ниті, треду, чи подібним терміном. Тут – просто задача, що має спільний контекст (пам’ять наприклад).

Ще там щось записано про те як пов’язані значення nice, пріоритет, і розмір часового кванту що виділяється задачі, але там написано мало, і я вже не можу розібрати що саме, тому оце і все.

Advertisements

Written by bunyk

Червень 4, 2012 at 12:05

Оприлюднено в Конспекти

Tagged with

Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: