本文为阅读操作系统原理及网上博客的笔记及自己的总结,以备查阅回顾
操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。
互斥:多个进程不能同时使用同一个资源;竞争使用临界资源;导致死锁(两进程临界资源相互依赖却同时被占用),饥饿(有些进程永远执行不到)
同步:一个进程的执行受其他进程的影响,需要其他进程的某些内容作为继续执行的依据;
异步:两进程执行完全不相互影响;
通信:多个进程间交换信息;比如互斥的信息,同步的信息;
临界(互斥)资源:一次只允许一个进程使用的资源
临界区:进程中访问临界资源的代码段
进入区:检查临界资源,设置标志
退出区:恢复访问标识
剩余区:上述三区之外
互斥和同步并不对立,互斥也是一种同步;
实现进程互斥的同步机制准则:空闲让进,忙则等待,有限等待,让权等待
互斥实现的硬件方法:
1. 禁止中断,代价高,多CPU中对其他CPU不起作用
2. 专用机器指令
TS指令(Testand Set),类似酒店房间门口需打扫标志,有的,才可以进去打扫
描述函数:int ts(int lock)
{
Int ts =lock;
Lock=1;
Return ts;
}
Swap指令
增加了一个管理员老大爷,保管者唯一的钥匙,取到钥匙才可以进去(),用完退回老大爷
硬件方法的优点:适用范围广,简单,支持多临界区
缺点:会死等,有可能饥饿死锁
软件方法:
简单的设置一个标识是不妥当的,有可能同时进入需增加额外的标识,麻烦,且面对多进程时表述困难
信号量(信号灯 semaphore)引入:Dijkstra提出,(熟悉不,想想著名的Dijkstra算法)
是一个结构体,包含信号量的值与指向等待该信号的队列的指针
其由操作系统维护,用户只能初始化,与使用两原语(前面介绍过原语)
P原语:执行信号量减一,小于0,进程阻塞,插入等待队列
V原语:信号量加一,小于等于0,唤醒等待队列进程
注意,信号量不止表示资源的占用情况,还可以表示等待队列中进程的数目(信号量小于0时,其绝对值表示)
管程:
PV操作分散在多个进程中,管理不便,使用有可能不当
引入新的进程同步工具-----管程
其定义了一个包含资源的数据结构,和一组操作,能同步进程,改变数据(挺像C++的类的)
管程内部数据只由内部函数访问,函数分内外;外部函数(entry)是对外接口
管程每次只允许一个进程进入;故管程入口处有一入口等待队列
管程内部的唤醒,出现多个等待进程,组成紧急等待队列,优先级高于入口队列,且最新唤醒的先执行
管程的互斥访问由编译程序在编译时自动添加。是一个语言成分,是操作系统的固有成分
管程内部不同等待原因的变量c可以进行操作
cwaitn(c)操作:紧急等待队列有进程,调出执行第一个,否则释放管程互斥权,本进程进入c变量等待队列
csignal(c)操作:C非空,唤醒第一个等待进程,本进程进入紧急等待队列尾部