操作系统实验报告+进程状态转换

合集下载

操作系统实验实验报告

操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。

本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。

二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。

实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。

三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。

在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。

通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。

2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。

通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。

在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。

(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。

通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。

2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。

在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。

(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验报告实验二时间片轮转进程调度算法学号:班级:姓名:【实验题目】: 时间片轮转进程调度算法【实验目的】通过这次实验, 加深对进程概念的理解, 进一步掌握进程状态的转变、进程调度的策略与对系统性能的评价方法。

【实验内容】问题描述:设计程序模拟进程的时间片轮转RR 调度过程。

假设有n 个进程分别在T1, … ,Tn 时刻到达系统, 它们需要的服务时间分别为S1, … ,Sn 。

分别利用不同的时间片大小q, 采用时间片轮转RR 进程调度算法进行调度, 计算每个进程的完成时间, 周转时间和带权周转时间, 并且统计n 个进程的平均周转时间和平均带权周转时间。

程序要求如下:1)进程个数n ;每个进程的到达时间T 1, … ,T n 和服务时间S 1, … ,S n ;输入时间片大小q 。

2)要求时间片轮转法RR 调度进程运行, 计算每个进程的周转时间, 带权周转时间, 并且计算所有进程的平均周转时间, 带权平均周转时间;3)输出: 要求模拟整个调度过程, 输出每个时刻的进程运行状态, 如“时刻3: 进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间, 带权周转时间, 所有进程的平均周转时间, 带权平均周转时间。

实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int ArrivalTime[100];int ServiceTime[100];int PServiceTime[100];int FinishTime[100];int WholeTime[100];double WeightWholeTime[100];double AverageWT,AverageWWT;bool Finished[100];➢2)进程调度的实现过程如下:➢变量初始化;➢接收用户输入n, T1, … ,Tn, S1, … ,Sn;时间片大小q;➢按照时间片轮转RR算法进行进程调度, 计算进程的完成时间、周转时间和带权周转时间;➢计算所有进程的平均周转时间和平均带权周转时间;➢按格式输出调度结果。

电大操作系统实验报告3_ 进程管理实验

电大操作系统实验报告3_ 进程管理实验

电大操作系统实验报告3_ 进程管理实验电大操作系统实验报告 3 进程管理实验一、实验目的进程管理是操作系统的核心功能之一,本次实验的目的是通过实际操作和观察,深入理解进程的概念、状态转换、进程调度以及进程间的通信机制,掌握操作系统中进程管理的基本原理和方法,提高对操作系统的整体认识和实践能力。

二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C 语言,开发工具为 Visual Studio 2019。

三、实验内容及步骤(一)进程的创建与终止1、编写一个 C 程序,使用系统调用创建一个子进程。

2、在父进程和子进程中分别输出各自的进程 ID 和父进程 ID。

3、子进程执行一段简单的计算任务,父进程等待子进程结束后输出结束信息。

以下是实现上述功能的 C 程序代码:```cinclude <stdioh>include <stdlibh>include <unistdh>int main(){pid_t pid;pid = fork();if (pid < 0) {printf("创建子进程失败\n");return 1;} else if (pid == 0) {printf("子进程:我的进程 ID 是%d,父进程 ID 是%d\n",getpid(), getppid());int result = 2 + 3;printf("子进程计算结果:2 + 3 =%d\n", result);exit(0);} else {printf("父进程:我的进程 ID 是%d,子进程 ID 是%d\n",getpid(), pid);wait(NULL);printf("子进程已结束\n");}return 0;}```编译并运行上述程序,可以观察到父进程和子进程的输出信息,验证了进程的创建和终止过程。

(二)进程的状态转换1、编写一个 C 程序,创建一个子进程,子进程进入睡眠状态一段时间,然后被唤醒并输出状态转换信息。

操作系统实验一模拟进程状态转换

操作系统实验一模拟进程状态转换

