操作系统-实验一-进程控制
目录
操作系统 | 实验一 进程控制
关键词由CSDN通过智能技术生成
文章目录
一、实验目的
1.理解进程的概念,明确进程和程序的区别
2.理解并发执行的实质。
3.掌握进程的创建、睡眠、撤销等进程控制方法。
二、实验内容
用C语言编写程序,模拟实现创建新的进程:查看运行进程;换出某个进程:杀死运行进程等功能。
三、实验步骤
3.1 数据结构
1、首先该系统用到了数组模拟内存、运用了线性表。
2、使用了自定义结构体,并且使用结构体类型变量。
3.2 程序流程图
系统概述:
系统运行流程图:
四、实验代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/**
* @Author: Yrani
* @Date: 2022-04-04 21:00:17
* @LastEditTime: 2022-04-05 19:40:30
* @keywords: 进程、创建、阻塞、唤醒
**/
struct process
{
int pid; //进程pid
int priority; //优先级
int size; //大小
int status;//标识进程状态,0-不在内存,1-在内存,2-阻塞
char info[10];
};
struct process memory[20]; //内存
int count = 0; //进程数量
int block = 0; // 阻塞
int pid = 0; //进程的pid
int flag = 0; //进程的状态
void Create()
{
if (count >= 20)
{
printf ("内存已满,请先唤醒或杀死进程\n");
return;
}
else
{
for (int i = 0; i < 20; i++)
{
//定位,找到可以还未创建的进程
if (memory[i].status == 1)
{
continue; //break
}
printf ("请输入新进程pid:\n");
scanf ("%d", &(memory[i].pid));
for (int j = 0; j < i; j++)
{
if (memory[i].pid == memory[j].pid)
{
printf ("该进程已存在\n");
return;
}
}
printf ("请输入新进程优先级\n");
scanf ("%d", &(memory[i].priority));
printf ("请输入新进程大小\n");
scanf ("%d", &(memory[i].size));
printf ("请输入新进程内容\n");
scanf ("%s", &(memory[i].info));
//创建进程,使标记位为1
memory[i].status = 1;
count++;
}
}
}
void Run() {
for (int i = 0; i < 20; i++)
{
if (memory[i].status == 1)
{
//输出运行进程的各个属性值
printf ("pid = %d\t\t",memory[i].pid);
printf ("priority = %d\t\t",memory[i].priority);
printf ("size = %d\t",memory[i].size);
printf ("status = %d\t",memory[i].status);
printf ("info = %s\t\t",memory[i].info);
puts("");
flag = 1;
}
}
if (!flag)
{
printf ("当前没有运行进程\n");
}
}
void Block()
{
if (!count)
{
printf("当前没有运行进程\n");
return;
}
printf ("输人要阻塞进程的pid值\n");
scanf ("%d", &pid);
for (int i = 0; i < 20; i++)
{
//定位,找到所要阻塞的进程,根据其状态做相应处理
if (pid == memory[i].pid)
{
if (memory[i].status == 1)
{
memory[i].status = 2;
block++;
printf ("已经成功阻塞该进程\n");
}
else if (memory[i].status == 0)
{
printf ("要阻塞的进程不存在\"n");
}
else
{
printf ("该进程已被阻塞\n");
}
flag = 1;
break;
}
}
//找不到,则说明进程不存在
if (!flag)
{
printf ("要阻塞的进程不存在\n");
}
}
void Kill()
{
if (!count)
{
printf ("当前没有运行进程\n");
return;
}
printf ("输入要杀死进程的pid值:\n");
scanf ("%d", &pid);
for (int i = 0; i < 20; i++)
{
//定位,找到所要杀死的进程,根据其状态做相应处理
if (pid == memory[i].pid)
{
if (memory[i].status == 1)
{
memory[i].status = 0;
count--;
printf ("已成功杀死该进程\n");
}
else if (memory[i].status == 0)
{
printf ("要杀死的进程不存在\n");
}
else
{
printf ("要杀死的进程已被阻塞\n");
}
flag = 1;
break;
}
}
//找不到,则说明进程不存在
if (!flag)
{
printf ("要杀死的进程不存在\n");
}
}
void Notify ()
{
if (!count)
{
printf ("当前没有运行进程\n");
return;
}
if (!block)
{
printf ("当前没有阻塞进程\n");
return;
}
printf ("输人要唤醒的进程的pid:\n");
scanf ("%d", &pid);
for (int i = 0; i < 20; i++)
{
//定位,找到所要唤醒的进程,根据其状态做相应处理
if (pid == memory[i].pid)
{
if (memory[i].status == 2)
{
memory[i].status = 1;
block --;
printf ("已经成功唤醒进程\n");
}
else if (memory[i].status == 0)
{
printf ("要唤醒的进程不存在\n");
}
else
{
printf ("要唤醒的进程已被阻塞\n");
}
flag = 0;
break;
}
//找不到,则说明进程不存在
}
if (flag)
{
printf ("要唤醒的进程不存在\n");
}
}
void Error()
{
printf("输入有误!!!请重新输入功能编号\n");
}
int main() {
int n = 1;
int num;
//一开始所有进程都不在内存中
for (int i = 0; 1 < 20; i++)
{
memory[i].status = 0;
while (n)
{
printf ("\n***********************************************************\n");
printf ("*进程演示系统 @Author:Yrani*\n");
printf ("***********************************************************\n");
printf ("*1.创建新的进程 2.查看运行进程*\n");
printf ("*3.阻塞某个进程 4.杀死运行进程*\n");
printf ("*5.唤醒某个进程 6.退出系统*\n");
printf ("************************************************************\n");
printf ("请选择 (1~6)\n");
scanf ("%d", &num);
switch (num)
{
case 1:
Create(); //创建进程
break;
case 2:
Run(); //展示结果信息
break;
case 3:
Block(); //阻塞某个进程
break;
case 4:
Kill(); //杀死进程
break;
case 5:
Notify(); //唤醒
break;
case 6:
exit(0); //退出
default:
Error(); //错误提示
}
flag = 0;//恢复标记
}
}
return 0;
}
五、实验结果
功能展示:
1、创建进程
2、查看运行的进程
3、阻塞某个进程
4、杀死某个进程
5、唤醒某个进程
六、实验体会总结
体会:
- 通过此次实验加深了我对进程概念的理解,以及明确了进程和程序之间的区别是什么。1)程序是永远都存在的,而进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;2)程序是静态的观念,进程是动态的观念;3)进程具有并发性,而程序没有;
- 并发执行的实质就是多个进程在使用同一个cpu,每个进程都独占cpu一会,然后让出cpu资源,供其他进程执行,这都是OS来进行管理和调度的。
- 此次实验我学会了使用线性表去模拟内存的结构从而进行进程的创建。
- 理解并掌握进程的创建、阻塞、唤醒、杀死等操作。
总结:
- 代码有中有多的坑点,需要仔细去思考和斟酌,本次实验中也遇到了不少困难,查阅了不少资料,对于c/c++的学习还需要多下功夫,多花时间。
- 将理论付诸于实践更有助于我们对理论知识的理解与掌握,加深了我们对进程控制的进一步了解。
- 这些常用的数据结构需要熟练掌握,才能在以后实际的运用场景中游刃有余,提升效率。
- 纸上得来终觉浅,绝知此事要躬行。