操作系统课程设计

发布 2022-10-05 11:48:28 阅读 8407

计算机与信息学院。

1、题目:多进程/线程编程:哲学家问题。

设置进程/线程,描述哲学家 ;

随机启动哲学家,显示进程/线程执行状态;

随着线程的执行,更新显示;

编写正确的哲学家程序,设法延迟线程的执行,使之出现死锁;

编写正确的哲学家程序,保证不出现死锁;

题目描述:哲学家问题:由dijkstra提出并解决,是典型的同步问题。

问题描述有多个(设为number)哲学家共用一张圆桌,分别坐在周围number个椅子上,在圆桌上有number个碗和number个筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐完毕,放下筷子继续思考。

2、开发环境:

开发工具:visual c++ 6.0 ;

开发环境:windows下多进程/线程编程。

开发语言:c++

3、总体算法:

设哲学家人数为number(程序中赋值为5),采用哲学家问题的一种解法:

1)采用p、v操作,哲学家拿起筷子后就持有该资源,等到吃完放下筷子后其他哲学家才能拿起该筷子;同样,哲学家需要的某筷子被其他哲学家持有时,等待,进程因而阻塞。

2)第一个到第number-1个哲学家采用一种进程描述,先左手拿筷子,之后右手才能拿。

3)只有最后一个哲学家定义另一进程:必须拿右手边筷子,之后再拿左手边的筷子。

4)所采用方法其实质是编号资源的方法,把筷子看为临界资源,按其序号编号,哲学家只能由小到大申请资源即为本算法。

5)出现死锁的方法:最后一个哲学家也是先拿左手边的筷子,再拿右手边的筷子时就容易出现死锁。

4、详细设计。

1.若干常量、变量的定义:

const int number=5;//哲学家人数。

const int sleep_time=10;//显示时间。

const int eating_time=50;//吃饭显示的时间。

critical_section chopstics[number];/临界资源:筷子。

critical_section cs;//控制打印的临界区变量,由于一段时间只能允许一个进程打印到屏幕,所以屏幕也为临界资源。

2.状态显示函数:

定义了若干函数显示当前状态:

thingking(int i) (哲学家i正在思考),hungry(int i) (饥饿),pickup(int i,int j) (哲学家i拿起了筷子j),eating(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(),le**ecriticalsection(),entercriticalsection(&chopstics[num]);拿起左手边的筷子。

pickup(num,num);

entercriticalsection(&chopstics[(num+1)%5]);拿起右手边的筷子。

pickup(num,num+1);

eating(num);/吃饭。

le**ecriticalsection(&chopstics[num]);放下左边的筷子。

putdown(num,num);

le**ecriticalsection(&chopstics[(num+1)%5]);放下右边的筷子。

putdown(num,num+1);

3)线程主体为死循环,没有资源时阻塞。

4.主进程main():

1)main函数**如下:

handle hthread[number];

initializecriticalsection(&cs);

/循环建立线程0-3