操作系统实验一模拟进程状态转换四、运行结果:图1 创建2个进程,因为这时cpu空闲所以内核调度,b优先级高先执行图2 超时,因为这时cpu空闲所以内核调度,b优先级还是比a高所以先执行图3 2个进程均被阻塞,其中一旦进程被阻塞就会引发调度图4 唤醒1个进程,从阻塞队列取队首放到就绪队列队尾,由于这时cpu空闲所以内核调度五、源代码:#include<cstdio>#include<algorithm>using namespace std;int Ready_len=0;int Blocked_len=0;int CPU_state=0;struct PCB{char name;int priority;int needtime;bool operator < (const PCB &b) const{return priority>b.priority;}};PCB Ready[100];PCB Blocked[100];PCB Cpu;bool dispatch();bool creat(int NUM){//创建一个新的进程while(NUM--){printf("输入进程名(一个字符)、所需时间(一个整数)、优先级(一个整数): \n");scanf("%s%d%d",&(Ready[Ready_len].name),&(Ready[Ready_len ].needtime),&(Ready[Ready_len].priority));getchar();Ready_len++;}if(CPU_state==0)//如果CPU空闲,则调度dispatch();}bool dispatch(){if(CPU_state==0){if(Ready_len!=0){sort(Ready,Ready+Ready_len);=Ready[0].name;Cpu.needtime=Ready[0].needtime;Cpu .priority=Ready[0].priority;if(Ready_len!=1)//就绪队列剔除队首元素for(int indx=1;indx<Ready_len;indx++){Ready[indx-1].name=Ready[indx].name;Ready[indx-1].needtime= Ready[indx].needtime;Ready[indx-1].priority=Ready[indx].priority;}Ready_len--;CPU_state=1;printf("***%c进程送往CPU执行\n",);Cpu.needtime--;Cpu.priority--;}else{printf("***就绪队列为空,无法调度\n");return false;}}else{printf("***CPU忙,无法调度\n");}}bool time_out(){if(CPU_state==1){if(Cpu.needtime==0)printf("***%c时间片用完,并且执行完毕,被释放\n",);else{Ready[Ready_len].name=;Ready[Ready_len].needtime= Cpu.needtime;Ready[Ready_len].priority=Cpu.priority;Ready_len++;printf("***%c时间片用完\n",);}CPU_state=0;=0;Cpu.needtime=0;Cpu.priority=0;if(Ready_len!=0)//时间片用完,如果就绪队列不为空,则调度dispatch();}else{printf("***没有进程在CPU中,无法超时\n");}}bool event_wait(){if(CPU_state==1){Blocked[Blocked_len].name=;Blocked[Blocked_len].n eedtime=Cpu.needtime;Blocked[Blocked_len].priority=Cpu.priority;Blocked_len++;printf("***%c被阻塞\n",);CPU_state=0;if(Ready_len!=0)//进程被阻塞,如果就绪队列不为空,则调度dispatch();}elseprintf("***没有进程在CPU中,无法阻塞\n");}bool event_occur(){if(Blocked_len!=0){//sort(Blocked,Blocked+Blocked_len);Ready[Ready_len].name=Blocked[0].name;Ready[Ready_len].nee dtime=Blocked[0].needtime;Ready[Ready_len].priority=Blocked[0]. priority;Ready_len++;if(Blocked_len!=1)//阻塞队列剔除队首元素for(int indx=1;indx<Blocked_len;indx++){Blocked[indx-1].name=Blocked[indx].name;Blocked[indx-1].needti me=Blocked[indx].needtime;Blocked[indx-1].priority=Blocked[indx]. priority;}Blocked_len--;//printf("%d %d",Blocked_len,Ready_len);printf("***%c被唤醒\n",Ready[Ready_len-1].name);if(CPU_state==0)//如果CPU空闲,则调度dispatch();//printf("%d %d",Blocked_len,Ready_len);}elseprintf("***阻塞队列为空,无法唤醒\n");}int main(){int Cputime=1;while(1){printf("\n1:New\t\t\t2:Dispatch\n");printf("3:Timeout\t\t4:Event wait\n");printf("5:Event occur\t\t0:exit\n");printf("输入1--5实现相应的功能:\n");int select;scanf("%d",&select);getchar();switch(select){case 1:int num;printf("输入要创建的进程数:\n");scanf("%d",&num);getchar();creat(num);break;case 2:dispatch();break;case 3:time_out();break;case 4:event_wait();break;case 5:event_occur();break;case 0:exit(0);break;}printf("****************************Cputime:%3d********************* *******\n",Cputime);printf("状态\t\t进程名\t\t需要时间\t\t优先级\n");if(CPU_state){//显示CPU中的进程printf("Running:\t%c\t\t",);printf("%d\t\t\t",Cpu.needtime);printf("%d\n",Cpu.priority);}if(Ready_len){//显示Ready队列中的进程for(int a=0;a<Ready_len;a++){printf("Ready%d:\t\t",a);printf("%c\t\t",Ready[a].name);printf("%d\t\t\t",Ready[a].needtime);printf("%d\n",Ready[a].priority);}}if(Blocked_len){//显示Blocked队列中的程序for(int b=0;b<Blocked_len;b++){printf("Blocked%d:\t",b);printf("%c\t\t",Blocked[b].name);printf("%d\t\t\t",Blocked[b].needtime);printf("%d\n",Blocked[b].priority);}}printf("**************************************************************** ***\n");Cputime++;} }。

操作系统进程的三种状态的转换实验报告

操作系统进程的三种状态的转换实验报告
2.按照课本基本知识和自己的想法编写程序。
3.设计出可视性较好的界面,应能反映出进程状态的变化引起的对应内容。
4.代码书写要规范,要适当地加入注释。
5.编译并调试自己编写的程序,是程序编译成功。
6.检查运行的结果是否正确。
四、实验结果(含算法说明、程序、数据记录及分析等,可附页)
五、实验思考题
利用C语言编写了一个模拟Windows进程三种状态之间的转换的程序,虽然肥城精简,但是我从中学到的很多知识点,学会了编写程序时的一些技巧,为自己以后更加深造打下了坚实的基础和使自己更好的理解Windows如何更好的管理进程。
六、实验总结(含实验心得体会,收获与不足等)
通过这次实验让我受益匪浅,不仅明白了自己以前不知道如何定义和应用结构体,还提高了自己的编程能力,调试程序的能力,使自己的编程能力有了大幅度的提高。使自己更好的理解进程的概念和进程的三种状态之间转换的过程和他们之间的关系。为自己以后复习打下了夯实的基础。
1)根据课本第三章的内容设计并实现一个模拟进程状态转换。
2)独立编写和调试程序。进程的数目,进程的状态模型自行选择。
3)合理设计进程相对应的数据结构,内容要包括进程的基本信息。
4)是进程的三种状态之间的转化清晰的显示。
三、实验过程及步骤(包含使用软件或实验设备等情况)
1.打开DEV-C++,新建一个源代码文件
实验报告
实验名称
进程三种状态的转换
专业
计算机
课程名称
操作系统
指导老师
张海燕
班级
二表一班
姓名
刘广法
学号
11100140109
评分
实验地点
1cபைடு நூலகம்6217

操作系统实验报告进程状态转换

操作系统实验报告进程状态转换

