一、进程概念:
- 定义:(分配系统资源的基本单位)
程序的一个执行实例,正在执行的程序; -
具体内容:(创建PCB、创建页表、维护虚拟地址到物理地址的映射)
PCB:为方便操作系统对进程的管理,建立的包含进程所有属性的结构体;(Linux 下 task_struct结构体)
(PID、进程状态、优先级、内存指针)
页表:保证虚拟地址空间映射到物理地址空间;
虚拟地址空间:通过页表映射到物理地址空间; - 进程状态:
R运行状态:并不意味着一定在运行中,表明进程在运行中或者在运行队列中
S睡眠状态:表明进程在等待事件完成;(睡眠可中断)
D磁盘休眠状态:即不可中断状态,通常会等待IO结束;
T停止状态:可以通过SIGSTOP信号给进程来停止,这个被暂停的进程可以发送SIGCONT信号让进程继续运行;
X死亡状态:这个状态只是一个返回状态,不会再任务列表里看到这个状态;
Z僵尸进程:进程死亡后仍保留部分数据的进程(父进程等待回收);(内存泄漏问题)
孤儿进程:父进程提前退出;(被1号进程领养,也会被回收)
- 进程优先级:
CPU资源分配的先后顺序,即进程的优先级(priority)
优先级搞得进程有优先执行的权利 ,配置进程优先级可以改善系统性能;
UID(执行者)、PID(进程代号)、PPID(父进程代号)、PRI(优先级)、NI(nice 值)
真正优先级=优先级+NI (值越小,越先执行) - 特点:
并发性:在同一个时间段内,有多个任务同时推进。
并行性:在任何时刻,有多个任务同时推进。
独立性:一个进程都会有独有的套PCB、页表及虚拟地址,运行过程不受其他进程影响。(代码共享单只有可读性,数据资源写时拷贝)
竞争性:多个进程,但CPU资源有限。
二、进程操作:
- 创建进程:fork
1、函数:
#include<unistd.h>
pid_t fork(void)
2、返回值:
子进程返回0;
父进程大于0(即子进程pid);
创建失败小于0;
3、fork之前,父进程独立执行,fork之后,父子两个执行流分别执行;(执行顺序由调度器决定)
- 进程终止:
1、退出结果分三种情况:
代码运行完毕,结果正确;
代码运行完毕,结果不正确;
代码异常终止;
2、退出方式:
从main返回;
调用exit;(void exit(int status),关闭所有打开的流,所有的缓存数据均被写入)关闭空闲进程
_exit;(关闭所有进程)
异常退出:Ctrl+c 信号终止 - 进程等待:
1、wait方法:
pid_t wait(int *status)
返回值:成功返回pid,失败返回-1。
参数:输出型参数,获取子进程退出状态,不关心则设置成NULL;
2、waitpid方法:
pid_t waitpid(pid_t pid,int *status,int options);
返回值:
当正常返回时候waitpid 返回收集到的子进程的进程ID;
如果设置了WNOHANG,而调用waitpid发现没有已退出的子进程可收集,则刚返回0;
如果调用中出错,则返回-1,这时errno会被设置成相应的值一指示错误所在;
3、获取子进程status:
输出型参数,由操作系统填充;
如果传递NULL,表示不关心进程的退出状态信息;
子进程会根据参数,将子进程的退出信息反馈给父进程;
status 不能简单的当作整型来看待,可以当作位图看待。
4、进程阻塞:
进程由于检测某一tiaojian条件不就绪而被挂起的现象;
挂起:将PCB从R队列到某个非R队列;
唤醒:将PCB从非R队列到R队列;
(三)守护进程:
系统服务进程不受用户登录注销的影响,会一直运行的进程;
(自成进程组、自成会话、自成作业)——特殊孤儿进程