东北大学操作系统实验之Linux及进程状态

时间:2024.5.4

操作系统实验报告一

东北大学操作系统实验之Linux及进程状态

实验一 进程状态转换及其PCB的变化

一、实验目的:

自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。

二、实验内容及要求:

(1)、 设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。

(2)、 独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。

(3)、 合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。

(4)、 设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。

(5)、 代码书写要规范,要适当地加入注释。

(6)、 鼓励在实验中加入新的观点或想法,并加以实现。

(7)、 认真进行预习,完成预习报告。

(8)、 实验完成后,要认真总结,完成实验报告。

五状态模型:

东北大学操作系统实验之Linux及进程状态

三、主要数据结构:

struct Run_type //运行态进程

{

char name;

int state;

int needtime;

int priority;

};

struct Ready_type //就绪态进程

{

1

char name;

int needtime;

int priority;

};

struct Blocked_type //阻塞态进程

{

char name;

int needtime;

int priority;

};

四、程序源代码:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int i=0; int j=0;

struct Run_type{

char name;

int state;

int needtime;

int priority;

};

struct Ready_type{

char name;

int needtime;

int priority;

};

struct Blocked_type{

char name;

int needtime;

int priority;

};

struct Run_type Cpu;

struct Ready_type Ready[10];

struct Blocked_type Blocked[10];

void Creat(){ //创建一个新的进程

int k=0;

label1:

printf(" input new process name(input a letter): \n");

scanf("%s",&(Ready[i].name));getchar();

for(k=0;k<i;k++)

if(Ready[i].name==Ready[k].name||Ready[i].name==Ready[k].name+32||Ready[i].name==Ready[k].name-32)

2

{

printf("the process is already exist!");

goto label1;

}

printf("input needtime (input a int number):\n");

label3:

scanf("%d",&(Ready[i].needtime));getchar();

if(Ready[i].needtime<1||Ready[i].needtime>100)

{

printf("please input the true needtime(1--100)\n");

goto label3;

}

printf(" input the priority(1--10): \n");

label2:

scanf("%d",&(Ready[i].priority));getchar();

if(Ready[i].priority<1||Ready[i].priority>10)

{

printf("please 1--10!\n");

goto label2;

}

i++;

}

void Dispath() //P135

{

int t;char v;int k;int j;

if(Cpu.state==0)

if(Ready[i-1].needtime==0)

{

printf("* there is no process ready!\n");

exit(0);

}

else

{

for(k=0;k<i-1;k++)

for(j=0;j<i-k-1;j++)

if(Ready[j].priority>Ready[j+1].priority)

{t=Ready[j].priority;

Ready[j].priority=Ready[j+1].priority;Ready[j+1].priority=t; t=Ready[j].needtime;

Ready[j].needtime=Ready[j+1].needtime;Ready[j+1].needtime=t; v=Ready[j].name;

Ready[j].name=Ready[j+1].name;Ready[j+1].name=v;

}

--i;

3

Cpu.name=Ready[i].name;Cpu.needtime=Ready[i].needtime;Cpu.priority=Ready[i].priority;Cpu.state=1;

printf("*%5c is send to cpu! \n",Cpu.name);

Cpu.needtime--;

if(Cpu.needtime==0)

{printf("*%5c is finished \n",Cpu.name);

Cpu.state=0;}

}

else

{

Ready[i].name=Cpu.name;

Ready[i].needtime=Cpu.needtime;

Ready[i].priority=Cpu.priority;

for(k=0;k<i;k++)

for(j=0;j<i-k;j++)

if(Ready[j].priority>Ready[j+1].priority)

{t=Ready[j].priority;

Ready[j].priority=Ready[j+1].priority;Ready[j+1].priority=t; t=Ready[j].needtime;

Ready[j].needtime=Ready[j+1].needtime;Ready[j+1].needtime=t; v=Ready[j].name;

Ready[j].name=Ready[j+1].name;Ready[j+1].name=v;

}

Cpu.name=Ready[i].name;Cpu.needtime=Ready[i].needtime;Cpu.priority=Ready[i].priority;Cpu.state=1;

printf("*%5c is send to cpu! \n",Cpu.name);

Cpu.needtime--;

if(Cpu.needtime==0)

{printf("*%5c is finished \n",Cpu.name);

Cpu.state=0;}

}

}

