§3 进程管理
C1 进程
1)并发
:同一时间两个进程都在运行或者阻塞。可能在不同处理机
并行
:同一时间两个进程都在运行。- 特点:
- 间断性:执行过程中可能阻塞挂起
- 非封闭性:多个进程共享资源,可能相互影响
- 不可再现性:执行结果依赖于调度执行次序
- 并发条件:Bernstein条件(充分条件):不发生读写冲突
- R ( S i ) , W ( S i ) R(S_i),W(S_i) R(Si),W(Si)为 S i S_i Si的读写集合
- $R(S_i)\cap W(S_j) = W(S_i)\cap R(S_j) = W(S_i)\cap W(S_j)\varnothing ,i\neq j $
- 计算题-并发利用率:分母使用所有进程结束(IO结束)执行的时间,设备也一样
2)进程
:程序在指定数据集上的一个动态执行过程
-
特点:
- 动态性:动态创建和结束
- 并发性:多个进程存在与内存中,能在一段时间内同时运行
-
独立性:传统OS中进程是独立运行的基本单位
-
异步性/制约性:由于共享数据/资源而相互制约。执行时间不可预计
-
进程与程序
-
区别:
进程 程序 代码端+数据段+PCB 算法+数据结构 动态 静态 暂存 永久 -
联系:一个程序对应多个进程,一个进程可能包含多个程序(多对多)
-
-
进程优点:提高效率;缺点:增加空间、时间开销和系统复杂度
3)控制结构:进程控制块
(PCB)。PCB是进程存在的唯一标志
- 组成:
- 进程标识信息,如进程ID,产生者(用户,父进程)标识。操作系统给每个进程赋予一个UID(子进程同父进程),每个组分配GID
- 处理机状态信息:
- 用户可见寄存器:可用数据/地址寄存器
- 控制和状态寄存器:PC,PSW
- 进程控制信息:
- 存储管理:堆、栈、代码段指针
- 进程所用资源:打开的系统资源,如文件
- 进程优先级
- 进程互斥、同步使用的信号量。
- PCB管理所用的链接域
- 其它信息:运行时间等
- PCB组织管理:多个链表将同一状态的进程链接,便于动态修改,实质上是带优先级的队列。
- 控制实现:
原语
:若干指令组成指令序列。在内核态原子执行,常驻内存。 - Linux中PCB为task_struct
4)生命周期
-
创建:
-
时机:系统初始化,用户请求服务,程序调用和批处理作业
-
fork()
系统调用:创建子进程。返回值在子进程中为0,父进程中为子进程的pid。为子进程复制父进程的页面,或者使用写时复制机制。vfork()
直接共享父进程的资源,一般要执行exec()
载入程序。父子进程使用不同地址空间。while(TURE){ type_promopt();//显示提示符 read_command(commands,parameters); if(fork()!=0){ //父进程 waitpid(-1,&status, 0); // -1表示等待退出,status得到执行情况 // 第三参数可以选择一些特殊功能 /* 此处父进程代码主要是配合子进程exit()使用。 回收一些子进程难以执行回收的资源,尚未回收 但已执行退出的子进程处于僵尸状态 */ }else{ //子进程 execve(command,parameters,0); //执行命令,**覆盖掉**进程原来的代码,堆栈 } }
-
Windows在创建进程时分配不同地址空间,POSIX使用写时复制机制
-
-
等待:由于等待系统服务、数据或是某种操作,进程自身发出阻塞
-
唤醒:资源到位后,由OS或其他进程唤醒,进入就绪态
-
终止:正常退出或错误退出(自行),致命错误或其他进程所杀(强制,使用kill)
- 有些系统中会"诛杀"所有创建的子进程,Unix和Windows不会
4)状态:由调度程序处理中断,启动和终止进程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JJ2h7FZ3-1590851691325)(E:\Typora笔记\文件图片\进程状态空间.png)]
-
挂起:进程保存到外存以腾出空间,分阻塞挂起与就绪挂起
- 阻塞到阻塞挂起:没有进程就绪,或就绪进程需要更多内存
- 就绪到就绪挂起:高优先级阻塞(OS认为很快就绪)和低优先级就绪进程同时存在时,挂起就绪进程
- 运行到就绪挂起:高优先级的阻塞挂起进程进入就绪挂起
- 阻塞挂起到就绪挂起
-
激活:
- 就绪挂起到就绪:没有就绪进程或挂就绪起进程优先级高于就绪进程时
- 阻塞挂起到阻塞:高优先级阻塞挂起(认为很快就绪)且内存允许时
5)层次结构:
- POSIX中所有进程都来自根进程init,进程组织为进程树
- Windows中没有层次,因为父进程可将创建子进程时获得的"句柄"(可控制子进程)交给其他进程
6)多道程序设计中: n n n为道数, p p p为I/O概率,CPU利用率为 1 − p n 1-pn 1−pn
C2 线程
1)线程:共享进程数据和空间的并行执行流程
2)作用:
- 共享同一地址空间和所有数据,解决进程间阻塞限制
- 相对于进程可以更快地创建、撤销和切换
- 提升进程内多个任务并行度
3)线程也有状态变化,控制结构TCB记录独享PC,Reg,栈,状态
4)进程与线程:
- 一个线程的错误可能引发所有线程崩溃。故进程用于安全性高的应用,线程用于性能要求高的应用。同时,线程引入设计复杂度问题。例如子进程是否继承所有线程,通常在继续执行时复制所有线程,在exec另一程序时只创建一个线程。
- 进程作为资源分配单位,线程是CPU调度单位
- 线程粒度小,并行度更高,切换更快。
- 共享资源,容易协作同步。
- 线程不能单独执行,但是每个线程都有程序出入口和执行序列,组成进程。
5)POSIX线程API: pthread
调用 | 功能 |
---|---|
pthread_create | 创建线程 |
pthread_exit | 结束调用的线程 |
pthread_join | 阻塞直到指定进程退出 |
pthread_yield | 释放CPU以执行另一个线程 |
pthread_attr_init | 创建并初始化一个线程属性结构 |
pthread_attr_destroy | 删除线程属性结构(如优先级) |
5)实现:
用户级线程
:使用用户线程库函数管理,内核将其视为单线程进程处理。每个进程维护线程表TCB进行管理。- 优点:
- 可用于不支持线程技术的系统。只需要线程库函数集(称运行时系统)
- 使用库函数统一API,易于移植
- 线程间切换不需要用户/核心态切换,不需要刷新Cache,在本地执行故快
- 由应用控制切换,易于优化
- 缺陷:
- 若发起系统调用,所有线程将被阻塞。对于CPU密集型任务,不需要多线程,而IO密集型又常常阻塞。Unix系统中对于阻塞的补救方式是先使用检查命令检查系统调用是否可能导致阻塞,若可能阻塞则暂时不进行系统调用,切换到另一个线程。这类检查函数称"包装器"。
- 某一线程引发的缺页中断也会使得所有被线程阻塞在磁盘IO
- 无法使用时钟中断机制退出线程,需要线程自行放弃。
- 时间片按进程分配,每个线程得到的时间片少,执行慢
- 内核只能按进程单位分配处理器,所以多处理器无法并发处理多线程
- 优点:
内核线程
:由内核维护线程表和进程表。- 缺点:
- 需要系统调用/内核切换来创建终止切换线程,开销大
- 涉及进程调度和线程调度,系统更复杂
- Windows NT、Windows 2000/ XP
- 缺点:
- 混合实现:用户级线程和内核级线程彼此多路复用
轻量级进程
:由内核支持的用户线程,单独的内核线程支持一个或多个用户进程。被内核单独调度,可并行运行在多处理器间。- Solaris 2
- 调度程序激活机制:模拟内核线程的功能并保证用户线程的性能
- 虚拟处理器:内核为每个进程提供一定数量虚拟处理器(多处理器系统中可以是真实处理器),运行时系统进行分配。内核也可以回收处理器。
上行调用
:内核在检测到阻塞时,或者阻塞的资源到位时,跳到指定地址唤醒运行时系统**(违背OS分层结构**)- 中断处理:CPU陷入内核态,若中断与被中断进程相关,恢复时运行时系统选择执行新就绪线程,原线程或新建线程
- Linux不确切区分进程与线程,将线程视为进程的另一个执行上下文
4)用户线程调度每次只能调度同一进程线程,而内核线程可以调度不同进程线程
5)弹出式线程:服务请求到来时,在内核新建一个进程来处理而不是恢复一个