模拟进程创建、终止、阻塞、唤醒原语,操作系统原理
- 格式:doc
- 大小:741.00 KB
- 文档页数:12
模拟进程创建终止阻塞唤醒原语操作系统原理操作系统是计算机系统的核心,负责管理计算机系统的硬件和软件资源,提供给用户和应用程序一个简洁、高效、安全的运行环境。
在操作系统中,进程是程序的执行实例,是操作系统对程序进行资源分配和调度的基本单位。
本文将重点介绍模拟进程创建、终止、阻塞、唤醒的原语,以及它们在操作系统中的原理和实现方式。
1.进程创建原语进程创建是指操作系统根据进程创建的请求,为新的进程分配资源并将其加入就绪队列,以便进行调度和执行。
进程创建原语一般包括以下步骤:(1)为新进程分配唯一的进程标识符(PID)。
(2)为新进程分配一个进程控制块(PCB),用于保存进程的运行状态和相关信息。
(3)为新进程分配私有资源,如内存空间、文件描述符等。
(4)将新进程插入就绪队列,等待调度器的调度。
进程创建原语的实现方式可以是系统调用,如Unix中的fork(,Windows中的CreateProcess(等。
2.进程终止原语进程终止是指操作系统将一个正在执行的进程从系统中移除,并释放其占用的资源。
进程终止原语一般包括以下步骤:(1)将进程从调度队列中移除,停止其执行。
(2)释放进程控制块和相关资源。
(3)通知父进程或其他相关进程,以便进行资源回收和状态更新。
进程终止原语的实现方式可以是系统调用,如Unix中的exit(,Windows中的ExitProcess(等。
3.进程阻塞原语进程阻塞是指一个进程由于等待其中一种条件的满足而无法继续执行,从而暂时停止执行,将自己从就绪队列中移除。
进程阻塞原语一般包括以下步骤:(1)将进程从就绪队列中移除,标记为阻塞状态。
(2)释放占用的CPU资源,以便其他进程可以使用。
(3)根据阻塞原因,将进程插入相应的等待队列中。
进程阻塞原语的实现方式可以是系统调用,如Unix中的sleep(,Windows中的WaitForSingleObject(等。
4.进程唤醒原语进程唤醒是指使一个阻塞的进程变为就绪状态,以便操作系统调度执行。
模拟进程创建终止阻塞唤醒原语_操作系统原理操作系统中的进程是程序运行的基本单位,它可以被创建、终止、阻塞和唤醒等。
下面将模拟进程的创建、终止、阻塞和唤醒的原语,以帮助更好地理解操作系统原理。
一、进程的创建进程的创建是指在操作系统中新建一个进程,并为其分配资源,使其能够运行。
进程的创建可以通过以下步骤来模拟:1.初始化进程控制块(PCB):创建一个用于记录进程信息的数据结构,称为进程控制块(PCB)。
PCB中包含了进程的标识符、状态信息、程序计数器等。
2.为进程分配资源:根据进程的需要,为其分配必要的资源,例如内存空间、文件资源等。
这样进程就可以运行了。
3.设置进程优先级:为进程设置优先级,以便操作系统能够按照优先级来调度进程。
4.进程初始化:对进程进行初始化操作,例如设置进程的初始状态、初始化进程的堆栈等。
5.将进程添加到就绪队列:将新建的进程添加到就绪队列中,表示该进程已经准备好运行了。
二、进程的终止进程的终止是指进程运行完成或者由于异常情况退出运行的过程。
进程的终止可以通过以下步骤来模拟:1. 处理终止信号:当操作系统接收到终止信号时,会进行相应的处理。
可以是用户通过按下Ctrl+C键发送的中断信号,或者是进程运行出错导致的异常信号。
2.终止进程的运行:操作系统会终止当前正在运行的进程,停止它的运行。
3.释放资源:操作系统会释放进程占用的资源,包括内存空间、文件资源等。
4.清理进程控制块:操作系统会清理进程控制块中的相关信息,以便重新利用。
5.将进程从就绪队列或阻塞队列中移除:如果进程在就绪队列中,将其从队列中移除。
如果进程在阻塞队列中,将其唤醒。
三、进程的阻塞进程的阻塞是指进程由于其中一种原因无法继续执行,进入等待状态,直到一些条件满足后才能继续运行的过程。
进程的阻塞可以通过以下步骤来模拟:1. 设置阻塞标志:操作系统会将进程的阻塞标志设置为true,表示该进程已被阻塞。
2.保存进程状态:操作系统会保存进程的当前状态,包括程序计数器、寄存器、栈指针等。
操作系统实验报告模板一、实验目的本次操作系统实验的主要目的是通过实际操作和观察,深入理解操作系统的核心概念和功能,包括进程管理、内存管理、文件系统、设备管理等方面。
同时,培养学生的动手能力、问题解决能力和团队合作精神,提高对操作系统原理的掌握程度和实际应用能力。
二、实验环境1、操作系统:_____(具体操作系统名称及版本)2、开发工具:_____(如编译器、调试器等)3、硬件环境:_____(处理器型号、内存大小等)三、实验内容(一)进程管理实验1、进程创建与终止使用系统调用创建多个进程,并观察进程的创建过程和资源分配情况。
实现进程的正常终止和异常终止,观察终止时的系统行为。
2、进程调度研究不同的进程调度算法,如先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。
通过编程模拟实现这些调度算法,并比较它们的性能。
3、进程同步与互斥利用信号量、互斥锁等机制实现进程之间的同步与互斥。
编写多进程程序,模拟生产者消费者问题、读者写者问题等经典同步场景。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法、最坏适应算法等。
观察内存分配和回收的过程,分析算法的优缺点。
2、虚拟内存了解虚拟内存的概念和实现原理。
通过设置页表、进行页面置换等操作,模拟虚拟内存的管理过程。
(三)文件系统实验1、文件操作实现文件的创建、打开、读写、关闭等基本操作。
研究文件的属性(如权限、大小、创建时间等)的设置和获取。
2、目录管理创建、删除目录,遍历目录结构。
实现文件和目录的重命名、移动等操作。
(四)设备管理实验1、设备驱动程序了解设备驱动程序的结构和工作原理。
编写简单的设备驱动程序,实现对特定设备的控制和数据传输。
2、设备分配与回收研究设备分配的策略,如独占式分配、共享式分配等。
实现设备的分配和回收过程,观察系统的资源利用情况。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止编写程序,使用系统调用创建指定数量的进程。
模拟进程创建、终止、阻塞、唤醒原语操作系统原理操作系统原理题目:模拟进程创建、终止、阻塞、唤醒原语院(部):管理工程学院专业:信息管理与信息系统班级:信管姓名:学号:实验题目一:模拟进程创建、终止、阻塞、唤醒原语一、题目类型:必做题目。
二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。
三、实验环境:1、硬件:pc机及其兼容机。
2、软件:WindowsOS,TurboC或C++、VC++、、Java等。
四、实验内容:1、设计创建、终止、阻塞、唤醒原语功能函数。
2、设计主函数,采用菜单结构(参见后面给出的流程图)。
3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。
五、算法流程图开始系统主菜单1…创建2…阻塞3…唤醒4…终止5…显示0…退出请输入您需要的功能(0-5):输入选择=?543210退出创建阻塞唤醒终止显示结束六、程序清单#include#includestructpcb{charname[10];intstatus;intorder;inttime;intwtime;intytime;}pcb[11];//该结构体用于存储已经输入的进程structghost{ charname[10];intstatus;intorder;inttime;}ghost[11];//该结构体用于优先级调度时,进程的优先级排序chara_name[10];inti=0,y,a=0,x,z,jilu;voidinsert();voidblock();voidrou se();voidstop();voidoutPut();voidcontrol();//实验二添加函数voidorder_control();//实验二添加函数voidtime_control();//实验二添加函数voidinsert(){jilu=0;//jilu是一个用于判断的变量,在重复时进行判断跳过if(i>=10)printf(“进程已经存在10个,无法继续添加进程\n“);else{printf(“请输入插入pcb的数据:\n“);printf(“1、进程名:“);scanf(“%s“,&pcb[i].name);printf(“2、该进程的优先级(1-10):“);scanf(“%d“,&pcb[i].order);printf(“3、运行时间“);scanf(“%d“,&pcb[i].time);for(y=0;y0)jilu=0;else{printf(“输入已经完成\n您输入的数据为:\n进程名:%s\n优先级:%d\n运行时间:%d\n“,pcb[i].name,pcb[i].order,pcb[i].time);printf(“------------------------------------------------------------------\n“);strcpy(ghost[i].name,pcb[i].name);ghost[i].order=pcb[i].order;ghost[i].time=pcb[i].time;pcb[i].status=1;ghost[i].status=1;pcb[i].wtime=pcb[i].time;pcb[i].ytime=0;i++;}}}voidblock(){intm;printf(“\n请输入您要改变状态的进程的进程名:“);scanf(“%s“,&a_name);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,a_name)==0){a=1;if(pcb[y].status==0){printf(“您要修改的进程已经是阻塞状态,无法更改\n“); }if(pcb[y].status==2){pcb[y].status=0;for(m=0;m<=i;m++){if(strcmp(ghost[m].name,a_name)==0){ghost[m].status=0;}}printf(“操作已完成,进程成功改为阻塞状态\n“);}}}if(a==0){printf(“对不起!您查找的进程名不存在\n“);}a=0;}voidrouse(){intm;printf(“\n请输入您要改变状态的进程的进程名:“);scanf(“%s“,&a_name);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,a_name)==0){a=1;if(pcb[y].status==1){printf(“您要修改的进程已经是就绪状态,无法更改\n“); break;};if(pcb[y].status==0){pcb[y].status=1;for(m=0;m<=i;m++){if(strcmp(ghost[m].name,a_name)==0){ghost[m].status=1;}}printf(“操作已完成,进程成功改为运行状态\n“);break;}}}if(a==0){printf(“对不起!您查找的进程名不存在\n“);}a=0;}voidstop(){printf(“\n请输入您要改变状态的进程的进程名: “);scanf(“%s“,&a_name);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,a_name)==0){a=1;for(;y<i;y++){pcb[y]=pcb[y+1];}i--;printf(“操作已完成,进程成功删除\n“);break;}}if(a==0){printf(“对不起!您查找的进程名不存在\n“);}a=0;}voidoutPut(){if(i==0){printf(“对不起,没有进程存在,无法显示\n“); }else{printf(“\n\n已存在进程分别为:(状态:2表示正在运行,1表示就绪,0表示阻塞)\n“); for(y=0;y<i;y++){if(pcb[y].status!=3)printf(“进程%d进程名:%s状态:%d\n“,y+1,pcb[y].name,pcb[y].status);}}}voidcontrol(){for(;1;){printf(“进程调度子菜单\n0:返回主菜单\n1:优先级调度\n2:时间片轮转调度\n请输入您想要进行的操作的指令:“);scanf(“%d“,&x);if(x==0)break;switch(x){case0:break;case1:order_control();break;case2:time_control();break;default:printf(“您输入的指令有误,请重新输入\n“); break;}}}voidorder_control(){intjishi;//用于CPU运行时间计时jishi=0;charpanduan1,panduan2;//用于判断是否继续调度 structghostjiaohuan;intgg,bl;for(gg=0;gg<i;gg++){if(pcb[gg].status==2){for(bl=0;bl<i;bl++){if(strcmp(ghost[bl].name,pcb[gg].name)==0) {ghost[bl].status=2;}}}}for(x=0;x<i-1;x++){for(y=x+1;y<i;y++){if(ghost[x].order<ghost[y].order){jiaohuan=ghost[x];ghost[x]=ghost[y];ghost[y]=jiaohuan;}}}//以上语句是根据优先级为进程排序printf(“\n\n按照优先级调度进程,具体内容为:\n“);for(x=0;x<i;x++){if(ghost[x].status==1){printf(“正在运行的进程:%s\n优先级:%d\n运行时间:%d\n\n\n“,ghost[x].name,ghost[x].order,ghost[x].time);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,ghost[x].name)==0){pcb[y].status=2;ghost[x].status=2;}};//该语句用于更改另一个结构体进程的状态printf(“是否继续运行直至进程运行完毕(Y/N)“);scanf(“%s“,&panduan1);if(panduan1=='Y'||panduan1=='y'){if(ghost[x].status==2){jishi=jishi+ghost[x].time;printf(“CPU运行时间%d,进程%s运行完毕,正在关闭!\n“,jishi,ghost[x].name);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,ghost[x].name)==0){pcb[y].status=3;ghost[x].status=3;}};//该语句用于更改另一个结构体进程的状态if(x==(i-1)){printf(“所有进程全部运行完毕!\n-------------------------------------------------------\n“);}else{printf(“--------------------------------------------------------------\n是否继续调度(y/n)“);scanf(“%s“,&panduan2);if(panduan2=='N'||panduan2=='n')break;}}}elsebreak;}}printf(“如果无输出内容,请检查就绪队列是否存在进程“);}voidtime_control(){intz,kz1,kz2,kz3,kz4,kz5,kz6;//kz1表示时间片运行的时间计时,kz2表示CPU运行的总时间,kz3用于所有进程时间的输出kz4表示已完成的进程数kz5用于表示状态为就绪的进程的个数kz6用于更改ghost的状态值=0;kz2=0;kz4=0;kz5=0;for(y=0;y<i;y++){if(pcb[y].status==1){kz5=kz5+1;}}printf(“\n\n请输入时间片长度:“);scanf(“%d“,&x);printf(“\n\n按照时间片轮转调度进程,具体内容为:\n“);if(kz5!=0){for(;kz4<kz5;){for(y=0;y<i;y++){if(pcb[y].status==1||pcb[y].status==2){for(kz1=0;kz1<x;kz1++){if(pcb[y].status==1||pcb[y].status==2){kz2=kz2+1;pcb[y].wtime=pcb[y].wtime-1;pcb[y].ytime=pcb[y].ytime+1;printf(“CPU运行时间:%d,正在运行进程:%s\n“,kz2,pcb[y].name);printf(“进程名已运行时间未运行时间要求运行时间\n“);for(kz3=0;kz3<i;kz3++){if(pcb[kz3].status==1||pcb[kz3].status==2){printf(“%s%12d%12d%12d\n“,pcb[kz3].name,pcb[kz3].ytime,pcb[kz3].wtime,pcb[kz3].time);}}if(pcb[y].wtime<=0&&pcb[y].status!=3){printf(“进程%s运行完毕,正在关闭!\n-------------------------------------------------------------------\n“,pcb[y].name);kz4=kz4+1;pcb[y].status=3;for(kz6=0;kz6<i;kz6++){if(strcmp(ghost[kz6].name,pcb[y].name)==0){ghost[kz6].status=3;}}kz1=x;break;}printf(“-------------------------------------------------------------------\n“);}}}}}}printf(“注意:如果未输出过程,请检查就绪列表是否存在进程\n“);}voidmain(){charc;for(;1;){printf(“系统主菜单\n“);printf(“1、创建\n“);printf(“2、阻塞\n“);printf(“3、唤醒\n“);printf(“4、终止\n“);printf(“5、显示\n“);printf(“6、调度\n“);printf(“0、退出\n“);printf(“请输入操作指令:“);if(scanf(“%d“,&x)){if(x==0)break;switch(x){case1:insert();break;case2:block();break;case3:rouse();break;case4:stop();break;case5:outPut();break;case6:control();break;case0:break;default:printf(“格式非法,请重新输入\n“);break;}}elseif(scanf(“%c“,&c)){printf(“格式非法,请重新输入\n“);}}}七、程序中使用的数据结构及符号说明structpcb{charname[10];intstatus;intorder;inttime;intwtime;intytime;}pcb[11];//该结构体用于存储已经输入的进程structghost{ charname[10];intstatus;intorder;inttime;}ghost[11];//该结构体用于优先级调度时,进程的优先级排序voidinsert();//添加进程voidblock();//阻塞进程voidrouse();//唤醒进程voidstop();//删除进程voidoutPut();//输出voidcontrol();//实验二添加函数voidorder_control();//实验二添加函数voidtime_control();//实验二添加函数八、调试程序时出现问题及解决方法问题一:现象:使用阻塞功能后,输出功能无法正常显示进程状态。
进程的控制方法
1、进程创建:创建一个新的进程,可以使用系统调用如fork()、
exec()、CREATE等函数来实现。
2、进程终止:进程完成其任务后,主动调用exit()或_exit()
函数来终止自己。
3、进程阻塞:进程主动调用阻塞原语,如semwait()、msgrcv
()等,将自己的状态由运行变为等待状态。
4、进程唤醒:进程被阻塞后,等待某个事件的发生,如消息的到
来或信号量的增加,然后被唤醒。
5、进程同步:进程在并发执行过程中,由于共享资源而产生竞争,
需要采取措施进行协调,如信号量、消息队列、管程等。
6、进程通信:进程之间需要传递消息和共享数据,可以使用管道、
共享内存、消息队列、信号等机制进行通信。
7、进程调度:操作系统根据一定的调度算法,将CPU的时间片分
配给各个进程,控制它们的执行顺序和时间。
8、进程撤销:进程在执行过程中出现错误或异常情况,需要调用
撤销原语,如kill()、exit()等,终止该进程的执行。
9、进程死锁:进程在等待对方释放资源时出现相互等待的情况,
导致两个或多个进程都无法继续执行,需要采取措施避免死锁的发生。
操作系统原理作业第1章1-2 批处理系统和分时系统各有什么特点?为什么分时系统的响应比较快?答:在批处理系统中操作人员将作业成批装入计算机并由计算机管理运行,在程序的运行期间用户不能干预,因此批处理系统的特点是:用户脱机使用计算机,作业成批处理,系统内多道程序并发执行以及交互能力差。
在分时系统中不同用户通过各自的终端以交互方式共同使用一台计算机,计算机以“分时”的方法轮流为每个用户服务。
分时系统的主要特点是:多个用户同时使用计算机的同时性,人机问答方式的交互性,每个用户独立使用计算机的独占性以及系统响应的及时性。
分时系统一般采用时间片轮转的方法使一台计算机同时为多个终端用户服务,因此分时系统的响应比较快。
1-4什么是多道程序设计技术?试述多道程序运行的特征。
答:多道程序设计技术是指同时把多个作业(程序)放入内存并允许它们交替执行和共享系统中的各类资源;当一道程序因某种原因(如I/O 请求)而暂停执行时,CPU 立即转去执行另一道程序。
多道程序运行具有如下特征:多道计算机内存中同时存放几道相互独立的程序。
宏观上并行:同时进入系统的几道程序都处于运行过程中,它们先后开始了各自的运行但都未运行完毕。
微观上串行:从微观上看内存中的多道程序轮流或分时地占有处理机,交替执行。
1-6操作系统的主要特性是什么?为什么会有这样的特性?答:并发性,共享性,异步性,虚拟性,这些特性保证了计算机能准确的运行,得出想要的结果。
1-7(1)工作情况如图。
(2)CPU有空闲等待,它发生在100 ms150 ms时间段内,此时间段内程序A 与程序B都在进行I/O操作。
(3)程序A无等待现象,程序B在0 ms50 ms时间段与180 ms200 ms时间段内有等待现象。
第2章2-1 什么是操作系统虚拟机?答:在裸机上配置了操作系统程序后就构成了操作系统虚拟机2-3 什么是处理机的态?为什么要区分处理机的态?答:处理机的态,就是处理机当前处于何种状态,正在执行哪类程序。
一、课程设计目的本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、课程设计要求从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:每位同学从所给题目中任选一个(如自拟题目,需经教师同意),且必须独立完成课程设计,不能相互抄袭。
设计完成后,将所完成的作品交由老师检查。
要求写出一份详细的设计报告。
三、课程设计题目编程模拟多进程共享临界资源四、课程设计功能和目标1、要求产生至少3个进程:2、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区…”,同时向管理进程提出申请;在临界区中等待一段随机时间,并显示:“进程x正在临界区…”;当时间结束,显示:“进程x退出临界区…”,同时向管理进程提出退出申请。
3、一个进程作为原语级管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;4、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。
5、进程间通信可以采用信号、消息传递、管道或网络通信方式。
五、课程设计实现原理通过编写,创建两个进程模拟需要进入临界区,另外编写一个进程作为原语的管理进程,其负责两个进程的进入!接着设置一个临界区,让其进程在其中访问遵循空闲让进、忙则等待、有限等待、让权等待的准则。
当进程和临界区建立好后,临界区的数据传输,受到了系统硬件的支持,不耗费多余的资源;而进程间通信传递,由软件进行控制和实现,需要消耗一定的CPU资源。
从这个意义上讲,临界区更适合频繁和大量的数据传输。
进程信息的传递,自身就带有同步的控制。
当等到信息的时候,进程进入睡眠状态,不再消耗CPU资源。
而共享队列如果不借助其他机制进行同步,接收数据的一方必须进行不断的查询,白白浪费了大量的CPU资源。
《操作系统》自编作业手册翟高寿北京交通大学计算机学院2009年2月编修说明《操作系统》自编作业手册综合根据自制电子课件旧版、汤子瀛教科书旧版、汤子瀛教科书新版、自编《系统程式》、参编《操作系统原理》等完成。
第一章 操作系统引论习题1.1 什么是操作系统?用自己的话谈谈你对操作系统概念的认识与理解。
1.2 设想由你自己负责组织一个项目团队来构建操作系统,你应当要求项目成员事先学习和掌握哪些硬件基础知识?并给出你对相关知识的理解与总结。
1.3 什么是输入输出重定向?什么是管道联接?分别加以举例说明。
1.4 试阐述程序接口与用户交互接口(即命令接口和图形化接口)之间的关系?并给出你对系统调用实现机制及处理过程的完整理解与总结。
1.5 谈谈你对脱机I/O和联机I/O的认识与理解。
1.6 试从多个角度来阐述单道/多道批处理系统与分时系统及实时系统的区别。
1.7 谈谈你对操作系统应当具备的资源管理功能(包括所引入的核心概念)的认识与理解。
为保证资源的有效管理与控制,操作系统于是体现出哪些特征?1.8 操作系统的基本设计原则有哪些?谈谈你对操作系统发展历程中所采用的几种结构的认识与理解。
自选实验1编程和替换Linux命令解释程序ShellI. 自己选取和设计一组联机命令,可通过调用系统内核过程加以实现或仅仅在屏幕上显示命令自身(算是虚化实现),至少一条命令如文件拷贝的处理牵涉到系统调用;II. 设计和构建命令解释程序并替换原Linux命令解释程序Shell启动系统和运行测试;III. 撰写实验报告,阐述实验目的、实验目标、实验步骤、技术难点及解决方案、关键数据结构和算法流程、测试方案与过程及运行效果、结论与体会等。
自选实验2利用C和汇编混合编程实现最简操作系统I. 实现二次装入引导过程;II. 以嵌入式汇编指令实现的C程序内核可非常简单(注意可执行程序格式);III. 撰写实验报告,阐述实验目的、实验目标、实验步骤、技术难点及解决方案、关键数据结构和算法流程、测试方案与过程及运行效果、结论与体会等。
1.操作系统的定义:操作系统是一个大型的系统软件,它负责计算机的全部软、硬件资源的分配、调度工作,控制并协调并发活动,实现信息的存取和保护。
它提供用户接口,使用户获得良好的工作环境。
操作系统使整个计算机系统实现了高效率和高度自动化。
作用:管理和控制资源,组织工作流程,提供用户界面2.操作系统的基本功能:a人机交互界面,提供一个友好的用户访问操作系统的接口。
用户可以通过系统命令组织和控制自己的作业运行。
用户程序和系统程序可以利用编程接口调用操作系统功能。
b资源管理, (OS功能模块)1文件管理,解决软件资源的存储、共享、保密和保护存储管理,提高利用率、方便用户使用、提供足够的存储空间、方便进程并发运行。
2设备管理,方便的设备使用、提高CPU与I/O设备利用率;3处理器管理完成处理器资源的分配调度等功能。
处理器调度的单位可为进程或线程。
4作业管理,管理计算机中任务3.操作系统的分类:1.单用户操作系统2.批处理操作系统,a单道批处理系统:系统中只有一道作业在主存中运行b多道批处理系统:内存中同时存放几个作业在运行;各作业替使用CPU;IBM DOS3.实时操作系统:专用系统,实时控制,高可靠性,事件驱动和队列驱动实时处理前台作业,批处理为后台作业。
4.分时操作系统:同时性,独立性,交互性,及时性。
解决多人同时使用机器的要求以时间片方式分配工作区别:实时OS是较少有人为干预的监督和控制系统,而分时OS是多个用户分享使用系统资源;实时操作系统是接收了某种类型的外部消息后有系统选择一个程序执行,而分时操作系统是将CPU工作时间分别提供给多个用户使用使每个用户一次轮流使用时间片。
5.网络操作系统网络OS和分布式OS的区别:网络操作系统各计算机自治各自完成任务资源使用不透明;分布式操作系统各计算机紧密集成合作完成一定的任务资源具有透明性6中断系统的职能:1发现中断源,提出中断请求:多个中断源时,根据优先级,判断接收的次序。
操作系统原理题目:模拟进程创建、终止、阻塞、唤醒原语院(部):管理工程学院专业:信息管理与信息系统班级:信管112*名:***学号:**********实验题目一:模拟进程创建、终止、阻塞、唤醒原语一、题目类型:必做题目。
二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。
三、实验环境:1、硬件:pc机及其兼容机。
2、软件:Windows OS,Turbo C或C++、VC++、、Java等。
四、实验内容:1、设计创建、终止、阻塞、唤醒原语功能函数。
2、设计主函数,采用菜单结构(参见后面给出的流程图)。
3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。
五、算法流程图六、程序清单#include <stdio.h>#include <string.h>struct pcb{char name[10];int status;int order;int wtime;int ytime;}pcb[11];//该结构体用于存储已经输入的进程struct ghost{char name[10];int status;int order;int time;}ghost[11];//该结构体用于优先级调度时,进程的优先级排序char a_name[10];int i=0,y,a=0,x,z,jilu;void insert();void block();void rouse();void stop();void outPut();void control();//实验二添加函数void order_control();//实验二添加函数void time_control();//实验二添加函数void insert(){jilu=0;//jilu是一个用于判断的变量,在重复时进行判断跳过if(i>=10)printf("进程已经存在10个,无法继续添加进程\n");else{printf("请输入插入pcb的数据:\n");printf("1、进程名:");scanf("%s",&pcb[i].name);printf("2、该进程的优先级(1-10):");scanf("%d",&pcb[i].order);printf("3、运行时间");scanf("%d",&pcb[i].time);for(y=0;y<i;y++){if (strcmp(pcb[i].name,pcb[y].name)==0){printf("您输入的进程名已经存在,请重新输入!\n");jilu=y+1;}if(jilu>0)jilu=0;else{printf("输入已经完成\n您输入的数据为:\n进程名: %s\n优先级: %d\n运行时间: %d\n",pcb[i].name,pcb[i].order,pcb[i].time);printf("------------------------------------------------------------------\n");strcpy(ghost[i].name,pcb[i].name);ghost[i].order=pcb[i].order;ghost[i].time=pcb[i].time;pcb[i].status=1;ghost[i].status=1;pcb[i].wtime=pcb[i].time;pcb[i].ytime=0;i++;}}}void block(){int m;printf("\n请输入您要改变状态的进程的进程名: ");scanf("%s",&a_name);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,a_name)==0){a=1;if(pcb[y].status==0){printf("您要修改的进程已经是阻塞状态,无法更改\n");}if(pcb[y].status==2){pcb[y].status=0;for(m=0;m<=i;m++){if(strcmp(ghost[m].name,a_name)==0){ghost[m].status=0;}}printf("操作已完成,进程成功改为阻塞状态\n");}}}if(a==0){printf("对不起!您查找的进程名不存在\n");}a=0;}void rouse(){int m;printf("\n请输入您要改变状态的进程的进程名: ");scanf("%s",&a_name);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,a_name)==0){a=1;if(pcb[y].status==1){printf("您要修改的进程已经是就绪状态,无法更改\n");break;};if(pcb[y].status==0){pcb[y].status=1;for(m=0;m<=i;m++){if(strcmp(ghost[m].name,a_name)==0){ghost[m].status=1;}}printf("操作已完成,进程成功改为运行状态\n");break;}}}if(a==0){printf("对不起!您查找的进程名不存在\n");}}void stop(){printf("\n请输入您要改变状态的进程的进程名: ");scanf("%s",&a_name);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,a_name)==0){a=1;for(;y<i;y++){pcb[y]=pcb[y+1];}i--;printf("操作已完成,进程成功删除\n");break;}}if(a==0){printf("对不起!您查找的进程名不存在\n");}a=0;}void outPut(){if(i==0){printf("对不起,没有进程存在,无法显示\n");}else{printf("\n\n 已存在进程分别为:(状态:2表示正在运行,1表示就绪,0表示阻塞)\n");for(y=0;y<i;y++){if(pcb[y].status!=3)printf("进程%d 进程名: %s 状态: %d\n",y+1,pcb[y].name,pcb[y].status);}}}void control(){{printf("进程调度子菜单\n0 :返回主菜单\n1 :优先级调度\n2 :时间片轮转调度\n 请输入您想要进行的操作的指令:");scanf("%d",&x);if(x==0)break;switch(x){case 0:break;case 1:order_control();break;case 2:time_control();break;default:printf("您输入的指令有误,请重新输入\n");break;}}}void order_control(){int jishi;//用于CPU运行时间计时jishi=0;char panduan1,panduan2;//用于判断是否继续调度struct ghost jiaohuan;int gg,bl;for(gg=0;gg<i;gg++){if(pcb[gg].status==2){for(bl=0;bl<i;bl++){if(strcmp(ghost[bl].name,pcb[gg].name)==0){ghost[bl].status=2;}}}}for(x=0;x<i-1;x++){for(y=x+1;y<i;y++){if(ghost[x].order<ghost[y].order){jiaohuan=ghost[x];ghost[x]=ghost[y];ghost[y]=jiaohuan;}}}//以上语句是根据优先级为进程排序printf("\n\n按照优先级调度进程,具体内容为:\n");for(x=0;x<i;x++){if(ghost[x].status==1){printf("正在运行的进程: %s\n优先级: %d\n运行时间: %d\n\n\n",ghost[x].name,ghost[x].order,ghost[x].time);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,ghost[x].name)==0){pcb[y].status=2;ghost[x].status=2;}};//该语句用于更改另一个结构体进程的状态printf("是否继续运行直至进程运行完毕(Y/N)");scanf("%s",&panduan1);if(panduan1=='Y'||panduan1=='y'){if(ghost[x].status==2){jishi=jishi+ghost[x].time;printf("CPU运行时间%d ,进程%s 运行完毕,正在关闭!\n",jishi,ghost[x].name);for(y=0;y<=i;y++){if(strcmp(pcb[y].name,ghost[x].name)==0){pcb[y].status=3;ghost[x].status=3;}};//该语句用于更改另一个结构体进程的状态if(x==(i-1)){printf("所有进程全部运行完毕!\n-------------------------------------------------------\n");}else{printf("--------------------------------------------------------------\n是否继续调度(y/n)");scanf("%s",&panduan2);if(panduan2=='N'||panduan2=='n')break;}}}else break;}}printf("如果无输出内容,请检查就绪队列是否存在进程");}void time_control(){int z,kz1,kz2,kz3,kz4,kz5,kz6;//kz1表示时间片运行的时间计时,kz2表示CPU运行的总时间,kz3用于所有进程时间的输出kz4表示已完成的进程数kz5用于表示状态为就绪的进程的个数kz6用于更改ghost的状态值z=0;kz2=0;kz4=0;kz5=0;for(y=0;y<i;y++){if(pcb[y].status==1){kz5=kz5+1;}}printf("\n\n请输入时间片长度: ");scanf("%d",&x);printf("\n\n按照时间片轮转调度进程,具体内容为:\n");if(kz5!=0){for(;kz4<kz5;){for(y=0;y<i;y++){if(pcb[y].status==1||pcb[y].status==2){for(kz1=0;kz1<x;kz1++){if(pcb[y].status==1||pcb[y].status==2){kz2=kz2+1;pcb[y].wtime=pcb[y].wtime-1;pcb[y].ytime=pcb[y].ytime+1;printf("CPU运行时间: %d ,正在运行进程: %s\n",kz2,pcb[y].name);printf("进程名已运行时间未运行时间要求运行时间\n");for(kz3=0;kz3<i;kz3++){if(pcb[kz3].status==1||pcb[kz3].status==2){printf("%s%12d%12d%12d\n",pcb[kz3].name,pcb[kz3].ytime,pcb[kz3].wtime,pcb[kz3].time);}}if(pcb[y].wtime<=0&&pcb[y].status!=3){printf("进程%s 运行完毕,正在关闭!\n-------------------------------------------------------------------\n",pcb[y].name);kz4=kz4+1;pcb[y].status=3;for(kz6=0;kz6<i;kz6++){if(strcmp(ghost[kz6].name,pcb[y].name)==0){ghost[kz6].status=3;}}kz1=x;break;}printf("-------------------------------------------------------------------\n");}}}}}}printf("注意:如果未输出过程,请检查就绪列表是否存在进程\n"); }void main(){char c;for(;1;){printf("系统主菜单\n");printf("1、创建\n");printf("2、阻塞\n");printf("3、唤醒\n");printf("4、终止\n ");printf("5、显示\n");printf("6、调度\n");printf("0、退出\n");printf("请输入操作指令: ");if(scanf("%d",&x)){if(x==0)break;switch(x){case 1:insert();break;case 2:block();break;case 3:rouse();break;case 4:stop();break;case 5:outPut();break;case 6:control();break;case 0:break;default:printf("格式非法,请重新输入\n");break;}}else if(scanf("%c",&c)){printf("格式非法,请重新输入\n");}}}七、程序中使用的数据结构及符号说明struct pcb{char name[10];int status;int order;int time;int wtime;int ytime;}pcb[11];//该结构体用于存储已经输入的进程struct ghost{char name[10];int status;int order;int time;}ghost[11];//该结构体用于优先级调度时,进程的优先级排序void insert();//添加进程void block();//阻塞进程void rouse();//唤醒进程void stop();//删除进程void outPut();//输出void control();//实验二添加函数void order_control();//实验二添加函数void time_control();//实验二添加函数八、调试程序时出现问题及解决方法问题一:现象:使用阻塞功能后,输出功能无法正常显示进程状态。