操作系统实验二

  • 格式:doc
  • 大小:230.76 KB
  • 文档页数:15

下载文档原格式

  / 15
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验

实验二进程管理

学号 1215108019 姓名李克帆

学院信息学院

班级 12电子 2

实验目的

1、理解进程的概念,明确进程和程序的区别。

2、理解并发执行的实质。

3、掌握进程的创建、睡眠、撤销等进程控制方法。

实验内容与要求

基本要求:用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。

实验报告内容

1、进程、进程控制块等的基本原理。

进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。

进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下:

I/完时间片

进程调

I/请

由于多个程序并发执行,各程序需要轮流使用CPU,当某程序不在CPU上运行时,必须保留其被中断的程序的现场,包括:断点地址、程序状态字、通用寄存器的内容、堆栈内容、程序当前状态、程序的大小、运行时间等信息,以便程序再次获得CPU时,能够正确执行。为了保存这些内容,需要建立—个专用数据结构,我们称这个数据结构为进程控制块PCB (Process Control Block)。

进程控制块是进程存在的惟一标志,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。当创建一个进程时,实际上就是为其建立一个进程控制块。

在通常的操作系统中,PCB应包含如下一些信息:

①进程标识信息。为了标识系统中的各个进程,每个进程必须有惟一的标识名或标识数。

②位置信息。指出进程的程序和数据部分在内存或外存中的物理位置。

③状态信息。指出进程当前所处的状态,作为进程调度、分配CPU的依据。

④进程的优先级。一般根据进程的轻重缓急其它信息。

这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。就

执行阻塞

程度为进程指定一个优先级,优先级用优先数表示。

⑤进程现场保护区。当进程状态变化时(例如一个进程放弃使用CPU),它需要将当时的CPU现场保护到内存中,以便再次占用CPU时恢复正常运行,有的系统把要保护的CPU 现场放在进程的工作区中,而PCB中仅给出CPU现场保护区起始地址。

⑥资源清单。每个进程在运行时,除了需要内存外,还需要其它资源,如I/O设备、外存、数据区等。这一部分指出资源需求、分配和控制信息。

⑦队列指针或链接字。它用于将处于同一状态的进程链接成一个队列,在该单元中存放下一进程PCB首址。

⑧其它信息。

这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。

2、程序流程图。

3、程序及注释。

#include

#include操作结束#include

struct jincheng_type{ // 定义表示进程信息的结构体

int pid;

//进程ID

int youxian; //优先级

int daxiao; //大小

int zhuangtai;

//进程的状态,这里用0表示没有建立或被杀死,1表示执行,2表示换出int info;

//内容

};

struct jincheng_type neicun[20]; //定义20个内存单位给进程使用

int shumu=0,guaqi=0,pid,flag=0; //定义正在执行进程数目,被挂起进程数目,进程ID,

运行标志位

void create() //函数--创建一个新进程

{ if(shumu>=20) printf(\n内存已满,请先换出或杀死进程\n); //判断内存空间是否已满

else{

for(int i=0;i<20;i++)

if(neicun[i].zhuangtai==0) break; //选出空着的内存单元给新进程使用

printf(\n请输入新进程pid\n); //输入新进程ID存至选出的内存单元

scanf(%d,&(neicun[i].pid));

for(int j=0;j

有进程ID相同时,显示该进程已存在

{ printf(\n该进程已存在\n); return;

}

printf(\n请输入新进程优先级\n); //输入新进程的优先级、大小和内容

scanf(%d,&(neicun[i].youxian)); printf(\n请输入新进程大小\n);

scanf(%d,&(neicun[i].daxiao)); printf(\n请输入新进程内容\n);

scanf(%s,&(neicun[i].info)); neicun[i].zhuangtai=1; //将新进程的内存单元状

态(zhuangtai)设成1,以表示存在且未被换出

shumu++;

//正在运行的进程数目加一

}

}

void run() //函数--查看正在运行的进程

{ for(int i=0;i<20;i++) { if(neicun[i].zhuangtai==1) //将存在且未被挂起(即zhuangtai=1)的进程显示出来,若存在这样的程序,则将flag设成1

{ printf(\n pid=%d--,neicun[i].pid); printf(youxian=%d--,neicun[i].youxian); printf(daxiao=%d--,neicun[i].daxiao); printf(zhuangtai=%d--,neicun[i].zhuangtai); printf(info=%c,neicun[i].info);

flag=1;

}

} if(!flag)

printf(\n当前没有运行进程\n);

//若当前没有运行进程(即flag=0),则显示当前没有运行进程

}

void huanchu() //函数--换出进程