【操作系统】进程的创建、睡眠、撤销
【实验目的】
1.理解进程的概念,明确进程和程序的区别
2.理解并发执行的实质。
3.掌握进程的创建、睡眠、撤销等进程控制方法。
【实验内容】
用C语言编写程序,模拟实现创建新的进程:查看运行进程;换出某个进程:杀死运行进程等功能。
【实验步骤】
1.1 数据结构:进程控制块是描述进程状态和特性的数据结构,一个进程只能有唯一的进程控制块。
1.2 程序流程图
1.3 实验代码
#include<stdio.h> #include<stdlib.h> #include<string.h> struct jincheng_type { int pid; int youxian; int daxiao; int zhuangtai;//标识进程状态,0-不在内存,1-在内存,2-阻塞 char info[10]; }; struct jincheng_type neicun[20]; int shumu=0,zuse=0,pid,flag=0; void create() { if(shumu>=20) printf("\n内存已满,请先唤醒或杀死进程n"); else { int i; for(i=0;i<20;i++) //定位,找到可以还未创建的进程 if(neicun[i].zhuangtai==0) break; printf("\n请输入新进程pid\n"); scanf("%d",&(neicun[i].pid)); for(int j=0;j<i;j++) if(neicun[i].pid==neicun[j].pid) { 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); //创建进程,使标记位为1 neicun[i].zhuangtai=1; shumu++; } } void run() { for(int i=0;i<20;i++) { if(neicun[i].zhuangtai==1) { //输出运行进程的各个属性值 printf("\npid=%d\t",neicun[i].pid); printf("youxian=%d\t",neicun[i].youxian); printf("daxiao=%d\t",neicun[i].daxiao); printf("zhuangtai=%d\t",neicun[i].zhuangtai); printf("info=%s\t ",neicun[i].info); flag=1; } } if(!flag) printf("\n当前没有运行进程\n"); } void zusetai() { if(!shumu) { printf("当前没有运行进程\n"); return; } printf("\n输入阻塞进程的PID值:"); scanf("%d",&pid); for(int i=0;i<20;i++) { //定位,找到所要阻塞的进程,根据其状态做相应处理 if(pid==neicun[i].pid) { if(neicun[i].zhuangtai==1) { neicun[i].zhuangtai=2; zuse++; printf("\n已经成功阻塞进程\n"); } else if(neicun[i].zhuangtai==0) printf("\n要阻塞的进程不存在\n"); else printf("\n要阻塞的进程已被阻塞\n"); flag=1; } } //找不到,则说明进程不存在 if(flag==0) printf("\n要阻塞的进程不存在\n"); } void kill() { if(!shumu) { printf("当前没有运行进程\n"); return; } printf("\n输入杀死进程的PID值"); scanf("%d",&pid); for(int i=0;i<20;i++) { //定位,找到所要杀死的进程,根据其状态做相应处理 if(pid==neicun[i].pid) { if(neicun[i].zhuangtai==1) { neicun[i].zhuangtai=0; shumu--; printf("\n已成功杀死进程\n"); } else if(neicun[i].zhuangtai==0) printf("\n:要杀死的进程不存在\n"); else printf("\n要杀死的进程已被阻塞\n"); } flag=1; //找不到,则说明进程不存在 if(!flag) printf("\n要杀死的进程不存在\n"); } } void huanxing() { if(!shumu) { printf("\n当前没有运行进程\n"); return; } if(!zuse) { printf("\n当前没有阻塞进程\n"); return; } printf("\n输人pid:\n"); scanf("%d",&pid); for(int i=0;i<20;i++) { //定位,找到所要杀死的进程,根据其状态做相应处理 if(pid==neicun[i].pid) { if(neicun[i].zhuangtai==2) { neicun[i].zhuangtai=1; zuse--; printf("\n已经成功唤醒进程\n"); } else if(neicun[i].zhuangtai==0) printf("\n要唤醒的进程不存在\n"); else printf("\n要唤醒的进程已被阻塞\n"); } flag=1; //找不到,则说明进程不存在 } if(!flag) printf("\n要唤醒的进程不存在\n"); } int main() { int n=1; int num; //一开始所有进程都不在内存中 for(int i=0;i<20;i++) neicun[i].zhuangtai=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)\n"); scanf("%d",&num); switch(num) { case 1:create();break; case 2:run();break; case 3:zusetai();break; case 4:kill();break; case 5:huanxing();break; case 6:exit(0); default:n=0; } flag=0;//恢复标记 } return 0; }
1.4 实验结果
阻塞
唤醒
杀死
【实验体会总结】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律