操作系统课程设计---信号量的操作.doc_第1页
操作系统课程设计---信号量的操作.doc_第2页
操作系统课程设计---信号量的操作.doc_第3页
操作系统课程设计---信号量的操作.doc_第4页
操作系统课程设计---信号量的操作.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

0 操作系统操作系统课程设计课程设计 专业: 计算机科学与技术 班级: 学 号姓 名成绩 题目名称: 信号量的操作 完成日期: 2011 年 12 月 22 日 1 目录目录 第一章第一章 概述概述 -2 1 1实验目的实验目的 -2 2 2、开发平台及实验环境:、开发平台及实验环境: -3 3 3、实验要求、实验要求 -3 第二章第二章 设计需求设计需求-3 1 1信号量的概念信号量的概念 -3 2 2信号量的分类信号量的分类 -4 3 3信号量于信号量于 pvpv 操作的关系操作的关系-4 第三章第三章 实例分析实例分析-5 1 1设计思想设计思想 -5 3 3运行结果截图运行结果截图 -10 4 4总结总结-11 参考文献参考文献-12 2 第一章第一章 概述概述 1 1实验目的实验目的 了解信号量机制,了解并掌握进程同步和互斥机制,熟悉信号量 的操作函数,利用信号量实现对共享资源的控制。 2 2、开发平台及实验环境:、开发平台及实验环境: 系统平台:windows 环境 实现语言:c+语言 开发工具:microsoft visual c+ 6.0 3 3、实验要求、实验要求 通过对 windows 系统的内核同步对象 mutexes 和 semaphores 的 使用来实现进程同步的控制。 利用 createsemaphore、waitforsingleobject 等函数检测内核同步 对象的状态。 第二章第二章 设计需求设计需求 1 1信号量的概念信号量的概念 信号量(semaphore),有时被称为信号灯,是在多线程环境下使 用的一种设施,是可以用来保证两个或多个关键代码段不被并发调 用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦 该关键代码段完成了,那么该线程必须释放信号量。其它想进入该 关键代码段的线程必须等待直到第一个线程释放信号量。为了完成 3 这个过程,需要创建一个信号量 vi,然后将 acquire semaphore vi 以及 release semaphore vi 分别放置在每个关键代码段的首末端。 确认这些信号量 vi 引用的是初始创建的信号量。 2 2信号量的分类信号量的分类 信号量按其用途分为两种: (1)公用信号量:初值常常为 1,用来实现进程间的互斥。相关进 程均可对其执行 p、v 操作。 (2) 私有信号量:初值常常为可用资源数,多用来实现进程同步。 拥有该信号量的一类进程可以对其执行 p 操作,而另一类进程可以 对其执行 v 操作,多用于并发进程的同步。 信号量按照取值可以分为两种: (1) 二元信号量: 仅允许取 0 和 1,主要用于解决进程互斥; (2) 一般信号量(计数信号量):允许取任意整数值,主要用于 解决进程同步问题。 3 3信号量于信号量于 pvpv 操作的关系操作的关系 p 操作 信号量的值减一 如果满足 if 条件,执行了 p 操作的进程会挂起,p 操作语 句之后的语句都不会再执行。 被挂起的进程,除非另一个进程调用 v()来唤醒它,否则永 远不会执行。 v 操作 信号量的值加一 如果满足 if 条件,执行 v 操作的进程会去唤醒另一个正在 等待的进程(被挂起的进程) 。 执行 v 操作的进程不会自愿停止, v 操作后面的语句会接 着执行 被唤醒的进程只是进入了就绪队列,并不一定有机会马上 被执行 4 被唤醒的进程,从挂起点接着执行,也就是 p 操作之后的 语句 第三章第三章 实例分析实例分析 1 1设计思想设计思想 假设某个饭店有一公共厕所,但是不分男女,老板规定,当有男生 上厕所时,其他男生可以进去,女生不能进入,有女生先进去的时 候其他女生可以进去,男生不能进入 2.2. 程序代码程序代码 #include #include #define threadcount 40 handle ghevent; int icurrentboy = 0; int icurrentgirl = 0; dword winapi boywerewcing( lpvoid ); dword winapi girlwerewcing( lpvoid ); void main() handle athreadthreadcount; dword threadid; int i; 5 / create a mutex with no initial owner ghevent = createevent( null, / default security attributes false, / be manual reset true, / initially not owned null); / unnamed mutex if (ghevent = null) printf(“createevent error: %dn“, getlasterror(); return; / create worker threads for( i=0; i threadcount; i+=2 ) athreadi = createthread( null, / default security attributes 0, / default stack size (lpthread_start_routine) boywerewcing, null, / no thread function arguments 0, / default creation flags / receive thread identifier if( athreadi = null ) printf(“createthread error: %dn“, getlasterror(); return; 6 athreadi+1 = createthread( null, / default security attributes 0, / default stack size (lpthread_start_routine) girlwerewcing, null, / no thread function arguments 0, / default creation flags / receive thread identifier if( athreadi+1 = null ) printf(“createthread error: %dn“, getlasterror(); return; / wait for all threads to terminate waitformultipleobjects(threadcount, athread, true, infinite); / close thread and mutex handles for( i=0; i threadcount; i+ ) closehandle(athreadi); closehandle(ghevent); 7 dword winapi boywerewcing( lpvoid lpparam ) dword dwwaitresult; if( icurrentboy = 0 ) dwwaitresult = waitforsingleobject( ghevent, / handle to mutex infinite); / no time-out interval icurrentboy+; else dwwaitresult = wait_object_0; icurrentboy+; switch (dwwaitresult) / the thread got ownership of the mutex case wait_object_0: _try / todo: was bathing printf(“boy were wcing.n“); icurrentboy-; _finally / release ownership of the mutex object if(icurrentboy = 0) 8 if (! setevent(ghevent) / deal with error. break; / the thread got ownership of an abandoned mutex case wait_abandoned: return false; return true; dword winapi girlwerewcing( lpvoid lpparam ) dword dwwaitresult; if( icurrentgirl = 0 ) dwwaitresult = waitforsingleobject( ghevent, / handle to mutex infinite); / no time-out interval icurrentgirl+; else dwwaitresult = wait_object_0; icurrentgirl+; 9 switch (dwwaitresult) / the thread got ownership of the mutex case wait_object_0: _try / todo: was bathing printf(“girl were wcing.n“); icurrentgirl-; _finally / release ownership of the mutex object if(icurrentgirl = 0) if (! setevent(ghevent) / deal with error. break; / the thread got ownership of an abandoned mutex case wait_abandoned: return false; return true; 10 3 3运行结果截图运行结果截图 4 4总结总结 刚刚看到课程设计的内容与要求时,不禁有点无从下手的感觉。经 过一番思考后,才决定选择设计“进程机制与并发程序设计 windows 下生产者与消费者的问题实现”这部分。设计这部分不仅 仅需要用到 c/c+编程,还需要编写相关的 pv 原语。由于自己的 pv 原语部分和 c/c+编程学的不是很好,因此对我来说有点难。于是 我就积极利用书本上的知识来编写 pv 原语,c/c+编程是参考书上 的指点以及网络资源编写出来的。不懂得地方查资料、上网找、问 问其他同学,最后终于慢慢的把课程设计做出来了。通过这次课程 设计,才感觉到自己还是平时动手少 ,要经常动手去做实验才能真

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论