操作系统实验1进程状态转换
- 格式:doc
- 大小:67.50 KB
- 文档页数:8
一、实验目的1. 加深对进程概念和进程调度算法的理解。
2. 掌握进程调度算法的基本原理和实现方法。
3. 培养编程能力和系统分析能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验内容1. 实现进程调度算法2. 创建进程控制块(PCB)3. 模拟进程调度过程四、实验原理进程调度是操作系统核心功能之一,负责将CPU分配给就绪队列中的进程。
常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转(RR)等。
1. 先来先服务(FCFS)算法:按照进程到达就绪队列的顺序进行调度。
2. 短作业优先(SJF)算法:优先调度运行时间最短的进程。
3. 优先级调度算法:根据进程的优先级进行调度,优先级高的进程优先执行。
4. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行,时间片结束后进行调度。
五、实验步骤1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、运行时间、优先级、状态等信息。
2. 创建进程队列,用于存储就绪队列、等待队列和完成队列。
3. 实现进程调度算法:a. FCFS算法:按照进程到达就绪队列的顺序进行调度。
b. SJF算法:优先调度运行时间最短的进程。
c. 优先级调度算法:根据进程的优先级进行调度。
d. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行。
4. 模拟进程调度过程:a. 初始化进程队列,将进程添加到就绪队列。
b. 循环执行调度算法,将CPU分配给就绪队列中的进程。
c. 更新进程状态,统计进程执行时间、等待时间等指标。
d. 当进程完成时,将其移至完成队列。
六、实验结果与分析1. FCFS算法:按照进程到达就绪队列的顺序进行调度,简单易实现,但可能导致短作业等待时间过长。
2. SJF算法:优先调度运行时间最短的进程,能提高系统吞吐量,但可能导致进程饥饿。
第1篇一、实验目的通过本次实验,加深对操作系统进程调度原理的理解,掌握先来先服务(FCFS)、时间片轮转(RR)和动态优先级(DP)三种常见调度算法的实现,并能够分析这些算法的优缺点,提高程序设计能力。
二、实验环境- 编程语言:C语言- 操作系统:Linux- 编译器:GCC三、实验内容本实验主要实现以下内容:1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、服务时间、优先级、状态等信息。
2. 实现三种调度算法:FCFS、RR和DP。
3. 创建一个进程队列,用于存储所有进程。
4. 实现调度函数,根据所选算法选择下一个执行的进程。
5. 模拟进程执行过程,打印进程执行状态和就绪队列。
四、实验步骤1. 定义PCB结构体:```ctypedef struct PCB {char processName[10];int arrivalTime;int serviceTime;int priority;int usedTime;int state; // 0: 等待,1: 运行,2: 完成} PCB;```2. 创建进程队列:```cPCB processes[MAX_PROCESSES]; // 假设最多有MAX_PROCESSES个进程int processCount = 0; // 实际进程数量```3. 实现三种调度算法:(1)FCFS调度算法:```cvoid fcfsScheduling() {int i, j;for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;if (processes[i].usedTime == processes[i].serviceTime) { processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); }for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(2)RR调度算法:```cvoid rrScheduling() {int i, j, quantum = 1; // 时间片for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;processes[i].serviceTime--;if (processes[i].serviceTime <= 0) {processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); } else {processes[i].arrivalTime++;}for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(3)DP调度算法:```cvoid dpScheduling() {int i, j, minPriority = MAX_PRIORITY;int minIndex = -1;for (i = 0; i < processCount; i++) {if (processes[i].arrivalTime <= 0 && processes[i].priority < minPriority) {minPriority = processes[i].priority;minIndex = i;}}if (minIndex != -1) {processes[minIndex].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[minIndex].processName);processes[minIndex].usedTime++;processes[minIndex].priority--;processes[minIndex].serviceTime--;if (processes[minIndex].serviceTime <= 0) {processes[minIndex].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[minIndex].processName); }}}```4. 模拟进程执行过程:```cvoid simulateProcess() {printf("请选择调度算法(1:FCFS,2:RR,3:DP):");int choice;scanf("%d", &choice);switch (choice) {case 1:fcfsScheduling();break;case 2:rrScheduling();break;case 3:dpScheduling();break;default:printf("无效的调度算法选择。
操作系统原理实验报告一、实验目的操作系统是计算机系统中最为关键的软件之一,它负责管理和控制计算机的硬件和软件资源,为用户和应用程序提供一个方便、高效、稳定的运行环境。
本次实验的目的在于通过实际操作和观察,深入理解操作系统的核心原理和关键机制,包括进程管理、内存管理、文件系统管理、设备管理等方面,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C++。
三、实验内容及步骤(一)进程管理实验1、进程创建与终止编写程序,使用系统调用创建一个新的进程,并在新进程中执行特定的任务,如打印一段文本。
观察新进程的创建过程和资源分配情况。
编写程序,实现父进程等待子进程终止,并获取子进程的退出状态。
2、进程调度编写程序,模拟多个进程的并发执行,设置不同的优先级和时间片。
观察进程的调度顺序和执行时间,分析调度算法的效果。
(二)内存管理实验1、内存分配与释放编写程序,使用动态内存分配函数(如 malloc、new 等)申请一定大小的内存空间,并进行读写操作。
观察内存的分配和释放过程,检查是否存在内存泄漏。
2、内存分页与分段了解操作系统的内存分页和分段机制。
编写程序,模拟内存分页和分段的过程,展示地址转换和页面置换算法的效果。
(三)文件系统管理实验1、文件创建与读写编写程序,创建一个新文件,并向文件中写入一定的数据。
读取文件中的数据,并进行验证。
2、文件目录操作编写程序,实现对文件目录的创建、删除、遍历等操作。
观察文件目录的结构和变化。
(四)设备管理实验1、设备驱动程序了解设备驱动程序的基本概念和工作原理。
编写一个简单的设备驱动程序,实现对特定设备的控制和数据传输。
2、设备中断处理模拟设备中断的产生和处理过程。
编写中断处理程序,处理设备中断事件。
四、实验结果与分析(一)进程管理实验结果与分析1、进程创建与终止成功创建了新进程,并在新进程中打印出指定的文本。
第1篇一、实践背景随着计算机技术的飞速发展,操作系统作为计算机系统的核心,扮演着至关重要的角色。
为了更好地理解和掌握操作系统的工作原理,提高自己的实践能力,我们开展了操作系统实践课程。
通过本次实践,我们对操作系统的基本概念、原理和实现有了更深入的认识。
二、实践目的1. 理解操作系统的基本概念和原理;2. 掌握操作系统的基本操作和配置;3. 培养解决实际问题的能力;4. 提高团队合作意识和沟通能力。
三、实践内容本次实践主要包括以下几个方面:1. 操作系统概述2. 进程管理3. 存储管理4. 文件系统5. 设备管理6. 网络操作系统四、实践过程1. 操作系统概述在实践过程中,我们首先了解了操作系统的基本概念和分类。
操作系统是计算机系统中负责管理硬件资源、控制程序执行、提供用户接口的软件系统。
根据不同的分类标准,操作系统可以分为多种类型,如单用户、多用户、实时、嵌入式等。
2. 进程管理进程管理是操作系统的一个重要组成部分,主要负责进程的创建、调度、同步、通信和终止等。
在实践过程中,我们学习了进程状态转换、进程调度算法(如先来先服务、短作业优先等)以及进程同步与互斥的机制。
3. 存储管理存储管理主要负责内存的分配、回收和扩展。
在实践过程中,我们了解了内存分配策略(如固定分区、可变分区、分页、分段等)以及内存保护机制。
4. 文件系统文件系统是操作系统的重要组成部分,主要负责文件的存储、检索和访问。
在实践过程中,我们学习了文件系统的结构、目录结构、文件系统实现方法(如FAT、NTFS等)以及文件系统的安全性。
5. 设备管理设备管理主要负责设备的分配、调度、控制和故障处理。
在实践过程中,我们了解了设备驱动程序、中断处理、DMA传输以及I/O缓冲区等概念。
6. 网络操作系统网络操作系统负责网络资源的分配、管理和通信。
在实践过程中,我们学习了网络协议、网络设备、网络配置以及网络安全等方面的知识。
五、实践总结通过本次操作系统实践,我们收获颇丰。
操作系统实验指导书楚雄师范学院计算机科学系操作系统课程组2011-9-20第一部分操作系统上机指导Linux操作系统环境:RedHat Enterprise Linux ES release 3 (Taroon Update 1) (2.4.21-9.EL)Red Flag Linux release 4.0 (HOT) (2.4)登录到系统常用命令练习:用root账号(超级用户)注册,口令为jkxroot(注意大小写)。
注册成功出现#号(超级用户系统提示符,普通用户的系统提示符为$)。
注销(退出)系统:logout 或exit3.练习使用命令ls(注意Linux命令区分大小写。
)使用ls 查看当前目录内容;使用ls 查看指定目录内容,如/目录,/etc目录使用ls –all 查看当前目录内容;使用dir 查看当前目录内容4.使用cd改变当前目录cd .. 回到上层目录;cd / 回到根目录5.pwd 显示当前路径6.建立目录mkdirmkdir 目录名;mkdir /home/s2001/newdir7.删除目录:rmdir;8.复制文件cp:如cp 文件名1 文件名29.移动文件或目录: mv10.删除文件rm11. 显示文件内容:more (分页显示);12. 显示文件:cat 文件名建立文件:cat >文件名,ctrl+d结束输入使用编辑器vi 编辑文件进入linux的文本模式之后,在命令行键入vi filename.c 然后回车。
下面作一些简单的解释:首先vi命令是打开vi编辑器。
后面的filename.c是用户即将编辑的c文件名字,注意扩展名字是.c;当然,vi编辑器功能很强,可以用它来编辑其它格式的文件,比如汇编文件,其扩展名字是.s;也可以直接用vi打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。
最基本的命令I :当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I键(insert),插入的意思,就可以进入编辑模式了。
计算机操作系统汤小丹课后答案完整版计算机操作系统是指协调和管理计算机硬件和软件资源的系统。
操作系统的作用是为用户提供一个与计算机硬件交互的界面,同时管理和分配计算机资源,保证各个程序能够高效地运行。
汤小丹编写的《计算机操作系统》一书,是操作系统领域的经典教材。
以下是本文对《计算机操作系统汤小丹课后答案》的完整版本。
前言汤小丹编写的《计算机操作系统》课后答案,是为了帮助读者更好地理解和掌握教材中的知识点。
通过做课后习题和查看答案,读者可以更好地巩固和应用所学知识,提高对操作系统的理解和掌握程度。
本文将对《计算机操作系统汤小丹课后答案》进行整理和梳理,方便读者进行学习和查询。
一、绪论1. 操作系统的定义及作用操作系统是协调和管理计算机硬件和软件资源的系统。
操作系统的作用是为用户提供一个与计算机硬件交互的界面,同时管理和分配计算机资源,保证各个程序能够高效地运行。
2. 操作系统的分类操作系统可以按照不同的分类标准进行分类,包括按照用户的数量、计算机系统的类型、功能特性等分类方法。
3. 操作系统的发展历史操作系统的发展经历了五个阶段,分别是无操作系统阶段、单道批处理系统阶段、多道批处理系统阶段、分时操作系统阶段和现代操作系统阶段。
二、进程管理1. 进程与线程的概念及区别进程是程序在执行过程中的实体,而线程是进程中独立运行的最小单位。
进程具有独立的地址空间和资源,线程共享进程的资源。
2. 进程的状态转换及原因进程的状态包括运行态、就绪态和阻塞态。
进程状态的转换是由于进程的运行、等待资源或等待事件等原因引起的。
3. 进程同步与互斥进程同步是指协调不同进程之间的活动顺序,而互斥是为了防止多个进程同时访问临界资源。
三、内存管理1. 内存管理的基本概念内存管理的任务是为进程提供内存空间,并进行分配和回收。
常见的内存管理方案包括连续内存分配、非连续内存分配和虚拟存储器管理等。
2. 连续内存分配的方法连续内存分配的方法包括固定分区分配、可变分区分配和动态分区分配。
第2章进程管理进程是操作系统中非常重要的概念,进程管理是操作系统最为重要的功能之一。
12.1 基本结构图2进程管理基本知识结构图(见下页)进程管理进程的概念进程的描述进程控制进程的创建与终止进程通信线程程序的顺序执行程序的并发执行进程的概念及特征进程的状态及转换Linux进程的状态Linux进程的PCBLinux进程的系统调用进程的阻塞与唤醒进程的同步与互斥临界资源锁机制信号量进程控制块信号量的应用及同步举例进程的同步与互斥进程控制块的组织方式共享存储器机制消息传递机制管道通信机制信号通信机制线程的概念线程的特点2.2 知识点2.2.1 进程的概念1.程序的顺序执行我们把一个具有独立功能的程序独占处理机,直到最后结束的过程称为程序的顺序执行。
程序顺序执行时的特征为:顺序性、封闭性和可再现性。
4顺序性是指,程序执行时严格按照程序的语句或指令的顺序执行。
封闭性是指,程序执行的结果只有程序本身才可以改变,而与其它外界因素无关。
可再现性是指,只要输入的初始条件相同,则无论何时重复执行该程序,结果都是相同的。
52.程序的并发执行所谓程序的并发性,是指多道程序在同一时间间隔内同时发生。
63.进程的概念及特征(1)进程的概念进程是操作系统中最基本、最重要的概念之一。
进程可以如下定义:进程是程序的一次执行。
进程是可以和别的进程并发执行的计算。
进程就是一个程序在给定活动空间和初始条件下,在一个处理机上的执行过程。
进程是程序在一个数据集合上的运行过程,它是系统进行资源分配和调度的一个独立单位。
进程是动态的,有生命周期的活动。
内核可以创建一个进程,最终将由内核终止该进程使其消亡。
7(2)进程与程序的区别进程和程序是两个完全不同的概念,但又有密切的联系。
8(3)进程的特征进程具有动态性、并发性、独立性、异步性及结构性的特征。
4.进程的状态及转换在操作系统中,进程通常至少有三种基本状态:就绪状态、执行状态和阻塞状态。
910程执行完成或撤消阻塞状态就绪状态进程创建调度用片间时进等待某事件发生如I/O 请求外部事件发生进程的基本状态及转换图完5.Linux进程的状态Linux系统内核在进程控制块中用state成员描述进程当前的状态,并明确定义了5种进程状态。
第二章进程管理第一部分教材习题(P81)3、为什么程序并发执行会产生间断性特征?(P36)4、程序并发执行,为何会失去封闭性和可再现性?(P37)【解】程序在并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行已失去了封闭性。
同时由于失去了封闭性,也将导致其再失去可再现性。
程序在并发执行时,由于失去了封闭性,程序经过多次执行后,其计算机结果已与并发程序的执行速度有关,从而使程序的执行失去了可再现性。
5、在操作系统中为什么要引入进程概念?(P37)它会产生什么样的影响?【解】在操作系统中引入进程的概念,是为了实现多个程序的并发执行。
传统的程序不能与其他程序并发执行,只有在为之创建进程后,才能与其他程序(进程)并发执行。
这是因为并发执行的程序(即进程)是“停停走走”地执行,只有在为它创建进程后,在它停下时,方能将其现场信息保存在它的PCB中,待下次被调度执行是,再从PCB中恢复CPU现场并继续执行,而传统的程序却无法满足上述要求。
建立进程所带来的好处是使多个程序能并发执行,这极大地提高了资源利用率和系统吞吐量。
但管理进程也需付出一定的代价,包括进程控制块及协调各运行机构所占用的内存空间开销,以及为进行进程间的切换、同步及通信等所付出的时间开销。
6、试从动态性、并发性和独立性上比较进程和程序?(P37)【解】(1)动态性:进程既然是进程实体的执行过程,因此,动态性是进程最基本的特性。
动态性还表现为:“它由创建而产生,由调度而执行,因得不到资源而暂停执行,以及由撤消而消亡”。
可见,进程有一定的生命期。
而程序只是一组有序指令的集合,并存放在某种介质上,本身并无运动的含义,因此,程序是个静态实体。
(2)并发性:所谓进程的并发,指的是多个进程实体,同存于内存中,能在一段时间内同时运行。
并发性是进程的重要特征,同时也成为OS的重要特征。
引入进程的目的也正是为了使其程序能和其它进程的程序并发执行,而程序是无法并发执行的。
操作系统实验 报告实验项目: 进程调度学 院: 计算机学院专 业:班 级:学 号:姓 名:1. 实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理机数时,就必须依照某种策略来决定哪些进程优先占用处理机。
本实验模拟在单处理机情况下的进程调度,加深了解进程调度的工作。
2. 实验内容设计一个按时间片轮转法实现进程调度的程序。
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB 来代表,进程控制块的格式为:其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q 1,Q 2,Q 3,Q 4,Q 5。
指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。
要求运行时间——假设进程需要运行的单位时间数。
已运行时间——假设进程已经运行的单位时间数,初始值为“0”。
状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R ”表示。
当一个进程运行结束后,它的状态为“结束”,用“E ”表示。
(2)每次运行所设计的进程调度程序前,为每个进程任意确定它的“要求运行时间”。
(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。
另用一标志单元记录轮到运行的进程。
例如,当前轮到Q 2执行,则有:进程名 指针 要求运行时间 已运行时间 状态标志单元(4)进程调度总是选择标志单元指示的进程运行。
由于本实验是模拟进程调度的功能,所以对被选中的进程并不实际的启动运行,而是执行“已运行时间+1”来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
请注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理机运行,直到出现等待事件或运行满一个时间片。
在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。
(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。
实验1 进程的状态及其转换 一、实验目的: 自行编制模拟程序,通过形象化的状态显示,加深理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。
二、实验内容及要求: 1) 设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 2) 独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。 3) 合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。 4) 设计出可视性较好的界面,应能反映出进程状态的变化引起的对应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" #include /*全局结构体及变量定义*/
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) //将进程插入到队列的尾部 { 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; p=node; 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"); else printf("this process resource is not ready ! \n"); }
void DispatchToBlock(struct PCB *node) //调度到阻塞状态的函数 { if(!node->P_Requiry) //如果所需要的资源没有满足则,调度到阻塞状态 { strcpy(node->P_State,"block"); InsertQueue(&Block_state,node); //插入到阻塞队列 Display_Process(node); } }
void DispatchToReady(struct PCB *node) //调度到就绪状态的函数 { if(node->P_Requiry) //如果所需的资源满足,则调度 { strcpy(node->P_State,"Ready"); InsertQueue(&Ready_state,node); Display_Process(node); } }
void DispatchBlockToReady() //从阻塞状态调度到就绪状态函数 { struct PCB*p,*q; q=Block_state; while(q!=NULL) //如果阻塞状态队列不空 { p=q; q=q->next; if(signal4&&p->P_Id==1) //如果所需要的资源满足 { p->P_Requiry=1; DeleteQueue(&Block_state,p); strcpy(p->P_State,"ready"); InsertQueue(&Ready_state,p); printf("process1 will be in the state of ready!\n"); Display_Process(p); } if(signal5&&p->P_Id==2) { p->P_Requiry=1; DeleteQueue(&Block_state,p); strcpy(p->P_State,"ready"); InsertQueue(&Ready_state,p); printf("process2 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; //所需要的时间片为1 p->P_Requiry=0;
Display_Process(p); Sleep(4000); 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';