- 1、本文档共50页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
04th _经典IPC问题
2.3.4 信号量(Semaphore); P、V原语作为操作系统内核代码的一部分,是一 种不可分割的原子操作(atomic action),在其 运行时,不会被时钟中断所打断;
P、V原语包含有进程的阻塞和唤醒机制,因此 在进程等待进入临界区时不会浪费CPU时间;;信号量和P、V原语的实现;P原语:申请一个资源; V原语:释放一个资源;Windows 2000
CreateSemaphore(创建信号量)
WaitForSingleObject(P操作)
ReleaseSemaphore(V操作)
?COS-II
osSemCreate(创建信号量)
osSemPend (P操作)
osSemPost(V操作);利用信号量来实现进程互斥;2.3.5 进程的同步;如何实现A先执行,然后B执行?;while(1)
{
….
A;
V(S);
….
};【例子1】 合作进程的执行次序
用进程流图来描述各进程合作完成某一任务的次序,其规则如下:;用信号量及P、V操作来描述左图
1、说明进程的同步关系
进程P1、P2可并行执行,P3的执行必须等待P1、P2都完成后才能开始执行。
几个同步关系?;main()
{
//均初始化为0
semaphore S13, S23;
cobegin
P1;
P2;
P3;
coend
};【例子2】 司机与售票员;while(上班时间)
{ P(S_DoorClose);
发动汽车;
正常运行;
到站停车; V(S_Stop);
};【例子3】共享缓冲区的合作进程的同步;buffer;1. 问题分析,弄清楚同步关系:
要保证打印结果的正确,Compute和Print进程必
须遵循以下同步规则:
当Compute把数据送入buffer后,Print才能从buffer中取,否则它必须等待(先存后取);
当Print从buffer取走数据后,Compute才能将新数据送buffer,否则也须等待(先取后存);semaphore S_Buffer; // 缓冲区是否有空间,初值1
semaphore S_Data; // 是否有数据需打印,初值0;2.4 经典的IPC问题;2.4.1 生产者—消费者问题;1;问题分析;semaphore S_Buffer_Num; // 空闲的缓冲区个数, // 初值为N
semaphore S_Product_Num; // 缓冲区当中的产品个 // 数,初值为0
semaphore S_Mutex; // 用于互斥访问的信号 // 量,初值为1;void producer(void){ int item;
while(TRUE)
{ item = produce_item( ); // 制造一个产品 P(S_Buffer_Num); // 是否有空闲缓冲区 P(S_Mutex); // 进入临界区 insert_item(item); // 产品放入缓冲区 V(S_Mutex); // 离开临界区 V(S_Product_Num); // 新增了一个产品 }
};void consumer(void){ int item;
while(TRUE)
{ P(S_Product_Num); // 缓冲区中有无产品 P(S_Mutex); // 进入临界区 item = remove_item( ) // 从缓冲区取产品 V(S_Mutex); // 离开临界区 V(S_Buffer_Num); // 新增一个空闲缓冲区 consume_item(item); // 使用该产品 }
};void consumer(void){ int item;
while(TRUE)
{ P(S_Product_Num); P(S_Mutex); item = remove_item( ) consume_item(item); V(S_Mutex); V(S_Bu
文档评论(0)