没有合适的资源?快使用搜索试试~ 我知道了~
操作系统实验指导书-(2).pdf
资源推荐
资源详情
资源评论
《 操 作 系 统 》
实 验 指 导 书
吉 林 农 业 大 学 信 息技 术 学 院
2007 年 8 月
- 1 -
实验一:进程管理
实验学时:2
实验类型:验证
一、实验目的
了解生产者与消费者在实现进程同步过程中的解决方案。
二、实验步骤
数据结构:
每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:
进程类型标号、进程系统号、进程状态(本程序未用)、进程产品(字符)、进
程链指针等等。
系统开辟了一个缓冲区,大小由 buffersize 指定。
程序中有三个链队列,一个链表。一个就绪队列(ready),两个等待队列:
生产者等待队列(producer);消费者队列(consumer)。一个链表(over),
用于收集已经运行结束的进程。
本程序通过函数模拟信号量的原子操作。
算法的文字描述:
① 由用户指定要产生的进程及其类别,存入进入就绪队列。
② 调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源不存在
则进入响应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束
时,会检查对应的等待队列,激活队列中的进 程进入就绪队列。运行结束的进
程进入 over 链表。重复这一过程直至就绪队列为空。
③ 程序询问是否要继续?如果要转开始执行,否则退出程序。
源程序:
#include "stdio.h"
#include "stdlib.h"
#define buffersize 5
int processnum=0;
/* 定义进程控制块 PCB */
struct pcb {
int flag;//flag=1 denote producer;flag=2 denote consumer;
int numlabel;
char product;
- 2 -
char state;
struct pcb* processlink;
}*exe=NULL,*over=NULL;
typedef struct pcb PCB;
PCB* readyhead=NULL,* readytail=NULL;
PCB* consumerhead=NULL,* consumertail=NULL;
PCB* producerhead=NULL,* producertail=NULL;
//产品数量
int productnum=0;
int full=0,empty=buffersize;// semaphore
char buffer[buffersize];//缓冲区
int bufferpoint=0;//缓冲区指针
void linkqueue(PCB* process,PCB** tail);
PCB* getq(PCB* head,PCB** tail);
bool hasElement(PCB* pro);
void display(PCB* p);
void linklist(PCB* p,PCB* listhead);
void freelink(PCB* linkhead);
bool processproc();
bool waitempty();
bool waitfull();
void signalempty();
void signalfull();
void producerrun();
void comsuerrun();
bool hasElement(PCB* pro);
void linklist(PCB* p,PCB* listhead)
{
PCB* cursor=listhead;
while(cursor->processlink!=NULL){
cursor=cursor->processlink;
}
cursor->processlink=p;
}
void freelink(PCB* linkhead)
{
PCB* p;
while(linkhead!=NULL){
p=linkhead;
linkhead=linkhead->processlink;
free(p);
}
}
void linkqueue(PCB* process,PCB** tail)
- 3 -
{
if((*tail)!=NULL){
(*tail)->processlink=process;
(*tail)=process;
}
else{
printf("队列未初始化!");
}
}
PCB* getq(PCB* head,PCB** tail)
{
PCB* p;
p=head->processlink;
if(p!=NULL){
head->processlink=p->processlink;
p->processlink=NULL;
if( head->processlink ==NULL )
(*tail)=head;
}
else
return NULL;
return p;
}
bool processproc()
{
int i,f,num;
char ch;
PCB* p=NULL;
PCB** p1=NULL;
printf("\n 请输入希望产生的进程个数?");
scanf("%d",&num);
getchar();
for(i=0;i<num;i++)
{printf("\n 请输入您要产生的进程:输入 1 为生产者进程;输入 2 为消费者进程\n");
scanf("%d",&f);
getchar();
p=(PCB*)malloc(sizeof(PCB)) ;
if( !p) {
printf("内存分配失败");
return false;
}
- 4 -
p->flag=f;
processnum++;
p->numlabel=processnum;
p->state='w';
p->processlink=NULL;
if(p->flag==1){
printf("您要产生的进程是生产者,它是第%d 个进程。请您输入您要该进程产生的字符!
\n",processnum);
scanf("%c",&ch);
getchar();
p->product=ch;
productnum++;
printf("您要该进程产生的字符是%c \n",p->product);
}
else {
printf("您要产生的进程是消费者,它是第%d 个进程。\n",p->numlabel);
}
linkqueue(p,&readytail);
}
return true;
}
bool waitempty()
{
if(empty<=0)
{
printf(" 进 程 %d: 缓 冲 区 存 数 , 缓 冲 区 满 , 该 进 程 进 入 生 产 者 等 待 队 列
\n",exe->numlabel);
linkqueue(exe,&producertail);
return false;
}
else{
empty--;
return true;
}
}
void signalempty()
{
PCB* p;
if(hasElement(producerhead)){
p=getq(producerhead,&producertail);
linkqueue(p,&readytail);
printf("等待中的生产者进程进入就绪队列,它的进程号是%d\n",p->numlabel);
}
剩余28页未读,继续阅读
资源评论
是空空呀
- 粉丝: 168
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功