初识进程控制

一、进程的概念

1、程序:为了实现特定任务的一系列指令的有序集合。
程序也可以这样表示: 代码 + 数据
2、进程:
从用户角度看:进程是程序的一次动态执行过程;
从操作系统角度看:(1)进程是系统分配cpu、内存、时间片等系统资源的基本单位;(2)是系统分配资源的最小单位;(3)每个进程都有自己独立的地址空间和运行状态。
进程也可以这样表示: 代码 + 数据 + PCB + 堆栈

·进程是程序的一次执行过程,那操作系统就需要有相关的数据结构来保存一个进程的一系列信息,C语言就用结构体来表示,这个结构体叫做PCB。
·操作系统内部有一个PCB链表,用来标识系统内当前所有的进程。

3、进程和程序的区别
(1)程序是静态的,进程是动态的(程序在磁盘上,进程在内存中);
(2)程序的生命周期相对长久,进程的生命周期相对短暂;
(3)程序没有PCB,进程有PCB;
(4)一个程序可以对应多个进程,一个进程只能对应一个程序。

4、进程的状态:经典三态
这里写图片描述

5、进程的状态:Linux下的七态
这里写图片描述

PCB:
进程标识符、进程状态 、优先级、程序入口地址、各种计时信息、进程间通信信息、占用内存大小及其使用情况的数据结构、交换分区信息、I/O设备,缓存相关的数据结构、文件系统的相关信息、现场保护信息。
进程标识符:
是一个无符号的整数,每个进程都有一个独一无二的标识符。
0:被操作系统内核使用;
1:被0号进程创建出来的一个用户进程。

二、进程的创建
1、创建进程的一般过程:
(1) 分配一个描述符,在内核中建立PCB;
(2) 复制父进程的环境;
(3) 分配系统资源,包括进程的代码、堆栈、数据;
(4) 将父进程地址空间的内容拷贝到子进程;
(5) 置成就绪状态,放入就绪队列。
2、创建进程的函数:

   int  fork(void)

   返回值:若成功,父进程的返回值是子进程的PID,子进程返回0 ;若失败,父进程返回-1.

   int getpid(void);  //获得当前进程的进程ID
   int getppid(void); //获得当前进程父进程的ID

当子进程死亡,子进程变成僵尸进程,僵尸进程会占用系统资源,是有害的;
当父进程死亡,子进程变成孤儿进程,孤儿进程需要1号进程领养;
当父进程和子进程都存在时,父子进程交替运行,谁被CPU调度到,就运行谁。

int vfork(void)
(1)子进程先运行,父进程等子进程执行完毕以后执行;
(2)必须使用exitexec退出,否则会出错;
(3)在任何一个系统上实现的vfork都有问题;
(4)就算是fork实现了写实拷贝,也没有vfork高效;
(5)建议不要使用vfork。

3、进程的退出
正常退出:
exit
main执行结束
_exit
异常退出:
ctrl + c
abort
kill pid(进程号)

猜你喜欢

转载自blog.csdn.net/weixin_41289858/article/details/80904968