文章目录

  • 一、实验目的
  • 二、实验内容
  • 三、实验步骤
    • 3.1 数据结构
    • 3.2 程序流程图
  • 四、实验代码
  • 五、实验结果
  • 六、实验体会总结

一、实验目的

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));//创建进程,使标记位为1memory[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、唤醒某个进程


6、输入错误的数字

7、退出

六、实验体会总结

体会:

  • 通过此次实验加深了我对进程概念的理解,以及明确了进程和程序之间的区别是什么。1)程序是永远都存在的,而进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;2)程序是静态的观念,进程是动态的观念;3)进程具有并发性,而程序没有;
  • 并发执行的实质就是多个进程在使用同一个cpu,每个进程都独占cpu一会,然后让出cpu资源,供其他进程执行,这都是OS来进行管理和调度的。
  • 此次实验我学会了使用线性表去模拟内存的结构从而进行进程的创建。
  • 理解并掌握进程的创建、阻塞、唤醒、杀死等操作。

总结:

  • 代码有中有多的坑点,需要仔细去思考和斟酌,本次实验中也遇到了不少困难,查阅了不少资料,对于c/c++的学习还需要多下功夫,多花时间。
  • 将理论付诸于实践更有助于我们对理论知识的理解与掌握,加深了我们对进程控制的进一步了解。
  • 这些常用的数据结构需要熟练掌握,才能在以后实际的运用场景中游刃有余,提升效率。
  • 纸上得来终觉浅,绝知此事要躬行。

操作系统 | 实验一 进程控制相关推荐

  1. linux 实验2 进程创建,实验2Linux进程控制与通信

    实验2Linux进程控制与通信 实验 2 Linux 进程控制与通信1. 实验目的(1 ) 进一步认识并发执行的概念,认识父子进程及进程创建原理:(2 ) 了解 Linux 系统中进程通信的基本原理. ...

  2. 实验2linux进程控制与通信,实验2 进程控制与通信管理word文档良心出品

    <实验2 进程控制与通信管理word文档良心出品>由会员分享,可在线阅读,更多相关<实验2 进程控制与通信管理word文档良心出品(13页珍藏版)>请在人人文库网上搜索. 1. ...

  3. 操作系统实验二进程的创建控制实验(含代码及实验心得)

    实现工具:PC机 实现环境:Linux 实习内容(功能.目标): 实验目的:  创建进程,体会进程间的并发特征. 实验内容:  编写一段程序,使用系统调用 fork() 创建两个子进程 p1 和 p2 ...

  4. 操作系统实验四 进程运行轨迹的跟踪与统计(哈工大李治军)

    实验4 进程运行轨迹的跟踪与统计 实验目的 掌握 Linux 下的多进程编程技术: 通过对进程运行轨迹的跟踪来形象化进程的概念: 在进程运行轨迹跟踪的基础上进行相应的数据统计,从而能对进程调度算法进行 ...

  5. 2020 操作系统 实验二 进程通信

    实验二.进程通信 一.实验名称 进程通信 二.实验目的 掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法. 三.实验原理 邮箱机制类似于日常使用的信 ...

  6. 操作系统实验·Linux进程通信与内存管理

    预备知识 Linux进程的数据结构 在Linux中,进程用task_struct表示,所有进程被组织到以init_task为表头的双向链表中(见[include/linux/sched.h]SET_L ...

  7. 操作系统——实验二 进程管理

    1.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执行的实质. (3)分析进程竞争资源现象,学习解决进程互斥的方法. 2.实验预备内容 (1)阅读Linux的sch ...

  8. 操作系统——实验贰——进程通信(一)管道及共享内存

    一. 实验目的 熟悉并掌握管道机制,并实现进程间通信 熟悉并掌握共享内存机制,并实现进程间通信 二. 实验内容 任务一: (1)阅读以上父子进程利用管道进行通信的例子(例1),写出程序的运行结果并分析 ...

  9. 【操作系统复习】进程控制

    进程控制 一.原语 1.1 进程控制相关的原语 1.1.1 进程的创建 1.1.2 进程的终止 1.1.3 进程的阻塞和唤醒 1.1.4 进程的切换

最新文章

  1. YOLOv4:目标检测(windows和Linux下Darknet 版本)实施
  2. python随机抽号_随手小代码——Python 从集合中随机抽取元素
  3. RabbitMQ—流量控制之内存阈值
  4. SAP Spartacus里product数据请求的HTTP url是在哪里维护的
  5. 后端:Java中如何更优雅的处理空值,看完你就懂了!
  6. .NET Core实践系列之SSO-跨域实现
  7. linux系统如何创建python文件_请问linux下如何创建pycharm的快捷方式?
  8. LeetCode刷题(26)
  9. 当动物保护用上AI……
  10. 分布式、微服务与集群的区别
  11. 打印预览和实际的打印不一致问题
  12. html yy直播,网页YY直播间进入方法 网页YY迷你版怎么用
  13. usb万能驱动win7_Win10改装win7原来这么简单
  14. vPlayer 模块Demo
  15. MFC——Listcontrol 添加背景颜色
  16. 【Shading】Shading 着色
  17. 翻转课堂十大精彩案例
  18. 嵌入式开发中,嵌入式硬件和软件有什么区别?
  19. 最短路(Finding Shortest Path)
  20. 益智游戏网开发之路二(网址yzyx.info)

热门文章

  1. vue+element-ui小结
  2. 每日新闻 | 苹果信用卡Apple Card今日推出!部分用户已收到邀请
  3. 域控禁止服务器文件复制,如何禁止局域网共享文件被复制
  4. 基于java和sqlserver建立的简易图书管理系统
  5. 自制小强机器人,能看能听能说能画
  6. 基于mpi的奇偶排序_奇偶排序
  7. 小记pandas中DataFrame.dropna方法
  8. JAVA实现屏幕截取
  9. 修复NVIDIA Geforce Experience Error Code 0x0001
  10. 1-1关于Linux的进程详述