for (int i=0;i{

initializecriticalsection(&chopstics[i]);

hthread[i]=(handle)_beginthreadex(null,0,threadfunc1,(void*)i,0,null);

/建立线程4

initializecriticalsection(&chopstics[number-1]);

/让其不出现死锁的定义,最后一个哲学家先拿右边筷子,再拿左边筷子。

/hthread[number-1]=(handle)_beginthreadex(null,0,threadfunc2,(void*)(number-1),0,null);

/出现死锁的定义,最后一个哲学家和其他哲学家一样,也是先拿左边筷子,再拿右边筷子。

hthread[number-1]=(handle)_beginthreadex(null,0,threadfunc1,(void*)(number-1),0,null);

/等待所有hthread有效。

/等待所有线程执行完。

waitformultipleobjects(number,hthread,true,infinite);

for (i=0;i{

le**ecriticalsection(&chopstics[i]);

closehandle(hthread[i]);

le**ecriticalsection(&cs);

相关说明:1)初始所有临界区都要初始化,用 initializecriticalsection()函数。

2)线程的定义用_beginthreadex()函数。

beginthreadex()函数的原型为unsigned long_beginthreadex(void *security,unsigned stack_size,unsigne (_stdcall*start_address)(void*),void *arglist, /传给线程函数的参数的指针*/unsigned initflag,unsigned *thrdaddr );用到该函数必须链接多线程库文件,步骤为:project setting ->c/c++ code generator->use run-time library->mulitthreaded dll

3)主进程最后用waitformultipleobjects(number,hthread,true,infinite);等待所有线程都执行完,否则阻塞。

由于线程定义都是死循环,不可能执行完,所以这之后的语句执行不到。此句的作用:

一,当不出现死锁时可以一直执行线程,二,是当出现死锁时,由于各线程阻塞也没法执行完,主进程因此也阻塞,最后出现死锁。

五、执行结果。

一、不出现死锁:

二、 出现死锁!!!

六、总结。以前没有接触过多线程编程的内容,这一次为做本课程设计完全自学了好多内容。从网上搜了好多资料,一有不会的就。

做的过程中也走了些弯路。比如开始时搞忘了数组是从0开始的,实际应是从0-(number-1),好多函数的参数搞错了;还有当初不知道怎样实现pv操作;还有开始并没有完全弄清,不清楚main函数是主进程,也是会调用的,因此开始写的程序结果也不对,然后问别人才弄清楚的;程序写完后想润色一下,想把waitformultipleobjects()做为if语句的条件判断,若出现死锁则显示:出现死。

锁!,运行却并不行,想了会才知道已经出现了死锁程序就阻塞了怎么可能还会继续运行,还是因为当初没弄清。

做完后很有成就感和充实感,因为学会了很多东西,从以前对多线程一无所知,到开始入门有所了解,而且还加深了对操作系统课本相关知识的理解。总之,做完后“感觉很好”!现在已经注意到实践的重要,以后会多动手编程,锻炼编程能力的同时还会加深对知识的理解,同时还能培养兴趣。

七、**。#include <>

#include <>

#include <>

const int number=5;//哲学家人数。

const int sleep_time=10;//显示时间。

const int eating_time=50;//吃饭显示的时间。

critical_section chopstics[number];/临界资源:筷子。

critical_section cs;//控制打印的临界区变量。

/状态显示函数。

/显示被调用线程。

void xianshi(int i){

entercriticalsection(&cs);

cout<<"线程"< le**ecriticalsection(&cs);

return;

/正在思考。

void thinking(int i){

entercriticalsection(&cs);

xianshi(i);

cout<<"哲学家"< sleep(sleep_time);

le**ecriticalsection(&cs);

return;

/正饥饿。void hungry(int i){

entercriticalsection(&cs);

操作系统课程设计

课程设计 河北大学工商学院。装。订。线。操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专 操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专业计算机类 学号 姓名。指导教师。年 6 月 24 日。设备管理 2 2.1设计任务2 2.2设计要求...

操作系统课程设计

银行家算法模拟。系别 班级 组员 银行家算法模拟。1.课程设计目的。通过本次课程设计,加深对最经典的避免死锁的银行家算法的理解,掌握死锁形成必要条件 安全状态等概念的理解,通过用c语言编程模拟该算法,并在windows平台上实现,更好地掌握操作系统的原理及实现方法。2.任务及要求。设n为系统进程的个...

操作系统课程设计

学生实习实训报告。实习类型 操作系统课程设计 学号 0901110005 学生姓名 田兴杰 指导教师 曹春梅 专业班级 信息安全技术0901班 院 部 电子信息系 2011年 1 月 7日。实习实训成绩评定表。目录。目录3 摘要4关键字4 1.1虚拟机简介5 1.1.1 一般意义的虚拟机5 1.1....