实验进程状态转换及其PCB的变化一、程序流程图:二、使用的数据结构及说明:在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下:struct PCB{int P_Id; //PCB的ID号char P_Name[10]; //PCB的名称char P_State[10]; //PCB状态int P_Runtime; //PCB的所需要的运行时间int P_Requiry; //PCB所需要的资源要求struct PCB * next ; //PCB块的下一个指针} ;其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。

P_Runtime标示要完成一个进程所需要的时间。

P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry 置1,否则置0。

Struct PCB * next 用来指向同一队列中的下一个PCB块。

三、程序源代码:#include"stdlib.h"#include"stdio.h"#include"string.h"/********** globle structure and viable ******/struct PCB{int P_Id; //PCB的ID号char P_Name[10]; //PCB的名称char P_State[10]; //PCB状态int P_Runtime; //PCB的所需要的运行时间int P_Requiry; //PCB所需要的资源要求struct PCB * next ; //PCB块的下一个指针} ;struct PCB * Create_state; //创建状态struct PCB * Run_state; //运行状态struct PCB * Ready_state; //就绪状态struct PCB * Block_state; //阻塞状态struct PCB * Exit_state; //退出状态int signal4=0; //标示进程4的完成状态int signal5=0; //标示进程5的完成状态void InsertQueue(struct PCB **head,struct PCB *node) /* insert node function */{struct PCB * p,*q;node->next=NULL;if(*head==NULL) //如果队列为空{*head=node;}Else //队列不空{p=*head;q=p->next;while(q!=NULL) //找到最后的元素位置{p=q;q=q->next;}p->next=node; //将节点插入队列}void DeleteQueue(struct PCB **head,struct PCB *node) //撤销进程,从队列中删除元素{struct PCB *p,*q;q=*head;if(*head==NULL||node==NULL) //如果队列为空,返回return ;if(*head==node) //如果要删除的元素是队首元素{*head=(*head)->next;return;}Else //如果不是队列的首元素{while(q->next!=p&&q->next!=NULL)q=q->next;q=p->next;p->next=NULL;}}void Display_Process(struct PCB * node) //打印进程状态的元素函数{printf("\n\nthis process Id is : %d \n",node->P_Id);printf("this process name is : %s \n",node->P_Name);printf("this process state is : on %s \n ",node->P_State);printf("this process Runtime is : %d \n",node->P_Runtime);if(node->P_Requiry)printf("this process resource is ready \n");elseprintf("this process resource is not ready ! \n");}void DispatchToBlock(struct PCB *node) // /* dispatch to block function*/{ //调度到阻塞状态的函数//struct PCB *p=(struct PCB *)malloc(sizeof(struct PCB));if(!node->P_Requiry) //如果所需要的资源没有满足则,调度到阻塞状态{strcpy(node->P_State,"block");InsertQueue(&Block_state,node); //插入到阻塞队列Display_Process(node);}void DispatchToReady(struct PCB *node) // dispatch to ready state{ //调度到就绪状态的函数if(node->P_Requiry) //如果所需的资源满足,则调度{strcpy(node->P_State,"Ready");InsertQueue(&Ready_state,node);Display_Process(node);}}void DispatchBlockToReady() //dispatch the process to readyqueue{ //从阻塞状态调度到就绪状态函数struct PCB*p,*q;q=Block_state;while(q!=NULL) //如果阻塞状态队列不空{p=q;q=q->next;if(signal4&&p->P_Id==4) //如果所需要的资源满足{DeleteQueue(&Block_state,p);strcpy(p->P_State,"ready");InsertQueue(&Ready_state,p);printf("process4 will be in the state of ready!\n");Display_Process(p);}if(signal5&&p->P_Id==5){DeleteQueue(&Block_state,p);strcpy(p->P_State,"ready");InsertQueue(&Ready_state,p);printf("process5 will be in the state of ready!\n");Display_Process(p);}}}void Create_Process() //创建进程函数{int i;struct PCB *p;char name[10];strcpy(name,"process");for(i=1;i<3;i++) //动态创建2个处于阻塞状态的进程{p=(struct PCB *)malloc(sizeof(struct PCB));p->P_Id=i;name[7]=i+'0';name[8]='\0';strcpy(p->P_Name,name);strcpy(p->P_State,"create");p->P_Runtime=1; //所需要的时间片为1p->P_Requiry=0;Display_Process(p);sleep(4);printf(" \n process%d will be in the state of Block, waiting the resource ready \n\n",i);DispatchToBlock(p); //同时调度到阻塞队列}for(i=3;i<7;i++) //创建4个就绪状态的队列{p=(struct PCB *)malloc(sizeof(struct PCB));p->P_Id=i;name[7]=i+'0';name[8]='\0';strcpy(p->P_Name,name);strcpy(p->P_State,"create");p->P_Requiry=1;if(i==6) //在这里个进程6所需要的时间片为2p->P_Runtime=2;elsep->P_Runtime=1;Display_Process(p);sleep(4);printf(" \n process%d will be in the state of Ready, waiting to run \n\n",i);DispatchToReady(p);}}void display(struct PCB **head) //打印各个状态队列里进程数目{struct PCB *p,*q;p=*head;while(p!=NULL){sleep(2);//printf("\n\n///////////////////////////////////\n");printf("\n\nthis process Id is : %d \n",p->P_Id);printf("this process name is : %s \n",p->P_Name);printf("this process state is : on %s \n ",p->P_State);printf("this process Runtime is : %d \n",p->P_Runtime);if(p->P_Requiry)printf("this process resource is ready \n");elseprintf("this process resource is not ready ! \n");p=p->next;}}void Process_Run() //进程运行函数{struct PCB *p,*q;p=Ready_state;q=p;while(p!=NULL) //就绪队列不空则继续执行{if(p->P_Runtime<=0) break; //如果时间片执行完了,则跳出循环strcpy(p->P_State,"running");Display_Process(p);p->P_Runtime=p->P_Runtime-1;sleep(4);if(p->P_Runtime>0) //没有完成,则进入就绪队列{printf("this process is not finished,will be dispatch to the ready queue!!\n");DeleteQueue(&Ready_state,p);strcpy(p->P_State,"ready");InsertQueue(&Ready_state,p);Display_Process(p);}Else //执行完成,则跳出,并发送相应的信息{printf("\n\nProcess%d is finished and will be in the state of exit!\n\n",p->P_Id);if(p->P_Id==4) signal4=1;if(p->P_Id==5) signal5=1;}if(signal4||signal5)DispatchBlockToReady(); //如果资源满足,则将进程调度到就绪队列q=q->next;p=q;}if(q==NULL)printf("\nthere is no process ready!\n STOP Machine!!!\n");}int main(int argc,char * argv[]) //主函数{int i;char c='c'; //界面printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n");printf("...................................Ding Hai bo\n");printf("......Press s to start the process.......\n");scanf("%c",&c);while(1){if(c=='s')break;scanf("%c",&c);}Create_Process(); //调用创建进程函数printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");printf("\n>>>>>>> Display the Ready queue >>>>>>>>>>>>>>>\n");sleep(5);display(&Ready_state); ////////////////显示就绪队列里的进程printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");printf("\n>>>>>>>> Display the Block queue >>>>>>>>>>>>\n");sleep(5); //显示阻塞队列函数display(&Block_state); /////////////////////printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n\n");printf("\n>>>>>>>> Now the process start to run >>>>>>>>>>>\n");sleep(5);Process_Run(); //调用进程运行函数}四、运行结果及说明:运行结果的截图:下面的运行结果是程序执行的每一步进程调度的显示,从进程的创建到进程的执行,结束,每一步进程调度都有显示。

进程的管理实验报告结论

进程的管理实验报告结论

一、实验背景及目的进程是操作系统中基本的活动单位,进程管理是操作系统核心功能之一。

为了深入理解进程的概念、进程状态转换、进程同步与互斥等知识,我们进行了进程管理实验。

本次实验旨在通过编写程序,模拟进程的创建、调度、同步与互斥等操作,加深对进程管理的理解。

二、实验内容及方法1. 进程创建与状态转换(1)使用系统调用fork()创建子进程,观察父进程和子进程的状态转换过程。

(2)使用系统调用exec()替换子进程的内容,观察子进程状态变化。

2. 进程调度(1)编写进程调度程序,实现最高优先数优先调度算法和先来先服务调度算法。

(2)模拟进程就绪队列,观察调度算法对进程执行顺序的影响。

3. 进程同步与互斥(1)使用信号量实现进程同步,观察进程同步效果。

(2)使用互斥锁实现进程互斥,观察进程互斥效果。

4. 进程通信(1)使用管道实现进程间通信,观察通信效果。

(2)使用共享内存实现进程间通信,观察通信效果。

三、实验结果与分析1. 进程创建与状态转换实验结果显示,使用fork()创建子进程后,父进程和子进程的状态均为运行态。

当父进程调用exec()替换子进程内容后,子进程状态变为僵尸态,父进程状态变为运行态。

这说明进程在创建和替换过程中,其状态发生了相应的变化。

2. 进程调度实验结果显示,最高优先数优先调度算法和先来先服务调度算法均能正确执行。

最高优先数优先调度算法下,优先级高的进程先执行;先来先服务调度算法下,先到达的进程先执行。

这说明两种调度算法均能实现进程的合理调度。

3. 进程同步与互斥实验结果显示,使用信号量实现进程同步时,进程能正确地按照规定的顺序执行;使用互斥锁实现进程互斥时,进程能正确地实现互斥访问共享资源。

这说明信号量和互斥锁在进程同步与互斥方面具有重要作用。

4. 进程通信实验结果显示,使用管道实现进程间通信时,进程能正确地接收和发送数据;使用共享内存实现进程间通信时,进程能正确地访问共享内存中的数据。

进程操作的实验报告

进程操作的实验报告

一、实验目的1. 理解进程的基本概念和进程控制块(PCB)的作用。

2. 掌握进程创建、调度、同步和通信的基本方法。

3. 熟悉进程状态转换及进程同步机制。

4. 提高编程能力,加深对操作系统进程管理的理解。

二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 开发环境:Visual Studio 2019三、实验内容1. 进程创建与销毁2. 进程调度3. 进程同步4. 进程通信四、实验步骤1. 进程创建与销毁(1)定义进程结构体```ctypedef struct {int pid; // 进程IDchar name[50]; // 进程名int status; // 进程状态struct PCB next; // 指向下一个进程的指针} PCB;```(2)创建进程```cPCB createProcess(char name) {PCB newProcess = (PCB )malloc(sizeof(PCB)); newProcess->pid = ...; // 分配进程IDstrcpy(newProcess->name, name);newProcess->status = ...; // 初始化进程状态 newProcess->next = NULL;// ... 其他初始化操作return newProcess;}```(3)销毁进程```cvoid destroyProcess(PCB process) {free(process);}```2. 进程调度(1)定义进程队列```ctypedef struct {PCB head; // 队列头指针PCB tail; // 队列尾指针} ProcessQueue;```(2)初始化进程队列```cvoid initProcessQueue(ProcessQueue queue) {queue->head = NULL;queue->tail = NULL;}```(3)入队```cvoid enqueue(ProcessQueue queue, PCB process) { if (queue->head == NULL) {queue->head = process;queue->tail = process;} else {queue->tail->next = process;queue->tail = process;}}(4)出队```cPCB dequeue(ProcessQueue queue) {if (queue->head == NULL) {return NULL;}PCB process = queue->head;queue->head = queue->head->next; if (queue->head == NULL) {queue->tail = NULL;}return process;}```3. 进程同步(1)互斥锁```ctypedef struct {int locked; // 锁的状态} Mutex;void initMutex(Mutex mutex) {mutex->locked = 0;void lock(Mutex mutex) {while (mutex->locked) {// 等待锁释放}mutex->locked = 1;}void unlock(Mutex mutex) {mutex->locked = 0;}```(2)信号量```ctypedef struct {int count; // 信号量值Mutex mutex; // 互斥锁} Semaphore;void initSemaphore(Semaphore semaphore, int count) { semaphore->count = count;initMutex(&semaphore->mutex);}void P(Semaphore semaphore) {lock(&semaphore->mutex);while (semaphore->count <= 0) {// 等待信号量}semaphore->count--;unlock(&semaphore->mutex);}void V(Semaphore semaphore) {lock(&semaphore->mutex);semaphore->count++;unlock(&semaphore->mutex);}```4. 进程通信(1)管道通信```cint pipe(int pipefd[2]) {// 创建管道}void writePipe(int pipefd[2], const void buf, size_t nbyte) { // 向管道写入数据}void readPipe(int pipefd[2], void buf, size_t nbyte) {// 从管道读取数据}```(2)消息队列通信```cint msgget(key_t key, int msgflg) {// 创建消息队列}void msgsnd(int msqid, const void msgp, size_t msgsz, int msgflg) {// 向消息队列发送消息}void msgrcv(int msqid, void msgp, size_t msgsz, long msgtype, int msgflg) {// 从消息队列接收消息}```五、实验结果与分析1. 进程创建与销毁:通过创建和销毁进程,验证了进程结构体的正确性。

进程的管理实验报告

进程的管理实验报告

一、实验目的1. 理解进程的基本概念和进程状态转换过程。

2. 掌握进程创建、进程同步和进程通信的方法。

3. 了解进程调度算法的基本原理和实现方法。

4. 通过实验加深对进程管理的理解,提高操作系统实践能力。

二、实验环境1. 操作系统:Linux2. 编程语言:C/C++3. 开发工具:GCC三、实验内容1. 进程创建与状态转换(1)使用fork()函数创建一个子进程,并观察父进程和子进程的进程ID。

(2)使用exec()函数替换子进程的映像,实现进程的创建。

(3)观察进程状态转换过程,如创建、运行、阻塞、就绪、终止等。

2. 进程同步(1)使用互斥锁(mutex)实现进程的互斥访问共享资源。

(2)使用信号量(semaphore)实现进程的同步,如生产者-消费者问题。

(3)观察进程同步的效果,确保进程安全执行。

3. 进程通信(1)使用管道(pipe)实现进程间的单向通信。

(2)使用消息队列(message queue)实现进程间的双向通信。

(3)使用共享内存(shared memory)实现进程间的快速通信。

(4)观察进程通信的效果,确保数据正确传递。

(1)实现基于优先级的进程调度算法,如先来先服务(FCFS)和最高优先级优先(HPF)。

(2)实现基于时间片的轮转调度算法(RR)。

(3)观察进程调度算法的效果,分析不同算法的优缺点。

四、实验步骤1. 编写程序实现进程创建与状态转换,使用fork()和exec()函数。

2. 编写程序实现进程同步,使用互斥锁和信号量。

3. 编写程序实现进程通信,使用管道、消息队列和共享内存。

4. 编写程序实现进程调度,使用优先级调度和时间片轮转调度。

5. 编译并运行程序,观察实验结果,分析实验现象。

五、实验结果与分析1. 进程创建与状态转换通过实验,我们成功创建了父进程和子进程,并观察到进程ID的变化。

在进程创建过程中,父进程的进程ID与子进程的进程ID不同,说明子进程是独立于父进程的实体。

操作系统进程管理实验报告

操作系统进程管理实验报告

操作系统进程管理实验报告一、引言在现代计算机科学中,操作系统的进程管理是确保系统高效运行的关键环节。

本实验旨在通过观察和分析操作系统的进程管理行为,深入理解进程的创建、运行和终止过程,以及操作系统如何对进程进行调度和资源分配。

二、实验目标1、理解进程的基本概念、进程状态及转换。

2、掌握进程的创建、终止和调度方法。

3、观察和分析进程在运行过程中的资源消耗和调度行为。

4、分析操作系统对进程的资源分配和调度策略对系统性能的影响。

三、实验环境与工具本实验在Linux操作系统上进行,使用GNU/Linux环境下的工具进行进程的创建、监控和调度。

四、实验步骤与记录1、创建进程:使用shell命令“fork”创建一个新的进程。

记录下父进程和子进程的PID,以及它们在内存中的状态。

2、进程状态观察:使用“ps”命令查看当前运行进程的状态,包括进程的PID、运行时间、CPU使用率等。

同时,使用“top”命令实时监控系统的CPU、内存等资源的使用情况。

3、进程调度:在“crontab”中设置定时任务,观察系统如何根据预设的调度策略分配CPU资源给各个进程。

4、资源分配:通过修改进程的优先级(使用“nice”命令),观察系统如何调整资源分配策略。

5、终止进程:使用“kill”命令终止一个进程,并观察系统如何处理该进程占用的资源。

五、实验结果与分析1、创建进程:通过“fork”系统调用,成功创建了一个新的进程,并获取了父进程和子进程的PID。

在内存中,父进程和子进程的状态分别为“running”和“ready”。

2、进程状态观察:使用“ps”命令可以看到父进程和子进程的状态均为“running”,同时显示了它们的CPU使用率和运行时间等信息。

通过“top”命令,可以实时监控系统的CPU、内存等资源的使用情况,为进一步分析提供了数据支持。

3、进程调度:在“crontab”中设置定时任务后,系统会根据预设的调度策略以及各个进程的运行状态,动态地分配CPU资源给各个进程。

进程描述、状态转换和控制实验

进程描述、状态转换和控制实验
1/6
计算机操作系统实验报告
PCB(){PID=-1;} }PCB,*PCBP; 5. 函数设计 5.1 用户选择菜单: 我们采用两级菜单显示: char menu()//用户选择菜单 char menu1()//进程操作菜单
0915257 吴龙龙
图 3-2 5.2 创建进程 void creat(int i,PCB a[]); 5.3 显示进程信息 void show(PCB a[]);
图 3-3 5.4 进程操作 1)io 请求 void iost(PCBP a,int i); 2)io 完成 void ioe(PCBP a,int i); 3)销毁进程 dest(PCBP a,int i);
2/6
计算机操作系统实验报告
0915257 吴龙龙
图 3-3 6. 数据测试 输入: 1\n2” ”3\n1\n3” ”4\n2\n3\n2\n1\n0\n2\n1\n4” ”5\n2\n\3\n2\n2\n0\n2 输出:
图 3-1 2.3 进程控制块 操作系统采用 PCB 块描述一个进程和其它进程以及系统资源的关系,刻 画一个进程在各个不同时期所处的状态. PCB 是系统感知进程存在的唯一标志, 进程与 PCB 是一一对应的. 3. 实验分析 根据实验要求,我们需要做的是模拟进程管理程序,其具体功能如下: 1) 进程创建 2) 进程显示 3) 对某进程操作: 1.io 请求 2.io 完成 3.销毁进程 4. 数据结构 typedef class PCB{ public: int PID; char name[10];//进程名 char state;//状态,R,W,G int pri;//priority 优先级 friend istream& operator >>(istream& ins,PCB& a);//重载>> friend ostream& operator <<(ostream& outs,PCB& a);//重载<<

操作系统实验之进程管理实验报告

操作系统实验之进程管理实验报告

操作系统实验之进程管理实验报告一、实验目的本次操作系统实验的主要目的是深入理解进程管理的概念和原理,通过实际操作和观察,掌握进程的创建、调度、同步与互斥等关键机制。

二、实验环境本次实验使用的操作系统为 Windows 10,开发工具为 Visual Studio 2019,编程语言为 C++。

三、实验内容1、进程创建使用系统提供的 API 函数创建新的进程。

观察新进程的资源使用情况和运行状态。

2、进程调度编写程序模拟不同的进程调度算法,如先来先服务(FCFS)、短作业优先(SJF)和时间片轮转(RR)。

比较不同调度算法下的平均周转时间、平均等待时间等性能指标。

3、进程同步与互斥利用信号量、互斥锁等机制实现进程之间的同步与互斥。

设计并发程序,解决生产者消费者问题、读写者问题等经典同步问题。

四、实验步骤1、进程创建实验首先,包含所需的头文件,如`<windowsh>`。

然后,定义创建进程的函数,使用`CreateProcess` 函数创建新进程,并获取进程的相关信息,如进程标识符、线程标识符等。

最后,通过查看任务管理器或其他系统工具,观察新创建进程的资源占用情况。

2、进程调度实验设计不同的调度算法函数,如`FCFSSchedule`、`SJFSchedule` 和`RRSchedule`。

在每个调度算法函数中,模拟进程的到达时间、服务时间等参数,并按照相应的算法进行进程调度。

计算每个进程的周转时间和等待时间,并求出平均周转时间和平均等待时间。

3、进程同步与互斥实验定义信号量或互斥锁变量。

在生产者消费者问题中,生产者在生产产品时获取互斥锁,生产完成后释放互斥锁并通知消费者;消费者在消费产品时获取互斥锁,消费完成后释放互斥锁。

在读写者问题中,读者在读取数据时获取共享锁,读完后释放共享锁;写者在写入数据时获取独占锁,写入完成后释放独占锁。

五、实验结果与分析1、进程创建实验结果成功创建新的进程,并能够获取到进程的相关信息。

操作系统实验进程状态转换及其PCB的变化

操作系统实验进程状态转换及其PCB的变化
操作系统实验进程状态 转换及其PCB的变化
XX,a click to unlimited possibilities
汇报人:XX
目录
01 添 加 目 录 项 标 题
02 进 程 状 态 转 换
03 P C B 的 变 化
04 实 验 操 作 步 骤
05 实 验 结 果 与 讨 论
Part One
优先级:用于确定进程的调度 优先级
内存指针:指向进程在内存中 的起始地址
PCB在进程状态转换时的变化
PCB中进程状态的变化 PCB中进程优先级的变化 PCB中进程控制块的变化 PCB中进程调度信息的变化
PCB变化的意义
跟踪进程状态转 换:通过PCB的 变化,可以跟踪 进程在操作系统 中的状态转换, 从而更好地理解 操作系统的调度 机制。
单击添加章节标题
Part Two
进程状态转换
进程的三种基本状态
执行状态:进程已获得CPU, 正在执行
就绪状态:进程已获得除 CPU外的所有必要资源,等 待分配CPU
阻塞状态:进程因等待某个 条件(如I/O操作)而暂时
无法执行
进程状态的转换过程
进程创建状态:新进程从 无到有,创建并初始化 PCB
PCB变化的实现方式
进程状态转换:描述进程在执行过程中状态的变化过程,包括就绪态、 运行态、阻塞态等。
PCB结构:介绍PCB的结构和组成,包括进程名、进程标识符、进程状 态、优先级等。
PCB变化过程:描述在进程状态转换过程中,PCB中各字段的变化情况, 如状态、优先级、时间片等。
调度算法:介绍常见的进程调度算法,如先来先服务、最短作业优先、 优先级调度等,以及它们对PCB变化的影响。
实验结果分析

操作系统实验报告

操作系统实验报告

通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。

设计程序摹拟进程的轮转法调度过程。

假设初始状态为:有n 个进程处于就绪状态,有m 个进程处于阻塞状态。

采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t 个时间片系统释放资源,唤醒处于阻塞队列队首的进程。

程序要求如下:1) .输出系统中进程的调度次序;2) .计算CPU 利用率。

