收藏 分享(赏)

操作系统课程设计62330.doc

上传人:dreamzhangning 文档编号:2313670 上传时间:2018-09-10 格式:DOC 页数:11 大小:204.50KB
下载 相关 举报
操作系统课程设计62330.doc_第1页
第1页 / 共11页
操作系统课程设计62330.doc_第2页
第2页 / 共11页
操作系统课程设计62330.doc_第3页
第3页 / 共11页
操作系统课程设计62330.doc_第4页
第4页 / 共11页
操作系统课程设计62330.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、合肥工业大学计算机与信息学院第 1 页 共 11 页计算机与信息学院操作系统课程设计专 业 班 级信息安全 10-02 班 学生姓名及学号刘禹 20103046 课程教学班号0002 任 课 教 师田卫东老师 实验指导教师田卫东老师 实验地点逸夫实验楼 507 20122013 学年第 2 学期合肥工业大学计算机与信息学院第 2 页 共 11 页1、题目:多进程/线程编程:哲学家问题。设置进程/线程,描述哲学家 ;随机启动哲学家,显示进程/线程执行状态;随着线程的执行,更新显示;编写正确的哲学家程序,设法延迟线程的执行,使之出现死锁;编写正确的哲学家程序,保证不出现死锁;题目描述:哲学家问题:

2、由 Dijkstra 提出并解决,是典型的同步问题。问题描述有多个(设为 number)哲学家共用一张圆桌,分别坐在周围 number 个椅子上,在圆桌上有 number 个碗和 number 个筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐完毕,放下筷子继续思考。2、开发环境:开发工具:Visual C+ 6.0 ;开发环境:Windows 下多进程/线程编程开发语言:C+3、总体算法:设哲学家人数为 number(程序中赋值为 5) ,采用哲学家问题的一种解法:(1)采用 p、v 操作,哲学家

3、拿起筷子后就持有该资源,等到吃完放下筷子后其他哲学家才能拿起该筷子;同样,哲学家需要的某筷子被其他哲学家持有时,等待,进程因而阻塞。(2)第一个到第 number-1 个哲学家采用一种进程描述,先左手拿筷子,之后右手才能拿。(3)只有最后一个哲学家定义另一进程:必须拿右手边筷子,之后再拿左手边的筷子。合肥工业大学计算机与信息学院第 3 页 共 11 页(4)所采用方法其实质是编号资源的方法,把筷子看为临界资源,按其序号编号,哲学家只能由小到大申请资源即为本算法。(5)出现死锁的方法:最后一个哲学家也是先拿左手边的筷子,再拿右手边的筷子时就容易出现死锁。4、详细设计1.若干常量、变量的定义:co

4、nst int number=5;/哲学家人数const int sleep_time=10;/显示时间const int eating_time=50;/吃饭显示的时间CRITICAL_SECTION chopsticsnumber;/临界资源:筷子CRITICAL_SECTION cs;/控制打印的临界区变量,由于一段时间只能允许一个进程打印到屏幕,所以屏幕也为临界资源2.状态显示函数:定义了若干函数显示当前状态:thingking(int i) (哲学家 i 正在思考),hungry(int i) (饥饿) ,pickup(int i,int j) (哲学家 i 拿起了筷子 j),eat

