进程管理
- PCB
1.进程控制块PCB是进程存在的唯一标志,存在于内核的地址空间!系统通过PCB对进程进行控制和管理
2.PCB包含的信息:进程标志符PID、状态、优先级、代码运行入口地址、程序的外存地址、代码段数据段堆栈段指针、文件描述符、处理机中各寄存器的值!! - 进程状态:新建、就绪、运行、阻塞、结束
- 进程通信
1.PV(低级通信)
2.共享存储:一块物理内存区域同时映射到两个进程的地址空间中
3.消息传递:利用操作系统提供的消息传递方法(发送消息、接受消息原语)进行数据交换。通过原语直接将消息放置到另一个进程的消息缓冲队列中。
4.管道通信:A向位于内核的共享存储区域(管道)写数据,B从该共享区域读数据;只能半双工;管道被Linux视为文件 - 调度的层次
1.作业调度:内存与外存之间的调度 => 从外存后备队列中选择作业调入内存并创建相应的进程。作业调度经历了进程的创建与就绪两种状态
2.中级调度:将暂时不能运行的进程调至外存等待,进程此时处于挂起态,当内存空间宽松时再将挂起的就绪进程调入内存
3.进程调度:从就绪队列中选择一个进程并为其分配处理机
- 典型的调度算法
1.先来先服务(FCFS):先进入队列的先调度
2.短作业优先(SJF):选择估计运行时间最短的作业/进程
3.优先级调度:…
4.高响应比优先:用于作业调度,响应比=(等待时间+服务时间)/服务时间
5.时间片轮转:…
6.多级反馈队列:…详见书籍
可用于作业调度:FCFS、SJF、优先级调度、高响应比优先
可用于进程调度:FCFS、SJF、优先级调度、时间片轮转、多级反馈队列 - 同步与互斥的关系
互斥:散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。
同步:散布在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。
关系:同步也是不能同时运行,但他有进一步的约束=>需要按照一定的先后次序运行各进程片段。 多数情况下同步已经实现了互斥,或者说同步是一种特殊的互斥 - 信号量
定义:
typedef struct{
int value; //大于0时代表该资源的数量; 小于0代表申请该资源的数量
struct process* L; //用于链接等待该资源的所有进程
}semaphore;
P操作:
void wait(semaphore S){
S.value--; //申请一个该资源
if(S.value<0){
add this process to S.L;
block(S.L);
}
}
V操作:
void signal(semaphore S){
S.value++; //释放一个该资源
if(S.value<=0){ //有需要该资源的进程 => 唤醒一个进程 (注意此处要取等)
remove a process P from S.L;
wakeup(P);
}
}
- 在同步互斥问题中如何应用信号量
同步:若某个行为要用到某种资源,则在该行为前P该类资源; 若某个行为会提供某种资源,自在该行为后V该类资源
互斥:P、V操作要紧夹着使用互斥资源的行为,中间不能有其他冗余代码 - 关于死锁
1.死锁的定义:多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都无法向前推进
2.死锁产生的原因:a.系统资源的竞争,资源总数不足以满足多个进程的需要(比如有3个进程,都需要某类资源2个,如果该类资源总数少于4个,则可能产生死锁=>比如只有3个资源且一个进程已经占用一个资源,则会导致所有进程等待第二个资源,从而死锁);b.进程推进顺序非法(请求和释放资源的顺序不当、信号量使用不当)
3.死锁产生的必要条件:互斥条件、不剥夺条件、请求并保持条件、循环等待条件(循环等待不是死锁的充分条件,因为即使资源分配图含圈,若某个进程能从圈外获得资源,也不会导致死锁)
4.死锁的解决方案… - 死锁的解决方法
1.(事先)死锁预防:破坏死锁产生的四个必要条件之一即可
2.(事先)死锁避免:资源动态分配过程中,检测死锁的不安全状态,避免发生死锁=>银行家算法
3.(事后)死锁检测与解除:a死锁检测:简化资源分配图可检测是否为死锁状态(翻书死锁定理); b死锁解除:资源剥夺、撤销进程、进程回退
内存管理
- 程序的装入和链接
过程:编译 => 链接 => 装入
链接的三种方式:a.静态连接; b.装入时动态链接; c.运行时动态链接
装入的三种方式:a.绝对装入:逻辑地址与内存地址完全相同,仅适用于单道程序; b.可重定位装入(静态重定位):装入时将各模块从0开始的逻辑地址修改为统一的地址,且需要一次分配全部内存空间!; c.动态运行时装入(动态重定位):地址转换推迟到程序运行时,在程序运行前只需装入部分代码即可 - 内存的分配方式
连续分配:单一连续分配(单道)、固定分区分配(内部碎片)、动态分区分配(外部碎片)
非连续分配:分页、分段、段页式 - 基本的分页存储管理
注意:a.与加入虚拟内存机制后的请求分页方式中,页表项的区别(后者有磁盘地址); b.在程序装入时应该为每个进程填充页表项
改进=> 多级页表(增加访存次数)、快表(高速缓存中) - 基本的分段式存储管理
注意:分段式地址是二维的; 物理地址计算方式与分页的区别 - 虚拟内存
由于不是一次全部装入,页表项需要包含外存地址字段、状态位等(请求分页、分段都可实现虚拟内存):
- 页面置换算法
最佳置换(OPT)、先进先出(FIFO)、最近最久未使用(LRU)、时钟置换(Clock)
杂七杂八
- 从用户态切换到和内核态的唯一途径=> 中断或异常(系统调用也需要发起中断)
- 管道:映射到内核地址空间的一块内存区域,被linux视为一个特殊的文件(但并不是位于磁盘上的文件)
- 临界区:访问临界资源的那段代码