Вы находитесь на странице: 1из 5

Министерство образования и науки Кыргызской Республики

Кыргызский государственный технический университет

им. И. Раззакова

Факультет информационных технологий

Кафедра «Программное обеспечение компьютерных систем»

Отчёт

дисциплина: «Операционные системы»

Лабораторная работа №13

тема: «Создание процесса в Linux. Системный вызов fork()»

Выполнил: студент группы ПИ(б)-1-21

Осмонова Жибек

Проверила: Кылычева С.А.

Бишкек-2020
Лабораторная работа №13
Давайте просмотрим, когда же процесс находится в каждом состоянии. Создайте файл
process - это обыкновенный bash-сценарий
#!/bin/bash
x=1
while [ $x -lt 10 ]
do
x=2
done

Сделайте этот файл исполнимым chmod +x ./process и запустите его ./process. Теперь
перейдите на другую консоль (ALT + Fn) и введите команду ps -a | grep process. Вы увидите
следующий вывод команды ps:

5455pts/0 00:15 bash

Данный вывод означает, что нашему процессу присвоен идентификатор процесса 4035.
Теперь введите команду top -p 4035
Теперь приостановим наш процесс - состояние T. Перейдите на консоль, на которой
запущен ./process и нажмите Ctrl + Z. Вы увидите сообщение Stopped.
Теперь попробуем "усыпить" наш процесс. Для этого нужно сначала "убить" его: kill 4035.

Мы вплотную подошли к самому интересному - созданию процесса-зомби. Во многих


статьях, посвященных процессам, пишется "зомби = не жив, не мертв". А что это означает
на самом деле? При завершении процесса должна удаляться его структура из списка
процессов. Иногда процесс уже завершился, но его имя еще не удалено из списка
процессов. В этом случае процесс становится зомби - его уже нет, но мы его видим в
таблице команды top. Такое может произойти, если процесс-потомок (дочерний процесс)
завершился раньше, чем этого ожидал процесс-родитель. Сейчас мы напишем программу,
порождающую зомби, который будет существовать 8 секунд. Процесс-родитель будет
ожидать завершения процесса-потомка через 10 секунд, а процесс-потомок завершить
через 2 секунды.

#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h>

int main() {
int pid;
int status, died;
pid=fork();
switch(pid) {
case -1: printf("can't fork\n");
exit(-1);
case 0 : printf(" I'm the child of PID %d\n", getppid());
printf(" My PID is %d\n", getpid());
// Ждем 2 секунды и завершаемся, следующую строку я закомментировал
// чтобы зомби "прожил" на 2 секунды больше
// sleep(2);
exit(0);
default: printf("I'm the parent.\n");
printf(" My PID is %d\n", getpid());
// Ждем завершения дочернего процесса через 10 секунд, а потом убиваем его

sleep(10);
if (pid & 1)
kill(pid,SIGKILL);
died= wait(&status);
}
}

Для компиляции данной программы нам нужен компилятор gcc:


gcc -o zombie zombie.c
После того, как программа будет откомпилирована, запустите ее: ./zombie. Программа
выведет следующую информацию:
Запомните последний номер и быстро переключайтесь на другую консоль. Затем введите
команду top -p 1148
16:04:22 up 2 min, 3 users, load average: 0,10, 0,10, 0,04
1 processes: 0 sleeping, 0 running, 1 zombie, 0 stopped
CPU states: 4,5% user, 7,6% system, 0,0% nice, 0,0% iowait, 87,8% idle
Mem: 127560k av, 76992k used, 50568k free, 0k shrd, 3872k buff
24280k active, 19328k inactive
Swap: 152576k av, 0k used, 152576k free 39704k cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
1148 den 17 0 0 0 0 Z 0,0 0,0 0:00 zombie <defunct>

Мы видим, что в списке процессов появился 1 зомби (STAT=Z), который проживет аж 10


секунд.
Мы уже рассмотрели все возможные состояния процессов. Осталось только рассмотреть
команду для повышения приоритета процесса - это команда nice. Повысить приоритет
команды может только пользователь root, указав соответствующий коэффициент
понижения. Для увеличения приоритета нужно указать отрицательный коэффициент,
например, nice -5 process

Вам также может понравиться