硬件环境:Ghost XP SP3 纯净版Y6.0 Pentium(R) Dual-Core CPU E6700 @3.20GHz 3.19 GHz, 1.96 GB 的内存物理地址扩展软件环境:Microsoft Windows XP , Visual Studio 2022#include <iostream>#include <algorithm>#include <queue>using namespace std;const int MaxNum = 100;struct Node{int index;int arriveTime;int rest;};bool NodeCmp(const Node& a,const Node& b){return a.arriveTime < b.arriveTime;}int n; //进程数int ArrivalTime[MaxNum];int ServiceTime[MaxNum];int PServiceTime[MaxNum];int FinishTime[MaxNum];int WholeTime[MaxNum];double WeightWholeTime[MaxNum];bool Finished[MaxNum];double AverageWT,AverageWWT;bool isEnterQue[MaxNum];int cntTimes[MaxNum];void init(){memset(PServiceTime,0,sizeof(PServiceTime));memset(Finished,0,sizeof(Finished));memset(FinishTime,0,sizeof(FinishTime));memset(WholeTime,0,sizeof(WholeTime));memset(WeightWholeTime,0,sizeof(WeightWholeTime)); }int sum(int array[],int n){int sum=0;int i;for(i=0;i<n;i++){sum += array[i];}return sum;}double sum(double array[],int n){double sum=0;int i;for(i=0;i<n;i++){sum += array[i];}return sum;}void print(){int i=0;cout<<"进程完成时间:";for(i=0;i<n;i++){cout<<FinishTime[i]<<' ' ;}cout<<endl;cout<<"周转时间:";for(i=0;i<n;i++){cout<<WholeTime[i]<<' ';}cout<<endl;cout<<"带权周转时间:";for(i=0;i<n;i++){printf("%.2f ",WeightWholeTime[i]);}cout<<endl;}void SearchToEnterQue(queue<Node>& que,Node* pArr,int maxArrivalTime) {int i;for(i=0;i<n;i++){if(pArr[i].arriveTime>maxArrivalTime)break ;if(isEnterQue[pArr[i].index]==false){que.push(pArr[i]);isEnterQue[pArr[i].index] = true;}}}void Work(int q){init();memset(isEnterQue,0,sizeof(isEnterQue));memset(cntTimes,0,sizeof(cntTimes));Node* pNodeArr = new Node[n];int i;for(i=0;i<n;i++){pNodeArr[i].index = i;pNodeArr[i].arriveTime = ArrivalTime[i];pNodeArr[i].rest = ServiceTime[i];}sort(pNodeArr,pNodeArr+n,NodeCmp);int totalTime = sum(ServiceTime,n);int time=pNodeArr[0].arriveTime;queue<Node> que;que.push(pNodeArr[0]);isEnterQue[pNodeArr[0].index]=true;Node cur;cout<<"================================================="<<endl;while(!que.empty()) {cur = que.front();que.pop();cntTimes[cur.index]++;if(cntTimes[cur.index]==1)printf("在%d时刻,进程%d开始执行。

