操作系统教程第5版第3章【PV】.pptx

  1. 1、本文档共83页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

第4章同步、通信与死锁;4.1并发进程;4.1.1顺序程序设计;顺序程序设计特点;4.1.2进程的并发性;并行工作图示;并发的实质;3、与时间有关的错误;3、与时间有关的错误(例子1);3、与时间有关的错误(例子2);11;12;3、与时间有关的错误(例子3);T1、T2并发执行,可能出现如下交叉情况:

T1:X1=Aj;//X1=m

T2:X2=Aj;//X2=m

T2:X2--;Aj=X2;{输出一张票};//Aj=m-1

T1:X1--;Aj=X1;{输出一张票};//Aj=m-1

同一张票卖给两位旅客;(永远等待)主存管理问题;若对borrow和return的并发执行不加限制将会导致错误,例如:

Borrow:while(BX);

Return:X=X+B;{修改主存分配表};{释放等待主存资源的进程};

此时,因为borrow还没有进入等待队列,因此,return的释放操作是空操作,当borrow进入等待队列时,可能没有进程再来归还,处于永远等待状态。;3.1.3进程的交互:竞争与协作(1)

第一种是竞争关系;进程的交往:竞争与协作(2)

第二种是协作关系;4.2临界区管理;20;21;22;4.2.1互斥与临界区(1);24;互斥与临界区(2);26;软件方案

Dekker解法、Peterson解法

硬件方案

屏蔽中断、TSL(XCHG)指令;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;Peterson算法;4.2.4实现临界区管理的硬件设施;“开关中断”指令(特权指令)可实现原语操作

操作步骤如下:

Step1:执行“关中断”指令

Step2:临界区操作

Step3:执行“开中断”指令;关中断;测试并建立指令TS指令的处理过程;测试并建立指令;对换指令(1);对换指令(2);软件方法:开销,编程技巧

硬件方法

忙等待(busywaiting)

进程在得到临界区访问权之前,持续测试而不做其他事情(单处理器避免使用)

自旋锁Spinlock(多处理器);4.3信号量与PV操作;进程同步:

指系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务;4.3.1同步和同步机制;生产者--消费者问题表述;生产者-消费者问题算法描述(1);生产者-消费者问题算法描述(2);62;63;64;生产者-消费者问题解决方法的不足;4.3.2信号量与PV操作;信号量与PV操作(3);68;信号量与PV操作;70;71;72;73;74;75;76;77;78;79;#includestdio.h

#includestdlib.h

#includeunistd.h

#includesemaphore.h

#includepthread.h

#definep(x)sem_wait(x)//intsem_wait(sem_t*sem);

#definev(x)sem_post(x)

sem_tfull,empty;//sem_t信号量数据类型

pthread_mutex_tmutex;//pthread_mutex_tlinux线程互斥量

intcount;

voidinit(){

sem_init(full,0,0);

sem_init(empty,0,100);

count=100;

};void*_producer(){

while(1){

p(full);

pthread_mutex_lock(mutex);

count=count+1;

printf([++]:Nowtherehas%dthings\n,count);

pthread_mutex_unlock(mutex);

sleep(5);

v(empty);

}

}

void*_consumer(){

while(1){

p(empty);

pthread_mutex_lock(mutex);

count=count-1;

printf([--]:Nowtherehas%dthings\n,count);

pthread_mutex_unlock(mutex);

sleep(1);

v(full);

}

};intmain(){

init();intconsumers[2];

pthread_tb;

pthread_tpthreads[2];

pthread_create(b,NULL,_producer,NULL);

for(inti=0;i2;i

文档评论(0)

海松 + 关注
实名认证
内容提供者

好文件大家都可以下载

1亿VIP精品文档

相关文档