第
第 PAGE # 页 共 21 页
第
第 PAGE # 页 共 21 页
第
第1 页共21 页
《操作系统原理》上机作业(报告)
作业:信号量机制
作业:
信号量机制
作业编号
8
题目
信号量机制
作业
【题目要求】通过多线程编程模拟进程的同步,互斥及信号量机制的 经典问题。
(1)编程解决下图(前趋图)问题,使得 5 个线程按该图要求运行,
要求其中 P1~P5代表 5个代码块,每个代码块分别由 1 个线程运行模拟, 每个代码块执行时分别可以打印输出该代码块的名称 ( P1~P5),每个 代码块运行时需要睡眠( sleep())一定时间。
要求
(2)利用多线程编程和信号量机制模拟生产者消费者问题(多生产 者和多消费者)。
(3)利用多线程编程和信号量机制模拟哲学家就餐问题, 至少实现 1 种不会出现死锁的方案。
(4)利用多线程编程和信号量机制模拟读写者问题。
实验要求】 可选编程语言: C/C++/Java/C#/Python; 一个小题实现在同一个程序文件中( C/C++ ); 请适当注释;
报 告 正 文(运行屏幕截图及源代码)
截图。
1.
2.
3.哲学家就餐。 (三种方法)
(1)只有双手都拿到筷子,才让其他人去拿。
2)偶数号先拿左边筷子,再拿右边筷子。奇数先拿右边筷子,再拿左边筷子。
3)最多允许四个哲学家就餐。
4.读写者问题。
第
第 PAGE # 页共21 页
第
第 PAGE # 页共21 页
代码。
1.
#include #include #include
#include
sem_t s1,s2,s3,s4;
void run1(void);
void run2(void);
void run3(void);
void run4(void);
void run5(void);
void compute(void);
int main()
{
pthread_t t1, t2, t3, t4, t5;
sem_init(&s1,0,0);
sem_init(&s2,0,0);
sem_init(&s3,0,0);
sem_init(&s4,0,0);
pthread_create(&t1, NULL, run1, NULL); pthread_create(&t2, NULL, run2, NULL); pthread_create(&t3, NULL, run3, NULL); pthread_create(&t4, NULL, run4, NULL); pthread_create(&t5, NULL, run5, NULL);
pthread_join(t1, NULL); pthread_join(t2, NULL); pthread_join(t3, NULL); pthread_join(t4, NULL); pthread_join(t5, NULL);
return 0;
}
void run1(void)
{
//sleep(2);
第
第 PAGE # 页共21 页
第
第 PAGE # 页 共 21 页
printf("P1 代码块开始运行 ...\n\n");
sem_post(&s1);
}
void run2(void)
{
// sleep(2);
printf("P2 代码块开始运行 ...\n\n");
sem_post(&s2);
}
void run3(void)
{
// sleep(2);
sem_wait(&s1);
sem_wait(&s2);
printf("P3 代码块开始运行 ...\n\n");
sem_post(&s3);
sem_post(&s4);
}
void run4(void)
{
// sleep(2); sem_wait(&s3);
printf("P4 代码块开始运行 ...\n\n");
}
void run5(void)
{
// sleep(2); sem_wait(&s4);
printf("P5 代码块开始运行 ...\n\n");
}
2.
#include
#include
#include
#include
//资源型信号量 sem_t empty; sem_t full;
//可消费数产品指针
int consume_index = 0;
int sn = 0;
//存放产品指针
int product_index = 0;
int sum = 0;
sem_t semaphore_