进程切换实验报告

进程切换实验报告

一、实验目的通过本次实验,了解进程切换的基本概念和过程,掌握进程切换的触发条件、切换过程以及切换开销,加深对进程调度和管理的理解。

二、实验环境操作系统:Linux编程语言:C语言开发环境:gcc编译器三、实验原理1. 进程切换的概念进程切换是指CPU从一个进程切换到另一个进程的过程。

在多进程系统中,操作系统为了保证各个进程的并发执行,需要实现进程切换。

进程切换是操作系统进程管理的核心内容。

2. 进程切换的触发条件(1)运行时间片用完:当进程运行一定的时间片后,CPU会强制将进程切换到就绪队列,等待下一次调度。

(2)高优先级进程就绪:当有更高优先级的进程进入就绪队列时,当前运行的进程会被切换。

(3)进程主动放弃CPU:如进程调用sleep()、yield()等函数,主动放弃CPU。

(4)异常和中断:如程序错误、硬件中断等,导致当前运行的进程切换。

3. 进程切换的过程(1)保存当前进程的状态:包括寄存器状态、程序计数器等。

(2)选择下一个要运行的进程:根据调度算法,从就绪队列中选择一个进程。

(3)恢复下一个进程的状态:将保存的状态恢复到CPU中。

(4)执行下一个进程:CPU开始执行新进程。

