信号量机制 整型信号量 最初由Dijkstra把整型信号量定义为一个整型量除初始化外仅能通过两个标准的原子操作(Atomic Operation) wait(S)和signal(S)来访问这两个操作一直被分别称为PV操作wait和signal操作可描述为 wait(S): while S≤ do noop S∶=S; signal(S): S∶=S+; 记录型信号量 在整型信号量机制中的wait操作只要是信号量S≤就会不断地测试因此该机制并未遵循让权等待的准则而是使进程处于忙等的状态记录型信号量机制则是一种不存在忙等现象的进程同步机制但在采取了让权等待的策略后又会出现多个进程等待访问同一临界资源的情况为此在信号量机制中除了需要一个用于代表资源数目的整型变量value外还应增加一个进程链表L用于链接上述的所有等待进程记录型信号量是由于它采用了记录型的数据结构而得名的它所包含的上述两个数据项可描述为 type semaphore=record value:integer; L:list of process; end 相应地wait(S)和signal(S)操作可描述为 procedure wait(S) var S: semaphore; begin Svalue∶=Svalue; if Svalue< then block(SL) end procedure signal(S) var S: semaphore; begin Svalue∶=Svalue+; if Svalue≤ then wakeup(SL); end 在记录型信号量机制中Svalue的初值表示系统中某类资源的数目因而又称为资源信号量对它的每次wait操作意味着进程请求一个单位的该类资源因此描述为Svalue∶=Svalue当Svalue<时表示该类资源已分配完毕因此进程应调用block原语进行自我阻塞放弃处理机并插入到信号量链表SL中可见该机制遵循了让权等待准则此时Svalue的绝对值表示在该信号量链表中已阻塞进程的数目对信号量的每次signal操作表示执行进程释放一个单位资源故Svalue∶=Svalue+操作表示资源数目加若加后仍是Svalue≤则表示在该信号量链表中仍有等待该资源的进程被阻塞故还应调用wakeup原语将SL链表中的第一个等待进程唤醒如果Svalue的初值为表示只允许一个进程访问临界资源此时的信号量转化为互斥信号量 AND型信号量 在两个进程中都要包含两个对Dmutex和Emutex的操作即 process A: process B: wait(Dmutex); wait(Emutex); wait(Emutex); wait(Dmutex); 若进程A和B按下述次序交替执行wait操作 process A: wait(Dmutex); 于是Dmutex= process B: wait(Emutex); 于是Emutex= process A: wait(Emutex); 于是Emutex= A阻塞 process B: wait(Dmutex); 于是Dmutex= B阻塞 AND同步机制的基本思想是将进程在整个运行过程中需要的所有资源一次性全部地分配给进程待进程使用完后再一起释放只要尚有一个资源未能分配给进程其它所有可能为之分配的资源也不分配给他亦即对若干个临界资源的分配采取原子操作方式要么全部分配到进程要么一个也不分配由死锁理论可知这样就可避免上述死锁情况的发生为此在wait操作中增加了一个AND条件故称为AND同步或称为同时wait操作即Swait(Simultaneous wait)定义如下 Swait(S S … Sn) if Si≥ and … and Sn≥ then for i∶= to n do Si∶=Si; endfor else place the process in the waiting queue associated with the first Si found with Si< and set the program count of this process to the beginning of Swait operation endif Ssignal(S S … Sn) for i∶= to n do Si=Si+; Remove all the process waiting in the queue associated with Si into the ready queue endfor; 信号量集 Swait(S t d … Sn tn dn) if Si≥t and … and Sn≥tn then for i∶= to n do Si∶=Sidi; endfor else Place the executing process in the waiting queue of the first Si with Si<ti and set its program counter to the beginning of the Swait Operation endif signal(S d … Sn dn) for i∶= to n do Si∶=Si+di; Remove all the process waiting in the queue associated with Si into the ready queue endfor; 一般信号量集的几种特殊情况() Swait(S d d)此时在信号量集中只有一个信号量S但允许它每次申请d个资源当现有资源数少于d时不予分配() Swait(S )此时的信号量集已蜕化为一般的记录型信号量(S>时)或互斥信号量(S=时) () Swait(S )这是一种很特殊且很有用的信号量操作当S≥时允许多个进程进入某特定区当S变为后将阻止任何进程进入特定区换言之它相当于一个可控开关 了解更多计算机相关基础课程视频 [] [] [] |