- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实 验 报 告
实验课程: 计算机操作系统
学生姓名: 郭慧
学 号: 6100512019
专业班级: 电子商务121班
2014 年 5 月 30 日
目 录
实验一 ………………………………………………………03
实验二 ………………………………………………………12
实验三 ………………………………………………………19
南昌大学实验报告
学生姓名: 郭慧 学号: 6100512019 专业班级: 电子商务121班
实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 2014-5-16 实验成绩:
实验1 进程/线程同步
一、实验目的
本实验讨论临界区问题及其解决方案。首先创建两个共享数据资源的并发线程。在没有同步控制机制的情况下,我们将看到某些异常现象。针对观察到的现象,本实验采用两套解决方案:
? 利用Windows的mutex机制
? 采用软件方案
然后比较这两种方案的性能优劣。
二、实验内容
2.1 进程/线程并发执行
Windows操作系统支持抢先式调度,这意味着一线程运行一段时间后,操作系统会暂停其运行并启动另一线程。也就是说,进程内的所有线程会以不可预知的步调并发执行。为了制造混乱,我们首先创建两个线程t1和t2。父线程(主线程)定义两个全局变量,比如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 ) ;
两个线程执行相同的代码。只要它们的执行过程不相互交叉,那么两个账户的余额之和将永远是0。但如果发生了交叉,那么某线程就有可能读到新的accnt1值和老的accnt2值,从而导致账户余额数据发生混乱。线程一旦检测到混乱的发生,便终止循环并打印交易的次数(counter)。
请编写出完整的程序代码并运行,然后观察产生混乱需要的时间长短。因为这是我们编写的第一个程序,因此这里我给出了完整的代码,请参考。有能力的同学在参考下面的代码之前,请先自己尝试一下。
#include stdio.h
#include stdlib.h
#include windows . h
int accnt1 = 0 ;
int accnt2 = 0 ;
DWORD WINAPI run ( LPVOID p) {
int count e r=0;
int tmp1 , tmp2 , r ;
do {
tmp1 = accnt1 ;
tmp2 = accnt2 ;
r = rand ( ) ;
accnt1 = tmp1 + r ;
accnt2 = tmp2 ? r ;
count e r++;
} while ( accnt1 + accnt2 == 0 ) ;
printf ( ”%d\n” , count e r ) ;
}
int main ( int argc , char ?argv [ ] )
{
CreateThread (NULL,
0 ,
run ,
NULL,
0 ,
NULL) ;
CreateThread (NULL,
0 ,
run ,
NULL,
0 ,
NULL) ;
system( “PAUSE”) ;
return 0 ;
}
反复运行该程序。请问,观察到了什么?你能解释这些现象吗?
2.2 临界区问题之解决方案
上面例子中,线程执行的代码叫做临界区,因为两个线程在这里访问了同样的数据,
在没有保护的情况下,有可能发生混乱。解决该问题有两套方案。其一,如果操作系统提
供了同步原语,例如mutex,那么就可直接利用该原语对临界区进行排它性的存取保护。其
二,如果操作系统不提供这样的原语,那么可用软件方案加以解决。本实验中,我们将实
现并比较这两种方案。
2.2.1 mutex方案
Windows操作系统提供了mutex对象。mutex状态可以是signaled (unlocked) 或者
文档评论(0)