4. 进程切换开销进程切换过程中,需要保存和恢复进程状态,这会带来一定的开销。

进程切换开销包括:(1)时间开销:进程切换需要一定的时间,包括保存和恢复进程状态的时间。

(2)空间开销:进程切换需要一定的空间来保存和恢复进程状态。

四、实验内容1. 创建进程:使用C语言创建两个进程,其中一个为父进程,另一个为子进程。

2. 进程切换:在父进程中,使用sleep()函数使进程休眠一段时间,触发进程切换。

3. 观察进程切换:在父进程中,使用ps命令查看进程状态,观察进程切换过程。

4. 分析进程切换开销:通过比较父进程和子进程的运行时间,分析进程切换的开销。

五、实验步骤1. 编写C程序,创建父进程和子进程。

2. 在父进程中,使用sleep()函数使进程休眠一段时间。

操作系统linux版实验报告

操作系统linux版实验报告

操作系统实验报告(Linux版)网络142 潘豹 142999实验一观察Linux进程状态一、实验目得在本实验中学习Linux操作系统得进程状态,并通过编写一些简单代码来观察各种情况下,Linux进程得状态,进一步理解进程得状态及其转换机制。

二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Linux Ubuntu操作系统,gcc编译器。

(四)查瞧“不可中断阻塞”状态(D)创建一个C程序,如uninter_status、c,让其睡眠30s代码:#include<unistd、h〉#include<stdio、h〉int main(){int i=0,j=0,k=0;for(i=0;i<1000000;i++){for(j=0;j<1000000;j++){k++;k--;}}}实验结果:(二)查瞧“暂停”状态(T)运行run_status进程,其进入R状态:代码同上:(三)查瞧“可中断阻塞”状态(S)创建一个C程序,如interruptiblie_status、c,让其睡眠30s编译链接,后台运行该程序(后接&符号),并使用ps命令查瞧运行状态代码:#include〈unistd、h>#include<stdio、h>int main(){sleep(30);return;}实验结果:(四)查瞧“不可中断阻塞”状态(D)创建一个C程序,如uninter_status、c,让其睡眠30s编译链接,后台运行该程序(后接&),并使用ps命令查瞧运行状态代码:#include〈unistd、h>#include〈stdio、h>intmain(){if(vfork()==0){sleep(300);return;}}实验结果:(五)查瞧“僵尸”进程(Z)创建一个C程序,如zombie_status、c,在其中创建一个子进程,并让子进程迅速结束,而父进程陷入阻塞编译链接,后台运行该程序(后接&),并使用ps命令查瞧运行状态(30s内)代码:#include<unistd、h>#incldue<stdio、h>int main(){if(fork()){sleep(300);}}实验结果:实验二观察Linux进程/线程得异步并发执行一、实验目得通过本实验学习如何创建Linux进程及线程,通过实验,观察Linux进程及线程得异步执行。

