操作系统--进程管理
进程管理:
进程基本概念:
1. 每个进程在内存都中有实际的空间,包括代码段、数据段、堆、栈等
2. 进程的五个状态:运行、就绪、等待(阻塞)、创建、结束
3. 每个操作系统只有一个运行进程、一个就绪进程队列和 N 个等待进程队列,一个等待进程队列等待同一个资源
4. 每个进程在操作系统中进程控制块(PCB)来表示
5. 进程的上下文切换,就是离开的进程要将CPU寄存器中的值放到自己PCB的registers中,而进入的进程将PCB的registers中的值放到CPU寄存器中;上下文切换是额外开销,应尽量减少
6. 进程间通信(IPC): 信号量、消息队列、共享内存、管道、套接字、信号
线程基本概念:
1. 与进程的区别:
宏观上,资源拥有的单位为进程(或任务),调度的单位为线程;
线程只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程拥有的全部资源
线程的系统开销比进程小
2. 用户级线程:不依赖与OS核心(内核不了解用户线程的存在),应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程,典型的JVM
3. 内核级线程:依赖于OS核心,由内核的内部需求进行创建和撤销,用来执行一个指定的函数;一个线程发起系统调用而阻塞,不会影响其他线程;时间片分配给线程,所以多线程的进程获得更多CPU时间
4. 基于上两种线程,有不同的多线程模型:
多对一模型,多个用户级线程对应一个内核级进程
一对一模型,一个用户级线程对应一个内核级线程
多对多模型,多个用户级线程对应多个内核级进程
CPU调度:
1. 调度算法的评价准则:
周转时间:进程从提交到完成所经历的时间; 平均周转时间 = All(周转时间)/进程数 ; 带权周转时间 = 周转时间/CPU执行时间 ; 平均带权周转时间 = All(带权周转时间)/进程数
响应时间:从进程提交到首次被响应的时间
等待时间:进程在就绪队列中等待的时间总和
吞吐量:单位时间内所完成的进程数
CPU利用率
2. 进程调度算法:
1. FCFS算法(先来先服务):有利于长进程不利于短进程,有利于CPU型的进程不利于I/O型的进程
2. SPF算法(短作业优先):相对FCFS算法改善平均周转时间,缩短进程的等待时间,提高了系统的吞吐量;但对长进程不利,并且进程的执行时间难以预估
3. SJF算法(最短剩余时间优先):是基于抢占式的SJF算法
补充:HRRN算法(高响应比优先):响应比 = (等待时间 +执行时间)/执行时间
4. 优先权调度算法:分为静态优先权和动态优先权,会导致进程饥饿,此时使用动态优先权,在优先权中加入时间参数
5. RR算法(时间片轮转):响应时间 = 进程数目 * 时间片长度
6. 多级队列调度算法:把就绪队列再分为若干个子队列,各子队列的调度算法不一样,并且各子队列也有优先级的区别,如分成系统进程、用户交互进程、批处理进程等
7. 多级反馈队列调度算法:时间片轮转算法和优先级算法的综合,从上到下队列的优先级逐级降低,但时间片长度逐级加倍,只有上层队列执行完了才执行下层队列,一个进程完成了一个队列中分给它的时间片,就降到下一级队列末尾
进程同步:
1. 进程面临的控制问题:互斥、死锁、饥饿
2. 同步机制应遵循的准则:互斥、空闲让进、有限等待
3. 解决进程同步的问题:软件设计、硬件指令和信号量机制
4. 信号量机制:
1. 记录型信号量结构: typedef struct {
int value;
struct process *L;
} semaphore;
2. 信号量的值只能通过初始化及两个原子操作改变:P、V(wait、signal)操作,分别代表分配资源和释放资源
3. 信号量分为互斥信号量(初始值永远是1)和同步信号量(初始值根据资源数确定)
4. wait和signal操作:
进程死锁:
1. 产生死锁的必要条件:互斥、不可抢占、请求和保持、环路等待
2. 解决死锁的基本方法:死锁预防、死锁避免、死锁检测和死锁恢复
3. 死锁预防:破坏四个必要条件中的一个条件
4. 死锁避免:允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统从安全状态向不安全状态转换,便可将资源分配给进程;否则不分配资源,进程必须阻塞等待,从而避免死锁。 安全条件:系统中存在一个安全序列<P0,P1,P2....>, 其中Pi将申请的资源<=(当前拥有资源+所有进程Pj占有的资源),j<i 使用银行家算法实现
5.死锁检测:检测资源分配图是否可以简化
6. 死锁恢复:有选择地杀死进程
7. 现代操作系统避免死锁采用的方式是:鸵鸟算法(不理不睬,假装不知道)