模拟进程管理
- 格式:doc
- 大小:125.00 KB
- 文档页数:24
《操作系统》实验报告实验一题目用C语言模拟实现操作系统的进程管理机制一、实验内容使用顺序表模拟内存中的进程队列,实现对于进程的管理。
进程的管理主要包括进程的创建、进程的查询、进程的换出以及进程的删除等操作。
二、实验目的进程是计算机操作系统的重要的核心概念,合理的管理进程是一个操作系统最核心主要的功能之一,通过编写相应的进程程序,加强对进程概念的理解。
三、设计过程1进程结构PCB的描述:typedef struct jincheng_type{int pid;int priority;char state;int blocktime;}PCB;PCB是对进程的描述,pid代表进程号,priority代表优先级,state代表状态,blocktime代表阻塞时间。
2进程队列的描述:使用顺序表typedef struct queuelist{PCB pro[MAXSIZE];int length;}MEMORY;内存的描述,系统创建的进程都保存在这里,MAXSIZE是内存中允许存放最大的进程数目3本实验主要包含如下三个主要操作(1)创建进程操作void create(MEMORY *P,int count);参数P是指向存放进程的内存指针(头指针),count是指创建进程的数目。
(2)查询进程操作int check(MEMORY *P,int pid);参数P是指向存放进程的内存指针(头指针),pid是指查询进程的进程号,若查询到该进程则返回OK(1),否则返回ERROR(0)。
(3)置换进程操作int exchange(MEMORY *P);参数P是指向存放进程的内存指针(头指针),将换出的进程保存在PCB pcb;中,若换出某个进程则返回OK(1),否则返回ERROR(0)。
(4)删除进程操作int kill(MEMORY *P,int i);参数P是指向存放进程的内存指针(头指针),删除内存中第i个进程,若删除某个进程则返回OK (1),否则返回ERROR (0)。
进程管理一、目的与要求1.目的进程是操作系统最重要的概念之一,是了解操作系统实质的关键。
本课题实习的目的是,加深对进程概念及进程管理各部分内容的理解;熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构、通讯机构的实施。
2.要求要求设计一个允许n个进程并发运行的进程管理模拟系统。
该系统包括以下内容:(1)简单的进程控制(2)同步及通讯机构(3)中断机构(4)进程调度。
其进程调度算法可任意选择。
每个进程用一个PCB表示,其内容可根据具体情况设置。
各进程之间有一定的同步关系。
系统在运行过程中应能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。
二、范例1.题目支持多个进程并发运行的简单进程管理模拟系统本系统的同步机构采用信号量上的P、V操作的机制;控制机构包括阻塞和唤醒操作;时间片中断处理程序模拟时间片中断;进程调度程序负责为各进程分配处理机。
系统中涉及了3个并发进程。
它们之间的关系是:3个进程需要互斥使用临界资源S2,进程1和进程2又需互斥使用临界资源S1.本系统在运行过程中随机打印出各进程的状态变换过程,系统的调度过程及公共变量的变化情况。
2.算法与N~S图系统为进程设置了5种运行状态:e—执行态;r—高就绪态;t—低就绪态(执行进程因时间片到限而转入);w—等待态;c—完成态。
各进程的初始状态均设置为r.系统分时执行各进程,并规定3个进程的执行概率均为33%。
通过产生随机数x来模拟时间片。
当进程process1访问随机数x时,若x>=0.33;当进程process2访问x时,若x<0.33或x>=0.66;当进程process3访问x时,若x<0.66,则分别认为各进程的执行时间片到限,产生“时间片中断”而转入低就绪态t。
进程调度算法采用剥夺式最高优先数法。
各进程的优先数通过键盘输入予以静态设置。
调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。
进程管理模拟系统课程设计一、课程目标知识目标:1. 学生能理解进程管理的基本概念,掌握进程的创建、同步、通信及调度等原理;2. 学生能运用所学知识分析进程管理模拟系统的运作过程,理解操作系统的进程管理功能;3. 学生了解进程管理在计算机系统中的应用,明确其在操作系统中的重要性。
技能目标:1. 学生能够独立设计简单的进程管理模拟系统,具备实际操作能力;2. 学生通过实践,提高程序设计能力,学会使用相关工具分析进程管理问题;3. 学生学会运用进程同步和通信技术解决实际问题,培养解决问题的能力。
情感态度价值观目标:1. 学生通过学习进程管理,培养团队合作精神,增强沟通与协作能力;2. 学生在学习过程中,培养严谨、细致的科学态度,提高对操作系统的兴趣;3. 学生认识到操作系统在计算机系统中的核心地位,增强学习操作系统的自觉性和责任感。
本课程旨在帮助学生掌握进程管理的核心知识,培养实际操作和解决问题的能力,同时注重培养学生的团队协作和情感态度,使他们在学习过程中形成正确的价值观。
课程针对学生的年级特点,注重理论与实践相结合,以操作系统的进程管理为基础,引导学生运用所学知识解决实际问题。
在教学过程中,教师需关注学生的学习进度,及时调整教学策略,确保课程目标的实现。
二、教学内容1. 进程管理基本概念:进程与线程的定义、进程的状态与转换、进程控制块(PCB)的作用;2. 进程同步与互斥:同步机制、互斥锁、生产者-消费者问题、读者-写者问题;3. 进程通信:管道、消息队列、信号量、共享内存;4. 进程调度:调度算法(如FCFS、SJF、RR等)、调度策略、调度性能分析;5. 进程管理模拟系统设计:系统架构、模块划分、关键算法实现;6. 实践操作:使用相关工具(如Linux系统调用、C语言编程等)设计并实现一个简单的进程管理模拟系统。
教学内容根据课程目标进行组织,以教材中关于进程管理的章节为基础,结合学生实际情况进行合理安排。
#include "windows.h"#include "stdio.h"#include "dos.h"#include "stdlib.h"#include "conio.h"#define SEC 3000 //睡眠时间(ms) #define NULL 0/*定义结构体*/typedef struct PCB{int PID;int UID;struct PCB * next;}PCB;PCB *ready , *excute , *wait;/*create queue header *//*queue operation 入队*/int enqueue(PCB *head , PCB *node){PCB *p;p = head;if(p -> next == NULL){head -> next = node;return 1;}while(p){if(p -> next == NULL){p -> next = node;return 1;}else p = p -> next;}}/*enquue*//*dequeue 出队列*/PCB * dequeue(PCB *head){PCB *p;p = head;if(p -> next == NULL){return NULL;}else{p = p -> next;head -> next = p -> next;p -> next = NULL;return p;}/*head to next*/}/*dequeue*//*PCB operate*//*新建进程*/int create(){PCB *p;p = (PCB*)malloc(sizeof(PCB));p -> next = NULL;printf("input PID and UID to a new process\n");scanf("%d %d",&p -> PID,&p -> UID);if(enqueue(ready , p))printf("create a process: PID = %d UID = %d\n", p -> PID , p -> UID);elseprintf("create Failed\n");return(0);}/*create*//*将就绪队列的先到进程加入到运行队列中fexcute*/int fexcute(){PCB *p = dequeue(ready);if(p == NULL){printf("NO process in queue \n");return 0;}else{enqueue(excute , p);printf("add a process into excute queue process: PID = %d UID= %d \n" ,p->PID , p->UID); return 1;}}/*excute*///挂起正在运行的进程int suspend(){PCB *p = dequeue(excute);if(p == NULL){printf("NO process in queue \n");return 0;}else{enqueue(ready , p);printf("add a process into ready queue process: PID = %d UID= %d \n" ,p->PID , p->UID); return 1;}}//唤醒等待队列中的进程int wake(){PCB *p = dequeue(wait);if(p == NULL){printf("NO process in queue \n");return 0;}else{enqueue(ready , p);printf("add a process into wait ready process: PID = %d UID= %d \n" ,p->PID , p->UID); return 1;}}//阻塞运行队列中的进程int block(){PCB *p = dequeue(excute);if(p == NULL){printf("NO process in queue \n");return 0;}else{enqueue(wait , p);printf("add a process into wait queue process: PID = %d UID= %d \n" ,p->PID , p->UID); return 1;}}/*block*//*输出队列outputqueue*/int outputqueue(PCB *head){PCB *p;if(head -> next == NULL){/*队列为空*/printf("queue is null \n");return 1;}p = head -> next; /*node pointer*/while(p){/*打印process id UID*/printf("PID = %d UID = %d \n" , p -> PID , p -> UID);p = p -> next;}return 0;}/*output输出*/int output(){printf("READY QUEUE:\n");outputqueue(ready);printf("EXCUTE QUEUE: \n");outputqueue(excute);printf("WAIT QUEUE: \n");outputqueue(wait);return(0);}/*output*//*init 初始化*/int init(){PCB *p;ready = (PCB*)malloc(sizeof(PCB));ready -> next=NULL;excute = (PCB*)malloc(sizeof(PCB));excute -> next=NULL;wait = (PCB*)malloc(sizeof(PCB));wait -> next = NULL;printf("____________PROCESS SECHUDLE__________\n"); printf("now initing.....................\n");printf("input PID and UID as integer , 0 0 as over\n"); while(1){p = (PCB*)malloc(sizeof(PCB));p -> next = NULL;scanf("%d %d",&p -> PID , &p -> UID);if(p -> PID == 0 && p -> UID == 0)break;else{if(enqueue(ready , p)){printf("new process PID = %d UID = %d added!\n",p -> PID , p -> UID);}else return 0;}}return 1;}/*init*//*运行一个process 并释放节点*/int run(){PCB *p = excute;int s = SEC;if(excute -> next == NULL){printf("no process in excute queue \n");return 0;}else{p = excute -> next;printf("system will sleep %ds as process running\n",s);Sleep(s);/*sleep as process runing time*/printf("process: PID = %d UID= %d excute successed..\n" , p -> PID , p -> UID ); excute -> next = p -> next;free(p);}}/*run*//*离开*/int leave(){PCB *p,*t;while(ready->next || excute->next || wait->next){p = ready -> next;{t = p -> next;free(p);p = t;}ready -> next = NULL;p = wait -> next;while(p){t = p -> next;free(p);p = t;}wait -> next = NULL;p = excute -> next;while(p){t = p -> next;free(p);p = t;}excute -> next = NULL;}exit(0);}/*leace*///帮助菜单int help(){printf("_____________________HELP MENU_____________________\n"); printf("\t-h HELP 弹出帮助菜单\n");printf("\t-c CREATE 创建一个新进程,并加入到就绪队列中\n");printf("\t-b BLOCK 阻塞正在运行的进程\n");printf("\t-w WAKE 唤醒等待队列中的进程\n");printf("\t-e EXCUTE 运行就绪队列中的进程\n");printf("\t-s SUSPEND 挂起正在运行的进程\n");printf("\t-o OUTPUT 输出所有进程队列\n");printf("\t-r RUN 运行运行队列中的进程\n");printf("\t-x EXIT 释放内存并退出程序\n");printf("___________________________________________________\n"); printf("\t 输入‘h/H’弹出帮助菜单\n");return(0);}/*help*///zhu{char COMMAND = NULL;if( init() != 1){printf("init falied ! \n ");getch();exit(0);}else{printf("init...OK\n");output();help();}while(1){/*当三队列都不空执行调度*/ printf(">");scanf("%c",&COMMAND); switch(COMMAND){case '\n': break;case 'H':case 'h': help(); break;case 'C':case 'c': create(); break;case 'B':case 'b': block(); break;case 'W':case 'w': wake(); break;case 'S':case 's': suspend(); break;case 'E':case 'e': fexcute(); break;case 'O':case 'o': output(); break;case 'X':case 'x': leave(); break;case 'R':case 'r': run(); break;}}}/*main*/。
模拟进程管理课程设计c一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握进程管理的基本概念、原理和方法。
技能目标要求学生能够运用进程管理知识分析和解决实际问题。
情感态度价值观目标要求学生培养对进程管理的兴趣和热情,提高自主学习的能力。
通过本课程的学习,学生将了解进程的定义、特点和分类,掌握进程管理的基本原理和方法,能够运用进程管理知识分析和解决实际问题。
同时,学生将培养对进程管理的兴趣和热情,提高自主学习的能力。
二、教学内容本课程的教学内容主要包括进程管理的基本概念、进程的描述与控制、进程的同步与互斥、进程的通信与同步、进程调度和死锁处理。
具体的教学大纲安排如下:第1周:进程管理的基本概念、进程的描述与控制;第2周:进程的同步与互斥、进程的通信与同步;第3周:进程调度、死锁处理;第4周:课程总结与复习。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
在讲授法的基础上,教师将引导学生进行思考和讨论,通过案例分析法和实验法,使学生能够将理论知识应用于实际问题中,提高分析和解决实际问题的能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备适当的教学资源。
教材:《进程管理>();参考书:《现代操作系统>();多媒体资料:相关教学视频、PPT课件;实验设备:计算机、网络设备等。
以上教学资源将帮助学生更好地理解和掌握进程管理知识,提高学习效果。
五、教学评估本课程的评估方式将包括平时表现、作业和考试等。
评估方式应客观、公正,能够全面反映学生的学习成果。
平时表现将根据学生在课堂上的参与度、提问和回答问题的表现进行评估。
作业将根据学生提交的作业质量和及时性进行评估。
考试将包括期中考试和期末考试,考试内容将涵盖课程的全部内容,采用客观题和主观题相结合的方式。
通过以上评估方式,我们将全面了解学生的学习成果,及时发现问题并进行调整,提高教学质量。
0128 #include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "string.h"typedef struct node{char name[10]; /*進程標識符*/int prio; /*進程優先數*/int round; /*進程時間輪轉時間片*/int cputime; /*進程占用CPU時間*/int needtime; /*進程到完成還要の時間*/int count; /*計數器*/char state; /*進程の狀態*/struct node *next; /*鏈指針*/}PCB;PCB *finish,*ready,*tail,*run; /*隊列指針*/int N; /*進程數*//*將就緒隊列中の第一個進程投入運行*/firstin(){run=ready; /*就緒隊列頭指針賦值給運行頭指針*/run->state='R'; /*進程狀態變為運行態*/ready=ready->next; /*就緒對列頭指針後移到下一進程*/}/*標題輸出函數*/void prt1(char a){if(toupper(a)=='P') /*優先數法*/printf(" 進程號cpu時間所需時間優先數狀態\n");elseprintf(" 進程號cpu時間所需時間記數時間片狀態\n");}/*進程PCB輸出*/void prt2(char a,PCB *q){if(toupper(a)=='P') /*優先數法の輸出*/printf(" %-10s%-10d%-10d%-10d %c\n",q->name,q->cputime,q->needtime,q->prio,q->state);else/*輪轉法の輸出*/printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,q->cputime,q->needtime,q->count,q->round,q->state);}/*輸出函數*/void prt(char algo){PCB *p;prt1(algo); /*輸出標題*/if(run!=NULL) /*如果運行指針不空*/prt2(algo,run); /*輸出當前正在運行のPCB*/ p=ready; /*輸出就緒隊列PCB*/while(p!=NULL){prt2(algo,p);p=p->next;}p=finish; /*輸出完成隊列のPCB*/while(p!=NULL){prt2(algo,p);p=p->next;}getchar(); /*壓任意鍵繼續*/}/*優先數の插入算法*/insert1(PCB *q){PCB *p1,*s,*r;int b;s=q; /*待插入のPCB指針*/p1=ready; /*就緒隊列頭指針*/r=p1; /*r做p1の前驅指針*/b=1;while((p1!=NULL)&&b) /*根據優先數確定插入位置*/ if(p1->prio>=s->prio){r=p1;p1=p1->next;}elseb=0;if(r!=p1) /*如果條件成立說明插入在r與p1之間*/{r->next=s;s->next=p1;}else{s->next=p1; /*否則插入在就緒隊列の頭*/ready=s;}}/*優先數創建初始PCB信息*/void create1(char alg){PCB *p;int i,time;char na[10];ready=NULL; /*就緒隊列頭指針*/finish=NULL; /*完成隊列頭指針*/run=NULL; /*運行隊列指針*/printf("輸入進程號和運行時間:\n"); /*輸入進程標識和所需時間創建PCB*/ for(i=1;i<=N;i++){p=(PCB *)malloc(sizeof(PCB));scanf("%s",na);scanf("%d",&time);strcpy(p->name,na);p->cputime=0;p->needtime=time;p->state='w';p->prio=50-time;if(ready!=NULL) /*就緒隊列不空調用插入函數插入*/insert1(p);else{p->next=ready; /*創建就緒隊列の第一個PCB*/ready=p;}}//clrscr();printf(" 優先數算法輸出信息:\n");printf("************************************************\n");prt(alg); /*輸出進程PCB信息*/run=ready; /*將就緒隊列の第一個進程投入運行*/ready=ready->next;run->state='R';}/*優先數調度算法*/priority(char alg){while(run!=NULL) /*當運行隊列不空時,有進程正在運行*/{run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->prio=run->prio-3; /*每運行一次優先數降低3個單位*/if(run->needtime==0) /*如所需時間為0將其插入完成隊列*/{run->next=finish;finish=run;run->state='F'; /*置狀態為完成態*/run=NULL; /*運行隊列頭指針為空*/if(ready!=NULL) /*如就緒隊列不空*/firstin(); /*將就緒對列の第一個進程投入運行*/}else /*沒有運行完同時優先數不是最大,則將其變為就緒態插入到就緒隊列*/ if((ready!=NULL)&&(run->prio<ready->prio)){run->state='W';insert1(run);firstin(); /*將就緒隊列の第一個進程投入運行*/}prt(alg); /*輸出進程PCB信息*/}}/*主函數*/main(){char algo; /*算法標記*///clrscr();//printf("選擇算法:P/R(優先數算法/時間片輪轉算法)\n");//scanf("%c",&algo); /*輸入字符確定算法*/algo='p';printf("輸入進程數:\n");scanf("%d",&N); /*輸入進程數*/if(algo=='P'||algo=='p'){create1(algo); /*優先數法*/priority(algo);}elseif(algo=='R'||algo=='r'){//create2(algo); /*輪轉法*///roundrun(algo);} }。
进程管理模拟系统实验指导书2一、实验目的学习进程管理的设计与实现,学习和运用操作系统原理,设计一个操作系统子系统的模拟系统。
通过该系统的设计调试可增加对操作系统实现的感知性。
同时可发挥团队协作精神和个人创造能力。
使同学们对操作系统学习有一个实现的尝试和创新的思维。
二、实验规则1.每组设计一个模拟系统(共100分)2.每人设计系统中的一部分(满分60分)3.集体调试创意(满分40分)三、实验要求1.进程管理功能以进程调度为主要功能。
以进程控制为辅助功能。
2.体现操作系统原理中进程调度算法和进程控制算法。
按照操作系统原理设计。
3.结构化设计。
设计时构建出模块结构图并存于文件中。
模块化实现,对每一功能,每一操作使用模块、函数、子程序设计方法实现。
4.进程以PCB为代表。
队列、指针用图示。
每一步功能在桌面上能显示出来。
5.系统应具有排错功能,对可能出现的错误应具有排查功能和纠错能力。
6.界面自行设计,语言自行选择。
(可用VC/C++/C/C#语言,也可用你会的其他语言,甚至还可用PPT)7.每人的设计功能都能表现或说明出来。
8.进程以队列法组织,对不同进程调度算法:FIFO队列或PRI队列或rotate(轮转队列)用同一个进程序列组织,对阻塞队列可设置一个,也可设多个。
9.因为是模拟系统,所以要显示每个功能和操作结果。
显示应力求清晰、易读和一目了然(一屏),最好能用汉字,否则可用英语或汉语拼音。
10.操作方便,使用便捷。
可视化程度高。
11.设计出系统后,还需要写出(介绍系统采用的语言、支撑平台、小组成员及分工。
如何安装、如何启动、如何操作)12.每组需写一份课程设计报告,内容包括:课程设计内容,课程设计设计思路,课程设计结构图,及分工内容、介绍。
13. 实验结果演示验收后,将可在任何环境下运行的可执行文件和系统说明书一起存盘并交盘。
(可合组一张盘),上标:班级、组号、姓名。
14. 实验结束后从中选出优秀作品,介绍给大家。
一、实验背景及目的进程是操作系统中基本的活动单位,进程管理是操作系统核心功能之一。
为了深入理解进程的概念、进程状态转换、进程同步与互斥等知识,我们进行了进程管理实验。
本次实验旨在通过编写程序,模拟进程的创建、调度、同步与互斥等操作,加深对进程管理的理解。
二、实验内容及方法1. 进程创建与状态转换(1)使用系统调用fork()创建子进程,观察父进程和子进程的状态转换过程。
(2)使用系统调用exec()替换子进程的内容,观察子进程状态变化。
2. 进程调度(1)编写进程调度程序,实现最高优先数优先调度算法和先来先服务调度算法。
(2)模拟进程就绪队列,观察调度算法对进程执行顺序的影响。
3. 进程同步与互斥(1)使用信号量实现进程同步,观察进程同步效果。
(2)使用互斥锁实现进程互斥,观察进程互斥效果。
4. 进程通信(1)使用管道实现进程间通信,观察通信效果。
(2)使用共享内存实现进程间通信,观察通信效果。
三、实验结果与分析1. 进程创建与状态转换实验结果显示,使用fork()创建子进程后,父进程和子进程的状态均为运行态。
当父进程调用exec()替换子进程内容后,子进程状态变为僵尸态,父进程状态变为运行态。
这说明进程在创建和替换过程中,其状态发生了相应的变化。
2. 进程调度实验结果显示,最高优先数优先调度算法和先来先服务调度算法均能正确执行。
最高优先数优先调度算法下,优先级高的进程先执行;先来先服务调度算法下,先到达的进程先执行。
这说明两种调度算法均能实现进程的合理调度。
3. 进程同步与互斥实验结果显示,使用信号量实现进程同步时,进程能正确地按照规定的顺序执行;使用互斥锁实现进程互斥时,进程能正确地实现互斥访问共享资源。
这说明信号量和互斥锁在进程同步与互斥方面具有重要作用。
4. 进程通信实验结果显示,使用管道实现进程间通信时,进程能正确地接收和发送数据;使用共享内存实现进程间通信时,进程能正确地访问共享内存中的数据。
操作系统实验————(1)模拟进程管理专业:信息管理与信息系统班级:信管082姓名:温静实验一进程管理1.目的和要求通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。
2.实验内容用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。
3.主体程序#include <conio.h>#include <stdio.h>#include <stdlib.h>struct PCB_type{ int pid;int priority;int cputime;int state;int shumu=0,pid_l;struct PCB_type neicun[20];struct PCB_type hc[10];int max=0;int number=0;void create();void run();void huanchu();void kill();/* 创建新进程*/void create(){if(shumu>=20){printf("\n内存已满,请先结束或换出进程\n");}else{shumu++;printf("\n请输入新进程的程序名\n");scanf("%d",&neicun[shumu-1].pid);printf("\n请输入新进程的优先级\n");scanf("%d",&neicun[shumu-1].priority);printf("\n请输入新进程的运行时间\n");scanf("%d",&neicun[shumu-1].cputime);printf("\n创建进程时令其状态为就绪\n");neicun[shumu-1].state=2;}printf("\n创建进程成功!\n");}/* 查看当前运行进程*/void run(){int max=0;for(int i=0;i<shumu;i++){if((neicun[i].state==1)&&(neicun[i].priority>=neicun[max].priority)) max=i;}neicun[max].state=3;printf("当前运行进程程序名:\n%d",neicun[max].pid);printf("\n该进程的优先级:\n%d",neicun[max].priority);printf("\n该进程的运行时间:\n%d",neicun[max].cputime);printf("\n该进程的状态:\n%d",neicun[max].state);}/* 换出*/void huanchu(){int k;printf("请输入要换出程序的程序名:");scanf("%d",&k);for(int j=0;j<shumu;j++){if(neicun[j].state==1){hc[number].pid=neicun[j].pid;hc[number].state=neicun[j].state;hc[number].priority=neicun[j].priority;hc[number].cputime=neicun[j].cputime;number++;neicun[j].pid=0;neicun[j].state=0;neicun[j].priority=0;neicun[j].cputime=0;pid_1++;}else printf("进程%d无法换出的pid:%d\n",j.neicun[j].pid);if(number!=0)for(int i=0;i<number;i++){printf("当前运行进程程序名:\n%d",hc[i].pid);printf("\n该进程的优先级:\n%d",hc[i].priority);printf("\n该进程的运行时间:\n%d",hc[i].cputime);printf("\n该进程的状态:\n%d",hc[i].state);}}PCB_type temp=neicun[0];for(k=0;k<=shumu;k++){if(neicun[k].priority>temp.priority)tmpe=neicun[k];}neicun[k].state=1;}/* 杀死进程*/void kill(){neicun[max].pid=0;neicun[max].priority=0;neicun[max].cputime=0;neicun[max].state=0;if(max==(shumu-1))shumu--;else{for(int j=max+1;j<shumu;j++){neicun[j-1].pid=neicun[j].pid;neicun[j-1].priority=neicun[j].priority;neicun[j-1].cputime=neicun[j].cputime;neicun[j-1].state=neicun[j].state;}shumu--;}max=0;run();}/* int k=0;printf("请输入要杀死程序的进程名:");scanf("%d",&k);if(neicun[k].state=1)neicun[k].state=2;neicun[k].cputime=0;neicun[k].pid=0;neicun[k].priority=0;neicun[k].state=0;if(k==(shumu-1))shumu--;else{for(int j=k+1;j<shumu;j++){neicun[j-1].pid=neicun[j].pid;neicun[j-1].priority=neicun[j].priority;neicun[j-1].cputime=neicun[j].cputime;neicun[j-1].state=neicun[j].state;}shumu--;}printf("进程%d已被杀死!,k");}*/int main(){int n,a;n=1;while(n==1){system("cls");printf("\n**********************************************");printf("\n* 进程演示系统*");printf("\n**********************************************");printf("\n 1.创建新的进程 2.查看运行进程");printf("\n 3.换出某个进程 4.杀死运行进程");printf("\n 5.退出系统");printf("\n**********************************************");printf("\n请选择(1~5):");scanf("%d",&a);switch(a){ case 1:create( );printf("\npress anykey to go on~");getch();break;case 2 :run();printf("\npress anykey to go on~");getch();break;case 3 :huanchu();printf("\npress anykey to go on~");getch();break;case 4 :kill();printf("\npress anykey to go on~");getch();break;case 5 :exit(0);default:n=0;break;}}}5.感想与心得体会做了两周的实验,问了很多同学,可程序还是有很多问题。
实验三进程管理模拟实验关键问题:阅读后面的C语言实例,修改程序,使其优先数在运行期间可以变化(动态优先数)。
例如当某进程被时间片中断次数增加到一定数目时,提高其优先权。
设计思路:首先在进程控制块中增加一个记录进程被中断的次数的整形变量sum;然后在初始化函数中对它初始化赋值为0;然后在block()函数中在每个进程被中断后sum进行加1操作,再显示该被中断进程被中断的次数;然后再find()函数中设计当某个进程被中断的次数达到3时修改该进程的优先权,并把该优先权设计为最高!然后再由find()函数返回被选中的进程的进程号!然后通过原来的相关代码来执行它相应的操作(其他部分代码不用变动)!实现的关键代码://在3个进程中按就绪状态及其优先数选出进程。
返回选出的进程号。
int find(){int j,pd=NIL,w=MAXPRI;for (j=0;j<3;j++) //选择高就绪状态优先级最高的进程{if(pcb[j].sum==3){pcb[j].priority=0;pcb[j].sum=0;printf("《进程%d中断次数达到3次,该进程优先权最高》\n",j+1);w=pcb[j].priority;pd=j;}else{if ((pcb[j].status=='r') && (pcb[j].priority<w)){w=pcb[j].priority;pd=j;}}}if (pd==NIL) //没有高就绪状态的进程,寻找低就绪状态的进程。
{for (j=0;j<3;j++){if(pcb[j].sum==3){pcb[j].priority=0;pcb[j].sum=0;printf("《进程%d中断次数达到3次,该进程优先权最高》\n",j+1);w=pcb[j].priority;pd=j;}else{if ((pcb[j].status=='t') && (pcb[j].priority<w)){w=pcb[j].priority;pd=j;}}}}return (pd);}程序运行结果:总结及进一步改善建议:该实验综合用了进程调度,进程控制,进程同步,进程调度算法等相应知识。