操作系统实验一练习进程状态转换

操作系统实验一练习进程状态转换

实验一模拟进程状态转换及其PCB的变化一、实验目的:自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。

二、实验内容及要求:(1)、设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。

(2)、独立编写、调试程序。

进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。

(3)、合理设计与进程PCB相对应的数据结构。

PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。

(4)、设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。

(5)、代码书写要规范,要适当地加入注释。

(6)、鼓励在实验中加入新的观点或想法,并加以实现。

(7)、认真进行预习,完成预习报告。

(8)、实验完成后,要认真总结,完成实验报告。

三、实现:数据结构struct PCB{char name。

int priority。

int needtime。

bool operator < (const PCB &b) const{ return priority>b.priority。

}}。

五状态进程模型最高优先数优先调度算法流程图四、运行结果:图1创建2个进程,因为这时cpu空闲所以内核调度,b优先级高先执行图2超时,因为这时cpu空闲所以内核调度,b优先级还是比a高所以先执行图32个进程均被阻塞,其中一旦进程被阻塞就会引发调度图4唤醒1个进程,从阻塞队列取队首放到就绪队列队尾,由于这时cpu空闲所以内核调度五、源代码:#include<cstdio>#include<algorithm>using namespace std。

int Ready_len=0。

int Blocked_len=0。

