复习课件操作系统实验二进程管理.doc
《操作系统课件:进程管理》
进程的创建与终止
创建进程
操作系统通过调用系统调用或其他进程来创建新进 程。
终止进程
进程可以正常终止或被其他进程强制终止。
进程调度的分类
1 非抢占式调度
进程不会被强制中断,直到主动让出CPU。
2 抢占式调度
操作系统会根据一定的优先级或时间片来中断正在运行的进程,将 CPU分配给其他进程。
进程同步的基本概念
进程同步是确保多个进程按照特定顺序执行的机制,以避免竞态条件和数据不一致的问题。
进程同步机制之互斥锁
互斥锁是最常用的进程同步机制,它确保在同一时间只能有一个进程访问共享资源。
操作系统课件:进程管理
本课程将详细介绍进程管理的各个方面,包括进程概念、进程状态与转换以 及进程调度算法等。让我们一起深入了解操作系统中最重要的组成部分之一。
什么是进程
进程是操作系统中正在执行的程序的实例。它是计算机系统中最基本的执行 单位,具有独立的内存空间和执行上下文。
进程控制块(PCB)的概念
进程控制块是操作系统中用于管理和控制进程的数据结构。它包含了进程的 状态信息以及与之相关的各种属性,如进程ID、优先级和资源占用情况。
进程状态及转换
创建
进程正在被创建,分配资源 并初始化。
就绪
进程已准备好执行,正在等 待CPU的分配。
运行
进程正在执行中。
阻塞
进程由于等待某种事件(如I/O操作)而暂停执 行。
进程调度算法的比较
先来先服务 (FCFS)
按进程到达的先后顺 序进行调度,非抢占 式。
最短作业优先 (SJF)
选择估计运行时间最 短的进程优先执行, 非抢占式。
轮转调度(RR)
《进程管理》课件
和协作。
进程迁移
02
为了提高系统可靠性和可用性,分布式系统支持进程迁移,确
保关键任务能够持续运行。
负载均衡
03
分布式系统通过负载均衡技术,将任务分配到不同节点上执行
,提高系统整体性能。
THANKS
感谢观看
当系统中存在多个等待资源的进程,且每 个进程都持有至少一个资源并等待获取被 其他进程持有的资源时,就会产生死锁。
通过设置资源分配顺序或限制资源请求量 来避免饥饿。
• 死锁预防
• 死锁避免
通过破坏死锁产生的必要条件来预防死锁 ,例如预先分配资源、设置最大需求量等 。
在分配资源时进行检测和限制,避免产生 死锁,例如银行家算法。
进程的状态及其转换
总结词
阐述进程的三种基本状态及转换关系
详细描述
进程状态分为新建、运行、阻塞和就绪等状态。新建状态是进程被创建时的状态,运行状态是进程获 得CPU并执行的状态,阻塞状态是进程等待某个条件成立而暂时无法执行的状态,就绪状态是进程已 具备运行条件但未获得CPU时的状态。不同状态之间可以相互转换。
进程管理在操作系统中的应用
01
02
03
进程调度
操作系统通过进程调度算 法,合理分配系统资源, 确保进程能够高效地运行 。
进程同步
操作系统提供进程同步机 制,实现多个进程之间的 协同工作,避免资源竞争 和死锁。
进程通信
进程之间通过消息传递、 共享内存等方式进行通信 ,实现数据交换和协同工 作。
多核处理器下的进程管理技术
进程与程序的区别和联系
总结词
比较进是程序的一次执行过程,具有动态特性和独立性。 程序是静态的,而进程是动态的。程序是永存的,进程是暂时的。程序是过程的代码, 而进程是执行这些代码的过程。一个程序可以对应多个进程,但一个进程不能对应多个
操作系统课件 第2章 进程
第二章 进 程 管 理
对于具有下述四条语句的程序段: S1: a∶=x+2 S2: b∶=y+4 S3: c∶=a+b S4: d∶=c+b 请画出前趋关系图。
S1 S3 S2 S4
第二章 进 程 管 理
2.2 程序并发执行时的特征
1) 间断性 相互制约性)-后面的模块等待前面的模块 间断性(相互制约性 - 相互制约性 传来的结果,然后才执行(如打印模块等待 计算模块完成)。走走停停。 2) 失去封闭性 :多个程序共享系统中的各种资源, 因而这些资源的状态将由多个程序来改变, 致使程序的运行已失去了封闭性。 结果是一个程序运行时会受到另一个程序的 结果是 影响。 3) 不可再现性 :程序在并发执行时,由于失去了封 闭性,也将导致失去其可再现性
第二பைடு நூலகம் 进 程 管 理
新进程
接纳
就绪 时间片完 I/O完成 进程调度
阻塞 I/O请求
执行
完成
结束
图 2-5 进程的三种基本状态及其转换
(教材讲5种)
第二章 进 程 管 理
作业调度
作业后备队列
阻塞队列
外存
进程就绪队列
一些 阻塞队列
内存
处理器 (CPU)
第二章 进 程 管 理
3.7五状态 五状态进程模型 五状态
第二章 进 程 管 理
3.4进程与程序的区别 进程与程序的区别
程序是静态的, 1)程序是静态的 进程是动态的; 是根本区别) 1)程序是静态的,进程是动态的;(是根本区别) 程序是有序代码的集合;进程是程序的执行。 程序是有序代码的集合;进程是程序的执行。 2)进程和程序不是一一对应的 2)进程和程序不是一一对应的 ; • 一个程序可对应多个进程 即多个进程可执行同一程序 ; 一个程序可对应多个进程,即多个进程可执行同一程序 • 一个进程可以执行一个或几个程序 3)进程是暂时的 程序的永久的:进程是一个状态变化的过程, 进程是暂时的, 3)进程是暂时的,程序的永久的:进程是一个状态变化的过程, 程序可长久保存。 程序可长久保存。 4)进程与程序的组成不同 进程的组成包括程序、 进程与程序的组成不同: 4)进程与程序的组成不同:进程的组成包括程序、数据和进程 控制块(即进程状态信息)。 控制块(即进程状态信息)。 5)进程具有创建其他进程的功能 而程序没有。 进程具有创建其他进程的功能, 5)进程具有创建其他进程的功能,而程序没有。
操作系统课件_04-2进程及进程管理
上锁原语; 临界区; 开锁原语;
上锁原语:
1.考察锁位的值; 2.若原来的值是为“0”,将锁位 置为“1”(占用该资源); 3.若原来值是为“1”,(该资源 已被别人占用),则转到1。 开锁原语: 进程使用完资源后,将锁位置为 “0”,称为开锁操作。
22
(1)上锁原语
算法 lock
(2)开锁原语
同步例1:病人就诊的例子
看病进程: 化验进程:
…
要病人去化验; … 唤 醒 后 等化验结果; … 继续诊病; 等待 等待
…
等要化验的病人; … 进行化验; 开出化验单; … 唤 醒 后
同步例2:
两位同学约好星 期天去西湖,早 上 8:00 在 校 门 口 , 不见不散。
当一个同学先来到 校门口,要等另一 个同学,到齐后一 道打的去东湖
改进的lock和unlock算法
用上锁原语和开锁原语实现进程互斥
进程A 上锁原语 进程B 上锁原语
进入临界区CSa
开锁原语
进入临界区CSb
开锁原语
注:由于上锁和开锁操作具有不可分割
情况B为 x = 10+1
第二种同步机构——信号灯
信号灯可看作是一种广义的锁,它的结构是一个 二元组(s,q)。其中:s是一个初值≥0的整型变 量,表示同一类资源中,可用的资源数。q 表示 需要该资源的进程等待队列,初始状态为空。 由于每个 s都对应于一个 q,因此在实用中通常 将 q 省略,直接将 s称为信号灯。
32
(一)用上锁原语和开锁原语实现进程互斥
进程A 上锁原语 进程B 上锁原语
进入临界区CSa
开锁原语
进入临界区CSb
开锁原语
注:由于上锁和开锁操作具有不可分割
计算机操作系统课件第2章 进程管理
进程的三种基本状态
就绪状态 执行状态 阻塞状态
万事俱备,就差CPU
正在CPU上运行 等待事件,无法运行
新状态和终止状态
新状态是一个进程刚刚建立,但还未 进入就绪队列的状态; 终止状态是当一个进程已经正常或异 常结束,OS已经将它从就绪队列中 移出,但尚未被撤销时的状态; 在进程管理中,新状态和终止状态是 非常有用的。
进程激活的过程
系统利用激活原语active( )将指定进程 激活; 静止就绪→活动就绪 静止阻塞→活动阻塞
进程同步
进程同步的主要任务,是使并发执行的多个 进程之间能有效地共享资源和互相合作,从而使 程序的执行具有可再现性。
进程间存在的两种关系
资源共享关系 互相合作关系
临界资源与临界区
临界资源:一次仅允许一个进程使用 的共享资源,如打印机、磁带机、共 享变量等 临界区:在每个进程中访问临界资源 的那段程序,简称CS区
生产者—消费者举例
1
······
out指针
in指针
n
设置整型变量counter,记录可以消 费的消息数。设它的初值为5。
执行举例
P1: register1=counter;
C1: register2=counter;
P2: register1=register1+1; C2: register2=register2-1;
信号量机制
1965年,荷兰计算机学家Dijkstra 提出了一种卓有成效的进程同步工具— —信号量机制。在应用中,信号量机制 又发展为信号量集机制,现在已被广泛 应用于单处理机和多处理机以及计算机 网络中。
整型信号量
Dijkstra最初将信号量定义为依个整 型量,除初始化外,只能通过两个标准 原子操作wait(s)和signal(s)来访问。这 两个操作被称为P、V操作。可描述为: wait(s): while s≤0 do no_op;
操作系统复习资料全第二章 进程管理(3)-经典同步问题
信号量S的值除初始化(为资源数目)外,其值只能通过原
语wait和signal,也称P、V操作来改变。
整型信号量的P、V操作描述
wait和signal
wait(S): while S≤0 do no-op S∶=S-1; signal(S): S∶=S+1; 解释:P或wait操作:当S≤0时,说明无资源可用,一直测试直到其他进程 释放该类资源。
1. 至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少 有一位哲学家能够进餐。(增加一个总资源信号量S=4)
2. 仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐 (AND型信号量)。
3. 规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子; 而偶数号哲学家则相反。按此规定,将是1、 2号哲学家竞争1号 筷子;3、4号哲学家竞争3号筷子。即五位哲学家都先竞争奇数 号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家 能获得两只筷子而进餐。
1. 利用记录型信号量解决读者 为实现Reader与Writer进程间在读或写时的互斥而设置了一个互 斥信号量Wmutex; 设置一个整型变量Readcount表示正在读的进程数目; 当 Readcount=0 时,表示尚无 Reader 进程在读时, Reader 进 程才需要执行 Wait(Wmutex) 操作。若 wait(Wmutex) 操作成功, 做Readcount+1和读文件操作; 当Reader进程在执行了Readcount减1操作后其值为0时,才须 执行signal(Wmutex)操作,以便让Writer进程写; 又因为Readcount是一个可被多个 Reader进程访问的临界资源, 因此,应该为它设置一个互斥信号量rmutex。
计算机操作系统_02进程管理
第二章 进 程 管 理 3) 并发性 这是指多个进程实体同存于内存中,且能在一段时间内 同时运行。并发性是进程的重要特征,同时也成为 OS 的重要 特征。引入进程的目的也正是为了使其进程实体能和其它进 程实体并发执行;而程序(没有建立PCB)是不能并发执行的。
4) 独立性
在传统的OS中,独立性是指进程实体是一个能独立运行、 独立分配资源和独立接受调度的基本单位。凡未建立PCB的程 序都不能作为一个独立的单位参与运行。
第二章 进 程 管 理
就绪 时间片完 I/O 完成 进程调度
阻塞
I/O 请求
执行
图2-5 进程的三种基本状态及其转换
第二章 进 程 管 理 3. 挂起状态 1) 引入挂起状态的原因
在不少系统中进程只有上述三种状态,但在另一些系统中,
又增加了一些新状态,最重要的是挂起状态。引入挂起状态的 原因有: (1) 终端用户的请求。当终端用户在自己的程序运行期间 发现有可疑问题时,希望暂时使自己的程序静止下来。亦即,
第二章 进 程 管 理 (1) N:=N+1在Print(N)和N:=0之前,此时得到的N值分 别为n+1,n+1,0。
(2) N:=N+1在Print(N)和N:=0之后,此时得到的N值分 别为n,0,1。
(3) N:=N+1在Print(N)和N:=0之间,此时得到的N值分 别为n,n+1,0。 上述情况说明,程序在并发执行时,由于失去了封闭性, 其计算结果已与并发程序的执行速度有关,从而使程序的执 行失去了可再现性,亦即,程序经过多次执行后,虽然它们 执行时的环境和初始条件相同,但得到的结果却各不相同。
第二章 进 程 管 理 2) 动态性 进程的实质是进程实体的一次执行过程,因此,动态性是 进程的最基本的特征。动态性还表现在:“它由创建而产生, 由调度而执行,由撤消而消亡”。可见,进程实体有一定的生
操作系统2 进程管理
进程的挂起状态(从内存交换到外存) 进程的激活状态(从外存交换到内存)
新建
内存活动
空间
运行
时间 片到
调度
终止
等待事件 发生如 等待I/O
完成
接纳 就绪 事件发生 等待
如I/O完成
接纳
挂起
激活(内存有空间)挂起
激活(内存有空间)
外存 就绪
事件发生 如I/O完成
外存 等待
外存活动 空间
具有挂起状态的进程状态转换图
进程控制块的组织:
2.2.3 进程的阻塞与唤醒
1. 引起进程阻塞和唤醒的事件
1) 请求系统服务 2) 启动某种操作 3) 4)
2. 进程阻塞过程
进程调用阻塞原语block(), 把自己阻塞。它是进程自身的 一种主动行为。
然后,PCB中的状态由“执行”改为阻塞,并将PCB插 入阻塞队列。
最后,转调度程序将处理机分配给另一就绪进程,并进 行切换.
2)把该进程的PCB复制到某指定的内存区域。 3)若被挂起的进程正在执行,则转向调度程序重新调度。
2. 进程的激活过程
系统用原语active( )将指定进程激活。
执行过程是:
1)先将进程从外存调入内存,静止就绪改为活动就绪; 静止阻塞改为活动阻塞。
2)假如采用的是抢占调度策略,则每当有新进程进入 就绪队列时,应检查是否要进行重新调度,即由调度程 序将被激活进程与当前进程进行优先级的比较,如果被 激活进程的优先级更低,就不必重新调度;否则,立即 剥夺当前进程的运行,把处理机分配给刚被激活的进程。
整个系统效率得 以提高。
下一 步
吞吐率:1/8Δt = 0.125道程序/Δt
A
0 Δt 1
《操作系统》课件02 进程管理
第二进章程管进理 程 管 理
❖ 2. 进程的三种基本状态 ٭就绪状态 ٭执行状态 ٭阻塞状态
I/O完成
就绪
时间片完
进程调度
阻塞
I/O请求
执行
进程的三种基本状态及其转换
第二进章程管进理 程 管 理
❖ 3. 挂起状态(被换出内存的状态)
٭引入原因 ▪ 终端用户请求 ▪ 父进程请求 ▪ 负荷调节需要 ▪ 操作系统需要
第二进章程管进理 程 管 理
第二章 进程管理
2.1 进程的基本概念 2.2 进程控制 2.3 进程同步 2.4 经典进程的同步问题 2.5 进程通信 2.6 线程 的基本概念 2.7 线程的实现
第二进章程管进理 程 管 理
2.1 进程的基本概念
2.1.1 前驱图的定义 2.1.2 程序的顺序执行 2.1.3 程序的并发执行 2.1.4 进程的定义与特征 2.1.5 进程控制块
❖ 2.进程控制块中的信息 ٭标识、处理机状态,进 程调度信息,进程控制 信息
pid 进程状态
现场 优先级 阻塞原因 程序地址 同步机制 资源清单 链接指针
第二进章程管进理 程 管 理
❖ 3.PCB的组织 ٭链接
执行指针 就绪队列指针 阻塞队列指针 空闲队列指针
以静态形式给出
PCB1 4 PCB2 3 PCB3 0 PCB4 8 PCB5 PCB6 7 PCB7 9 PCB8 0 PCB9 1
❖ n++;在printf(n);和n=0;之后,则n值分别 为5,0,1.
❖ n++;在printf(n);和n=0;之间,则n值分别 为5,6,0.
操作系统课件进程及进程管理
3.1 进程的引入
3-1-4 多道程序设计
➢ 定义 在采用多道程序设计的计算机系统中,允许多个程序同时进
入一个计算机系统的主存储器并运行,这种让多个程序同时进 入计算机计算的方法称为多道程序设计。 ➢ 目的
提高处理器的效率,从而提高整个系统的效率 ➢ 必须解决的问题
中断处理、进程管理、资源管理中的基本操作 ➢ 原子操作
所谓原子操作是指:一个操作中的所有动作,要么全做,要么全不做。 换言之,原子操作是一个不可分割的操作
3.2 进程
▪ 进程的创建
➢ 进程图 -进程图是用于描述进程家族关系的有向树 -子进程可以继承父进程所拥有的资源,当子进程撤销时,应将从父进程
那里获得的资源归还给父进程;在撤销父进程时,也必须同时撤销其所有的 子进程 ➢ 引起创建进程的事件
再按新进程的PCB中的处理机状态设置CPU环境 ➢ 进程唤醒过程
调用唤醒原语wakeup( )将等待该事件的进程唤醒 -把被阻塞进程从等待该事件的阻塞队列中移出 -将其PCB中的现行状态由“阻塞”改为“就绪” -然后再将该进程插入到就绪队列中
3.2 进程
▪ 进程的挂起与激活
➢ 进程的挂起过程 当出现了引起进程挂起的事件时,系统就利用挂起原语suspend( )将指
态,亦即进程的执行受到阻塞,故称这种状态为阻塞状态,有时也称为“等 待”状态或“睡眠”状态。 ▪ 进程状态的转换
- 就绪→执行状态 处于就绪状态的进程,当进程调度为之分配了处理机后 - 执行→阻塞状态 正在执行的进程因发生某种事件而 无法执行 - 执行→就绪状态 正在执行的进程如因时间片用完或 一个优先权高的进程到来而被暂停执行 - 阻塞→就绪状态 处于阻塞状态的进程,其等待的事件已经发生
操作系统原理第二章进程管理
CUIT 叶斌
04:21
2.3 进程状态及其控制
一个状态转换和进程转换的例子
进程B
中断处理
I/O驱动 进程A
操
作
I/O中断
系
统
|
进
程
管
理
现场保护
中断处理 A就绪 调度,恢 复A现场
现场保护 和阻塞A
启动I/O
调度,恢 复B现场
27
注:红色表示处于“管态”
CUIT 叶斌
I/O
退出 (收回 资源, 调度)
1、请求系统服务
2、启动某种操作
操
作
3、数据尚未到达
CUIT 叶斌
04:21
2.2 进程的概念
进程的组成(进程上下文)
PCB
程序
操 作
数据
系 统
进程控制块PCB
| 进
描述信息
程
控制信息
管 理
资源管理信息
CPU现场保护:对CPU的处理
18
CUIT 叶斌
04:21
2.2 进程的概念
PCB的组织方式
链接方式
将具有相同状态的PCB,用其中的链接
程
管
insert (RL, i);
理
}
31
CUIT 叶斌
04:21
进程的终止
进程终止的事件
正常结束:Holt指令(引发中断)
异常结束:
操
越界错误
作
保护错
系
非法指令错
统 |
特权指令错
进
运行超时
程
等待超时
管 理
算术运算错
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验实验二进程管理学号姓名班级华侨大学电子工程系实验目的1、理解进程的概念,明确进程和程序的区别。
2、理解并发执行的实质。
3、掌握进程的创建、睡眠、撤销等进程控制方法。
实验内容与要求基本要求:用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。
实验报告内容1、进程、进程控制块等的基本原理。
进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。
为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。
进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下:由于多个程序并发执行,各程序需要轮流使用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("%d",&(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=%d",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:确定;0:不确定\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=%d",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**********************************\n"); //用户操作界面printf("\n**********************************\n");printf("\n***********进程演示系统***********\n");printf("\n 1.创建新的进程 2.查看运行进程\n");printf("\n 3.唤出某个进程 4.杀死某个进程\n");printf("\n 5.唤醒某个进程 6.查看内存状态\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;case 4: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。