资源描述:
《页面置换实验》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、操作系统实验指导书2010年4月26日实验一线程同步1.1实验简介#whatdiskimageswillbeusedfloppya:1_44=balder10.img,status=insertedabcsdfdfdfsdfdd本实验讨论临界区问题及其解决方案。实验首先创建两个共享数据资源的并发线程。在没有同步控制机制的情况下,我们将看到某些异常现象。针对观察到的现象,本实验采用两套解决方案:•利用Windows的mutex机制•采用软件方案然后比较这两种方案的性能优劣。1.2制造混乱Windows操作系统支持抢先式调度,这意味着一线程运行一
2、段时间后,操作系统会暂停其运行并启动另一线程。也就是说,进程内的所有线程会以不可预知的步调并发执行。为了制造混乱,我们首先创建两个线程t1和t2。父线程(主线程)定义两个全局变量,比如accnt1和accnt2。每个变量表示一个银行账户,其值表示该账户的存款余额,初始值为0。线程模拟在两个账户之间进行转账的交易。也即,每个线程首先读取两个账户的余额,然后产生一个随机数r,在其中一个账户上减去该数,在另一个账户上加上该数。线程操作的代码框架如下:1counter=0;2do{11.2制造混乱实验一线程同步3tmp1=accnt1;4tmp2=a
3、ccnt2;5r=rand();6accnt1=tmp1+r;7accnt2=tmp2 r;8counter++;9}while(accnt1+accnt2==0);10print(counter);两个线程执行相同的代码。只要它们的执行过程不相互交叉,那么两个账户的余额之和将永远是0。但如果发生了交叉,那么某线程就有可能读到新的accnt1值和老的accnt2值,从而导致账户余额数据发生混乱。线程一旦检测到混乱的发生,便终止循环并打印交易的次数(counter)。请编写出完整的程序代码并运行,然后观察产生混乱需要的时间长短。因为这是我们编写
4、的第一个程序,因此这里我给出了完整的代码,请参考。有能力的同学在参考下面的代码之前,请先自己尝试一下。1#include2#include3#include45intaccnt1=0;6intaccnt2=0;78DWORDWINAPIrun(LPVOIDp){9intcounter=0;10inttmp1,tmp2,r;1112do{13tmp1=accnt1;14tmp2=accnt2;15r=rand();16accnt1=tmp1+r;17accnt2=tmp2 r;18co
5、unter++;19}while(accnt1+accnt2==0);20printf("%d",counter);21}2223intmain(intargc,char∗argv[])24{25CreateThread(NULL,21.3临界区问题之解决方案实验一线程同步260,27run,28NULL,290,30NULL);3132CreateThread(NULL,330,34run,35NULL,360,37NULL);3839system("PAUSE");40return0;41}反复运行该程序。请问,观察到了什么?你能解释
6、这些现象吗?1.3临界区问题之解决方案上面例子中,线程执行的代码叫做临界区,因为两个线程在这里访问了同样的数据,在没有保护的情况下,有可能发生混乱。解决该问题有两套方案。其一,如果操作系统提供了同步原语,例如mutex,那么就可直接利用该原语对临界区进行排它性的存取保护。其二,如果操作系统不提供这样的原语,那么可用软件方案加以解决。本实验中,我们将实现并比较这两种方案。1.3.1mutex方案Windows操作系统提供了mutex对象。mutex状态可以是signaled(unlocked)或者是nonsignaled(locked)。利用m
7、utex对象,可以方便地实现临界区保护。进入临界区时(在第一个读操作之前),锁住mutex对象;离开临界区时(在第二个写操作之后),打开mutex对象。线程的阻塞与唤醒由系统管理,程序员无需干预。以下给出的是在Windows操作系统下有关mutex对象操作的提示。创建一个未上锁mutex对象的代码如下:1HANDLEhMutex=CreateMutex(NULL,2FALSE,3NULL);31.3临界区问题之解决方案实验一线程同步给mutex对象上锁的代码如下:1WaitForSingleObject(hMutex,INFINITE);打开
8、mutex对象的代码如下:1ReleaseMutex(hMutex);根据以上提示,编写出用mutex对象保护临界区的解决方案。完成后,请思考以下问题:假设把加锁和