目录
逻辑地址转物理地址:页号变块号,offset不变(反过来同理)
1 Linux基础
2 进程与线程、死锁
(处理机调度和进程线程管理)
2.1 进程
定义:(还未引入线程之前)
组织(组成):PCB进程控制块+程序段+数据段
PCB是进程存在的唯一标识。进程在创建时,操作系统会为它创建一个PCB,随后,这个PCB会被放置到内存中,在进程执行时,系统通过该进程的PCB可以了解进程的现行的状态信息,由此操作系统就可以对其进行控制和管理。当进程结束时,操作系统也会将PCB从内存中删除,进程也就随之消亡了。
程序段:进程调度到CPU执行的程序代码段。一个程序可以被多个进程共享(程序段相同),即多个进程可以运行同一个程序。
数据段:进程对应的程序加工处理的原始数据和进程运行过程中产生的中间/最终结果。
状态:创建、就绪、运行、阻塞、终止
等待(阻塞):进程正在等待合作进程的一个消息
就绪:进程正在等待分给他一个时间片
基本属性:资源的拥有者;调度单位
缺点:进程切换对时间空间开销大,限制并发程度的提高
进程控制:
使用原语来实现进程控制。(PCB转为就绪态 + PCB放到就绪队列)
方法:关中断指令和开中断指令;内核程序运行在核心态,执行关中断指令后,不再检查中断信号,以实现“原子性”。
(进程间通信IPC)
进程间通信:进程之间的信息交换(数据交换),依赖于操作系统提供的支持。因为为了保证安全,一个进程不能直接访问另外一个进程的内存地址,各个进程拥有的内存地址是相互独立的。
(1)共享存储
需要进行通讯的若干进程向操作系统申请一块共享空间,该共享空间可以由这些进程直接访问,通过对这片共享空间进行读/写操作实现进程之间的信息交换。操作系统会将这块共享空间映射到对应的进程的虚拟地址空间。
(2)消息传递
进程以格式化的消息为单位进行数据交换。若进程间不存在共享空间,需要利用操作系统提供的方法传递消息。分为直接通信和间接通信
(3)管道通信
指通过管道这种特殊的共享文件(pipe文件)进行进程间的信息交换。允许两个进程按生产者-消费者方式通信。先进先出、一端读一端写。管道机制有三方面能力:互斥、同步、确定对方存在。
当进程从用户态->内核态,表明陷阱,可能是因为:
系统调用;异常;外设异常
2.2 线程
目的:减少进程切换和创建的开销,提高执行效率和节约资源
将进程自愿申请和调度属性分开,即进程作为资源的申请和拥有者,但线程是独立调度和分派的基本单位。
优点:调度的基本单位,不引起进程切换;并发性提高;线程不拥有资源;多处理器体系结构的利用
线程的实现:用户级ULT、内核级KLT
用户级ULT:用户层通过线程库来支持。线程库提供对线程的创建、调度、管理,不需要用户干预;内核不知道用户线程的存在
优点:调度算法进程专用;线程切换不用内核;与操作系统无关
缺点:如果内核单线程,任何用户级线程阻塞时会引起整个进程阻塞;不能发挥多处理机优势
内核级TLT:内核直接负责线程的创建、调度、管理,给每个线程配备一个TCB线程控制器。
优点:发挥多处理机优势;阻塞时可调用其他线程;内核也可以用多线程技术;内核支持线程具有很小的数据结构和堆栈,线程切换开销小。
缺点:同一进程的线程切换需要用户态转到内核态,开销大
混合模式,多线程组合:
2.3 调度
定义:在某个队列中,按照某种方法(算法),选择合适的个体(作业、进程)的过程。
七状态模型:
挂起:由于内存有限,需要将某些进程的数据调出暂存至外存,待这些进程需要运行且内存空闲时再重新调入内存,这些被暂存至外存等待的进程的状态就是挂起状态。
层次:
高级调度(作业调度):外存->内存,创建新进程,作业调度
中级调度(内存调度):外存<->内存,挂起->激活,不创建新进程
低级调度(进程调度):内存,进程调度、CPU调度,从就绪->运行
指标:
CPU利用率=CPU有效工作时间 / ( CPU有效工作时间+CPU空闲等待时间 )
吞吐量=一个时间单元内完成*进程*的数量
周转时间=进程提交到完成的时间
均周转时间=各个作业周转时间总和/作业数
等待时间=进程在就绪队列里等待的时间之和
响应时间=分时系统,提到请求到第一次响应的时间
2.4 调度算法
2.4.1 FCFS先来先服务
缺点:周转时间与响应时间无法保证;短作业不利,等待时间远长于处理时间
2.4.2 SJF最短作业优先
两种形式:抢占式、非抢占式
缺点:需要事先估计每个作业所需时间;长作业可能会锁死;不利于分时系统(分时系统不可抢占)
2.4.3 SRT剩余最短时间优先
针对SJF增加抢占机制。选择预期剩余时间最短的,新程序就绪且有更短的剩余时间,可以抢占当前正在运行的进程。
缺点:记录过去的服务时间,增加开销;
优点:周转时间看来,由于SJF;不产生过多中断,优于轮转法
2.4.4 HRP最高响应比优先算法
响应比R = (等待时间W + 作业时间T)/ 作业时间T
优点比较:FCFS强调系统等待时间,SJF强调运行时间,HRP综合他们的特点
2.4.5 RR轮转法
为每个进程定义时间片。基于时钟的抢占策略,一般用于分时系统。
时间片选择:
时间片过短,进程切换过多开销大;时间片过长,变成FCFS。
优点:公平;
缺点:时间片短,切换开销大;时间片长,短作业不公平
改进方法:
2.4.6 PS优先级算法调度
每个进程都有一个优先号数,CPU被分配给优先级最高的 。
问题:低优先级饥饿
解决方案:老化——随时间增加进程的优先级
2.5 竞争问题
(进程、线程间竞争问题的处理)
当并发进程/线程竞争使用统一资源,可能会出现竞争条件。
一次只允许一个进程使用的资源被称作临界资源。
进程/线程访问临界资源的那段代码称为临界区。
同步:直接制约关系:未完成任务多个进程、线程需要某些位置、次序而等待、传递信息形成的制约关系。
互斥:间接制约关系,进程占用临界资源时,另外的进程需要等待。
实现方法:
软件实现:半标志法、双标志法先检查、双标志法后检查。
硬件实现:中断屏蔽方法、硬件指令方法(原子操作)
信号量semaphore:可以解决互斥同步问题。只被两个原语操作控制:P(S)加锁和V(S)释放锁
分类:
非记录型信号量(忙等待方式:不断测试):+空闲资源的数量;0无资源
二元信号量(信号量取值只有0和1,0有资源,1被占用)
记录型信号量(睡眠与唤醒方式:增加资源等待队列)
取值:0无资源无等待;+空闲资源的数量;-等待进程的数量
经典问题:生产者消费者、 哲学家就餐、读写者(读优先、写优先)
(死锁形成的原因和解决方法)
2.6 死锁问题
定义:一系列进程正在死锁,当每一个进程都在等待另外进程给他释放资源
原因:
资源不足,总需求超过最大资源量
可重用资源
不可重用资源
进程推进速度不当
P操作顺序不当
必要条件:互斥、占有并等待、不可抢占、循环等待
资源分配图:
2.7 解决死锁
2.7.1 方法
鸵鸟算法:无视可能出现的问题,当死锁概率很低时才可以使用
预防:限制,破坏4大必要条件
互斥:无法破坏,有的资源就是互斥
请求并保持:预先静态分配;资源严重浪费
不可抢占:复杂,前段工作失效,造成额外开销
循环等待:编号;不好修改系统构造,浪费且编码困难
检测和恢复:允许死锁,按时检测,再采取解锁手段
避免:资源动态分配中,采取方法防止不安全的操作
2.7.2 安全状态
安全序列:系统按序列进行资源分配,每个进程都可以顺利完成
并非不安全状态都是死锁状态,进入不安全状态可能造成死锁。
避免死锁的实质是,避免进入不安全状态。
2.7.3 银行家算法
2.7.4 安全性算法
死锁解除:资源剥夺法;撤销进程法ÿ