第四章 进程管理
4.1 进程概念
-
4.1.1 进程概述
- (1)定义:程序在某个数据集合上的一次运行活动
- (2)特性:动态性(程序为静态长存),并发性,异步性,独立性(作为系统分配与调用CPU的单位)
- (3)类型:系统和用户进程;计算型进程和I/O进程(用户交互)
-
4.1.2 进程状态
- 运动、就绪、阻塞态
-
4.1.3 LINUX进程状态
- 可运行、阻塞、僵死、挂起态
-
4.1.4 进程控制块PCB
- 描述进程状态、资源和与相关进程关系的数据结构
- 进程 = 程序(代码 + 数据) + PCB
4.2 进程控制
-
4.2.1 进程控制
- (1)四种控制:进程创建(包括标识ID,优先级,起始地址等),进程撤销(资源与PCB),进程阻塞,进程唤醒
- (2)原语:若干指令构成的具有特定功能的函数,必须一次执行完不能停止
-
4.2.2 Windows进程控制
- System(),CreateProcess(),ExitProcess(),TerminateProcess()
-
4.2.3 LINUX进程控制
- 所有的子进程都来自父进程:pid_t pid = fork(void),子父不同功能:exec(包含函数)函数簇
4.3 线程
-
4.3.1 线程概念
- (1)一个进程多线程,CPU可独立运行(最小调度单位可以是线程,但是一般还是取进程)
- (2)CreateThread()函数,单线程与多线程程序
-
4.3.2 线程典型应用场景
- (1)线程典型应用场景:多功能并发、提升窗口交互性
- (2)LINUX:pthread_create()函数
4.4 临界区和锁
-
4.4.1 临界资源和临界区
- (1)临界资源:一个只允许一个进程独占访问的资源
- (2)临界区:锁住的临界资源的前后区域
- (3)原则:忙则等待,空闲让进,有限等待,让权等待
-
4.4.2 锁机制
- (1)基本原理:设置标志S = 1表明临界资源是否可用,1可用 ,0不可用
- (2)实现:Locks()操作S减1,Unlocks()操作S加1
4.5 同步与P-V操作
-
4.5.1 同步与互斥的概念
- (1)进程互斥:多个进程共享独占性资源,必须协调各进程对资源的存取顺序
- (2)进程同步:若干合作进程为了完成一个共同的任务,需要相互协调运行步伐。一个进程开始某个操作之前必须要求另一个进程已经完成某个操作,否则前面的进程只能等待
-
4.5.2 P-V操作
- (1)信号灯:进程运行过程受信号灯状态控制,并能改变信号灯状态
- (2)数据结构:一个二元矢量(s,q);s(信号量)为整数,初值为负;q为PCB队列(存进程PCB的指针),初值为空集
- (3)P操作,S减1;若差大于或等于0,进程继续;若差小于0,则该进程阻塞并加入到队列q中,并转调度
- (4)V操作:S加1;若和大于0,进程继续;若和小于或等于0,该进程继续同时从q中唤醒一个进程
-
4.5.3 P-V操作解决互斥问题
- 设置S = 1,在临界区前后进行PV操作
-
4.5.4 P-V操作解决同步问题
- (1)同步实质:运行条件不满足则暂停,运行条件满足时则继续
- (2)基本思路:定义合理的S初值(如S1 = S2 = 0),关键操作前P操作,关键操作后S操作
-
4.5.5 经典同步问题
-
(1)生产者消费者问题
- 规则:不能向满缓冲区存;不能向空缓冲区取;每个时刻只允许一个消费者/生产者来取/存产品
- 实现核心:缓冲区是临界区,要被互斥使用
-
(2)读者与编者问题
- 规则:允许多个读者同时读;不允许读者与编者同时操作;不允许多个编者同时操作
- 实现核心:循规蹈矩,并注意读者对于编者权限的限制方式设计(互斥量累加,保证必有1)
-
4.6 Windows与Linux的同步机制
-
4.6.1 Windows
- (1)临界区机制:CRITICAL SECTION
- (2)等待函数:WaitForXXXObject,其中EnterCS为P操作,LeaveCS为V操作
- (3)互斥量:与PV操作的区别在于可以跨线程使用
- (4)信号量:允许多个进程/线程访问临界区,其中WaitForSingleObject信号量减1(>0有信号);ReleaseSemaphore信号量加1(<=0无信号)
-
4.6.2 Linux
- (1)进程调用wait(int status):阻塞自己,等待子进程结束后销毁自己
- (2)Exit终结进程:释放资源并上报父进程
- (3)Sleep休眠:根据输入时间来休眠
4.7 进程通信
-
4.7.1 匿名管道通信
- (1)管道通信机制:pipe,程序A→pipe(R→W)→程序B,即将A的输出重定向为B的输入
- (2)设计思路:父进程的UI在前台运行→子进程作为底层在后台运行→UI与底层管道实现了双向通信
- (3)实现过程:两根管道1和2,父进程中的输入作为管道1的Read,子进程的输入作为管道1的Write;子进程中的输出作为管道2的Read,父进程的输出作为管道1的Write;
-
4.7.2 Linux通信
- (1)信号Signal:Ctrl + C→SIGINT(杀死整个进程);Ctrl + Z→SIGTSTP(暂停);kill-9→SIGKILL(杀死当前进程)
- (2)信号机制编程:(与QT的信号槽很类似),在函数Signal(信号编号,处理函数)中定义对应信号编号的处理函数