实验四 用信号量解决进程互斥与同步问题
生产者与消费者问题模拟
姓名 黄淋生 专业 网络工程 学号 201306114112

一、实验目的
1. 掌握临界区的概念及临界区的设计原则;
2. 掌握信号量的概念、PV操作的含义以及应用PV操作实现进程的同步与互斥;
3. 分析进程争用资源的现象,学习解决进程互斥的方法。
二、实验内容
分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟。
三、实验步骤
1. 生产者--消费者问题表述:
有一环形缓冲池,包含n个缓冲区(0~n-1)。
有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品。
所有进程必须对缓冲区进行互斥的访问。
生产者不能向满缓冲区写数据,消费者不能从空缓冲区取数据,即生产者与消费者必须同步。
计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。
2. 定义生产者消费者问题中的各数据结构,并初始化。
信号量,初值。
3. 编写PV操作。
4. 编写生产者与消费者程序,利用信号量及其PV操作,实现生产者与消费者之间的同步与互斥。
5. 模拟显示生产者与消费者同步与互斥的效果。
6. 选做:模拟显示读者写者问题的效果。
四. 代码
#include<stdio.h>
#define N 100

typedef struct process
{
int num;
int time;
int start;
int end;
int level;
int freetime;
char buff;
}P;

P a[N],b;
void rank(int n)
{
int i=0,j,t=n,x;
for(i=0;i<n;i++)
{
if(i==0&&a[i].freetime!=0)
a[i].buff='R';
else if(a[i].freetime==0)
a[i].buff='F';
else
a[i].buff='r';
}//给状态
for(i=0;i<n;i++)
{
for(j=i+1;j<t;j++)
{

if(a[i].freetime==0)
{

a[i].level=-100;

}

if(a[i].level<a[j].level)
{
b=a[i];
a[i]=a[j];
a[j]=b;
}

}
}

}

int decide()
{
if(a[0].freetime==0)
return 1;
else
return 0;
}

void main()
{
int n,i,t,sum=0;
printf("请输入进程个数n>0 \n");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("请输入第%d个进程时间n>0 \n",i+1);
scanf("%d",&a[i].time);
a[i].freetime=a[i].time;//剩余时间赋值
a[i].num=i+1;
a[i].start=a[i].end=0;
printf("请输入第%d个进程优先级 >0 \n",i+1);
scanf("%d",&a[i].level);
}//输入数据

for(i=0;i<n;i++)
{
for(t=i+1;t<n;t++)
{
if(a[t].level>a[i].level)
{
b=a[i];
a[i]=a[t];
a[t]=b;
}
}
}//排序

for(i=0;i<n;i++)
{
if(i==0)
a[i].buff='R';
else
a[i].buff='r';
}//给状态
getchar();//间断控制
printf("初始进程状态为\n");
for(i=0;i<n;i++)
{
if(i==0){
printf("进程号,进程总时间,进程剩余时间,进程执行时间,优先级,进程状态\n");
}
printf("%3d,%8d,%10d,%10d,%13d,%8c\n",a[i].num,a[i].time,a[i].freetime,a[i].start,a[i].level,a[i].buff);
}
//打印第一组数据
printf("按回车键继续。。。\n");
getchar();
while(decide()==0)
{
a[0].freetime--;//时间计算以下都是
a[0].start++;
a[0].level--;
rank(n);//调整进程优先级
for(i=0;i<n;i++)
{
if(i==0){
printf("进程号,进程总时间,进程剩余时间,进程执行时间,优先级,进程状态\n");
}
printf("%3d,%8d,%10d,%10d,%13d,%8c\n",a[i].num,a[i].time,a[i].freetime,a[i].start,a[i].level,a[i].buff);
}
//打印第一组数据
printf("按回车键继续。。。\n");
getchar();//间断控制

}

}
截图:
五. 实验心得
心得体会,实验过程的难点问题及其解决的方法。

有时候上课走神,没听到,所以做起来有点困难。不是很会做  参考了下其他人的代码。

转载于:https://www.cnblogs.com/huanglinsheng/p/5587992.html

