资源描述
姓名
任倩倩
倪晨
学号
2011210590
2011210542
实验成绩
华中师范大学计算机科学系
实 验 报 告 书
实验题目: 进程管理实验
课程名称: 操作系统
主讲教师: 叶俊民 教授
辅导教师: 叶俊民 教授
班 级: 1班
实验时间: 2013年11月10日
一、 实验目的:
通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。
二、实验内容:
用C语言编程模拟进程管理,至少要有:创建新的进程;删除进程;挂起某个进程的功能。
三、实验环境:
Windows操作系统、VC++6.0、C语言
四、实验详细实现过程与算法流程
1、初始化的进程块状态如图所示:
B表示正在运行,R表示就绪,W表示等待
Name
Status
priority
Next
P0
‘W’
-1
6
ABC
‘R’
-1
-1
-1
-1
-1
-1
P6
‘W’
0
8
W1
‘B’
-1
13
A8
‘W’
6
14
C9
‘B’
7
-1
-1
-1
-1
B13
‘B’
9
9
B14
‘W’
8
-1
-1
2、源程序:
#include<stdio.h>
#include<string.h>
//进程控制块的数据结构
struct PCBSTRUCT{
char Name[10];
char status; //进程控制块所处的状态,b表示运行,r表示就绪,w表示等待
int next;
int prior;
}pcb[255];
int srun = 7;//运行队列头指针
int erun;//运行队列尾指针
int sready = 1;//就绪队列头指针
int eready;//就绪队列尾指针
int swait = 0;//等待队列头指针
int ewait;//等待队列尾指针
//初始化静态链表,运行队列7,9,13;等待队列0,6,8,14;就绪队列1;
void init(){
strcpy(pcb[0].Name,"p0");
pcb[0].status='w';
pcb[0].prior=-1;
pcb[0].next=6;
strcpy(pcb[1].Name,"ABC");
pcb[1].status='r';
pcb[1].prior=-1;
pcb[1].next=-1;
eready=1;
strcpy(pcb[6].Name,"p6");
pcb[6].status='w';
pcb[6].prior=0;
pcb[6].next=8;
strcpy(pcb[7].Name,"w1");
pcb[7].status='b';
pcb[7].prior=-1;
pcb[7].next=13;
strcpy(pcb[8].Name,"A8");
pcb[8].status='w';
pcb[8].prior=6;
pcb[8].next=14;
strcpy(pcb[9].Name,"C9");
pcb[9].status='b';
pcb[9].prior=7;
pcb[9].next=-1;
erun = 9;
strcpy(pcb[13].Name,"B13");
pcb[13].status='b';
pcb[13].prior=9;
pcb[13].next=9;
strcpy(pcb[14].Name,"B14");
pcb[14].status='w';
pcb[14].prior=8;
pcb[14].next=-1;
ewait=14;
}
//插入就绪队列
void insertR(char* name){
for(int j = 0; j < 255; j++){
if(strcmp(pcb[j].Name,"-1") == 0){
strcpy(pcb[j].Name,name);
pcb[j].next = -1;
pcb[j].prior = eready;
pcb[eready].next = j;
eready = j;
return;
}
}
}
//插入等待队列
void insertW(char* name){
for(int j = 0; j < 255; j++){
if(strcmp(pcb[j].Name,"-1") == 0){
strcpy(pcb[j].Name,name);
pcb[j].next = -1;
pcb[j].prior = ewait;
pcb[ewait].next = j;
ewait = j;
return;
}
}
}
//创建一个进程并插入就绪队列
void creat(char* name){
for(int i = 0; i < 255; i++){
if(strcmp(pcb[i].Name,name) == 0){
printf("要创建的进程已存在!");
return;
}
}
insertR(name);
}
//输出目前正在运行或等待或就绪的队列
void Print(char ch){
int p ;//当前进程控制块的序号
//输出等待队列
if(ch == 'w'){
p = swait;
while(pcb[p].next != -1){
printf(pcb[p].Name );
printf("|");
p = pcb[p].next;
}
printf("%s\n",pcb[ewait].Name);
}
//输出就绪队列
else if(ch == 'r'){
p = sready;
while(pcb[p].next != -1){
printf( pcb[p].Name );
printf("|");
p = pcb[p].next;
}
printf("%s\n",pcb[eready].Name);
}
//输出运行队列
else{
p = srun;
while(pcb[p].next != -1){
printf( pcb[p].Name );
printf("|");
p = pcb[p].next;
}
printf("%s\n",pcb[erun].Name);
}
}
void Givestatus(int s,int i){
strcpy(pcb[i].Name,"-1");
//pcb[s].prior = -1;
pcb[i].next = -1;
pcb[i].prior = -1;
pcb[i].status = 'N';
}
//撤销一个进程
void Delete(char* name){
if(strcmp("-1",name) != 0)
for(int i = 0; i < 255; i++){
if(strcmp(pcb[i].Name,name) == 0){
if(i == srun ){
srun = pcb[i].next;
Givestatus(srun,i);
return ;
}
if(i == erun ){
erun = pcb[i].prior;
pcb[erun].next = -1;
Givestatus(srun,i);
return ;
}
if(i == sready ){
sready = pcb[i].next;
pcb[sready].prior = -1;
Givestatus(erun,i);
return;
}
if(i == eready ){
eready = pcb[i].prior;
pcb[eready].next = -1;
Givestatus(eready,i);
return;
}
if(i == swait ){
swait = pcb[i].next;
pcb[swait].prior = -1;
Givestatus(swait,i);
return;
}
if(i == ewait ){
ewait = pcb[i].prior;
pcb[ewait].next = -1;
Givestatus(ewait,i);
return;
}
pcb[pcb[i].next].prior =pcb[i].prior;
pcb[pcb[i].prior].next =pcb[i].next;
pcb[i].next = -1;
pcb[i].prior = -1;
pcb[i].status = 'N';
return;
}
}
}
//挂起一个进程并插入等待队列
void Hangup(char* name){
for(int i = 0; i < 255; i++){
if(strcmp(pcb[i].Name,name) == 0 && pcb[i].status == 'b' ){
Delete(name);//从运行队列中删除的进程
insertW(name);//插入等待队列
return;
}
}
printf("您要挂起的进程不存在!\n");
}
void main(){
int choose;//选项
for(int i = 0; i < 255; i++){
strcpy(pcb[i].Name,"-1");
pcb[i].next = -1;
pcb[i].prior = -1;
pcb[i].status = 'N';
}
init();
printf("Ready processes:");
Print('r');
printf("Wait processes:");
Print('w');
printf("Running processes:");
Print('b');
while(choose != 4){
printf("***************************************\n");
printf("choose:\n");
printf("1:Create a process:\n");
printf("2:Delete a process:\n");
printf("3:Hang up a process:\n");
printf("4:Quit!\n");
printf("***************************************\n");
printf("Input you choose!\n");
char name[10];
scanf("%d",&choose);
if(choose != 1 && choose != 2 && choose != 3 && choose != 4)
printf("\nThe choosees are 1,2,3,4,please input again!\n");
if(choose == 1){
printf("Input the name of the process you want to create:\n");
scanf("%s",name);
creat(name);
printf("Ready processes:");
Print('r');
printf("Wait processes:");
Print('w');
printf("Running processes:");
Print('b');
}
else if(choose == 2){
printf("Input the name of the process you want to delete:\n");
scanf("%s",name);
Delete(name);
printf("Ready processes:");
Print('r');
printf("Wait processes:");
Print('w');
printf("Running processes:");
Print('b');
}
else if(choose == 3){
printf("Input the name of the process you want to hang up:\n");
scanf("%s",name);
Hangup(name);
printf("Ready processes:");
Print('r');
printf("Wait processes:");
Print('w');
printf("Running processes:");
Print('b');
}
}
}
五、实验结果截图
输入选择1,2,3,4运行结果:
3、通过活动,使学生养成博览群书的好习惯。
B比率分析法和比较分析法不能测算出各因素的影响程度。√
C采用约当产量比例法,分配原材料费用与分配加工费用所用的完工率都是一致的。X
C采用直接分配法分配辅助生产费用时,应考虑各辅助生产车间之间相互提供产品或劳务的情况。错
C产品的实际生产成本包括废品损失和停工损失。√
C成本报表是对外报告的会计报表。×
C成本分析的首要程序是发现问题、分析原因。×
C成本会计的对象是指成本核算。×
C成本计算的辅助方法一般应与基本方法结合使用而不单独使用。√
C成本计算方法中的最基本的方法是分步法。X
D当车间生产多种产品时,“废品损失”、“停工损失”的借方余额,月末均直接记入该产品的产品成本
中。×
D定额法是为了简化成本计算而采用的一种成本计算方法。×
F“废品损失”账户月末没有余额。√
F废品损失是指在生产过程中发现和入库后发现的不可修复废品的生产成本和可修复废品的修复费用。X
F分步法的一个重要特点是各步骤之间要进行成本结转。(√)
G各月末在产品数量变化不大的产品,可不计算月末在产品成本。错
G工资费用就是成本项目。(×)
G归集在基本生产车间的制造费用最后均应分配计入产品成本中。对
J计算计时工资费用,应以考勤记录中的工作时间记录为依据。(√)
J简化的分批法就是不计算在产品成本的分批法。(×)
J简化分批法是不分批计算在产品成本的方法。对
J加班加点工资既可能是直接计人费用,又可能是间接计人费用。√
J接生产工艺过程的特点,工业企业的生产可分为大量生产、成批生产和单件生产三种,X
K可修复废品是指技术上可以修复使用的废品。错
K可修复废品是指经过修理可以使用,而不管修复费用在经济上是否合算的废品。X
P品种法只适用于大量大批的单步骤生产的企业。×
Q企业的制造费用一定要通过“制造费用”科目核算。X
Q企业职工的医药费、医务部门、职工浴室等部门职工的工资,均应通过“应付工资”科目核算。X
S生产车间耗用的材料,全部计入“直接材料”成本项目。X
S适应生产特点和管理要求,采用适当的成本计算方法,是成本核算的基础工作。(×)
W完工产品费用等于月初在产品费用加本月生产费用减月末在产品费用。对
Y“预提费用”可能出现借方余额,其性质属于资产,实际上是待摊费用。对
Y引起资产和负债同时减少的支出是费用性支出。X
Y以应付票据去偿付购买材料的费用,是成本性支出。X
Y原材料分工序一次投入与原材料在每道工序陆续投入,其完工率的计算方法是完全一致的。X
Y运用连环替代法进行分析,即使随意改变各构成因素的替换顺序,各因素的影响结果加总后仍等于指标的总差异,因此更换各因索替换顺序,不会影响分析的结果。(×)
Z在产品品种规格繁多的情况下,应该采用分类法计算产品成本。对
Z直接生产费用就是直接计人费用。X
Z逐步结转分步法也称为计列半成品分步法。√
A按年度计划分配率分配制造费用,“制造费用”账户月末(可能有月末余额/可能有借方余额/可能有贷方余额/可能无月末余额)。
A按年度计划分配率分配制造费用的方法适用于(季节性生产企业)
展开阅读全文