void Timeout()

{

if(Cpu.state==0)

{

printf("* there is no process in cpu(please select Dispath!\n"); exit(0);

}

else

{

Ready[i].name=Cpu.name;

Ready[i].needtime=Cpu.needtime;

Ready[i].priority=Cpu.priority;

4

printf("%c is timeout \n",Cpu.name); Cpu.name=0;

Cpu.needtime=0;

Cpu.priority=0;

Cpu.state=0;

i++;

}

}

void Eventwait(){

if(Cpu.state!=0)

{

Blocked[j].name=Cpu.name;

Blocked[j].needtime=Cpu.needtime;

Blocked[j].priority=Cpu.priority;

printf("* %c is Blocked !\n",Cpu.name); j++;

Cpu.name=Blocked[j].name;

Cpu.needtime=Blocked[j].needtime;

Cpu.priority=Blocked[j].priority;

Cpu.state=0;

}

else

printf("* There is no process in cpu!"); }

void Eventoccurs(char a){

int k=0;int m=0;int n=0;int p=0;

if(Blocked[0].needtime==0)

{

printf("* there is no process blocked!\n"); exit(0);

}

else

{

for(k;k<j;k++)

if(Blocked[k].name==a)

{

Ready[i].name=Blocked[k].name;

Ready[i].needtime=Blocked[k].needtime; Ready[i].priority=Blocked[k].priority; p=1;

m=j-k;

for(n;n<m;n++)

{

Blocked[k].name=Blocked[k+1].name;

5

Blocked[k].needtime=Blocked[k+1].needtime;

Blocked[k].priority=Blocked[k+1].priority;

k++;

}

j--;i++;

}

if(p==1)

printf("* %c is ready!\n",a);

else

printf("* %c is not found! \n",a);

}

}