5、ing(int i) (正在吃饭),putdown(int i,int j) (哲学家 i 放下筷子 j) 。另外定义了函数 xianshi(int i) ,每个状态显示函数都调用该函数,显示当前调用的进程。3.线程定义体:(1)参数为 void * i,i 即为调用的进程号,由于 void *表示为任意类型的指针,所以要强制类型转换:int num=(int)i;(2)pv 操作的实现方法:EnterCriticalSection() ,LeaveCriticalSection() ,EnterCriticalSection(/拿起左手边的筷子pickup(num,num);合肥工业大学计算

6、机与信息学院第 4 页 共 11 页EnterCriticalSection(/拿起右手边的筷子pickup(num,num+1);eating(num);/吃饭LeaveCriticalSection(/放下左边的筷子putdown(num,num);LeaveCriticalSection(/放下右边的筷子putdown(num,num+1);(3)线程主体为死循环,没有资源时阻塞4.主进程 main():(1)main 函数代码如下:HANDLE hThreadnumber;InitializeCriticalSection(/循环建立线程 0-3for (int i=0;ic/c+ -

7、Code Generator-use run-time library-Mulitthreaded DLL 3)主进程最后用 WaitForMultipleObjects(number,hThread,true,INFINITE);等待所有线程都执行完,否则阻塞。由于线程定义都是死循环,不可能执行完,所以这之后的语句执行不到。此句的作用:一,当不出现死锁时可以一直执行线程,二,是当出现死锁时,由于各线程阻塞也没法执行完,主进程因此也阻塞,最后出现死锁。五、执行结果一、不出现死锁:合肥工业大学计算机与信息学院第 6 页 共 11 页二、 出现死锁!六、总结以前没有接触过多线程编程的内容,这一次为

8、做本课程设计完全自学了好多内容。从网上搜了好多资料,一有不会的就百度。做的过程中也走了些弯路。比如开始时搞忘了数组是从 0 开始的,实际应是从 0-(number-1 ) ,好多函数的参数搞错了;还有当初不知道怎样实现 pv 操作;还有开始并没有完全弄清,不清楚 main 函数是主进程,也是会调用的,因此开始写的程序结果也不对,然后问别人才弄清楚的;程序写完后想润色一下,合肥工业大学计算机与信息学院第 7 页 共 11 页想把 WaitForMultipleObjects()做为 if 语句的条件判断,若出现死锁则显示:出现死锁!,运行却并不行,想了会才知道已经出现了死锁程序就阻塞了怎么可能还

9、会继续运行,还是因为当初没弄清。做完后很有成就感和充实感,因为学会了很多东西,从以前对多线程一无所知,到开始入门有所了解,而且还加深了对操作系统课本相关知识的理解。总之,做完后“感觉很好”!现在已经注意到实践的重要,以后会多动手编程,锻炼编程能力的同时还会加深对知识的理解,同时还能培养兴趣。七、代码#include #include #include const int number=5;/哲学家人数const int sleep_time=10;/显示时间const int eating_time=50;/吃饭显示的时间CRITICAL_SECTION chopsticsnumber;/临界

10、资源:筷子CRITICAL_SECTION cs;/控制打印的临界区变量/状态显示函数/显示被调用线程void xianshi(int i)EnterCriticalSection(cout“线程“i“被调用“:“ “;LeaveCriticalSection(return;/正在思考void thinking(int i)EnterCriticalSection(xianshi(i);cout“哲学家“i“在思考“endl;Sleep(sleep_time);LeaveCriticalSection(return;/正饥饿void hungry(int i)合肥工业大学计算机与信息学院第 8

11、 页 共 11 页EnterCriticalSection(xianshi(i);cout“哲学家“i“饥饿了“endl;Sleep(sleep_time);LeaveCriticalSection(return;/哲学家 i 拿起了筷子 jvoid pickup(int i,int j)EnterCriticalSection(xianshi(i);if (j=i)cout“哲学家“i“拿起左手边的筷子:-“jendl;else if(i=number-1)cout“哲学家“i“拿起右手边的筷子:-“0endl;elsecout“哲学家“i“拿起右手边的筷子:-“jendl;Sleep(sl

12、eep_time);LeaveCriticalSection(return;/显示正在吃饭void eating(int i)EnterCriticalSection(xianshi(i);cout“哲学家“i“正在吃饭“endl;Sleep(eating_time);LeaveCriticalSection(return;/显示放下筷子void putdown(int i,int j)EnterCriticalSection(xianshi(i);if (j=i)cout“哲学家“i“放下左手边的筷子:+“jendl;else if(i=number-1)cout“哲学家“i“放下右手边的筷

13、子:+“0endl;else合肥工业大学计算机与信息学院第 9 页 共 11 页cout“哲学家“i“放下右手边的筷子:+“jendl;Sleep(sleep_time);LeaveCriticalSection(return;/线程定义/用于定义哲学家 1-4UINT WINAPI ThreadFunc1(void * i)int num=(int)i;while (1)thinking(num);hungry(num);/wait=WaitForSingleObject(mutexnum,INFINITE);EnterCriticalSection(/拿起左手边的筷子pickup(num,

14、num);/wait=WaitForSingleObject(mutexnum+1,INFINITE);EnterCriticalSection(/拿起右手边的筷子pickup(num,num+1);eating(num);LeaveCriticalSection(/放下左边的筷子/ReleaseMutex(mutexnum);putdown(num,num);/ ReleaseMutex(mutexnum+1);LeaveCriticalSection(/放下右边的筷子putdown(num,num+1);return 1;/用于定义哲学家 5UINT WINAPI ThreadFunc2(

15、void * i)int num=(int)i;while (1)thinking(num);hungry(num);/wait=WaitForSingleObject(mutex0,INFINITE);EnterCriticalSection(/拿起右手边的筷子pickup(num,0);/ wait=WaitForSingleObject(mutexnum,INFINITE);EnterCriticalSection(/拿起左手边的筷子合肥工业大学计算机与信息学院第 10 页 共 11 页pickup(num,num);eating(num);/ ReleaseMutex(mutex0);

16、LeaveCriticalSection(/放下左边的筷子putdown(num,0);/ ReleaseMutex(mutexnum);LeaveCriticalSection(/放下右边的筷子putdown(num,num);return 1;/int main()HANDLE hThreadnumber;/HANDLE hThread2number;InitializeCriticalSection(/循环建立线程 0-3for (int i=0;inumber-1;i+)/ mutexi=CreateMutex(NULL,FALSE,“);InitializeCriticalSecti

17、on(hThreadi=(HANDLE)_beginthreadex(NULL,0,ThreadFunc1,(void*)i,0,NULL);/建立线程 4InitializeCriticalSection(/让其不出现死锁的定义,最后一个哲学家先拿右边筷子,再拿左边筷子/ hThreadnumber-1=(HANDLE)_beginthreadex(NULL,0,ThreadFunc2,(void*)(number-1),0,NULL);/出现死锁的定义,最后一个哲学家和其他哲学家一样,也是先拿左边筷子,再拿右边筷子hThreadnumber-1=(HANDLE)_beginthreadex

18、(NULL,0,ThreadFunc1,(void*)(number-1),0,NULL);/等待所有 hThread 有效/* if (WaitForMultipleObjects(5,hThread2,true,INFINITE)cout“出现死锁!“endl;*/等待所有线程执行完WaitForMultipleObjects(number,hThread,true,INFINITE);for (i=0;inumber;i+)合肥工业大学计算机与信息学院第 11 页 共 11 页LeaveCriticalSection(CloseHandle(hThreadi);LeaveCriticalSection(return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报