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 |