void main(){

Cpu.state=0;

int Cputime=0;

int x=6;

while(x!=0)

{

printf("\n1:input new process 2:Dispath\n");

printf("3:Timeout

4:Eventwait\n");

printf("5:Eventoccurs(select whose eventoccur ) 0:exit\n");

label4:

scanf("%d",&x);getchar();

printf("\n==================================================================

============\n");

if(x==0||x==1||x==2||x==3||x==4||x==5)

{

switch(x)

{

case 1:Creat();break;

case 2:Dispath();break;

case 3:Timeout();break;

case 4:Eventwait();break;

case 5:char a;scanf("%c",&a);getchar(); Eventoccurs(a);break;

default:printf("please select from 0 to 5\n");

}

printf("----------------------------- Cputime:%3d

----------------------------------\n",Cputime);

printf("| ProceNsname NeedTime Priority |\n");

if(Cpu.state!=0)//显示Cpu中的程序

6

{

printf("| Cpu:%16c",Cpu.name);printf("%20d",Cpu.needtime);printf("%18d |\n",Cpu.priority);

}

else

printf("| * Cpu is free |\n");

int y=0;

if(i==0)//显示Ready队列中的数据

{

printf("| *There is no process ready. |\n");

}

else

{

for(y;y<i;y++)//显示Ready中的程序

{

printf("| Ready%d:",y);

printf("%15c",Ready[y].name);printf("%20d",Ready[y].needtime);printf("%18d

|\n",Ready[y].priority);

}

}

int z=0;

if(j==0) //显示Blocked队列中的程序

{

printf("| *There is no process blocked. |\n");

}

else

{

for(z;z<j;z++)

{

printf("| Blocked%d:",z);

printf("%13c",Blocked[z].name);printf("%20d",Blocked[z].needtime);printf("%1

8d |\n",Blocked[z].priority);

}

}

Cputime++;

if(Cpu.state!=0)

Cpu.needtime=Cpu.needtime-1;

printf("--------------------------------------------------------------------

7

---------\n");

}

else

{

printf("please input 0--5\n");

goto label4;

}

}

}

五、运行结果:

1.创建a,b两个进程

东北大学操作系统实验之Linux及进程状态

2、调度进程(由于b优先级高,所以b先进入运行态)

东北大学操作系统实验之Linux及进程状态

3、当b时间片到了,b变为就绪态

东北大学操作系统实验之Linux及进程状态

8

4、再次调度(由于b优先级高,故还是b变成运行态)

东北大学操作系统实验之Linux及进程状态

5、正在运行的b阻塞

东北大学操作系统实验之Linux及进程状态

6、当b等待的事件发生,b重新进入就绪态

东北大学操作系统实验之Linux及进程状态

六、程序使用说明:

编译程序后若无错就执行程序,初始如下:

东北大学操作系统实验之Linux及进程状态

9

其中:1表示创建新进程,随后输入进程名,所需时间,优先级 2表示系统调度进程,首先调度最高优先级

3表示时间片已到,运行中的进程将编程就绪态 4表示进程所需的事件尚未发生,进程将被阻塞

5表示进程等待的事件已发生,进程从阻塞态变为就绪态 0退出程序

10

更多相关推荐:
操作系统实验报告-Linux操作、使用、编程)

实验报告20xx20xx学年第二学期课程名称实验名称实验时间指导单位操作系统ALinux操作使用编程20xx年5月6日计算机学院计算机科学与技术系指导教师徐小龙学生姓名学院系陈坤通达学院班级学号专业100029...

linux操作系统实验报告

一设计题目进程管理及理解和增加Linux系统调用二设计时间和地点设计时间20xx年12月26日20xx年12月29日设计地点装备制造学院B座502机房三设计目的和要求1加深对进程概念的理解明确进程和程序的区别2...

操作系统课程设计实验报告(以Linux为例)

操作系统课程设计实验报告学号姓名苏州大学计算机科学与技术学院20xx年9月操作系统课程设计实验报告目录目录1一实验环境2二实验报告总体要求2实验一编译LINUX内核3实验二观察LINUX行为7实验三进程间通信1...

linux操作系统实验报告书

linux操作系统实验报告书1一实验名称Linux基本命令的使用二实验目的1进一步练习Linux登录和退出的方法2练习与目录和文件操作相关的Linux命令cd切换目录mkdir建立一个新目录cp文件拷贝ls显示...

linux操作系统指令实验报告

实验一Linux的基本操作和常用命令的使用一实验目的1学会安装Linux操作系统2掌握Linux系统的一些基本操作3掌握常用Linux命令的使用方法4了解Linux命令中参数选项的用法和作用二实验环境1Linu...

Linux操作系统实习报告

沈阳航空航天大学Linux系统操作实习报告院系计算机学院专业计算机科学与技术班级84010103学号20xx040101061姓名李雪城指导教师王越完成日期20xx年7月22日7月18日实习内容今天是Linux...

Linux操作系统的安装及使用实验报告

实验报告课程名称计算机网络原理与技术实验项目Linux操作系统的安装及使用专业班级姓名学号指导教师成绩日期一实验目的1掌握虚拟机VMware软件的安装和使用2掌握Linux系统软件的安装和使用4掌握Linux命...

Linux操作系统设计实践报告一

Linux操作系统设计实践实验报告一学号组长学院数计学院专业年级09本组其它成员学号姓名学号姓名学号姓名实验时间20xx20xx学年第一学期指导教师Linux操作系统设计实践实验一进程管理实验目的1加深对进程概...

Linux系统的熟悉与使用操作系统实验报告

实验一Linux系统熟悉与使用Linux有两种不同的含义从严格的技术定义讲Linux指的是开放源代码的Unix类操作系统的内核然而目前大多数人用它来表示以Linux内核为基础的整个操作系统从这种意义讲Linux...

Linux操作系统实验报告2

1在linux系统中头文件以h为扩展名在usrinclude目录中显示所有以t字母开头的头文件的名字给出会话过程2搜索你的主目录找到所有的HTML和C程序文件文件有htmlhtm或c扩展名显示符合要求的文件路径...

操作系统实验报告 linux部分(原创)

操作系统实验报告Linux部分班级姓名23Linux并发程序设计实验估计时间90分钟工具准备工作实验内容与步骤背景知识管道是Linux中最常用的进程间通信IPC机制利用管道时一个进程的输出可成为另外一个进程的输...

linux操作系统实验报告_shell简单编程

操作系统实验报告院系机电与信息工程学院实验日期20xx年xx月x日

linux操作系统实验报告(21篇)