学院:软件学院班级:1042组号:7组成员:张晗武川渊张天峰进程的创建与撤销#include<iostream>#include<malloc.h>#include<stdlib.h>#include<cstring>using namespace std;#define OK 1 //成功返回OK定义为1#define EVERFLOW -1 //越界用-1#define PCBSIZE 10 //空闲队列初始数组空间#define NULL 0 //空定义为0 typedef struct PCB //定义进程结构体{char name[100];int id; //进程的序号int priority; //进程的优先级int time;struct PCB *next; //进程指向下一个节点}PCB,*PCBList;PCB pcb[PCBSIZE];//创建pcb块,初始空间大小为10PCBList nullPcb;//空闲队列PCBList readyPcb;//就绪队列PCBList readyPcbtail;//就绪队列队尾指针void InitPcb(PCBList &nullPcb);//--初始化空闲队列PCBList Create(PCBList &nullPcb);//-- //创建一个pcb 进程从PCB空间申请一个空PCB,填入进程参数,创建一个pcb进程。
void InsertReadyPcb(PCBList &readyPcb,PCBList &pcb);int Delete(int id,PCBList &readyPcb,PCBList&nullPcb);//--用于销毁一个pcb进程,指定销毁队列的序列号,销毁该进程,并将它插入到空闲队列中void PrintPCB(PCBList &readyPcb);//--就绪队列输出函数-输出就绪队列中的进程信息,以便观察创建或撤消活动的结果void main(){ int on=0;PCBList p;int deleteId;InitPcb(nullPcb);//给就绪队列分配空间readyPcbtail=(PCB*)malloc(sizeof(PCB));readyPcb=readyPcbtail;readyPcbtail->id=0;readyPcbtail->priority=0;readyPcbtail->time=0;readyPcbtail->next=NULL;do{/*创建程序控制界面*/cout<<"******************************"<<endl;;cout<<"1.创建一个PCB进程"<<endl;cout<<"2.销毁运行PCB进程"<<endl;cout<<"3.就绪队列打印输出"<<endl;cout<<"4.退出系统"<<endl;cout<<"******************************"<<endl;cin>>on;//设置开关按钮switch(on){case 1: p=Create(nullPcb); InsertReadyPcb(readyPcb,p);break; //执行创建PCB进程case 2: cout<<"请输入销毁的进程的id值"<<endl;cin>>deleteId;Delete(deleteId,readyPcb,nullPcb);break;case 3: PrintPCB(readyPcb);break;case 4: exit(0);default:cout<<"请输入1-4之间的序号";}}while(on!=4);}void InitPcb(PCBList &nullPcb)//初始化空闲队列{nullPcb=&pcb[0];for(int i=0;i<PCBSIZE-1;i++){pcb[i].id=i;pcb[i].next=&pcb[i+1];}pcb[PCBSIZE-1].next=NULL;cout<<"进程块初始化成功"<<endl;}PCBList Create(PCBList &nullPcb)//用于创建一个pcb进程{ PCBList pcbP;if(nullPcb){//将空闲队列的第一个赋值给就绪队列,并将它放置在就绪队列的队尾pcbP=nullPcb;nullPcb=nullPcb->next;printf("请输入创建pcb的序号id\n");scanf("%d",&pcbP->id);printf("请输入创建它的名字\n");scanf("%s",&pcbP->name);printf("请输入它的优先级\n");scanf("%d",&pcbP->priority);printf("请输入它运行所需时间\n");scanf("%d",&pcbP->time);pcbP->next=NULL;}return pcbP;}int Delete(int id,PCBList &readyPcb,PCBList&nullPcb)//用于销毁一个pcb进程{ PCBList pcbT,pcbF;if(pcbT) {while(pcbT) {if(pcbT->id==id) {pcbF->next=pcbT->next;pcbT->next=nullPcb;nullPcb=pcbT;printf("销毁成功\n");return OK;}pcbT=pcbT->next;pcbF=pcbF->next;}if(!pcbT) {printf("没有要删除的pcb进程\n");} }else{printf("没有要删除的pcb进程\n");}return OK;}void PrintPCB(PCBList &readyPcb)//打印pcb就绪序列{ PCBList pcbP;printf("就绪队列中的进程,按照优先级排序的序列为:\n");printf("\t\t序号\t名字\t优先级\t运行时间\n");pcbP=readyPcb->next;while(pcbP){printf("\t\t%d\t%s\t%d\t%d\n",pcbP->id,pcbP->name,pcbP->priority,pcbP->time);pcbP=pcbP->next;}}void InsertReadyPcb(PCBList &readyPcb,PCBList &pcb){PCBList pcbF=readyPcb;PCBList pcbT=readyPcb->next;if(pcbT){while(pcbT){if(pcbT->priority<pcb->priority){pcb->next=pcbT;pcbF->next=pcb;printf("创建成功并将进程插入到了就绪队列中了\n");return;}pcbT=pcbT->next;pcbF=pcbF->next;}if(!pcbT){pcbF->next=pcb;}}else{pcbF->next=pcb;printf("创建成功并将进程插入到了就绪队列中了\n");}}学习操作系统心得体会摘要:操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。
操作系统身负诸如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。
转眼间,学习了一个学期的计算机操作系统课程即将结束。
在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。
在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程和实用性。
通过这一学期的学习,我才知道操作系统(Operating System,简称OS)是管理计算机系统的全部硬件资源包括软件资源及数据资源;控制程序运行;改善人机界面;为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,为用户提供方便的、有效的、友善的服务界面。
经过一个学期的学习,我也知道了计算机操作系统是铺设在计算机硬件上的多层系统软件,不仅增强了系统的功能,而且还隐藏了对硬件操作的细节,由它实现了对计算机硬件操作的多层次的抽象。
操作系统的一些原理在生活中也有所应用,以下是我通过这一学期的学习,把操作系统的一些原理联系生活所得的心得体会:1.生产—消费者问题在实际的操作系统操作过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。
产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。
单单抽象出生产者和消费者,还够不上是生产者—消费者问题。
该问题还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。
生产者把数据放入缓冲区,而消费者从缓冲区取出数据。
为了理解这一问题,我们举一个寄信的例子。
假设你要寄一封平信,大致过程如下:1、你把信写好——相当于生产者制造数据2、你把信放入邮筒——相当于生产者把数据放入缓冲区3、邮递员把信从邮筒取出——相当于消费者把数据取出缓冲区4、邮递员把信拿去邮局做相应的处理——相当于消费者处理数据2、银行家算法——避免死锁死锁的产生是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。