int CPU_state=0。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验进程状态转换及其PCB的变化一、程序流程图:二、使用的数据结构及说明:在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下:struct PCB{int P_Id; //PCB的ID号char P_Name[10]; //PCB的名称char P_State[10]; //PCB状态int P_Runtime; //PCB的所需要的运行时间int P_Requiry; //PCB所需要的资源要求struct PCB * next ; //PCB块的下一个指针} ;其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。

P_Runtime标示要完成一个进程所需要的时间。

P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry 置1,否则置0。

Struct PCB * next 用来指向同一队列中的下一个PCB块。

三、程序源代码:#include"stdlib.h"#include"stdio.h"#include"string.h"/********** globle structure and viable ******/struct PCB{int P_Id; //PCB的ID号char P_Name[10]; //PCB的名称char P_State[10]; //PCB状态int P_Runtime; //PCB的所需要的运行时间int P_Requiry; //PCB所需要的资源要求struct PCB * next ; //PCB块的下一个指针} ;struct PCB * Create_state; //创建状态struct PCB * Run_state; //运行状态struct PCB * Ready_state; //就绪状态struct PCB * Block_state; //阻塞状态struct PCB * Exit_state; //退出状态int signal4=0; //标示进程4的完成状态int signal5=0; //标示进程5的完成状态void InsertQueue(struct PCB **head,struct PCB *node) /* insert node function */{struct PCB * p,*q;node->next=NULL;if(*head==NULL) //如果队列为空{*head=node;}Else //队列不空{p=*head;q=p->next;while(q!=NULL) //找到最后的元素位置{p=q;q=q->next;}p->next=node; //将节点插入队列}void DeleteQueue(struct PCB **head,struct PCB *node) //撤销进程,从队列中删除元素{struct PCB *p,*q;q=*head;if(*head==NULL||node==NULL) //如果队列为空,返回return ;if(*head==node) //如果要删除的元素是队首元素{*head=(*head)->next;return;}Else //如果不是队列的首元素{while(q->next!=p&&q->next!=NULL)q=q->next;q=p->next;p->next=NULL;}}void Display_Process(struct PCB * node) //打印进程状态的元素函数{printf("\n\nthis process Id is : %d \n",node->P_Id);printf("this process name is : %s \n",node->P_Name);printf("this process state is : on %s \n ",node->P_State);printf("this process Runtime is : %d \n",node->P_Runtime);if(node->P_Requiry)printf("this process resource is ready \n");elseprintf("this process resource is not ready ! \n");}void DispatchToBlock(struct PCB *node) // /* dispatch to block function*/{ //调度到阻塞状态的函数//struct PCB *p=(struct PCB *)malloc(sizeof(struct PCB));if(!node->P_Requiry) //如果所需要的资源没有满足则,调度到阻塞状态{strcpy(node->P_State,"block");InsertQueue(&Block_state,node); //插入到阻塞队列Display_Process(node);}void DispatchToReady(struct PCB *node) // dispatch to ready state{ //调度到就绪状态的函数if(node->P_Requiry) //如果所需的资源满足,则调度{strcpy(node->P_State,"Ready");InsertQueue(&Ready_state,node);Display_Process(node);}}void DispatchBlockToReady() //dispatch the process to readyqueue{ //从阻塞状态调度到就绪状态函数struct PCB*p,*q;q=Block_state;while(q!=NULL) //如果阻塞状态队列不空{p=q;q=q->next;if(signal4&&p->P_Id==4) //如果所需要的资源满足{DeleteQueue(&Block_state,p);strcpy(p->P_State,"ready");InsertQueue(&Ready_state,p);printf("process4 will be in the state of ready!\n");Display_Process(p);}if(signal5&&p->P_Id==5){DeleteQueue(&Block_state,p);strcpy(p->P_State,"ready");InsertQueue(&Ready_state,p);printf("process5 will be in the state of ready!\n");Display_Process(p);}}}void Create_Process() //创建进程函数{int i;struct PCB *p;char name[10];strcpy(name,"process");for(i=1;i<3;i++) //动态创建2个处于阻塞状态的进程{p=(struct PCB *)malloc(sizeof(struct PCB));p->P_Id=i;name[7]=i+'0';name[8]='\0';strcpy(p->P_Name,name);strcpy(p->P_State,"create");p->P_Runtime=1; //所需要的时间片为1p->P_Requiry=0;Display_Process(p);sleep(4);printf(" \n process%d will be in the state of Block, waiting the resource ready \n\n",i);DispatchToBlock(p); //同时调度到阻塞队列}for(i=3;i<7;i++) //创建4个就绪状态的队列{p=(struct PCB *)malloc(sizeof(struct PCB));p->P_Id=i;name[7]=i+'0';name[8]='\0';strcpy(p->P_Name,name);strcpy(p->P_State,"create");p->P_Requiry=1;if(i==6) //在这里个进程6所需要的时间片为2p->P_Runtime=2;elsep->P_Runtime=1;Display_Process(p);sleep(4);printf(" \n process%d will be in the state of Ready, waiting to run \n\n",i);DispatchToReady(p);}}void display(struct PCB **head) //打印各个状态队列里进程数目{struct PCB *p,*q;p=*head;while(p!=NULL){sleep(2);//printf("\n\n///////////////////////////////////\n");printf("\n\nthis process Id is : %d \n",p->P_Id);printf("this process name is : %s \n",p->P_Name);printf("this process state is : on %s \n ",p->P_State);printf("this process Runtime is : %d \n",p->P_Runtime);if(p->P_Requiry)printf("this process resource is ready \n");elseprintf("this process resource is not ready ! \n");p=p->next;}}void Process_Run() //进程运行函数{struct PCB *p,*q;p=Ready_state;q=p;while(p!=NULL) //就绪队列不空则继续执行{if(p->P_Runtime<=0) break; //如果时间片执行完了,则跳出循环strcpy(p->P_State,"running");Display_Process(p);p->P_Runtime=p->P_Runtime-1;sleep(4);if(p->P_Runtime>0) //没有完成,则进入就绪队列{printf("this process is not finished,will be dispatch to the ready queue!!\n");DeleteQueue(&Ready_state,p);strcpy(p->P_State,"ready");InsertQueue(&Ready_state,p);Display_Process(p);}Else //执行完成,则跳出,并发送相应的信息{printf("\n\nProcess%d is finished and will be in the state of exit!\n\n",p->P_Id);if(p->P_Id==4) signal4=1;if(p->P_Id==5) signal5=1;}if(signal4||signal5)DispatchBlockToReady(); //如果资源满足,则将进程调度到就绪队列q=q->next;p=q;}if(q==NULL)printf("\nthere is no process ready!\n STOP Machine!!!\n");}int main(int argc,char * argv[]) //主函数{int i;char c='c'; //界面printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n");printf("...................................Ding Hai bo\n");printf("......Press s to start the process.......\n");scanf("%c",&c);while(1){if(c=='s')break;scanf("%c",&c);}Create_Process(); //调用创建进程函数printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");printf("\n>>>>>>> Display the Ready queue >>>>>>>>>>>>>>>\n");sleep(5);display(&Ready_state); ////////////////显示就绪队列里的进程printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");printf("\n>>>>>>>> Display the Block queue >>>>>>>>>>>>\n");sleep(5); //显示阻塞队列函数display(&Block_state); /////////////////////printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n\n");printf("\n>>>>>>>> Now the process start to run >>>>>>>>>>>\n");sleep(5);Process_Run(); //调用进程运行函数}四、运行结果及说明:运行结果的截图:下面的运行结果是程序执行的每一步进程调度的显示,从进程的创建到进程的执行,结束,每一步进程调度都有显示。

相关文档
最新文档