Моделювання станів процесів в Linux засобами мови програмування С.
Зміст
Вступ
В попередніх темах було детально описано поняття процесів та особливості їх реалізації і роботи з ними в різних операційних системах, як видно з назви в даній статті буде описано моделювання станів процесів в Linux використовуючи мову програмування С, тому передбачається що читач ознайомився з попередніми темами, і має певний набір теоретичних знань про процеси в операційній системі Linux, та базові знання та навички програмування мовою С.
Написання, компіляція та запуск С програм в Linux
Для компіляції С програм було використано GNU Compiler Collection (GCC) який є набором компіляторів для різних мов програмування, розроблений в рамках проекту GNU. GCC використовується як стандартний компілятор для вільних UNIX-подібних операційних систем.
Першим этапом створення програми є безпосередньо написання програмного коду, набирати код програми можна в будь-якому текстовому редакторі, наприклад Gedit після чого потрібно зберегти файл з відповідним розширенням, яке покаже компілятору GCC на якій саме мові програмування було написано програму, для мови С використовується розширення .с. Для того щоб скомпілювати програму потрібно перейти в термінал, та запустити команду gcc program.c -o program
Де program.c назва текстового файлу з кодом програми, program – назва виконуваного файлу, опція -o відповідно задає ім'я виконуваного файлу. Після того як програма була скомпільована, та був створений виконуваний файл, його можна запустити наступною командою ./program
Моделювання cтану виконання (R)
Виконання це єдиний активний стан процесу, в даному стані процес займає процесор. Стан виконання можна легко моделювати за допомогою звичайного циклу (Лістинг 1).
#include <stdio.h>
int main(void) { while(1==1) printf("Running\n"); return 0; }
Лістинг 1. Стан виконання.
Головним елементом програми є безкінечний цикл while який виводить на термінал слово Running. Цього цілком достатньо для того щоб процес завжди знаходився в стані виконання.
Моделювання cтану чекання що переривається (S)
Чекання що переривається – стан блокування при якому процес чекає появи деякої події, наприклад операцію вводу виводу (Лістинг 2).
#include <stdio.h>
int main(void) { char a; printf("Wait\n"); scanf("%c",&a); return 0; }
Лістинг 2. Стан чекання що переривається.
При виконанні даної програми процес очікує введення довільного символу, і поки цей символ не буде введений процес буде знаходитись в стані чекання що переривається.
Моделювання призупиненого cтану (Т)
При призупиненому стані – процес зупинений і може бути продовжений тільки в наслідок дії іншого процесу. Реалізація даного стану показана в лістингу 3.
#include <stdio.h> #include <signal.h>
int main(void) { kill(getpid(),SIGSTOP); return 0; }
Лістинг 3. Призупинений стан
Призупинений стан реалізується однією функцією kill. Функція kill посилає вказаний сигнал вказаному процесу, за допомогою цієї функції програма сама собі, відсилає сигнал SIGSTOP який викликає зупинку процесу.
Моделювання стану зомбі (Z)
Коли процес знаходиться в стані зомбі його виконання було припинено, але за деяких обставин його структура залишається в таблиці процесів. Однією з причин виникнення процесу зомбі може бути ситуація при якій процес-нащадок (дочірній процес) завершиться раніше, ніж цього очікував процес-батько. Дану ситуацію реалізує програма код якої зображений в лістингу 4.
#include <stdlib.h> #include <sys/types.h> #include <unistd.h>
int main(void) { pid_t pid; if (pid = fork () >0) { sleep (30); } return 0; }
Лістинг 4. Стан зомбі.
В даній програмі створюється дочірній процес який одразу завершує своє виконання в той же час батьківський процес виконує функцію sleep(30) яка призупиняє його роботу на 30 секунд, таким чином дочірній процес протримається в стані зомбі 30 секунд, доки батьківський процес не відновить своє виконання.
Моделювання стану чекання що не переривається (D)
В стані чекання що не переривається процес безпосередньо чекає виконання якоїсь апаратної умови тому не сприймає ніяких інших сигналів.
В лістингу 5 зображено код програми яка моделює стан чекання що не переривається.
#include <stdio.h> #include <unistd.h>
int main(void) { printf("Wait\n"); // Створюється, відкривається для запису файл FILE *f; f=fopen("File","wt"); char s[2]; s[0]='0'; s[1]='1'; int i = 0; //створюється дочірній процес int pid; pid=fork(); //батьківський і дочірній процес записують рядок S в файл 10000000 разів if(pid>0) { while(i<10000000) { fputs(s,f); i++;} } else { while(i<10000000) { fputs(s,f); i++;}} return 0; }
Лістинг 5. Чекання що не переривається.
Принцип роботи даної програми наступний, створюється новий файл в який одночасно 10000000 разів намагаються записати один і той же рядок символів, батьківський і дочірній процес, в результаті в певні моменти часу батьківський або дочірній процеси переходять в стан чекання що не переривається.