实验四、存储管理
2016-06-29 17:10
267 查看
专业:网络工程一班 姓名:颜超武 学号:201406114310
一、实验目的
1.掌握临界区的概念及临界区的设计原则;
2.掌握信号量的概念、PV操作的含义以及应用PV操作实现进程的同步与互斥;
3.分析进程争用资源的现象,学习解决进程互斥的方法。
二、实验内容和要求
分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟
生产者--消费者问题表述:
有一环形缓冲池,包含n个缓冲区(0~n-1)。
有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品。
所有进程必须对缓冲区进行互斥的访问。
生产者不能向满缓冲区写数据,消费者不能从空缓冲区取数据,即生产者与消费者必须同步。
计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。
定义生产者消费者问题中的各数据结构,并初始化。
信号量,初值。
编写PV操作。
编写生产者与消费者程序,利用信号量及其PV操作,实现生产者与消费者之间的同步与互斥。
模拟显示生产者与消费者同步与互斥的效果。
选做:模拟显示读者写者问题的效果。
三、实验方法、步骤及结果测试
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define N 100
typedef struct process
{
int num;
}P;
P a
;
int wordtime=0;
void main(){
int i=0,j,run=1,n,p=0,v=0,num;
printf("输入缓冲区大小\n");
scanf("%d",&n);
while(run==1)
{
srand(time(NULL));
j=rand()%2+1;
if(1==j)
{
if(i<5&&p==0&&v==0)
{
p++;
v++;
i++;
printf("生产\n");
p--;
v--;
}
else{
printf("仓库已满无法生产\n");
}
}
else
{
if(i>0&&p==0&&v==0)
{
p++;
v++;
i--;
printf("消费\n");
p--;
v--;
}
else{
printf("无货物无法消费\n");
}
}
printf("是否继续||1.是 2.否\n");
scanf("%d",&run);
}
}
四、实验总结
此次试验简单,不过用c语言难以实现逻辑上的模拟,只能在显示效果上模拟,推荐用就JAVA多线程实现。不过我在这次实验过程中也学习到了许多东西,并且成功完成了试验要求。
一、实验目的
1.掌握临界区的概念及临界区的设计原则;
2.掌握信号量的概念、PV操作的含义以及应用PV操作实现进程的同步与互斥;
3.分析进程争用资源的现象,学习解决进程互斥的方法。
二、实验内容和要求
分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟
生产者--消费者问题表述:
有一环形缓冲池,包含n个缓冲区(0~n-1)。
有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品。
所有进程必须对缓冲区进行互斥的访问。
生产者不能向满缓冲区写数据,消费者不能从空缓冲区取数据,即生产者与消费者必须同步。
计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。
定义生产者消费者问题中的各数据结构,并初始化。
信号量,初值。
编写PV操作。
编写生产者与消费者程序,利用信号量及其PV操作,实现生产者与消费者之间的同步与互斥。
模拟显示生产者与消费者同步与互斥的效果。
选做:模拟显示读者写者问题的效果。
三、实验方法、步骤及结果测试
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define N 100
typedef struct process
{
int num;
}P;
P a
;
int wordtime=0;
void main(){
int i=0,j,run=1,n,p=0,v=0,num;
printf("输入缓冲区大小\n");
scanf("%d",&n);
while(run==1)
{
srand(time(NULL));
j=rand()%2+1;
if(1==j)
{
if(i<5&&p==0&&v==0)
{
p++;
v++;
i++;
printf("生产\n");
p--;
v--;
}
else{
printf("仓库已满无法生产\n");
}
}
else
{
if(i>0&&p==0&&v==0)
{
p++;
v++;
i--;
printf("消费\n");
p--;
v--;
}
else{
printf("无货物无法消费\n");
}
}
printf("是否继续||1.是 2.否\n");
scanf("%d",&run);
}
}
四、实验总结
此次试验简单,不过用c语言难以实现逻辑上的模拟,只能在显示效果上模拟,推荐用就JAVA多线程实现。不过我在这次实验过程中也学习到了许多东西,并且成功完成了试验要求。
相关文章推荐
- 实验三、进程调度模拟程序
- 重构表索引
- linux socket 缓冲区默认大小
- Spring集成Quartz定时任务框架介绍和Cron表达式详解
- 领域驱动设计(DDD:Domain-Driven Design)
- 自定义UTI 注册你的APP所支持的文件类型
- centos7上通过手工方式和shell脚本方式安装jdk
- 补丁vs错误(codevs 2218 错误答案)
- 搭建samba 实现虚拟机与本机文件共享
- JSON-RPC、XML-RPC、SOAP三者的关系
- 【Unity Shaders】学习笔记——SurfaceShader(七)法线贴图
- 实验二、作业调度模拟程序
- update set from 【连接查询更新】
- [HTML]HTML5实现可编辑表格
- 1004. Counting Leaves
- Spring中的p标签
- as4 通过yum自动升级实现
- Android生命周期
- orcale建表,分区
- a target 在frame框架中的跳转方式