操作系统实验报告.doc
约25页DOC格式手机打开展开
操作系统实验报告,页数:15字数:5066实验一、哲学家就餐问题一、问题描述哲学家就餐问题是有dijkatra提出并解决的典型同步问题。该问题描述的是有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考和就餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他...
内容介绍
此文档由会员 usactu 发布
操作系统实验报告
页数:15 字数:5066
实验一、哲学家就餐问题
一、问题描述
哲学家就餐问题是有Dijkatra提出并解决的典型同步问题。该问题描述的是有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考和就餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完,放下筷子继续思考。
二、问题分析
该问题可用记录型信号量或者是AND型信号量解决。
记录型信号量解决
经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量组成信号量数组。当哲学家饥饿时总是先拿其左边的筷子,成功后,再去拿右边的筷子,又成功后方可就餐。进餐完,又先放下他左边的筷子,再放下右边筷子。这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。
AND型信号量解决
在哲学家就餐过程中,要求每个哲学家先获得两个临界资源后方能就餐,这在本质上就是AND同步问题,故用AND信号量机制可获得最简洁的解法。
三、程序伪代码
#include
#include
#include
#define N 5 /* 哲学家的个数 */
#define P(S) WaitForSingleObject(S, INFINITE) // 定义Windows下的P操作
#define V(S) ReleaseSemaphore(S, 1, NULL) // 定义Windows下的V操作
typedef HANDLE Semaphore; // 信号量的Windows原型
HANDLE hThread[N]; // 线程计数
Semaphore S[N]; // N根筷子, N个信号量
// 对每个哲学家的线程
DWORD WINAPI Philosopher(LPVOID para)
{
添加代码
}
int main(int argc, char *argv[])
{
DWORD tid;
int i=0;
char sTmp[32];// 初始化信号量
for (i=0; i {
页数:15 字数:5066
实验一、哲学家就餐问题
一、问题描述
哲学家就餐问题是有Dijkatra提出并解决的典型同步问题。该问题描述的是有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考和就餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完,放下筷子继续思考。
二、问题分析
该问题可用记录型信号量或者是AND型信号量解决。
记录型信号量解决
经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量组成信号量数组。当哲学家饥饿时总是先拿其左边的筷子,成功后,再去拿右边的筷子,又成功后方可就餐。进餐完,又先放下他左边的筷子,再放下右边筷子。这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。
AND型信号量解决
在哲学家就餐过程中,要求每个哲学家先获得两个临界资源后方能就餐,这在本质上就是AND同步问题,故用AND信号量机制可获得最简洁的解法。
三、程序伪代码
#include
#include
#include
#define N 5 /* 哲学家的个数 */
#define P(S) WaitForSingleObject(S, INFINITE) // 定义Windows下的P操作
#define V(S) ReleaseSemaphore(S, 1, NULL) // 定义Windows下的V操作
typedef HANDLE Semaphore; // 信号量的Windows原型
HANDLE hThread[N]; // 线程计数
Semaphore S[N]; // N根筷子, N个信号量
// 对每个哲学家的线程
DWORD WINAPI Philosopher(LPVOID para)
{
添加代码
}
int main(int argc, char *argv[])
{
DWORD tid;
int i=0;
char sTmp[32];// 初始化信号量
for (i=0; i