操作系统课程设计进程管理代码
『壹』 计算机操作系统进程管理实验代码。
你说的是cmd命令提示符地下的操作命令吗? 可以找度娘啊!
『贰』 操作系统课程设计"进程管理系统设计"
日死 打广告哈
『叁』 哪位大侠有操作系统课程设计关于处理机管理(进程管理)的源代码,十万火急!!!
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
struct pcb { /* 定义进程控制块PCB */
char name[10];
char state;
int super;
int ntime;
int rtime;
struct pcb* link;
}*ready=NULL,*p;
typedef struct pcb PCB;
void sort() /* 建立对进程进行优先级排列函数*/
{
PCB *first, *second;
int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/
{
p->link=ready;
ready=p;
}
else /* 进程比较优先级,插入适当的位置中*/
{
first=ready;
second=first->link;
while(second!=NULL)
{
if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/
{ /*插入到当前进程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else /* 插入进程优先数最低,则插入到队尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0) first->link=p;
}
}
void input() /* 建立进程控制块函数*/
{
int i,num;
//clrscr(); /*清屏*/
printf("\n 请输入进程号?");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n 进程号No.%d:\n",i);
p=getpch(PCB);
printf("\n 输入进程名:");
scanf("%s",p->name);
printf("\n 输入进程优先数:");
scanf("%d",&p->super);
printf("\n 输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort(); /* 调用sort函数*/
}
}
int space()
{
int l=0; PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
printf("\n qname \t state \t super \t ndtime \t runtime \n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->super);
printf("|%d\t",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}
check() /* 建立进程查看函数 */
{
PCB* pr;
printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
disp(p);
pr=ready;
printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
}
destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
printf("\n 进程 [%s] 已完成.\n",p->name);
free(p);
}
running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 调用destroy函数*/
else
{
(p->super)--;
p->state='w';
sort(); /*调用sort函数*/
}
}
main() /*主函数*/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar();
h++;
printf("\n The execute number:%d \n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n\n 进程已经完成.\n");
ch=getchar();
}
『肆』 操作系统进程调度课程设计伪代码
操作系统进程调度课程设计伪代码我帮你解决绝对专业.
『伍』 操作系统的课程设计~进程控制系统~用C语言编写的
补充: 这个程序当然可以在WINDOWS下编辑了. 不过编译就必须要UNIX了.
下面的程序假设回你的当答前目录有一个helloworld程序, 这个你会写吧? :)
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int pid;
int status;
pid = fork();
if (pid == 0) {
/* child process */
execve("./helloworld", NULL, NULL);
} else if (pid < 0) {
/* failed to fork, print error message */
printf("fork error, errno = %d\n", errno);
} else {
waitpid(pid,&status,0)
}
return 0;
}
『陆』 求代码~操作系统 进程控制实验 语言C++ 要求如下
代码很简单的,其实就是考查出队入队的队列应用。
创建进程入队、结束进程出队、进程阻塞入队、激活进程出队、调度进程入队出队、时间片到入队出队。
『柒』 操作系统课程设计《两道批处理系统的两级调度-2》 请发邮箱[email protected],多谢各位大神啦!
设计1 进程管理
设计内容
进程的创建和控制
编写一段程序,使用系统调用()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。每个进程在屏幕上显示一个字符,记录屏幕上的显示结果,并分析原因。修改以编写的程序,将每个进程输出一个字符改为每个进程输出一句话。
进程的软中断通信
使用系统调用fork()创建两个子进程,使用系统调用signal()让父进程捕捉用alarm函数设置时钟的时间段终止时产生的信号,当捕捉到该信号后,父进程使用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出子进程被杀死信息后终止,父进程等待两个子进程终止后,输出父进程被杀死信息后终止程序。记录屏幕上的显示结果,并分析原因。
进程的管道通信
使用系统调用pipe()建立一个管道;两个子进程分别向管道写信息,父进程则从管道读出来自子进程的信息,显示在屏幕上。
记录屏幕上的显示结果,并分析原因。
设计2 进程的同步与互斥
设计内容
用程序实现生产者-消费者问题
问题描述: 一个仓库可以存放K件物品。生产者每生产一件产品,将产品放入仓库,仓库满了就停止生产。消费者每次从仓库中去一件物品,然后进行消费,仓库空时就停止消费。
设计3 存储管理
设计内容
将指令序列转换为用户虚存中的请求调用页面流。
页面大小为1K
用户内存容量为4页到40页
用户外存的容量为40k
在用户外存中,按每K存放10条指令,400条指令在外存中的存放方式为:
0-9条指令为第0页
10-19条指令为第1页
。。。。。
390-399条指令为第39页
按以上方式,用户指令可组成40页
通过随机数产生一个指令序列,共400个指令(0-399)
模拟请求页式存储管理中页面置换算法
执行一条指令,首先在外存中查找所对应的页面和页面号,然后将此页面调入内存中,模拟并计算下列各述算法在不同内存容量下的命中率(页面有效次数/页面流的个数)
先进先出的算法(FIFO)
最久未使用算法(LRU)
提示
随机指令的产生
rand() 或srand()
用户内存中页面控制结构采用链表
页面控制结构
struct p_str{
int pagenum; /* 页号 */
int count; /* 访问页面的次数 */
struct p_str next; /* 下一指针 */
}p_str;
#define false 0
#define true 1
#define n 4
#define m 10
struct
{
char type[10];
int count;
int remain;
int address;
}equiptype[n];
struct
{
int number;
int status;
int remain;
char jobname[4];
int lnumber;
}equipment[m];
allocate(J,type,mm)
char *J,*type;
int mm;
{
int i,t,j;
i=0;
while(i<n&&strcmp(equiptype[i].type,type)!=0)
i++;
if(i>=n)
{
printf("该类设备,设备配失败");
return(false);
}
if(equiptype[i].remain<1)
{
printf("该类设备足配失败");
return(false);
}
t=equiptype[i].address;
while(!(equipment[t].status==1 && equipment[t].remain==0))
t++;
equiptype[i].remain--;
equipment[t].remain=1;
strcpy(equipment[t].jobname,J);
equipment[t].lnumber=mm;
}
reclaim (J,type)
char J,type;
{
int i,t,j,k,nn;
i=0;
while(i<n&&strcmp(equiptype[i].type,type)!=0)
i++;
if(i>=n)
{
printf("该类设备,设备收失败");
return(false);
}
t=equiptype[i].address;
j=equiptype[i].count;
k=0;
nn=t+j;
for(;t<nn;t++)
if(strcmp(equipment[t].jobname,J)==0&&equipment[t].remain==1)
{
equipment[t].remain=0;
k++;
}
equiptype[i].remain= equiptype[i].remain+k;
if(k==0)
printf("该作业没使用该类设备\n");
}
main( )
{
char J[4];
int i,mm,a;
char type[10];
strcpy(equiptype[0].type,"input");
equiptype[0].count=2;
equiptype[0].remain=2;
equiptype[0].address=0;
strcpy(equiptype[1].type,"printer");
equiptype[1].count=3;
equiptype[1].remain=3;
equiptype[1].address=2;
strcpy(equiptype[2].type,"disk");
equiptype[2].count=4;
equiptype[2].remain=4;
equiptype[2].address=5;
strcpy(equiptype[3].type,"tape");
equiptype[3].count=1;
equiptype[3].remain=1;
equiptype[3].address=9;
for(i=0;i<10;i++)
{
equipment[i].number=i;
equipment[i].status=1;
equipment[i].remain=0;
}
while(1)
{
printf("\n0-退1-配2-收3-显示");
printf("\n选择功能项(0~3):");
scanf("%d",&a);
switch(a)
{
case 0 :
exit(0);
case 1 :
printf("输入作业名、作业所需设备类设备相号");
scanf("%s%s%d",J,type,&mm);
allocate(J,type,mm);
break;
case 2:
printf("输入作业名作业归设备类");
scanf("%s%s",J,type);
reclaim(J,type);
break;
case 3:
printf("\n输设备类表\n");
printf(" 设备类型 设备总量 空闲设备\n");
for(i=0;i<n;i++)
printf("%9s%8d%9d\n",equiptype[i].type,equiptype[i].count, equiptype[i].remain);
printf("输设备表:\n");
printf("绝号 /坏 已/未配 占用作业名 相号\n");
for(i=0;i<m;i++)
printf("%3d%8d%9d%12s%8d\n",equipment[i].number, equipment[i].status,equipment[i].remain,equipment[i].jobname,
equipment[i].lnumber);
}
}
}
『捌』 求代码~操作系统 进程管理实验 语言C++ 要求如下:
四、实验思路和设计
1、进程管理
(1)程序流程图
由学生自行完成。
(2)主要程序代码
//PCB结构体
struct pcb{
int id; //进程序号
int ra; //所需资源A的数量
int rb; //所需资源B的数量
int rc; //所需资源C的数量
int ntime; //所需的时间片个数
int rtime; //已经运行的时间片个数
char state; //进程状态
struct pcb *next;
} *hready=NULL,*hblock=NULL,*p; //hready,hblock分别为指向就绪和阻塞队列
typedef struct pcb PCB;
int m,n,r,a,b,c,h=0,i=1,time1Inteval; //m为要模拟的进程个数,n为初始化进程个数
//r为可随机产生的进程数(r=m-n)
//a,b,c分别为A,B,C三类资源的总量
//i为进城计数,i=1…n
//h为运行的时间片次数,time1Inteval为时间片大小(毫秒)
//建立一个PCB结构体型的空链表
PCB *increat(void)
{ PCB *head;
head=NULL;
return(head);
}
//从链表起始地址开始输出该链表的内容
void disp(PCB *head)
{PCB *p1;
p1=head;
AnsiString str2;
if(head!=NULL) //链表非空
{
do
{
str2+=" ";
str2+=IntToStr(p1->id);str2+=" ";
str2+=(p1->state);str2+=" ";
str2+=IntToStr(p1->ra);str2+=" ";
str2+=IntToStr(p1->rb);str2+=" ";
str2+=IntToStr(p1->rc);str2+=" ";
str2+=IntToStr(p1->ntime);str2+=" ";
str2+=IntToStr(p1->rtime);str2+="\r\n";
p1=p1->next;
}while(p1!=NULL); //不断输出进程的信息,直到链尾!
} //if
else
{ str2+="\t\t该 队 列 中 没 有 进 程!\r\n" ;}
Form1->Memo1->Lines->Add(str2);
}
//将进程插入到链尾(包括就绪队列和阻塞队列)
PCB *insert(PCB *head,PCB*pcb) //带两个指针形参:队列指针和当前进程PCB
{
PCB *pi,*p1;
p1=head;
pi=pcb;
if (head==NULL)
{
head=pi;
pi->next=NULL;
}
else
{
while(p1->next!=NULL)
{p1=p1->next;}
p1->next=pi;
pi->next=NULL;
}
return(head);
}
//对进程进行初始化,建立就绪队阻塞队列。
void input()
{
AnsiString str1;
m=StrToInt (Form1->Edit1->Text); //读取要模拟的进程总数给m
n=StrToInt (Form1->Edit2->Text); //读取需初始化进程数给n
a=StrToInt (Form1->Edit3->Text); //读取A类资源的总数给a
b=StrToInt (Form1->Edit4->Text); //读取B类资源的总数给b
c=StrToInt (Form1->Edit5->Text); //读取C类资源的总数给c
time1Inteval=StrToInt(Form1->Edit6->Text); //读取时间片长度给time1Inteval
Form1->Timer1->Interval=time1Inteval;
r=m-n; //计算可随机产生的进程数为r
for(i=1;i<=n;i++) //初始化n个进程信息
{
p=getpcb(PCB); // #define getpcb(type) (type*)malloc(sizeof(type))
p->id=i;
str1+=" 产生进程ID:";str1+=IntToStr(p->id);str1+="\r\n";
p->ra=(random(a-3)+3);
str1+=" 所需A类资源数:";str1+=IntToStr(p->ra);str1+="\r\n";
p->rb=(random(b));
str1+=" 所需B类资源数:";str1+=IntToStr(p->ra);str1+="\r\n";
p->rc=(random(c-2)+2);
str1+=" 所需C类资源数:";str1+=IntToStr(p->ra);str1+="\r\n";
p->ntime=(random(5)+1);
str1+=" 所需时间片个数:";str1+=IntToStr(p->ntime);str1+="\r\n";
p->rtime=0;
p->next=NULL;
if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0)) //如果资源符合所需要求
{ //则写入就绪队列队尾
a=a-(p->ra); //当前所剩A类资源数目
b=b-(p->rb); //当前所剩B类资源数目
c=c-(p->rc); //当前所剩C类资源数目
p->state='W';
hready=insert(hready,p); //将进程插入就绪队列
}//if
else //如果资源不符合所需要求,则写入阻塞队列队尾
{
p->state='B';
hblock=insert(hblock,p);
} //if
str1+=" 当前进程状态:";
str1+=(p->state);
str1+="\r\n";
str1+="\r\n";
}//for
Form1->Memo1->Lines->Add(str1);
}
//输出就绪队列和阻塞队列的信息
void outputall()
{
AnsiString str1,str2,str3;
str3+="\r\n" ;
str3+="= = = = = = = = = = = = = = = CPU时间片运行了: " ;
str3+=IntToStr(h);
str3+=" 次= = = = = = = = = = = = = = =\r\n";
Form1->Memo1->Lines->Add(str3);
str1+="*********************************当 前 就 绪 队 列 的 信 息" ;
str1+="*********************************\r\n" ;
str1+="进程ID 进程状态 A资源数 B资源数 C资源数 需要时间片 已运行时间片";
Form1->Memo1->Lines->Add(str1);
disp(hready);
str2+="*********************************当 前 阻 塞 队 列 的 信 息";
str2+="*********************************\r\n" ;
str2+="\r\n";
str2+="进程ID 进程状态 A资源数 B资源数 C资源数 需要时间片 已运行时间片";
Form1->Memo1->Lines->Add(str2);
disp(hblock);
}
//运行就绪队列的头进程,运行一个时间片(FCFS),轮转一个时间片
PCB *running(PCB *head)
{
PCB *p1;
p1=head;
AnsiString str4;
If (p1->next==NULL) head=increat();
else {head=p1->next; }
p1->state='R'; //进程状态由就绪转向运行
(p1->rtime)++; //已运行时间片数增加1
h++;
str4+="~~~~~~~~~~~~~~~~ 当前正在运行的进程ID是: ";
str4+=IntToStr(p1->id);
str4+=" ~~~~~~~~~~~~~~~~~~\r\n";
str4+="进程ID 进程状态 A资源数 B资源数 C资源数 需要时间片 已运行时间片\r\n";
str4+=" ";
str4+=IntToStr(p1->id);str4+=" ";
str4+=(p1->state);str4+=" ";
str4+=IntToStr(p1->ra);str4+=" ";
str4+=IntToStr(p1->rb);str4+=" ";
str4+=IntToStr(p1->rc);str4+=" ";
str4+=IntToStr(p1->ntime);str4+=" ";
str4+=IntToStr(p1->rtime);str4+=" ";
Form1->Memo1->Lines->Add(str4);
if(p1->ntime==p1->rtime) //如果已经运行的时间片到达所需次数,该进程结束
{
str4+="\r\n\r\n\t\tID号为:";
str4+=IntToStr(p1->id);
str4+=" 的进程已经完成!!!";
Form1->Memo1->Lines->Add(str4);
a=a+(p1->ra);
b=b+(p1->rb);
c=c+(p1->rc);
free(p1); //释放当前指针
}
else //如果已经运行的时间片未到达所需次数,该进程运行一个时间片后进入就绪队列尾
{
p1->state='W';
head=insert(head,p1);
}
return(head);
}
//检测当前资源数目是否满足阻塞队列里进程的需求
void testblock()
{
PCB *p1,*p2;
p1=hblock;
p2=hblock;
AnsiString str5;
while((hblock!=NULL)&&(p1!=NULL))
{
if((a-(p1->ra)>=0)&&(b-(p1->rb)>=0)&& (c-(p1->rc)>=0)) //如果满足
{if(p1==hblock)
{
hblock=p1->next;
p1->state='W';
hready=insert(hready,p1); //将阻塞的进程插入就绪队列
a=a-(p->ra);
b=b-(p->rb);
c=c-(p->rc);
str5="\tID号为: " ;
str5+=IntToStr(p1->id);
str5+=" 的进程由阻塞队列转入就绪队列!\r\n";
p1=hblock;
} //if(p1==hblock)
else
{p2->next=p1->next;
p1->state='W';
hready=insert(hready,p1);
str5="\tID号为: " ;
str5+=IntToStr(p1->id);
str5+=" 的进程由阻塞队列转入就绪队列!\r\n";
p1=p2->next;
}//else
} //大if
else
{p2=p1;
p1=p1->next;
} //else
Form1->Memo1->Lines->Add(str5);
} //whlie
}
//检测是否有新的进程产生,随机产生新进程
void testnew()
{
int t;
AnsiString str6;
if(r>0) //r=m-n为可随机产生的进程数目
{
t=random(9); //生成随机数
if(t<=7) //如果随机数小于等于7,则产生新进程,否则不产生
{
p=getpcb(PCB);
str6+="有新的进程申请加入:\r\n" ;
p->id=i++; //i为全程变量,表示进程号?
str6+="进程ID:";
str6+=IntToStr(p->id);
str6+="\r\n";
p->ra=(random(a-3)); //随机分配资源
str6+="所需A类资源数:";
str6+=IntToStr(p->ra);
str6+="\r\n";
p->rb=(random(b-3));
str6+="所需B类资源数:";
str6+=IntToStr(p->rb);
str6+="\r\n";
p->rc=(random(c-3));
str6+="所需C类资源数:";
str6+=IntToStr(p->rc);
str6+="\r\n";
p->ntime=(random(5)+1); //随机分配时间片总数
str6+="所需时间片个数:";
str6+=IntToStr(p->ntime);
str6+="\r\n";
p->rtime=0; //已运行时间片数初始为0
p->next=NULL;
if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0))
{ //进程满足要求,进入就绪队列
a=a-(p->ra); //分配资源给该进程,总资源数减少
b=b-(p->rb);
c=c-(p->rc);
p->state='w';
str6+="当前进程状态:";
str6+=(p->state);
str6+="\r\n";
hready=insert(hready,p);
str6+="资源满足新进程需求,该进程进入就绪队列!";
}//if
else //进程不满足要求,进入阻塞队列
{
p->state='B';
hblock=insert(hblock,p);
str6+="当前进程状态:";
str6+=(p->state);
str6+="\r\n";
str6+="资源不能满足新进程需求,该进程进入阻塞队列!" ;
}//else
}//if (t<=7)
Form1->Memo1->Lines->Add(str6);
}//if(r>0)
r--;
}
//系统三类资源变化情况的显示
void rescore()
{
if(a>a1) {Form1->Edit7->Text=IntToStr(a1);}
if(a<0) {Form1->Edit7->Text=0;}
if(a>=0&&a<a1) {Form1->Edit7->Text=IntToStr(a);}
if(b>b1) {Form1->Edit8->Text=IntToStr(b1);}
if(b<0) {Form1->Edit8->Text=0;}
if(b>=0&&b<=b1) {Form1->Edit8->Text=IntToStr(b); }
if(c>c1) {Form1->Edit9->Text=IntToStr(c1);}
if(c<0) {Form1->Edit9->Text=0;}
if(c>=0&&c<=c1) {Form1->Edit9->Text=IntToStr(c); }
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
runFcfs(); //先来先服务(FCFS)调度算法
}
//先来先服务(FCFS)调度算法
void runFcfs()
{
AnsiString str;
if(form1_hready!=NULL) //如果就绪队列为非空,则不断运行,直到就绪队列为空为止
{
outputall(); //输出就绪队列和阻塞队列的信息
form1_hready=running(form1_hready); //将就绪队列的第一个进程运行一个时间片
testblock(); //检查阻塞队列是否有进程可以进入就绪队列
testnew(); //检查是否有新进程产生
rescore() ; //系统三类资源变化情况的显示
}
else
{
Form1->Timer1->Enabled=false;
Form1->Edit7->Text=IntToStr(a1);
Form1->Edit8->Text=IntToStr(b1);
Form1->Edit9->Text=IntToStr(c1);
str+="\r\n\r\n<<<<<<<<<<<<<<<所 有 的 进 程 都 已 经 成 功 运 行 结 束 !>>>>>>>>>>>>>>";
Form1->Memo1->Lines->Add(str);
}
}
//将结果保存成txt文件
void __fastcall TForm1::N8Click(TObject *Sender)
{
if(Form1->SaveDialog1->Execute())
{
FILE* fp=fopen(Form1->SaveDialog1->FileName.c_str(),"w");
if(fp==NULL)
{
MessageBox(NULL,"打开文件出错","信息",MB_OK);
return;
}
for(int i=0;i<Form1->Memo1->Lines->Count;i++)
{ fputs(Form1->Memo1->Lines->Strings[i].c_str(),fp);
fputc('\n',fp);
}
fclose(fp);
}
}
//开始模拟按钮单击执行函数
void __fastcall TForm1::Button1Click(TObject *Sender)
{
runmain();
Form1->Button1->Enabled=false;
Form1->Edit1->Enabled=false;
Form1->Edit2->Enabled=false;
Form1->Edit3->Enabled=false;
Form1->Edit4->Enabled=false;
Form1->Edit5->Enabled=false;
Form1->Edit6->Enabled=false;
}
//清除屏幕按钮单击执行函数
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Memo1->Clear();
Button1->Enabled=true;
h=0;
Form1->Edit1->Enabled=true;
Form1->Edit2->Enabled=true;
Form1->Edit3->Enabled=true;
Form1->Edit4->Enabled=true;
Form1->Edit5->Enabled=true;
Form1->Edit6->Enabled=true;
}
//运行的主函数
void runmain()
{
AnsiString str,str1;
input();
Form1->Timer1->Enabled=true; //触发时钟,调用runFCFS。
str+="\r\n";
}
『玖』 操作系统课程设计 (包括进程管理、进程的同步和互斥、存储管理)
一、实验的目的与基本要求实验目的本课程设计是为了配合操作系统课程的理论教学而设置的,目的是通过课程设计的综合训练,加强学生对操作系统概念的实际应用技能的训练,提高学生分析问题和解决问题的能力。基本要求课程设计按照教学要求需要两周时间完成,两周中每天(按每周5天)至少要上3-4小时的机来调试程序。学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时的向教师汇报。课程设计的具体内容如下:设计1 进程管理1. 设计目的加深对进程概念的理解,明确进程和程序的区别;进一步认识并发执行的实质;实现Linux中进程通信的两种方式:软中断和管道通信。2. 设计内容1) 进程的创建和控制编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。每个进程在屏幕上显示一个字符,记录屏幕上的显示结果,并分析原因。修改以编写的程序,将每个进程输出一个字符改为每个进程输出一句话。2) 进程的软中断通信使用系统调用fork()创建两个子进程,使用系统调用signal()让父进程捕捉用alarm函数设置时钟的时间段终止时产生的信号,当捕捉到该信号后,父进程使用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出子进程被杀死信息后终止,父进程等待两个子进程终止后,输出父进程被杀死信息后终止程序。记录屏幕上的显示结果,并分析原因。3) 进程的管道通信使用系统调用pipe()建立一个管道;两个子进程分别向管道写信息,父进程则从管道读出来自子进程的信息,显示在屏幕上。记录屏幕上的显示结果,并分析原因。3. 系统调用函数说明、参数值及定义1. Fork()创建一个新进程进程int fork()其中返回int取值意义如下:正确返回:在父进程中返回子进程的进程号,在子进程中返回0错误返回:-12. Lockf(int files,int function,long size)用作锁定文件的某些段或者整个文件。file:文件描述符;function:锁定和解锁,1表示锁定,0表示解锁;size:是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。3. Signal(int sig, (*func) function)进程控制软中断信号的处理。signal()会依照参数sig指定的信号编号来设置该信号的处理函数。sig: SIGALRM: alarm()函数设置的时钟的时间段终止时产生的信号.其它信号略function:信号处理的一个函数地址。4. kill(int pid,int sig)向一个进程或一个进程组发信号,可以用来送参数sig指定的信号给参数pid指定的进程。pid: pid>0 将信号传给进程号为pid的进程其它略signumber: 送给进程号为pid进程指定信号量5. alarm(unsigned int seconds)设置一个指定时间的计时器seconds: 设置时间秒数6. int pipe(int filedes[2])filedes为整数数组名,在调用这个函数后,系统为通道分配的两个文件描述符将通过这个数组返回到用户进程中, filedes[1]是文件输出描述符, filedes[0]是文件输入描述符7. int wait(int *status)暂停目前进程的执行,直到有信号到来或子进程的结束。子进程的结束状态指会由参数status返回,如果不在意结束状态时,则参数status可以设置成NULL设计2 进程的同步与互斥1. 设计目的分析进程争用资源的现象,学习解决进程互斥的方法。2. 设计内容用程序实现生产者-消费者问题l 问题描述: 一个仓库可以存放K件物品。生产者每生产一件产品,将产品放入仓库,仓库满了就停止生产。消费者每次从仓库中去一件物品,然后进行消费,仓库空时就停止消费。l 数据结构:进程:Procer - 生产者进程,Consumer - 消费者进程 buffer: array [0..k-1] of integer; in,out: 0..k-1; in记录第一个空缓冲区,out记录第一个不空的缓冲区 s1,s2,mutex: semaphore; s1控制缓冲区不满,s2控制缓冲区不空,mutex保护临界区; 初始化s1=k,s2=0,mutex=1l 原语描述procer(生产者进程): Item_Type item;{while (true){proce(&item);p(s1);p(mutex);buffer[in]:=item; in:=(in+1) mod k;v(mutex);v(s2);}}consumer(消费者进程): out:=(out+1) mod k;v(mutex);v(s1);}}设计3 存储管理1. 设计目的通过请求页式存储管理中页面置换算法设计,了解存储技术的特点,掌握请求页式存储管理的页面置换算法。2. 设计内容l 将指令序列转换为用户虚存中的请求调用页面流。i. 页面大小为1Kii. 用户内存容量为4页到40页iii. 用户外存的容量为40k在用户外存中,按每K存放10条指令,400条指令在外存中的存放方式为:0-9条指令为第0页10-19条指令为第1页。390-399条指令为第39页按以上方式,用户指令可组成40页l 通过随机数产生一个指令序列,共400个指令(0-399)l 模拟请求页式存储管理中页面置换算法执行一条指令,首先在外存中查找所对应的页面和页面号,然后将此页面调入内存中,模拟并计算下列各述算法在不同内存容量下的命中率(页面有效次数/页面流的个数)1) 先进先出的算法(FIFO)2) 最久未使用算法(LRU)3. 提示l 随机指令的产生 rand() 或srand()l 用户内存中页面控制结构采用链表 页面控制结构 struct p_str{ int pagenum; /* 页号 */ int count; /* 访问页面的次数 */struct p_str next; /* 下一指针 */}p_str;