操作系统第一次实验报告_操作系统临界区问题
更新时间:2024-05-22 20:49:01 阅读量: 综合文库 文档下载
- 操作系统第一次在线作业推荐度:
- 相关推荐
操作系统临界区问题
刘唯墨
一、实验目的
本实验讨论临界区问题及其解决方案。实验首先创建两个共享数据资源的并发线程。在没有同步控制机制的情况下,我们将看到某些异常现象。 针对观察到的现象,本实验采用两套解决方案: ? 利用Windows 的mutex 机制 ? 采用软件方案
然后比较这两种方案的性能优劣。
二、实验步骤 1、制造混乱
Windows 操作系统支持抢先式调度,这意味着一线程运行一段时间后,操作系统会暂停其运行并启动另一线程。也就是说,进程内的所有线程会以不可预知的步调并发执行。
为了制造混乱,我们首先创建两个线程t1 和t2。父线程(主线程)定义两个全局变量,比如accnt1 和accnt2。每个变量表示一个银行账户,其值表示该账户的存款余额,初始值为0。线程模拟在两个账户之间进行转账的交易。也即,每个线程首先读取两个账户的余额,然后产生一个随机数r,在其中一个账户上减去该数,在另一个账户上加上该数。代码如下:
#include
int accnt1=0; int accnt2=0; double begin=0; double end=0; double time=0; int a=1;
//HANDLE hMutex=CreateMutex(NULL,FALSE,NULL); DWORD WINAPI run(LPVOID p) { int counter=0;
int tmp1,tmp2,r;
//WaitForSingleObject(hMutex,INFINITE); begin=GetTickCount(); do {
tmp1=accnt1; tmp2=accnt2; r=rand();
accnt1=tmp1+r; accnt2=tmp2-r; counter++;
} while (accnt1+accnt2==0&&counter<1000000); end=GetTickCount(); time=end-begin;
printf(\进?程¨?%d所¨′用??时o?à间?为a%lf\\n\,a,time); a++;
//ReleaseMutex(hMutex); counter=0; return 0; }
int main(int argc, char *argv[]) {
CreateThread(NULL,0,run,NULL,0,NULL); CreateThread(NULL,0,run,NULL,0,NULL); system(\); return 0; }
执行结果如下:
从运行结果可以看出,每次进程2都可以全部完成,完成一次计数所需要的时间为62ms,而进城1无法全部完成,所用时间不一定。
混乱制造成功。
2、解决方案 方案一:mutex 方案
Windows 操作系统提供了mutex 对象。mutex 状态可以signaled(unlocked) 或者是nonsignaled (locked)。利用mutex 对象,可以方便地实现临界区保护。进入临界区时(在第一个读操作之前),锁住mutex 对象;离开临界区时(在第二个写操作之后),打开mutex 对象。线程的阻塞与唤醒由系统管理,程序员无需干预。以下给出的是在Windows 操作系统下有关mutex 对象操作的提示。创建一个未上锁mutex 对象的代码如下:
#include
int accnt1=0; int accnt2=0; double begin=0; double end=0; double time=0; int a=1;
HANDLE hMutex=CreateMutex(NULL,FALSE,NULL); DWORD WINAPI run(LPVOID p) { int counter=0; int tmp1,tmp2,r;
WaitForSingleObject(hMutex,INFINITE); begin=GetTickCount(); do {
tmp1=accnt1; tmp2=accnt2; r=rand();
accnt1=tmp1+r; accnt2=tmp2-r; counter++;
} while (accnt1+accnt2==0&&counter<1000000); end=GetTickCount(); time=end-begin;
printf(\进?程¨?%d所¨′用??时o?à间?为a%lf\\n\,a,time);
a++;
ReleaseMutex(hMutex); counter=0; return 0; }
int main(int argc, char *argv[]) {
CreateThread(NULL,0,run,NULL,0,NULL); CreateThread(NULL,0,run,NULL,0,NULL); system(\); return 0; }
运行结果如下:
从运行结果可以看出,利用mutex 方案并测定进城运行时间可以看出,两个进程运行时间大体相同,进程运行完全,从而可以认为mutex方案有效的防止了两个进程的相互交叉和阻碍。
方案二:软件方案
现在假设操作系统没有提供同步原语。这时,我们只能通过编程语言 对变量的操作实现临界区保护。下面给出的是一个概念性的解决方案框 架:
1 /_ CS Algorithm: Peterson Solution _/ 2 int c1 = 0, c2 = 0, will wait ; 3 cobegin
4 p1: while (1) { 5 c1 = 1;
6 will wait = 1;
7 while( c2 && (will wait==1) ); /_wait loop_/ 8 CS1; 9 c1 = 0; 10 program1; 11 } 12 p2: while (1) { 13 c2 = 1;
14 will wait = 2;
15 while( c1 && (will wait==2) ); /_wait loop_/ 16 CS2; 17 c2 = 0; 18 program2; 19 } 上面的方案使用了三个变量c1; c2 和will wait。线程i 试图进入临界 区时首先把变量ci 置为1,接着把变量will wait 的值设置为i(为什么?) 阻塞通过临界区之前的循环实现。当线程退出临界区时,又把变量ci 的值 设置为0。
代码如下:
#include
int accnt1=0,accnt2=0;
DWORD WINAPI run1(LPVOID p) {
int counter=0;
int tmp1=0,tmp2=0,r;
double begin=0,end=0,time=0; begin=GetTickCount(); do {
tmp1=accnt1; tmp2=accnt2; r=rand();
accnt1=tmp1+r; accnt2=tmp2-r; counter++;
} while (accnt1+accnt2==0&&counter<1000000); end=GetTickCount(); time=end-begin;
printf(\进?程¨?1所¨′用??时o?à间?为a%lf\,time); counter=0; return 0;






正在阅读:
1习题12-09
苏教版四年级上册《练习5》练习01-25
中考工作总结范本参考04-04
华软《趣味逻辑学》复习03-12
高中化学竞赛辅导练习12-07
年产500万米高压胶管建设项目可行性研究报告,2013年05-13
二年级奥数测试题04-23
优秀班主任申报材料02-19
前任攻略插曲02-13
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 操作系统
- 临界
- 第一次
- 实验
- 报告
- 问题
- 现代交换原理_思考与练习题答案
- 安全系统工程复习试题
- 江苏省兴化市2016-2017学年八年级《语文》上学期期末试题
- 绩效管理与绩效面谈培训教材
- 有机化学各大名校考研真题十六、十七、十八章
- 四级考试考点词汇及真题解析(A-M)
- 食品经营许可现场核查表
- 国家电网招聘考试2013真题
- 中国农业科学院博士研究生预防兽医学入学试题近5年考题
- 热力市场开发管理办法
- 交通信号灯中黄灯闪亮时间分析建模论文
- 甲级单位编制门铃IC项目可行性报告(立项可研+贷款+用地+2013案
- 人教版九年级思想品德第三次月考试卷
- 可研报告
- 竹鼠养殖产业化扶贫项目申报建议书 - 图文
- 2018年中国石油化工行业行业发展趋势报告目录
- 环境法第1-2章模拟练习题
- 2010年9月18日公务员考试行测真题
- 河南省新版继电保护复习题1
- 2高考文言文阅读题汇编