操作系统实验二
操作系统实验二
实验二并发与调度一、实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。
通过分析实验程序,了解管理事件对象的API。
了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。
在Linux Redhat 9.0操作系统平台上,用pipe()创建一个管道文件,然后用fork()创建两个生产进程和两个消费进程,它们之间通过pipe()传递消息。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional,Linux Redhat 9.0操作系统平台,Visual C++ 6.0企业版。
三、实验内容和步骤第一部分:互斥体对象本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。
每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。
创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源(因而也就是共享资源) 。
利用互斥体保护共享资源// mutex项目# include <windows.h># include <iostream>class CCountUpDown{public:CCountUpDown(int nAccesses) :m_hThreadInc(INV ALID_HANDLE_V ALUE) ,m_hThreadDec(INV ALID_HANDLE_V ALUE) ,m_hMutexV alue(IN V ALID_HANDLE_V ALUE) ,m_nV alue(0) ,m_nAccess(nAccesses){m_hMutexV alue = :: CreateMutex(NULL,TRUE,NULL) ;m_hThreadInc = :: CreateThread(NULL,0,IncThreadProc,reinterpret_cast <LPVOID> (this) ,0,NULL) ;m_hThreadDec = :: CreateThread(NULL,0,DecThreadProc,reinterpret_cast <LPVOID> (this) ,0,NULL) ;:: ReleaseMutex(m_hMutexV alue) ;}virtual ~CCountUpDown(){:: CloseHandle(m_hThreadInc) ;:: CloseHandle(m_hThreadDec) ;:: CloseHandle(m_hMutexV alue) ;}virtual void WaitForCompletion(){if (m_hThreadInc != INV ALID_HANDLE_V ALUE &&m_hThreadDec != INV ALID_HANDLE_V ALUE){:: WaitForSingleObject(m_hThreadInc, INFINITE) ;:: WaitForSingleObject(m_hThreadDec, INFINITE) ;}}protected:virtual void DoCount(int nStep){while (m_nAccess > 0){:: WaitForSingleObject(m_hMutexV alue, INFINITE) ;m_nV alue += nStep;std :: cout << “thread: ” << :: GetCurrentThreadId()<< “value: ” << m_n V alue<< “access: ” << m_nAccess << std :: endl;--m_nAccess;:: Sleep(1000) ; // 使显示速度放慢:: ReleaseMutex(m_hMutexV alue) ;}}static DWORD WINAPI IncThreadProc(LPVOID lpParam){CCountUpDown* pThis =reinterpret_cast < CCountUpDown* > (lpParam) ;pThis -> DoCount(+1) ;return(0) ;}static DWORD WINAPI DecThreadProc(LPVOID lpParam){CCountUpDown* pThis =reinterpret_cast <CCountUpDown* > (lpParam) ;pThis -> DoCount(-1) ;return(0) ;}protected:HANDLE m_hThreadInc;HANDLE m_hThreadDec;HANDLE m_hMutexV alue;int m_nV alue;int m_nAccess ;} ;void main(){ CCountUpDown ud(50) ;ud.WaitForCompletion() ; }分析程序的运行结果,可以看到线程(加和减线程) 的交替执行(因为Sleep() API允许Windows切换线程) 。
操作系统实验二实验报告
操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。
通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。
三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。
2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。
3、为新进程指定可执行文件的路径、命令行参数、进程属性等。
4、编写代码来等待新进程的结束,并获取其退出代码。
(二)进程同步实验1、设计一个生产者消费者问题的模型。
2、使用信号量来实现生产者和消费者进程之间的同步。
3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。
4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。
(三)进程通信实验1、选择使用管道来实现进程之间的通信。
2、创建一个匿名管道,父进程和子进程分别读写管道的两端。
3、父进程向管道写入数据,子进程从管道读取数据并进行处理。
四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。
通过观察进程的创建和执行过程,加深了对进程概念的理解。
(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。
分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。
(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。
数据能够准确地在进程之间传递,验证了管道通信的有效性。
五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。
通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。
(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。
操作系统实验二:进程管理
操作系统实验二:进程管理操作系统实验二:进程管理篇一:操作系统实验报告实验一进程管理一、目的进程调度是处理机管理的核心内容。
本实验要求编写和调试一个简单的进程调度程序。
通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。
二、实验内容及要求1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。
可根据实验的不同,PCB结构的内容可以作适当的增删)。
为了便于处理,程序中的某进程运行时间以时间片为单位计算。
各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
2、系统资源(r1…rw),共有w类,每类数目为r1…rw。
随机产生n进程Pi(id,s(j,k)t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。
3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。
建立进程就绪队列。
4、编制进程调度算法:时间片轮转调度算法本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。
在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。
三、实验环境操作系统环境:Windows系统。
编程语言:C#。
四、实验思路和设计1、程序流程图2、主要程序代码//PCB结构体struct pcb{public int id; //进程IDpublic int ra; //所需资源A的数量public int rb; //所需资源B的数量public int rc; //所需资源C的数量public int ntime; //所需的时间片个数public int rtime; //已经运行的时间片个数public char state; //进程状态,W(等待)、R(运行)、B(阻塞)//public int next;}ArrayList hready = new ArrayList();ArrayList hblock = new ArrayList();Random random = new Random();//ArrayList p = new ArrayList();int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数//r为可随机产生的进程数(r=m-n)//a,b,c分别为A,B,C三类资源的总量//i为进城计数,i=1…n//h为运行的时间片次数,time1Inteval为时间片大小(毫秒)//对进程进行初始化,建立就绪数组、阻塞数组。
实验二操作系统安全配置
实验二操作系统安全配置一.实验目的1.熟悉Windows NT/XP/2000系统的安全配置2. 懂得可信计算机评价准则二.实验内容1.Windows系统注册表的配置点击“开始\运行”选项,键入“regedit”命令打开注册表编辑器,学习并修改有关网络及安全的一些表项2.Windows系统的安全服务a.打开“操纵面板\管理工具\本地安全策略”,查阅并修改有效项目的设置。
b.打开“操纵面板\管理工具\事件查看器”,查阅并懂得系统日志,选几例,分析并说明不一致类型的事件含义。
3. IE浏览器安全设置打开Internet Explorer菜单栏上的“工具\Internet选项”,调整或者修改“安全”、“隐私”、“内容”等栏目的设置,分析、观察并验证你的修改。
4. Internet 信息服务安全设置打开“操纵面板\管理工具\Internet 信息服务”,修改有关网络及安全的一些设置,并启动WWW或者FTP服务器验证(最好与邻座同学配合)。
三.实验过程1. Windows系统注册表的配置点击“开始\运行”选项,键入“regedit”命令打开注册表编辑器,图如下:禁止修改显示属性HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ Policies\System 在右边的窗口中创建一个DOWRD值:“NoDispCPL”,并将其值设为“1”。
没有成功,由于Policies里无System选项.在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer 下在右边的窗口中新建一个二进制值“NoViewContextMenu”,并设值为“01 00 00 00”。
修改后需重新启动WINDOWS .2、Windows系统的安全服务打开“操纵面板\管理工具\本地安全策略”,查阅并修改有效项目的设置。
操作系统实验2-计算机操作系统(第3版)-郁红英-清华大学出版社
操作系统实验
(课程设计)实验报告
学院
专业
班级/学号
学生姓名
成绩
实验地点_
实验日期___ __
指导教师_____ ___ _____
(课程上机)实验报告
1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;
2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;
3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;
4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。
操作系统实验二(进程管理)
操作系统进程管理实验实验题目:(1)进程的创建编写一段程序,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。
试观察记录屏幕上的显示结果,并分析原因。
(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。
(3)编制一段程序,使其实现进程的软中断通信。
要求:使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按Del键);当捕捉到中断信号后,父进程调用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process 1 is killed by parent! Child process 2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 在上面的程序中增加语句signal(SIGINT, SIG_IGN)和signal(SIGQUIT, SIG_IGN),观察执行结果,并分析原因。
(4)进程的管道通信编制一段程序,实现进程的管道通信。
使用系统调用pipe( )建立一条管道线;两个进程P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。
实验源程序及报告:(1)、进程的创建#include <stdio.h>int main(int argc, char *argv[]){int pid1,pid2; /*fork first child process*/if ( ( pid1=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid1=fork() ) == 0 ){printf( "b\n" );}/*fork second child process*/if ( ( pid2=fork() ) < 0 ){printf( "ProcessCreate Failed!"); exit(-1);}if ( ( pid2=fork() ) == 0 ){printf( "c\n" );}/*parent process*/else{wait(NULL);printf( "a\n" );exit(0);}return 0;}(2)、进程的控制#include <stdio.h>int main(int argc, char *argv[]){ int pid1,pid2;/*fork first child process*/if ( ( pid1=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid1=fork() ) == 0 ){printf( "This is my Unix OS program!\n" ); }/*fork second child process*/if ( ( pid2=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid2=fork() ) == 0 ){printf( "This is the second Child process!\n" ); }/*parent process*/else{wait(NULL);printf( "This is the Parent process\n" );exit(0);}return 0;}(3)编制一段程序,使其实现进程的软中断通信。
操作系统实验报告(2)
计算机实验报告(2)操作系统部分一、基本要求和内容1.了解操作系统的基本功能.2.认识WINDOWS桌面的各部分组成,掌握基本的桌面操作.3.掌握各种基本操作对象的操作方法.4.学会使用WINDOWS帮助.5.了解基本的DOS命令和基本的命令行操作方法.6.熟练掌握文件操作方法.7.掌握对图标的操作方法(移动/拖曳/单击/双击/右击等等).8.熟悉资源管理器窗口和”我的电脑”(“计算机”)窗口.9.掌握启动控制面板的方法,了解控制面板的主要功能,掌握使用控制面板对软硬件进行设置的方法。
10.掌握“运行”对话框的使用方法。
11.了解“任务管理器”的简单使用方法。
12.熟悉“画图”“记事本”“计算器”“写字板”等常用应用程序。
13.开始POWERPOINT的基本使用.二、通过上机实验解决下列问题1. CTRL+ALT+DEL 组合键的功能是:打开【任务管理器】窗口2.全角和半角的区别是:半角是一个字符,全角是两个字符3. CTRL+A组合键的功能是:全部选中CTRL+C组合键的功能是:复制CTRL+V组合键的功能是:粘贴CTRL+X组合键的功能是:剪切CTRL+Z组合键的功能是: 撤销ALT+PRINTSCREEN组合键的功能是:复制当前窗口、对话框或其他对象到剪贴板中任务栏隐藏时通过什么组合键可以看到任务栏:Ctrl+Alt+Del进行窗口切换的组合键是:ALT+Tab4.“画图”应用程序默认保存文件类型是:*.png“记事本”应用程序默认保存文件类型是: *.txt.DOC是什么文件类型Word文档.EXE是什么文件类型可执行文件(程序文件)5.鼠标的基本操作方法包括:指向、单击、双击和拖动鼠标指针附近有漏沙钟表示当前的状态是: 沙漏是等待,因为程序先是从硬盘上读取,然后再到内存,芯片在其期间进行运算,再没真正的打开程序时,系统认为它没正真的启动6.资源管理器左下角窗格(即”文件夹”窗口)显示的是:系统中的所有资源以分层树型的结构显示出来7.一般情况下,对文件进行重命名时,不应该修改文件的扩展名,因为: 如果修改了后缀名则会导致文件属性更改,文件无法打开8.文件的属性主要包括哪些:“只读”、“存档”、“隐藏”9.选择多个连续的文件可以采用哪些方法:使用鼠标先选定第一个文件或文件夹,然后按住Shift键,用鼠标单击最后一个文件或文件夹,这样在第一个对象和最后一个对象之间的所有文件或文件夹将全部被选中,包括第一个和最后一个文件或文件夹。
操作系统实验答案-实验2Linux的基本操作及vi的使用(答案)
实验二Linux的基本命令操作及vi的使用实验目的:1、熟悉Linux操作系统环境2、熟悉Linux操作系统的文件结构3、熟悉Linux操作系统的基本命令4、熟悉Linux操作系统的文件组织方式5、学习使用vi编辑器建立、编辑、显示以及加工处理文本文件。
实验内容及要求:1、登陆实验室的Linux服务器。
启动电脑,进入Windows操作系统,在“开始”-〉“运行”中输入“Telnet 10.200.41。
178”,即可登陆实验室的Linux服务器.在“Login:”提示后输入“stu”+学号(如02号同学输入stu02),按下回车键。
在“Password:”提示后输入“123”(注意输入密码时屏幕上不会有“*”等符号出现,这和Windows 不同),按下回车键,若出现“[os@root os]$”或“-bash—2。
05b$”,表示已成功登陆系统,可以开始输入指令操作。
思考:(用pwd指令)查看自己登陆后位于Linux的哪个目录,写出该目录的路径,与自己周围的同学比较,看是否相同.(可查阅Linux资料了解“/home"目录的功能介绍)2、在Linux中进行以下基本操作:1)在当前目录下新建一个名为(自己姓名首字母缩写+学号后3位数)的子目录。
写出你所用的指令.(例如:mkdir zq000 )2)进入刚创建的子目录环境下.(提示:指令cd)3)在刚创建的子目录下新建一个名为abc.txt的文件。
写出你所用的指令。
(提示:新建文件的指令是touch)4)将/目录下(即根目录下)的welcome.txt文件复制到自己的子目录下,写出你所用的指令.cp –i /root/stu62/abc.txt /home/welcome.txt5)写出welcome.txt文件的内容。
(提示:用cat指令查看)Hello, Boys and girls ,welcome to the wonderful Linux world!3、在Linux中进行以下基本操作:1)进入自己的主目录。
操作系统实验2
操作系统实验2操作系统实验报告哈尔滨工程大学软件学院一、实验概述1. 实验名称实验环境的使用2. 实验目的熟悉操作系统集成实验环境OS Lab的基本使用方法。
练习编译、调试EOS操作系统内核以及EOS应用程序。
3. 实验类型验证二、实验环境OS Lab三、实验过程新建:调试:使用Bochs作为远程目标机:调试:调试软盘引导扇区程序:查看boot.lst文件:查看最后指令字节码调试加载程序:调试内核:EOS启动后的状态和行为:ID是31的是应用程序的进程,ID31的是系统进程。
应用程序的优先级是8,而系统进程的优先级是24,应用程序的进程数是1,而系统进程的进程数是10,并且应用程序是有名字的,而系统程序没有名字。
Id是33的是应用程序的主线程,它与系统线程主要的区别就是优先级不同。
四、思考题1、为什么EOS操作系统从软盘启动时要使用boot.bin和loader.bin两个程序?使用一个可以吗?它们各自的主要功能是什么?如果将loader.bin的功能移动到boot.bin文件中,则boot.bin文件的大小是否仍然能保持小于512字节?答:在IDE环境启动执行EOS操作系统的时候,会把boot.bin、loader.bin和kernel.dll三个二进制文件写到软盘镜像文件中,然后让虚拟机来执行软盘里的EOS操作系统。
仅使用其中的一个是不能运行的。
Boot.bin程序的功能是:在Boot.bin程序执行的过程中,CPU始终处于实模式状态。
Boot.bin程序利用BIOS提供的int 0x13中断服务程序读取软盘FAT12文件系统的根目录,在根目录中搜寻loader.bin文件。
Loader.bin程序的功能是:Loader.bin程序的任务和Boot.bin程序很相似,同样是将其它的程序加载到物理内存中,但这次加载的是EOS内核。
除此之外,Loader.bin程序还负责检测内存大小,为内核准备保护模式执行环境等工作。
操作系统实验2时间片轮转和实验3银行家算法
实验二时间片轮转【实验目的】通过这次实验, 加深对进程概念的理解, 进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
【实验内容】问题描述:设计程序模拟进程的时间片轮转RR调度过程。
假设有n个进程分别在T1, …,Tn时刻到达系统, 它们需要的服务时间分别为S1, …,Sn。
分别利用不同的时间片大小q, 采用时间片轮转RR进程调度算法进行调度, 计算每个进程的完成时间, 周转时间和带权周转时间, 并且统计n个进程的平均周转时间和平均带权周转时间。
程序要求如下:1)进程个数n;每个进程的到达时间T1, … ,T n和服务时间S1, … ,S n;输入时间片大小q。
2)要求时间片轮转法RR调度进程运行, 计算每个进程的周转时间, 带权周转时间, 并且计算所有进程的平均周转时间, 带权平均周转时间;3)输出: 要求模拟整个调度过程, 输出每个时刻的进程运行状态, 如“时刻3: 进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间, 带权周转时间, 所有进程的平均周转时间, 带权平均周转时间。
源程序在VisualC++6.0中实现//RR算法#include<iostream.h>#include<iomanip.h>#include<stdio.h>#include<conio.h>#include<malloc.h>#include<stdlib.h>typedef int QElemType;#define OK 1#define ERROR 0#define OVERFLOW -1typedef int Status;typedef struct QNode{QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;Status InitQueue(LinkQueue &Q);Status DestroyQueue(LinkQueue &Q);Status EnQueue(LinkQueue &Q,QElemType e);int DeQueue(LinkQueue &Q,QElemType e);bool QueueEmpty(LinkQueue &Q);static const int MaxNum=100;intn,q,ArrivalTime[MaxNum],ServiceTime[MaxNum],FinishedTime[MaxNum],WholeTime[MaxNu m];double WeightWholeTime[MaxNum],Average_WT=0,Average_WWT=0;LinkQueue Q;void RR(int*ArrivalTime,int*ServiceTime,int n,int q,LinkQueue &Q);void main(){cout<<"请输入进程总数n的值(0<n<=100):"<<endl;cin>>n;while(n<0||n>100){cout<<"你输入的n的值不正确, 请重新输入!"<<endl;cin>>n;}cout<<"请依次输入各个进程的到达时间: "<<endl;for(int i=0;i<n;i++)cin>>ArrivalTime[i];cout<<"请依次输入各个进程的服务时间: "<<endl;for( i=0;i<n;i++)cin>>ServiceTime[i];cout<<"请输入时间片q的值(0<q<=200):"<<endl;cin>>q;while(q<0||q>200){cout<<"你输入的q值不正确, 请重新输入!"<<endl;cin>>q;}RR(ArrivalTime,ServiceTime,n,q,Q);//调用RR算法}//RR算法的具体实现void RR(int*ArrivalTime,int*ServiceTime,int n,int q,LinkQueue &Q){int countTime=0,e;int STime[MaxNum],pushed[MaxNum];for(int i=0;i<n;i++){STime[i]=ServiceTime[i];pushed[i]=0;}InitQueue(Q);EnQueue(Q,0);pushed[0]=1;int time=0;while(QueueEmpty(Q)==false){e=DeQueue(Q,e);if(STime[e]>q){STime[e]=STime[e]-q;countTime+=q;}else{countTime+=STime[e];STime[e]=0;FinishedTime[e]=countTime;}while(time<countTime){if(STime>0){cout<<"时刻"<<setw(2)<<time<<":进程"<<e<<"正在运行"<<endl;}time++;}for(i=1;i<n;i++){if(STime!=0&&i!=e&&ArrivalTime[i]<countTime&&pushed[i]==0||STime!=0&&i!=e&&A rrivalTime[i]==countTime){EnQueue(Q,i);pushed[i]=1;}}if(STime[e]>0)//判断进程e是否已执行完{EnQueue(Q,e);}}for(i=0;i<n;i++){//求周转时间和带权周转时间WholeTime[i]=FinishedTime[i]-ArrivalTime[i];WeightWholeTime[i]=(double)(WholeTime[i]*1.000000/ServiceTime[i]);Average_WT+=WholeTime[i];Average_WWT+=WeightWholeTime[i];}Average_WT/=n;//求平均周转时间Average_WWT/=n;//求平均带权周转时间//----------------输出----------------cout<<"完成:"<<" ";for(i=0;i<n;i++)cout<<setw(8)<<FinishedTime[i]<<" ";cout<<endl;cout<<"周转:"<<" ";for(i=0;i<n;i++)cout<<setw(8)<<WholeTime[i]<<" ";cout<<endl;cout<<"带权: "<<" ";for(i=0;i<n;i++)cout<<setw(8)<<setiosflags(ios::fixed)<<setprecision(2)<<WeightWholeTime[i]<<" "; cout<<endl;cout<<"平均周转时间为: "<<Average_WT<<endl;cout<<"平均带权周转时间为:"<<Average_WWT<<endl;DestroyQueue(Q);}//初始化链队列QStatus InitQueue(LinkQueue &Q){Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front)exit(OVERFLOW);Q.front->next=NULL;return OK;}//销毁链队列QStatus DestroyQueue(LinkQueue &Q){while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}//入队Status EnQueue(LinkQueue &Q,QElemType e){QueuePtr p=(QueuePtr)malloc(sizeof(QNode));if(!p) exit(OVERFLOW);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}//出队, 并用e返回出队节点的元素值int DeQueue(LinkQueue &Q,QElemType e){ QueuePtr p;if(Q.front==Q.rear) return ERROR;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p) {Q.rear=Q.front;}free(p);return e;}//判断链队列Q是否为空bool QueueEmpty(LinkQueue &Q){if(Q.front==Q.rear)return true;else return false;}实例运行截图实验三银行家算法【实验目的】通过这次实验, 加深对进程死锁的理解, 进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
电大操作系统实验2:进程管理实验
电大操作系统实验2:进程管理实验
实验目的:
1.加深对进程概念的理解,特别是进程的动态性和并发性。
2.了解进程的创建和终止。
3.学会查看进程的状态信息。
4.学会使用进程管理命令。
实验要求:
1.理解有关进程的概念,能够使用ps命令列出系统中进
程的有关信息并进行分析。
2.理解进程的创建和族系关系。
3.能够使用&,jobs,bg,at等命令控制进程的运行。
实验内容:
1.使用ps命令查看系统中运行进程的信息。
实验环境:
实验步骤和结果:
1.输入ps命令,可以报告系统当前的进程状态。
2.输入ps-e命令,可以显示系统中运行的所有进程,包括系统进程和用户进程。
3.输入ps-f命令,可以得到进程的详细信息。
进程控制:
1.后台进程
1) $grep "注册用户名" /etc/passwd。
/tmp/abc &
2.作业控制
1) 进程休眠60秒Sleep 60 &
2) 进程休眠30秒Sleep 30 &
3) 查看进程状态Jobs
4) 将睡眠30秒的sleep命令放在前台执行fg%2
3.发送中断信号
1) 后台运行sleep命令$sleep 120 &
2) 查看sleep进程的状态$ps-p pid
3) 终止sleep命令$kill -9 pid。
《操作系统》实验二
《操作系统》实验二一、实验目的本实验旨在加深对操作系统基本概念和原理的理解,通过实际操作,提高对操作系统设计和实现的认知。
通过实验二,我们将重点掌握进程管理、线程调度、内存管理和文件系统的基本原理和实现方法。
二、实验内容1、进程管理a.实现进程创建、撤销、阻塞、唤醒等基本操作。
b.设计一个简单的进程调度算法,如轮转法或优先级调度法。
c.实现进程间的通信机制,如共享内存或消息队列。
2、线程调度a.实现线程的创建、撤销和调度。
b.实现一个简单的线程调度算法,如协同多任务(cooperative multitasking)。
3、内存管理a.设计一个简单的分页内存管理系统。
b.实现内存的分配和回收。
c.实现一个简单的内存保护机制。
4、文件系统a.设计一个简单的文件系统,包括文件的创建、读取、写入和删除。
b.实现文件的存储和检索。
c.实现文件的备份和恢复。
三、实验步骤1、进程管理a.首先,设计一个进程类,包含进程的基本属性(如进程ID、状态、优先级等)和操作方法(如创建、撤销、阻塞、唤醒等)。
b.然后,实现一个进程调度器,根据不同的调度算法对进程进行调度。
可以使用模拟的方法,不需要真实的硬件环境。
c.最后,实现进程间的通信机制,可以通过模拟共享内存或消息队列来实现。
2、线程调度a.首先,设计一个线程类,包含线程的基本属性(如线程ID、状态等)和操作方法(如创建、撤销等)。
b.然后,实现一个线程调度器,根据不同的调度算法对线程进行调度。
同样可以使用模拟的方法。
3、内存管理a.首先,设计一个内存页框类,包含页框的基本属性(如页框号、状态等)和操作方法(如分配、回收等)。
b.然后,实现一个内存管理器,根据不同的内存保护机制对内存进行保护。
可以使用模拟的方法。
4、文件系统a.首先,设计一个文件类,包含文件的基本属性(如文件名、大小等)和操作方法(如创建、读取、写入、删除等)。
b.然后,实现一个文件系统管理器,包括文件的存储和检索功能。
操作系统实验2进程调度 实验报告
(2)掌握带优先级的进程调度算法;
(3)选用面向对象的编程方法。
二、实验内容;
(1)用C语言(或其它语言,如Java)实现对N个进程采用动态优先调度算法的调度。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:
进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
4.可动态添加、删除进程;
5.完成所有进程操作。
五、程序源代码及注释
六、实验结果分析
1、运行结果如下:
2、结果分析
首先,每次从就绪队列中选择最高优先权的进程时,需要计算出最高优先权和次高优先权之间的STARTBLOCK。即最高优先权进程运行多少个时间片后就会进入阻塞队列。每调度一次,就需要更新所有进程的信息,并判断CPUTIME是否等于ALLTIME,如果相等,则进程完成操作,需从就绪队列中删除。如果阻塞队列中进程的BLOCKTIME为0时,还需要将其转移到就绪队列中。
(5)用户可以干预进程的运行状态,程序应该设置可以让用户中断的入口,并可以通过以下命令查看,修改,终止进程。
A)create随机创建进程,进程的优先级与所需要的时间片随机决定;
B)ps查看当前进程状态
C)sleep命令将进程挂起
D)kill命令杀死进程
E)quit命令退出
(5)分析程序运行的结果,谈一下自己的认识。
三、实验原理;
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
根据进程的五个特征:(1)动态性;(2)并发性;(3)异步性;(4)独立性;(5)结构性及三种基本状态的转换,了解各进程对资源的共享和竞争。进程并发执行时,由于资源共享,带来各进程之间的相互制约。为了反映这些制约关系和资源共享关系,在创建一个进程时,应首先创建其PCB,然后才能根据PCB中信息对进程实施有效的管理和控制。当一个进程完成其功能之后,系统则最后释放PCB,进程也随之消亡。
操作系统实验二Windows任务管理器的进程管理
实验二 Windows任务管理器的进程管理一实验目的1)在Windows 任务管理器中对程序进程进行响应的管理操作;2)熟悉操作系统进程管理的概念;3)学习观察操作系统运行的动态性能。
二实验环境需要准备一台运行Windows XP操作系统的计算机。
三背景知识Windows XP的任务管理器提供了用户计算机上正在运行的程序和进程的相关信息,也显示了最常用的度量进程性能的单位。
使用任务管理器,可以打开监视计算机性能的关键指示器,快速查看正在运行的程序的状态,或者终止已停止响应的程序。
也可以使用多个参数评估正在运行的进程的活动,以及查看CPU 和内存使用情况的图形和数据。
四实验内容与步骤启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口。
当前机器中由你打开,正在运行的应用程序有:1) 实验二Windows 任务管理器的进程管理2) 管理工具3) 可移动磁盘(I:)Windows“任务管理器”的窗口由 5 个选项卡组成,分别是:1) 应用程序2) 进程3) 性能4)联网5)用户当前“进程”选项卡显示的栏目分别是(可移动窗口下方的游标/箭头,或使窗口最大化进行观察) :1) 映像名称2) 用户名3) CPU4)内存使用1. 使用任务管理器终止进程步骤1:单击“进程”选项卡,一共显示了33 个进程。
请试着区分一下,其中:系统(SYSTEM) 进程有19 个,填入表2-1中。
表2-1 实验记录服务(SERVICE) 进程有_ 4___个,填入表2-2中。
用户进程有__9____个,填入表2-3中。
步骤2:单击要终止的进程,然后单击“结束进程”按钮。
终止进程,将结束它直接或间接创建的所有子进程。
例如,如果终止了电子邮件程序(如Outlook 98) 的进程树,那么同时也终止了相关的进程,如MAPI后台处理程序mapisp32.exe。
《操作系统》实验报告(2)
c.将subdir目录的读权限去掉,看看是否能用ls命令看到其中内容?
权限不够
(三)Shell程序设计
1.上机编辑、执行实验内容中的例1~例6过程,写出每个脚本(例1~例5)的功能和执行结果;
然后把t01.txt复制一个新文件t03.txt,catt01.txt>t02.txt;
用cat命令将f01.txt的内容追加到t01.txt的末尾,catf01.txt>> t01.txt;
再用diff命令比较t01.txt,t02.txt和t03.txt,比较t01.txt,t02.txt:diff t01.txt t02.txt,结果是否相同:__相同___;比较t01.txt,t03.txt:diff t01.txt t03.txt,结果是否相同:不相同;比较t02.txt,t03.txt:diff t02.txt t03.txt,结果是否相同:不相同。出现上述结果的原因是:______________________________________________________________________________。
2.修改例5,使脚本中不出现break循环控制语句;
3.编写一个Shell过程完成如下功能:
a.合并两个$1、$2文件为$3,并显示内容。
b.如果缺少$3,那么先报告缺少$3,将合并后的内容输出到totaltext.txt,并显示内容。
c.如果缺少$2、$3那么先报告缺少$2、$3,只显示$1的内容。
b.用ln命令给t03.txt建立一个符号链接t04.txt,ln–st03.txt t04.txt;用cat命令看看t04.txt,___cat t04.txt_____;然后删去t03.txt,___rm t03.txt____;再用cat命令看看t04.txt,___cat t04.txt___;结果是:___t04.txt为空____
Windows操作系统实验二实验报告
Windows操作系统C/C++ 程序实验姓名:_____王晨璐_____学号:____1131000046____班级:____1班_____院系:___信息工程学院_____2015__年_10_月_26_日实验二Windows 2000/xp进程控制一、背景知识二、实验目的三、工具/准备工作四、实验内容与步骤请回答:Windows所创建的每个进程都是以调用CreateProcess()API函数开始和以调用TerminateProcess()或ExitProcess() API函数终止。
1. 创建进程步骤5:编译完成后,单击“Build”菜单中的“Build 2-1.exe”命令,建立2-1.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?可以正常运行。
清单2-1展示的是一个简单的使用CreateProcess() API函数的例子。
首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。
大多数参数都可取缺省值,但是创建标志参数使用了:CREATE_NEW_CONSOLE标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。
然后该克隆进程的创建方法关闭传递过来的句柄并返回main() 函数。
在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。
CreateProcess() 函数有10个核心参数?本实验程序中设置的各个参数的值是:a. LPCSTR lpApplivetionName szFllenameb. LPCSTR lpCommandLine szCmdLinec. LPSECURITY_ATTRIBUTES lpProcessAttributes NULLd. LPSECURITY_ATTRIBUTES lpThreadAttributes NULLe.BOOL bInherithandle Falsef. DWORD dwCreationFlage CREATE_NEW_CONSOLEg. LPVOID ipEnvironment NULLh. LPCTSTR lpCurrentDirectory NULLI. STARTUPINFO lp startupinfo &siJ. LPPROCESS_INFORMATION lpProcessInformation &pi 程序运行时屏幕显示的信息是:提示:部分程序在Visual C++环境完成编译、链接之后,还可以在Windows 2000/xp的“命令提示符”状态下尝试执行该程序,看看与在可视化界面下运行的结果有没有不同?为什么?界面是一样的2. 正在运行的进程步骤10:编译完成后,单击“Build”菜单中的“Build 2-2.exe”命令,建立2-2.exe可执行文件。
最新操作系统实验报告实验二
最新操作系统实验报告实验二实验目的:1. 熟悉最新操作系统的架构和特性。
2. 掌握操作系统的基本操作和配置方法。
3. 分析操作系统的性能和稳定性。
实验环境:- 硬件环境:Intel Core i7处理器,16GB RAM,256GB SSD。
- 软件环境:最新操作系统版本X.Y.Z,图形界面和命令行界面。
实验步骤:1. 安装最新操作系统X.Y.Z,记录安装过程中的关键步骤和遇到的问题。
2. 配置系统环境,包括网络设置、显示设置、用户账户管理等。
3. 测试文件系统的性能,包括文件的创建、复制、删除和搜索操作。
4. 测试多任务处理能力,通过同时运行多个应用程序来观察系统响应时间和资源分配情况。
5. 检验系统的安全性,包括用户权限管理、防火墙设置和病毒防护功能。
6. 评估系统的稳定性,进行长时间运行测试,记录是否有崩溃或异常行为发生。
7. 对系统进行基准测试,使用专业工具如SPEC CPU测试套件来评估系统性能。
实验结果:1. 安装过程中,系统顺利识别硬件并完成驱动安装,未遇到兼容性问题。
2. 系统配置简便,图形用户界面直观易用,网络配置通过向导快速完成。
3. 文件系统测试显示,读写速度达到预期标准,搜索操作响应迅速。
4. 多任务处理测试中,系统在开启多个资源密集型应用时仍保持流畅,未出现明显延迟。
5. 安全性测试表明,用户权限分级明确,防火墙和病毒防护均能有效工作。
6. 稳定性测试中,系统连续运行72小时无故障,表现出良好的稳定性。
7. 基准测试结果显示,系统性能较前一版本有显著提升,特别是在多线程处理方面。
实验结论:最新操作系统X.Y.Z在本次实验中表现出了良好的性能和稳定性。
系统的用户界面友好,配置和管理方便。
文件系统和多任务处理能力均达到预期目标,安全性和稳定性也符合最新的操作系统标准。
推荐对性能和稳定性有较高要求的用户进行升级。
操作系统实验二进程调度
操作系统实验二进程调度摘要:进程调度是操作系统中重要的功能之一,可以决定进程的优先级和执行顺序。
本实验主要介绍了进程调度的概念、不同的调度算法以及如何实现进程调度。
一、概念介绍进程调度是操作系统中的一项重要功能,用于决定哪个进程能够在处理器上运行。
在操作系统中存在多个进程需要同时运行,而处理器资源有限,因此需要通过进程调度来合理地安排进程的执行顺序,提高系统的效率。
进程调度的目标是使系统的吞吐量最大化、响应时间最短、资源利用率最高等。
常见的调度策略包括先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转、优先级调度等。
二、调度算法介绍1.先来先服务(FCFS)先来先服务(FCFS)是最简单的调度算法,按照进程到达的顺序进行调度,先到达的进程先执行。
FCFS算法不考虑进程的优先级和执行时间,容易导致平均等待时间长。
2.最短作业优先(SJF)最短作业优先(SJF)调度算法按照进程所需的CPU时间进行排序,优先调度所需时间最短的进程。
SJF算法可以减少平均等待时间,但可能会导致长作业等待时间过长。
3.时间片轮转时间片轮转是一种抢占式调度策略,将处理器的使用权分割为若干个时间片,每个进程在一个时间片内运行,如果时间片用完仍未运行完,则将该进程放到队列的末尾,并让下一个进程运行。
时间片轮转算法保证了公平性和响应时间,但可能会导致上下文切换次数过多。
4.优先级调度优先级调度是根据进程的优先级进行调度,优先级高的进程先执行。
优先级可以根据进程类型、实时性等因素确定,不同的操作系统可能有不同的优先级范围和策略。
三、实验步骤1.定义进程结构:定义进程结构体,包含进程ID、进程状态、优先级、执行时间等信息。
2.初始化进程队列:将所有进程按照到达的先后顺序加入到进程队列中。
3.实现调度算法:根据不同的调度算法,实现相应的进程调度算法代码。
可以使用循环遍历进程队列,并根据不同的调度策略决定下一个要执行的进程。
4.执行进程调度:在每个时间片结束后,根据调度算法选取下一个要执行的进程,并更新进程的状态和执行时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验实验二进程管理学号 1215108019 姓名李克帆学院信息学院班级 12电子 2实验目的1、理解进程的概念,明确进程和程序的区别。
2、理解并发执行的实质。
3、掌握进程的创建、睡眠、撤销等进程控制方法。
实验内容与要求基本要求:用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。
实验报告内容1、进程、进程控制块等的基本原理。
进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。
为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。
进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下:I/完时间片进程调I/请由于多个程序并发执行,各程序需要轮流使用CPU,当某程序不在CPU上运行时,必须保留其被中断的程序的现场,包括:断点地址、程序状态字、通用寄存器的内容、堆栈内容、程序当前状态、程序的大小、运行时间等信息,以便程序再次获得CPU时,能够正确执行。
为了保存这些内容,需要建立—个专用数据结构,我们称这个数据结构为进程控制块PCB (Process Control Block)。
进程控制块是进程存在的惟一标志,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。
当创建一个进程时,实际上就是为其建立一个进程控制块。
在通常的操作系统中,PCB应包含如下一些信息:①进程标识信息。
为了标识系统中的各个进程,每个进程必须有惟一的标识名或标识数。
②位置信息。
指出进程的程序和数据部分在内存或外存中的物理位置。
③状态信息。
指出进程当前所处的状态,作为进程调度、分配CPU的依据。
④进程的优先级。
一般根据进程的轻重缓急其它信息。
这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。
就执行阻塞程度为进程指定一个优先级,优先级用优先数表示。
⑤进程现场保护区。
当进程状态变化时(例如一个进程放弃使用CPU),它需要将当时的CPU现场保护到内存中,以便再次占用CPU时恢复正常运行,有的系统把要保护的CPU 现场放在进程的工作区中,而PCB中仅给出CPU现场保护区起始地址。
⑥资源清单。
每个进程在运行时,除了需要内存外,还需要其它资源,如I/O设备、外存、数据区等。
这一部分指出资源需求、分配和控制信息。
⑦队列指针或链接字。
它用于将处于同一状态的进程链接成一个队列,在该单元中存放下一进程PCB首址。
⑧其它信息。
这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。
2、程序流程图。
3、程序及注释。
#include<stdio.h>#include<stdlib.h>操作结束#include<string.h>struct jincheng_type{ // 定义表示进程信息的结构体int pid;//进程IDint youxian; //优先级int daxiao; //大小int zhuangtai;//进程的状态,这里用0表示没有建立或被杀死,1表示执行,2表示换出int info;//内容};struct jincheng_type neicun[20]; //定义20个内存单位给进程使用int shumu=0,guaqi=0,pid,flag=0; //定义正在执行进程数目,被挂起进程数目,进程ID,运行标志位void create() //函数--创建一个新进程{ if(shumu>=20) printf(\n内存已满,请先换出或杀死进程\n); //判断内存空间是否已满else{for(int i=0;i<20;i++)if(neicun[i].zhuangtai==0) break; //选出空着的内存单元给新进程使用printf(\n请输入新进程pid\n); //输入新进程ID存至选出的内存单元scanf(%d,&(neicun[i].pid));for(int j=0;j<i;j++) if(neicun[i].pid==neicun[j].pid) //当输入的新进程与原有进程ID相同时,显示该进程已存在{ 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)); neicun[i].zhuangtai=1; //将新进程的内存单元状态(zhuangtai)设成1,以表示存在且未被换出shumu++;//正在运行的进程数目加一}}void run() //函数--查看正在运行的进程{ for(int i=0;i<20;i++) { if(neicun[i].zhuangtai==1) //将存在且未被挂起(即zhuangtai=1)的进程显示出来,若存在这样的程序,则将flag设成1{ printf(\n pid=%d--,neicun[i].pid); printf(youxian=%d--,neicun[i].youxian); printf(daxiao=%d--,neicun[i].daxiao); printf(zhuangtai=%d--,neicun[i].zhuangtai); printf(info=%c,neicun[i].info);flag=1;}} if(!flag)printf(\n当前没有运行进程\n);//若当前没有运行进程(即flag=0),则显示当前没有运行进程}void huanchu() //函数--换出进程{ if(!shumu) //判断是否无进程存在{ printf(\n当前没有进程存在\n); return; }printf(\n 输入唤出进程ID值); //输入需要换出的进程ID,scanf(%d,&pid); for(int i=0;i<20;i++){ if(pid==neicun[i].pid) { if(neicun[i].zhuangtai==1) //若该ID代表的进程正在运行,则将其挂起,即将zhuangyai置成2,并将guaqi加一{ neicun[i].zhuangtai=2;guaqi++;printf(\n已经成功换出进程\n);}else if(neicun[i].zhuangtai==2) printf(\n要唤出的进程已被挂起\n);//若该ID代表的进程已被挂起,即zhuangtai==2,则显示'要唤出的进程已被挂起'flag=1; break;}}if(!flag) printf(\n要唤出的进程不存在\n); //若进程不存在,给出显示}void kill() //函数--杀死进程{ if(!shumu) //判断是否无进程存在{ printf(\n当前没有进程存在\n); return;}printf(\n 输入杀死进程的ID值); //读入要杀死的进程IDscanf(%d,&pid); for(int i=0;i<20;i++) { if(pid==neicun[i].pid){ if(neicun[i].zhuangtai==1) //若进程正在运行则再次询问是否要杀死,通过用户的反馈执行不同操作{ printf(\n该进程正在运行,确定要杀死吗?\n); printf(\n请输入 1:Yes;0:NO \n); scanf(%d,&flag); if(flag){neicun[i].zhuangtai=0; //将zhuangtai置为0,表示进程被杀死,并将shumu自减一shumu--;printf(\n已经成功杀死进程\n); }else printf(\要杀死的进程正在运行\n);}else if(neicun[i].zhuangtai==2) //若该进程已经被挂起,则直接杀死{ neicun[i].zhuangtai=0; shumu--;printf(\n已经成功杀死进程\n);}flag=1; break;}}if(flag==0) printf(\n要杀死的进程不存在\n); //若进程不存在,给出显示}void huanxing() //函数--唤醒进程{ if(!shumu) //判断是否无进程存在{ printf(\n当前没有运行进程\n); return;}if(!guaqi) //判断是否无进程被挂起{ printf(\n当前没有挂起进程\n); return;}printf(\n输入pid\n); //输入需要唤醒进程IDscanf(%d,&pid); for(int i=0;i<20;i++) { if(pid==neicun[i].pid){ flag=false;if(neicun[i].zhuangtai==2) //判断该进程是否被挂起,若没有则将其唤醒并将guaqi 自减一{ neicun[i].zhuangtai=1; guaqi--;printf(\n已经成功唤醒进程\n);}else if(neicun[i].zhuangtai==2) printf(\n要唤醒的进程已被挂起\n);//若目标进程已被挂起,则显示'要唤醒的进程已被挂起'flag=1; break;}} if(!flag) printf(\n要唤醒的进程不存在\n); //若要唤醒的进程不存在,给出显示}void viewall() //函数--查看内存状态{ for(int i=0;i<20;i++) //显示所有20个内存单元的状态{ printf(\n pid=%d,neicun[i].pid); printf(youxian=%d,neicun[i].youxian); printf(daxiao=%d,neicun[i].daxiao); printf(zhuangtai=%d,neicun[i].zhuangtai); printf(info=%c,neicun[i].info);}}void main() //主函数{ int n=1; int num;for(int i=0;i<20;i++) //先将内存zhuangtai位清零neicun[i].zhuangtai=0;while(n){ printf(\n fff \n);printf(\n*************************************************\n);printf(\n 1.创建新的进程 \n); printf(\n 2.查看运行进程\n);printf(\n 3.唤出某个进程 \n);printf(\n 4.杀死某个进程 \n); printf(\n 5.唤醒某个进程\n); printf(\n6.查看内存状态 \n);printf(\n 7.退出进程 \n);printf(\n*************************************************\n); printf(\n请选择(1-7)\n); scanf(%d,&num); switch(num) //功能选择{case 1:create();break; case 2:run();break; case 3:huanchu();break; case4:kill();break; case 5:huanxing();break;case 6:viewall();break; case 7:exit(0); default:n=0; } flag=0;}}4、程序运行演示与截图(1)创建新进程,依次建立进程1、2、3,图中为建立进程2。