.
实验二 模拟实现进程管理
组长:李和林  软件1402
组员     分工     一、 实验目的
1. 理解进程的概念,明确进程和程序的区别。 2. 理解并发执行的实质。
3. 掌握进程的创建,睡眠,撤销等进程控制方法。
二、 实验内容
用C语言,JAVA语言,C++语言编写程序,模拟实现创建新的进程;查看运行进程,换出某个进程;杀死运行进程。
三、 实验准备
1. 进程的定义
进程是程序在一个数据集合上的运行过程,是系统资源分配和调度的一个单位。一个程序在不同的数据集合上运行,乃至一个程序在同样数据集合上的多次运行都是不同的进程。
2. 进程的状态
通常情况下,一个进程必须具有就绪,执行和阻塞三种基本
教育资料
.
情况。
1) 就绪状态
当进程已分配到除处理器外的所有必要资源后,只要再获得处理器就可以立即执行,这时进程的状态就为就绪状态。在一个系统里,可以有多个进程同时处于就绪状态,通常把这些就绪进程排成一个或多个队列,称为就绪队列。 2) 执行状态
处于就绪状态的进程一旦获得处理器,就可以运行,进程状态也就处于执行状态,在单处理器系统中,只能有一个进程处于执行状态,在多处理器系统中,则可能有多个进程处于执行状态 3) 阻塞状态
正在执行的进程因为发生某些事件而暂停运行,这种受阻暂停的状态称为阻塞状态,也可称为等待状态。通常将处于阻塞状态的进程拍成一个队列,称为阻塞队列,在有些系统中,也会按阻塞原因的不同将阻塞状态的进程排成多个队列。 3. 进程状态之间的转换
新进程  教育资料 接纳 就绪 中断 执行 调度 完成 终止 I/O完成 阻塞 I/O请求    .
4. 进程控制块
1) 进程控制块的作用
进程控制块是进程实体的重要组成部分,主要包含下
述四个方面的信息:
a) 进程标示信息 b) 说明信息 c) 现场信息 d) 管理信息
5. 进程控制块的组织方式 1) 链接方式 2) 索引方式 6. 进程控制原语
1) 创建原语 2) 撤销原语 3) 阻塞原语 4) 唤醒原语 7. 程序代码
#include #include using namespace std; void clrscr(); void create(); void run( );void exchange( );//唤出 void kill( ); void wakeUp( );//唤醒 struct process_type{
教育资料
.
int pid;
int priority;//优先次序  int size;  int state;//状态  char info[10]; };
教育资料struct process_type internalMemory[20];
int amount=0,hangUp=0,pid,flag=0;//数目,挂起    void  main( ){  int n;  int a; n=1; clrscr( ); while(n==1){   cout<<\"\\n********************************************\";
cout<<\"\\n*               进程演示系统                                *\"  cout<<\"\\n********************************************\";   cout<<\"\\n     1.创建新的进程     2.查看运行进程    \";   cout<<\"\\n     3.换出某个进程     4.杀死运行进程    \";   cout<<\"\\n     5.唤醒某个进程¨     6.退出系统        \";   cout<<\"\\n*********************************************\"<>a;   switch(a){   case 1:    create( );    break;   case 2:run( );
break;
case 3:
exchange();//换出    break;   case 4:
kill();    break;   case 5:
wakeUp();    break;   case 6:    exit(0);   default:
n=0;
}
;
.
} }
void create(){  //创建进程  int i=0;  if (amount>=20)  {    } else{
for (i=0;i<20;i++) {     }
cout<<\"请输入新进程的pid: \"<if (internalMemory[i].state==0) {  }break;
cout<<\" 内存已满,请先结束或换出进程\";
cin>>internalMemory[ i ].pid;
cout<<\"请输入新进程的优先级: \"<>internalMemory[amount].priority; cout<<\"请输入新进程的大小: \"<>internalMemory[amount].size;          } }cout<<\"请输入新进程的内容: \"<>internalMemory[amount].info; internalMemory[i].state=1; amount++;void clrscr()//清除内存空间 {
for (int i=0;i<19;i++)  {
internalMemory[i].pid=0; internalMemory[i].priority=0; internalMemory[i].size=0; internalMemory[i].state=0;  }  amount=0; }
void run() {
for (int i=0;i<20;i++)  {
教育资料
.
} }
void exchange( ){//唤出优先级最小的进程  if (!amount)
{      }
cout<<\"\\n输入换出进程的ID值: \";  cin>>pid;
for (int i=0;i<20;i++)
{                                    }
if (flag==0)  {
if (pid==internalMemory[i].pid) {                 }
if (internalMemory[i].state==1) {     {  } else{  } flag=1; break;
cout<<\"\\n要换出的进程已被挂起\\n\"; cout<<\"\\n要换出的进程不存在\"; internalMemory[i].state=2; hangUp++;
cout<<\"\\n已经成功换出进程\\n\"; }
cout<<\"当前没有运行进程\\n\"; return;
if (internalMemory[i].state==1) {         }
cout<<\"当前内存中的进程:\\n\"<cout<cout<else if (internalMemory[i].state==0)教育资料
.
} }
void kill( ){  if (!amount)  {
cout<<\"当前没有运行进程\\n\"; return;  }
cout<<\"请输入要杀死的进程:  \";  cin>>pid;
for (int i=0;i<20;i++)  {
if (pid==internalMemory[i].pid)                              }
if (!flag)  {    } }
void wakeUp(){  if (!amount)  {      }
cout<<\"当前没有运行进程\"<cout<<\"\\n要杀死的进程不存在\\n\";                }{  {    {  {  } flag=1; break;
cout<<\"\\n要杀死的进程已被挂起\\n\";
cout<<\"\\n要杀死的进程不存在\\n\";
}else
internalMemory[i].state=0;
amount--;
cout<<\"此进程被杀死\"<cout<<\"\\n要换出的进程不存在\";}else if (internalMemory[i].state==0)
教育资料
.
if (!hangUp)  {    }
cout<<\"请输入pid: \";  cin>>pid;
for (int i=0;i<20;i++)  {
if (pid==internalMemory[i].pid) {                         }
if (flag)  {    } }
cout<<\"\\n要唤醒的进程已被挂起\\n\"<flag=0;if (internalMemory[i].state==2) {    }        }
else if (internalMemory[i].state==0) {   } break;
cout<<\"\\n要换醒的进程不存在\\n\"; cout<<\"\\n要唤醒的进程已被挂起\\n\"; }else{
internalMemory[i].state=1; hangUp--;
cout<<\"已经成功唤醒进程\\n\";
cout<<\"当前没有挂起进程\";
return;
8.实现的结果
教育资料
.
教育资料