聊城大学计算机学院计算机操作系统课件 第2章(1).ppt

聊城大学计算机学院计算机操作系统课件 第2章(1).ppt

  1. 1、本文档共96页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
TEST-AND-SET指令 Check: TSL register,flag ;将内存地址flag中值读入register,将1写入flag   CMP register,#0 ;检测register JNE Check ;非零则循环检测 临界段CS MOV flag,#0 ;清flag位 RET TSL指令用于互斥功能的汇编代码 例:有语句: S1:a:=x+y; S2: b:=z+1; S3: c:=a-b; S4: w:=c+1 判断S1和S2是否可以并发执行: R(S1)∩W(S2)∪R(S2) ∩W(S1) ∪W(S1) ∩W(S2)={ } 所以可以正确并发。 判断S2和S3是否可以并发执行 R(S2)∩W(S3)∪R(S3) ∩W(S2) ∪W(S2) ∩W(S3)= {b} 所以不能并发执行。 各自的读集和写集为: R(S1)={x,y} W(S1)={a}; R(S2)={z} W(S2)={b}; R(S3)={a,b};W(S3)={c}; R(S4)={c} W(S4)={w} Bernstein条件举例 进程引入 操作系统的基本特性是并发与共享,即在系统中(内存)同时存在几个相互独立的程序,这些程序在系统中既交叉地运行,又要共享系统中的资源,这就会引起一系列的问题,包括:对资源的竞争、运行程序之间的通信、程序之间的合作与协同等。 要解决这些问题,用程序的概念已经不能描述程序在内存中运行的状态,必须引入新的概念--进程。 为了控制和协调各程序段在执行过程当中的软硬件资源共享和竞争,必须有一个描述各程序执行过程和共享资源的基本单位。(这个单位被称为进程或任务) 例如编译程序P,可编译两个源程序程序A、B,当编译A工作到某点发生磁盘输入数据中断,编译程序可编译B。很显然,P不能作为占有处理器的单位。可以将P与服务对象联系起来,为A服务构成进程A,为B服务构成进程B。这两个进程同时执行其彼此按照各自的进度独立推进。 * 在一个实际操作系统中,为了方便管理和调度,往往设置多种进程状态,如UNIX进程的状态为9态,Linux为6态。 * 在某些系统中,进程可以执行一个诸如pause的系统调用来进入阻塞状态。在其他系统中,包括UNIX,当一个进程从管道或设备文件(如终端)读取数据时,如果没有有效的输入存在,则进程会被自动阻塞。 * 当一个具有较高优先级的挂起等待态进程所等待的事件完成后,他需要抢占CPU,而此时主存空间不够,可能会导致正在运行的进程转换为挂起就绪态。另外运行态进程也可自我挂起。 * * 采用这种树形方式,对进程的控制更为方便、灵活。 kill是给别的进程发一个信号,进程接受到信号后,就会作相应的动作或者缺省的动作。一般缺省的动作是终止。但是如果自己写信号的处理,就可以不终止。 exit是进程自己终止了。 Exit(status)中status是终止码,是终止进程向父进程传送的参数 创建子进程的父进程可以通过系统调用pid=wait (status)等待它的一个子进终止。 如果一个父进程fork了一个或几个子进程,当一个或多个子进程终止时,父进程则使用wait()函数来获取已经终止子进程的状态,释放子进程占用的系统资源,避免产生僵尸进程;这个一般是必需的; 调用wait()函数会产生一下几种情况: a:如果调用此函数的进程没有子进程,则立即出错返回; b:如果调用此函数的进程的所有子进程都在运行,则阻塞; c:此点最重要:在调用此函数的进程的所有子进程中,如果有其中一个子进程终止,则wait()函数取得该子进程的状态后会立即返回;而并非只是最后一个子进程结束时wait()函数才能返回。所以有多个进程的话,需要多次调用wait()函数才能避免僵尸进程。 其实在实际程序中,一般用使用waitpid()代替wait(),因为waitpid()可以不阻塞;另外如果有多子进程一起结束,一起产生几个SIGCHLD信号,因为信号是不排队的,是会丢失的,所以可能导致父进程只会调用一次wait(),只能获取其中一个已结束的子进程的状态,其它的几个已经结束的子进程可能就会变成僵尸进程;鉴于以上两种原因:一般在在程序中使用while((pid=waitpid(-1,NULL,WNOHONG)) 0 )来代替wait()。 Sleep(chan disp)是内核函数用户是不能直接调用, UNIX向用户另外提供了一个系统调用 sleep(seconds); int seconds Java多线程中:sleep( ):暂停/休眠指定的时间,到时间

您可能关注的文档

文档评论(0)

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

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档