Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРВ_07_18_01_Процессы.pptx
Скачиваний:
6
Добавлен:
20.06.2023
Размер:
58.33 Кб
Скачать

7. Процессы

«Процесс – действия машины при выполнении программы»

«Процесс – программа в стадии выполнения»

«Процесс – это адресное пространство вместе с выполняемыми в нем потоками управления, а также системными ресурсами, которые этим потокам требуются»

QNX - «Процесс – контейнер потоков»

7. Процессы 2016 v.02

1

Выполняемая

программа

main () {

}

адрес В. программы адрес стека приоритет

Стэк

Потоки

«Физическое» представление

Исполняемый код

Дескриптор (ТСВ task control block)

Стек процесса

Потоки - Нити

(Light-weight proсcess, thread)

Обеспечивает изолированное адресное пространство

PID - идентификатор

процесса, pid_t getpid()

Очередь процессов

TCB TCB . . .TCB

Указатель стека - регистр общего назначения процессора

SP (адрес стека)

Контекст – данные, однозначно характеризующие состояние в текущий момент

7. Процессы 2016 v.02

2

Создание процесса

Создание и запуск процесса из программы:

system()

Семейство функций exec() – вызвавший процесс заменяется вновь созданным

Семейство функций spawn()

fork()

Действия запроса на создание процесса:

активизирует создание адресного пространства

в новом процессе запускается поток, который вызовет функцию main()

7. Процессы 2016 v.02

3

Пример_1: функция system()

int system( const char *command );

command - NULL, system() определяет наличие shell сommand – не NULL, вызывает экземпляр shell и передает

строку command для выполнения.

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

int main( void ) { int rc;

rc = system( "ls" ); if( rc == -1 ) {

printf( "shell could not be run\n" ); } else {

printf( "result of running command is %d\n", rc);

}

return EXIT_SUCCESS;

}

7. Процессы 2016 v.02

4

Пример_2: функция spawnl()

#include <process.h>

int spawnl( int mode, const char * path, const char * arg0, const char * arg1..., const char * argn, NULL );

#/tmp/test.sh file

#!/bin/sh

i=1 id=$$

while [ i -le 10 ] do

echo "Prosess id=$id This is $i-th cycle of the test"

sleep 1

let "i = i + 1" done

pidin | grep “bin/sh” exit 0

#include <stdlib.h> #include <stdio.h> #include <process.h>

int main(int argc, char *argv[]) {

printf( "*** I'm process %d\n", getpid() );

// spawnl(P_WAIT, "/bin/sh", "/bin/sh", "test.sh", NULL);

spawnl(P_NOWAIT, "/bin/sh", "my_name", "test.sh", NULL);

int i;

for (i=0; i<=5; i++){

printf("*** I'm process %d\n", getpid()); sleep(1);

}

printf( "*** I'm process %d, and I'm stopped\n", getpid() );

return EXIT_SUCCESS;

}

7. Процессы 2016 v.02

5

Пример_3: функция fork()

#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <process.h>

Клонирование процесса

pid_t fork() Возвращает

0 – в дочернем процессе pid – в процессе-родителе

int main(int argc, char *argv[]) { printf("parent pid = %d\n", getpid()); int returned_pid;

int i;

returned_pid = fork(); for (i=0; i<=5; i++) {

printf("pid = %d returned_pid = %d\n", getpid(), returned_pid); sleep(1);

}

return EXIT_SUCCESS;

}

7. Процессы 2016 v.02

6

Пример_4: функция fork()

Код дочернего процесса отличен от родительского

#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <process.h>

int main(int argc, char *argv[]) { int i;

printf("parent pid = %d\n", getpid());

if (fork())

for (i=0; i<=5; i++) {

printf("this is the parent, pid = %d\n", getpid()); sleep(1);

}

else

for (i=0; i<=5; i++) {

printf("this is the child, pid = %d\n", getpid()); sleep(2);

}

return EXIT_SUCCESS;

}

7. Процессы 2016 v.02

7