ImageVerifierCode 换一换
格式:DOCX , 页数:42 ,大小:312.80KB ,
资源ID:5111616      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-5111616.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(南昌大学操作系统实验报告Word格式.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

南昌大学操作系统实验报告Word格式.docx

1、父线程(主线程)定义两个全局变量,比如accnt1和accnt2。每个变量表示一个银行账户,其值表示该账户的存款余额,初始值为0。线程模拟在两个账户之间进行转账的交易。也即,每个线程首先读取两个账户的余额,然后产生一个随机数r,在其中一个账户上减去该数,在另一个账户上加上该数。线程操作的代码框架如下:counter=0;do tmp1 = accnt1 ;tmp2 = accnt2 ;r = rand ( ) ;accnt1 = tmp1 + r ;accnt2 = tmp2 r ;counter+; while ( accnt1 + accnt2 = 0 ) ;print ( counter

2、 ) ;两个线程执行相同的代码。只要它们的执行过程不相互交叉,那么两个账户的余额之和将永远是0。但如果发生了交叉,那么某线程就有可能读到新的accnt1值和老的accnt2值,从而导致账户余额数据发生混乱。线程一旦检测到混乱的发生,便终止循环并打印交易的次数(counter)。请编写出完整的程序代码并运行,然后观察产生混乱需要的时间长短。因为这是我们编写的第一个程序,因此这里我给出了完整的代码,请参考。有能力的同学在参考下面的代码之前,请先自己尝试一下。#include stdlib.hwindows . hint accnt1 = 0 ;int accnt2 = 0 ;DWORD WINAP

3、I run ( LPVOID p) int count e r=0;int tmp1 , tmp2 , r ;count e r+;printf ( ”%dn” , count e r ) ;int main ( int argc , char argv )CreateThread (NULL,0 ,run ,NULL,NULL) ;system( “PAUSE”) ;return 0 ;反复运行该程序。请问,观察到了什么?你能解释这些现象吗?2.2 临界区问题之解决方案上面例子中,线程执行的代码叫做临界区,因为两个线程在这里访问了同样的数据,在没有保护的情况下,有可能发生混乱。解决该问题有两

4、套方案。其一,如果操作系统提供了同步原语,例如mutex,那么就可直接利用该原语对临界区进行排它性的存取保护。其二,如果操作系统不提供这样的原语,那么可用软件方案加以解决。本实验中,我们将实现并比较这两种方案。2.2.1 mutex方案Windows操作系统提供了mutex对象。mutex状态可以是signaled (unlocked) 或者是nonsignaled (locked)。利用mutex对象,可以方便地实现临界区保护。进入临界区时(在第一个读操作之前),锁住mutex对象;离开临界区时(在第二个写操作之后),打开mutex对象。线程的阻塞与唤醒由系统管理,程序员无需干预。以下给出的

5、是在Windows操作系统下有关mutex对象操作的提示。创建一个未上锁mutex对象的代码如下:HANDLE hMutex = CreateMutex (NULL,FALSE,给mutex对象上锁的代码如下:Wai tForSingleObject ( hMutex , INFINITE ) ;打开mutex对象的代码如下:ReleaseMutex ( hMutex ) ;根据以上提示,编写出用mutex对象保护临界区的解决方案。完成后,请思考以下问题:假设把加锁和开锁操作分别放置在第一个写操作之前和第二个写操作之后,能否实现临界区的保护,为什么?2.2.2 软件方案现在假设操作系统没有提供

6、同步原语。这时,我们只能通过编程语言对变量的操作实现临界区保护。下面给出的是一个概念性的解决方案框架:int c1 = 0 , c2 = 0 , willwait ;cobeginp1 : while ( 1 ) c1 = 1 ;willwait = 1 ;while ( c2 & (willwait =1) ) ; / wai t loop /CS1 ;c1 = 0 ;program1 ;p2 :c2 = 1 ;wi l l wa i t = 2 ;while ( c1 & (willwait =2) ) ;CS2 ;c2 = 0 ;program2 ;上面的方案使用了三个变量c1, c2和

7、willwait。线程i试图进入临界区时首先把变量ci置为1,接着把变量willwait的值设置为i(为什么?)阻塞通过临界区之前的循环实现。当线程退出临界区时,又把变量ci的值设置为0。在我们的例子中,临界区始于第一个读操作,结束于第二个写操作。请把上面的概念框架转换为可运行的C代码,实现临界区的保护。为了加快程序的执行速度,可在阻塞循环中增加一个Sleep(0)语句。这可以让不能进入临界区的线程马上放弃处理器,而不用无谓消耗处理器资源。最后,请比较mutex方案和软件方案的效率(执行相同的循环次数,计算消耗的时间。为了让结果更科学,请多次试验,然后计算平均值)。提示:时间度量可以用DWOR

8、D GetTickCount (VOID)在操作开始之前调用一次,操作结束之后再调用一次,两次调用所得到的返回值的差便是该操作所消耗的大致时间(单位毫秒)。3、实验代码、数据及处理结果#include stdafx.hint _tmain(int argc, _TCHAR* argv) return 0;windows.hint counter=0;accnt2 = tmp2 - r ;printf ( 循环1次数为%dn , counter ) ;printf (%d,%dnn,accnt1,accnt2) ;return 0;CreateThread (NULL,0 ,run ,NULL,

9、0 ,NULL) ;system( PAUSE) ; 由运行结果可观察出,当没有任何线程同步机制时,程序无法循环多次。原因是没有线程同步机制。2.21 mutex方案double begin=0;double end=0;double time=0;int a=1;HANDLE hMutex=CreateMutex(NULL,FALSE,NULL); while ( accnt1 + accnt2 = 0 &counterusing namespace std;#define False 0#define True 1int Max100100=0;int Allocation100100=0

10、;int Need100100=0;int Available100=0;int Work100=0;char name100=0;int temp100=0;int S=100,P=100;int safequeue100=0;int Request100=0;/void Showdata() int i,j,k,l; coutt资源分配情况nendl;tMaxt已分配tNeedt; for(j=0;j3;j+) for (i=0;iS;i+) coutnamei cout for(i=0;P; for (j=0;Maxij for (k=0;kk+)Allocationik for (l=

11、0;ll+)NeedilnAvailable for (i=0;Availableiint Judgesafe() int tempwork100100=0; int i,x,k=0,m,apply,Finish100=0; int j; int flag=0; Worki=Availablei; apply=0; for(j=0; if (Finishi=False&Needij=Workj) apply+; if(apply=S) for(m=0;mm+) tempworkim=Workm; Workm=Workm+Allocationim; Finishi=True; tempk=i;

12、i=-1; k+; flag+; if(Finishi=False)系统不安全 return -1;系统是安全的分配的序列:tempi; if(iP-1) coutvoid Changedata(int flag) for (int i=0; Availablei=Availablei-Requesti; Allocationflagi=Allocationflagi+Requesti; Needflagi=Needflagi-Requesti;void Share() int i,flag; char ch=Y输入请求资源的进程: cinflag; if (flag=P)此进程不存在! else输入此进程对各个资源的请求数量: cinRequesti; if (RequestiNeedflagi) cout进程flagAvailablei)申请的资源大于可利用的资源。分配不合理,不予分配! if (ch=) Changedata(flag); if (Judgesafe()=-1)申请资源后,系统进入死锁状态,分配失败! for (int i=0; Availablei=Availablei+Requesti; Allocationflagi=Allocationflagi

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2