200600814112 石强 计科071
实验一:进程创建与撤消
一.实验目的
(1) 加深对进程概念的理解和进程创建与撤消算法; (2) 进一步认识并发执行的实质。
二.实验属性
该实验为设计性实验。
三.实验仪器设备及器材
普通PC386以上微机
四.实验要求
本实验要求2学时完成。
本实验要求完成如下任务:
(1)进程管理认识:通过windows “任务管理器”观察进程的状态,进行进程的创建、切换和撤销。
(2)进程创建与撤销:通过编程实现进程的创建与撤销功能,并在屏幕上观察进程活动的结果。
实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告;实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。实验后认真书写符合规范格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。 五.实验步骤:
步骤一:了解进程的创建与撤销过程.
步骤二:对PCB的数据结构了解,并设计出PCB的数据结构. 步骤三:设计主体代码. 步骤四:运行验证.
六.主要代码
struct pcb //定义进程控制块pcb的结构 {
int id;//进程id
char name[10];//进程名称 int priority;//进程的优先级
struct pcb *status;//状态指针(运行,就绪,等待) struct pcb *next;//进程当前队列指针
1
200600814112 石强 计科071
struct pcb *all_q_next;//总链指针 int flag;//进程控制块的分配标志
};
struct pcb pcba[10];//结构体数组,用来模拟pcb资源池 struct pcb *all_q_head;//总链队列头指针 struct pcb *ready_head;//就绪队列头指针 void creat() //创建进程
{
int m;//用来循环给pcb块的标志位置零 int i;//用来输入第一个进程的id int j;//用来寻找空闲pcb块
//进程控制块分配标志置零 for(m=0;m<=9;m++) pcba[m].flag=0; //初始化总链队列
p1=p2=p3=all_q_head=&pcba[0]; all_q_head->id=0;
all_q_head->next=NULL; all_q_head->all_q_next=NULL; all_q_head->flag=1;
//初始化就绪队列
q1=q2=q4=q5=ready_head=&pcba[1]; ready_head->id=0;
ready_head->next=NULL;
ready_head->all_q_next=NULL; ready_head->flag=1;
//判断有没有同名进程
cout<<\开始创建第一个进程:\ //
p3->all_q_next=NULL;
for(;;) {
cout<<\请输入进程id(id是整型数)\
cin>>i;
while(p3!=NULL)
2
200600814112 石强 计科071
{
if(p3->id==i)
{
cout<<\有同名进程,创建出现错误!\
p4=p5=all_q_head->all_q_next; return; }//if
else
p3=p3->all_q_next; }//while
if(p3==NULL) {
cout<<\没有同名进程,可以以此进程id创建进程\ p3=all_q_head;//t- pcb中内容赋值
} else
{
cout<<\池中没有空闲pcb块,不能申请pcb结构来创建进程
\ }
//if break;
for(j=0;j<=9;j++) //判断pcb池中有没有空闲的pcb块 {
if(pcba[j].flag==1&&j!=9) continue;
cout<<\池中有空闲pcb块,可以申请pcb结构来创建进程
\ t=&pcba[j];//获得空间, 在没有同名进程和有空闲pcb块的情况下,开始创建进程
t->id=i;//进程的id可以直接赋值;
break; }
if(j>9)
{
cout<<\池中没有空闲pcb块,不能申请pcb结构来创建进程
\
3
200600814112 石强 计科071
}
cout<<\请依次输入所创进程的名称,优先级\ // scanf(\
cin>>t->name; //进程的名称,它是不超过10个字符的字符串 cin>>t->priority;//进程的优先级,它是整型数 t->status=ready_head;//进程的状态置为就绪状态 t->flag=1;
//新进程的pcb入总链队列 p2->all_q_next=t;
t->all_q_next=NULL; p2=t;
//新进程的pcb入就绪队列
q2->next=t; t->next=NULL; q2=t;
//输出总链队列的内容
cout<<\进程创建后总链队列的内容如下(进程id,进程名,优先级):\ p1=p1->all_q_next; while(p1!=NULL)
{
cout<
p1=all_q_head;
//输出就绪队列的内容
cout<<\进程创建后就绪队列的内容如下(进程id,进程名,优先级):\ q1=q1->next; while(q1!=NULL) {
cout<
4
200600814112 石强 计科071
q1=q1->next;
}//while
q1=ready_head; char k;
cout<<\继续创建进程吗?(y/n):\ cin>>k; if(k=='y'||k=='Y')
continue;
else if(k=='n'||k=='N')
{ cout<<\进程创建完毕!\ }
p4=p5=all_q_head->all_q_next; break; } else
{ p4=p5=all_q_head->all_q_next; }
return; }
p4=p5=all_q_head->all_q_next;
void kill() //***************************************************** 撤销进程 { for(;;)
{
//cout<<\输入有误,请继续输入:\ if(p5==NULL)
{ cout<<\没有可以撤销的进程了!\ return;
}
cout<<\请输入想要撤销的进程的id号:\ int n;
cin>>n;
q1=q2=q3=ready_head->next;
while(p5->id!=n&&p5->all_q_next!=NULL)//寻找id号为n的节点 { p4=p5;
p5=p5->all_q_next; }
if(p5->id==n)//找到
5