操作系统实验一 进程管理
实验一 进程管理
1.目的和要求
通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。
2.实验内容
用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。
3.实验环境
Windows操作系统、VC++6.0
C语言
4.实验提示
PCB结构通常包括以下信息:进程名,进程优先数,轮转时间片,进程所占用的CPU时间,进程的状态,当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删。
主体程序
#include "conio.h"#include "stdio.h"#include "stdlib.h"struct PCB_type{ int pid;int priority;int cputime;……… };struct PCB_type neicun[20];int shumu=0,pid_l;main(){int n,m,i;char a;n=1;while(n==1){clrscr();printf("\n********************************************");printf("\n* 进程演示系统 *");printf("\n********************************************");printf("\n 1.创建新的进程 2.查看运行进程 ");printf("\n 3.换出某个进程 4.杀死运行进程 ");printf("\n 5.退出系统 ");printf("\n********************************************");printf("\n请选择(1~5)");a=getchar();switch(a){ case'1':create( ); /*自定义过程*/break;case'2':run( ); /* 自定义过程 */break;case'3':huanchu(); /*自定义过程*/break;case'4':kill( ); /*自定义过程*/break;case'5':exit(0); default: n=0;}}}create( ) /* 创建一个进程的示例(不完整的程序) */{if(shumu>=20){printf("\n内存已满,请先结束或换出进程\n");}else{printf("\n请输入新进程的pid\n");scanf("%d",&neicun[shumu-1].pid);printf("\n请输入新进程的优先级\n");scanf("%d",&neicun[shumu-1].youxian);printf("\n请输入新进程的大小\n");scanf("%d",&neicun[shumu-1].daxiao);shumu++;}}
5.实验运行结果
********************************************
* 进程演示系统 *
********************************************
1.创建新的进程 2.查看运行进程
3.换出某个进程 4.杀死运行进程
5.退出系统
********************************************
请选择(1~5)
然后根据你选择的不同,出现不同的结果。
6. 实验要求:
- 上机前认真使用C语言编写好程序,采用Visual C++6.0作为编译环境;
- 上机时独立调试程序
根据具体实验要求,填写好实验报告(包括目的和要求、实验内容、实验环境、设计思想、源程序、实例运行结果、总结)
实验报告代码:
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
struct PCB_type
{ int pid;int priority;int size;char content[10];int state; /* 0表示不在内存,1表示在内存,2表示挂起*/
};
struct PCB_type storage[20];
int num=0,hang_up=0,bj,i,j,pid;/*定义相关参数变量*/
/*********************创建新进程*************************/
void create()
{ if(num>=20) /*判断是否有存储空间*/printf("\n 内存已满,请删除或挂起其他程序");else{for(i=0;i<20;i++)if(storage[i].state==0) break; /*按顺序在内存中寻找创建新进程的空间*/printf("\n请输入新建进程的pid值\n");scanf("%d",&storage[i].pid);for(j=0;j<i;j++) /*判断是否之前已存储相同pid进程*/if(storage[j].pid==storage[i].pid){ printf("\n该进程已存在于内存中");return;}printf("\n请输入新进程的优先级 \n" ); scanf("%d",&storage[i].priority);printf("\n请输入新进程的大小\n" ); scanf("%d",&storage[i].size);printf("\n请输入新进程的内容\n" ); scanf("%s",&storage[i].content);storage[i].state=1; /*将进程状态设为1,表示在内存中*/num++;/*内存中进程数目加一*/}
}
/********************查看当前运行进程**************************/
void run()
{ bj=0;for(i=0;i<20;i++)
if(storage[i].state==1) /*若进程状态设为1,表示在内存中,输出查看*/
{printf("\n pid=%d",storage[i].pid);printf(" priority=%d",storage[i].priority);printf(" size=%d",storage[i].size);printf(" content=%s",storage[i].content);bj=1;/*存在于内存中的进程标记为1 */
}if(bj==0) printf("\n当前没有运行该进程\n" );/*标记为0,表示该进程未创建于内存中*/ }
/********************换出进程***************************/void swap_out()
{if(num==0) /*num=0,表示内存中无进程*/{ printf("\n当前没有运行的进程\n" );return;} printf("\n请输入要换出的进程的pid值\n" );scanf("%d",&pid);bj=0;for(i=0;i<20;i++){if(pid==storage[i].pid){ if(storage[i].state==1){storage[i].state=2; /*将该进程的状态设为挂起*/hang_up++;printf("\n该进程已成功挂起换出\n" );}else if(storage[i].state==0)printf("\n要换出的进程不存在\n" );else printf("\n要换出的进程已经被挂起\n" ); bj=1;break;}}if(bj==0) printf("\n要换出的进程不存在\n" );
}
/********************杀死进程***************************/
void kill()
{if(num==0){ printf("\n当前没有运行的进程\n" );return;}printf("\n请输入要杀死的进程的pid值\n" );scanf("%d",&pid);bj=0;for(i=0;i<20;i++){if(pid==storage[i].pid){ if(storage[i].state==1){storage[i].state=0; /*将该进程的状态设为不在内存中*/num--; /*内存中的进程数目减少一个*/printf("\n该进程已成功杀死\n" );}else if(storage[i].state==0)printf("\n要杀死的进程不存在\n" );else printf("\n要杀死的进程已经被挂起\n" );/*剩余状态为2,挂起*/bj=1;break;}} if(bj==0) printf("\n要杀死的进程不存在\n" );}
/********************唤醒进程***************************/
void rouse()
{ if(num==0) { printf("当前没有运行的进程\n");return;}if(hang_up==0) /*hang_up=0,表示没有挂起的进程*/{ printf("\n当前没有换出的进程\n");return;}printf("\n请输入要唤醒的进程的pid值:\n");scanf("%d",&pid);for(i=0;i<20;i++){if(pid==storage[i].pid){if(storage[i].state==2){storage[i].state=1; /*将该进程的状态设为挂起*/hang_up--;num++;printf("\n该进程已成功唤醒\n" );}else if(storage[i].state==0)printf("\n要唤醒的进程不存在\n" );else printf("\n要唤醒的进程已经在内存中\n" );}}}
/********************主程序***************************/
int main()
{int serial,n=1,i;
for(i=0;i<20;i++)storage[i].state=0; /*使所有进程都初始设为不在内存中*/
while(n){
printf("\n**********************************************");
printf("\n* 进程演示系统 *");
printf("\n**********************************************");
printf("\n 1.创建新的进程 2.查看运行进程");
printf("\n 3.换出某个进程 4.杀死运行进程");
printf("\n 5.唤醒某个进程 6.退出程序 ");
printf("\n**********************************************");
printf("\n请选择(1~6):");scanf("%d",&serial);switch(serial){ case 1: create( ); break;case 2 :run(); break;case 3 :swap_out();break;case 4 :kill();break;case 5 :rouse();break;case 6 :exit(0);default: n=0;break;}
}
return 0;
}
运行结果:
操作系统实验一 进程管理相关推荐
- 操作系统实验二 进程管理
进程管理 一.实验目的 1. 理解进程的概念,明确进程和程序的区别. 2. 理解并发执行的实质. 3. 掌握进程的创建.睡眠.撤销等进程控制方法. 二.实验内容与基本要求 用C语言编写程序,模拟实现创 ...
- 操作系统——实验二 进程管理
1.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执行的实质. (3)分析进程竞争资源现象,学习解决进程互斥的方法. 2.实验预备内容 (1)阅读Linux的sch ...
- 计算机操作系统实验二 进程管理
一.实验目的 1.掌握进程的概念,明确进程的含义 2.认识并了解并发执行的实质 二.实验内容 1.编写一段程序,使用系统调用fork( )创建两个子进程.当此程序运行时,在系统中有一个父进程和两个子进 ...
- 操作系统 实验一 进程管理与进程同步
理解安全性算法和银行家算法的核心机制: 针对3类资源.5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况: 编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申 ...
- 操作系统实验一 Linux基本操作|实验二 进程管理
由于当时没存代码,只有实验文档代码截图,文末也可直接获取实验文档. 操作系统实验 目录 实验一 Linux基本操作 实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统 ...
- linux进程管理命令实验,实验2Linux进程管理.doc
实验2Linux进程管理 实验2 Linux进程管理 实验目的 1.加深对进程概念的理解,明确进程和程序的区别 2.进一步认识并发执行的实质 3.分析进程争用资源的现象,学习解决进程互斥的方法 实验性 ...
- (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题
本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...
- (王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题
本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 文章目录 一 ...
- (王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题
注意:生产者与消费者问题Linux系统编程专栏有案例讲解 Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型 Linux系统编程40:多线程之基于环形队列的生产者与消费者模型 本文接:(王 ...
- 笔记篇:操作系统第二章 进程管理
笔记篇:操作系统第二章 进程管理 目录 笔记篇:操作系统第二章 进程管理 2.1 进程的基本概念 2.1.1 程序的顺序执行及其特征 2.1.2 前驱图 2.1.3 程序的并发执行及其特征 2.1.4 ...
最新文章
- CCNA11月14日战报
- 0127-python内置函数(一).abb
- 启动Spark Shell,在Spark Shell中编写WordCount程序,在IDEA中编写WordCount的Maven程序,spark-submit使用spark的jar来做单词统计
- 《DSP using MATLAB》第6章开始了
- 【东营seo】SEO发展下的大机遇
- Python之包管理工具
- SpringBoot入门(四)——自动配置
- 第7章[7.18] Ext JS组件嵌入HTML页面
- 一篇文章搞定Python多进程
- 第26讲 js函数调用过程内存分析 js函数细节
- java内存分配与回收策略、动态对象年龄判断、空间分配担保
- c语言常用函数doc下载,c语言常用函数.doc
- win7系统如何加速计算机启动,怎么使win7系统开机加速
- 【BZOJ2434】【NOI2011】阿狸的打字机(AC自动机及Fail树的性质,树状数组)
- ARCGIS Pro试用申请教程以及登录页面脚本错误解决办法
- Anroid在应用层实现开机自启
- 移动硬盘坏了数据可以恢复吗?新方法一看便知
- 慢牛股票-基于Sencha touch+Cordova的股票类APP
- 从现在开始学 Kafka:SpringBoot 集成 Kafka,生产者与消费者示例
- 恢复被病毒强制隐藏的文件夹
热门文章
- 滴滴上市年营收超千亿,程维:我必须时刻保持危机感
- 支付宝资金预授权怎么开通详解,芝麻信用免押接口开通,免押领取/免押金租赁设备!
- 计算机媒体分类及其特点,多媒体的媒体种类有哪些?试归纳叙述多媒体关键特性以及这些特性之间的关系。...
- com.thoughtworks.xstream.InitializationException 打包时偶尔就会报错
- Anaconda2020安装与使用
- android台式电脑系统安装,怎么在台式机上安装安卓系统
- 算法-猴子运香蕉,看谁剩的多,N种解法
- ai画面怎么调大小_AI里面怎么改变文件的大小?
- android sqlite英文文献,SQLite数据库外文文献翻译.doc
- 氨基酸三字母序列转单字母序列