实验四 用信号量解决进程互斥与同步问题 生产者与消费者问题模拟相关推荐

  1. 用信号量实现进程互斥,同步【操作系统学习笔记】

    21.用信号量实现进程互斥,同步 文章目录 21.用信号量实现进程互斥,同步

  2. (王道408考研操作系统)第二章进程管理-第三节5:用信号量实现进程互斥、同步和前驱关系

    文章目录 一:使用信号量实现进程互斥 二:使用信号量实现进程同步 三:使用信号量实现前驱关系 一:使用信号量实现进程互斥 思想: 1:分析并发进程的关键活动,划定临界区 2:设置互斥信号量mutex, ...

  3. 用信号量实现进程互斥、同步、前驱关系

    信号量机制实现进程互斥 信号量机制实现进程同步 信号量机制实现前驱关系

  4. 开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型...

    开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print(' ...

  5. 信号量机制实现进程互斥与同步,生产者消费者

    生产者

  6. 用信号量实现进程互斥示例和解决哲学家就餐问题

    用信号量实现进程互斥示例和解决哲学家就餐问题 参考文章: (1)用信号量实现进程互斥示例和解决哲学家就餐问题 (2)https://www.cnblogs.com/alantu2018/p/84731 ...

  7. 操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系

    2.3.5 用信号量机制实现进程互斥.同步.前驱关系 目录 2.3.5 用信号量机制实现进程互斥.同步.前驱关系 2.3.5.1 用信号量机制实现进程互斥 2.3.5.2 用信号量机制实现进程同步 2 ...

  8. 利用信号量实现进程互斥(操作系统)

    利用信号量实现进程互斥 ​​​​​​​ 方法要点: 为每个临界资源设置一个互斥信号量 mutex , 其初值为 1 : 各进程访问该资源前执行 wait(mutex) 操作,离开临界区时执行 sign ...

  9. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)...

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  10. [OS复习]进程互斥与同步1

    进程互斥与同步 1.引言:多道程序设计存在的问题? 采用多道程序设计技术的操作系统,允许多个进程同时驻留内存并发执行.思考: A.如何协调多个进程对系统资源,如内存空间.外部设备等的竞争和共享? B. ...

最新文章

  1. 我靠这份无人机完全指南吹了一整年牛!
  2. Snap和Flatpak 通吃所有发行版的打包方式。
  3. python程序编程千分符号怎么输入_教你用Python来玩“微信跳一跳”瞬间千分……已开源...
  4. linux安装mysql字符_Linux下MySQL的彻底卸载和安装配置字符集
  5. DOS下查看局域网的ip使用情况,以及ip对应的主机名
  6. OS X 键盘快捷键
  7. java method 注释_Java注解
  8. jsp和mysql乱码
  9. 无名接口.php,李无名
  10. 福昕pdf虚拟打印机_福昕扫描王将取代扫描仪,OCR文字识别应用办公标配
  11. 锯齿波FMCW雷达目标检测原理
  12. 透气清爽的高回弹跑鞋,跑步轻松畅快,咕咚逐日21K体验
  13. M2M技术的基本框架
  14. VVC代码阅读(2)compressGOP函数(1)
  15. 电脑突然找不到wifi 的解决方法
  16. iOS 加粗字体方法 (不改变字体字号只加粗文字)
  17. 雷军周鸿祎黄章,个性及扑朔迷离的关系
  18. VMVare中Ubuntu报错:Drag and drop is not supported
  19. vue版分享微博 分享微信 分享qq |亲测有效|2020年08月13日
  20. Knald - 1.2.1 烘培贴图,利用贴图转换成其他贴图   笔记

热门文章

  1. 2010年程序员的最后一天!
  2. php图片缩放比例缩放,php图片等比例放大与缩小的方法举例
  3. FD.io——助你创新更高效、更灵活的报文处理方案
  4. Linux内核中Netfilter架构介绍
  5. OpenCV利用高斯模糊可以实现毛玻璃的特效
  6. warning: left shift count = width of type
  7. scala中的作用域保护
  8. mysql 优化 整体思路
  9. 【排列组合】只上代码不解释
  10. python 数学计算库_数学计算工具库-Numpy