操作系统Linux我用 Linux

操作系统之进程管理

2017-12-29  本文已影响71人  紫霞等了至尊宝五百年

一、进程

1.1 多道程序设计

允许多个程序同时进入内存并运行,提高CPU的利用率,目的是提高系统效率


a图内存中有四个程序,串行执行,因为这里只有一个程序计数器。
当有了多道程序技术之后就得到了b图,每个程序各自独立的占用一个逻辑程序计数器,达到并发执行效果
从c图中可以看到多个程序是轮流执行的

1.2 并发环境与并发程序

并发环境指一段时间间隔内,单处理器上有两个或两个以上的程序同时处于开始运行但尚未结束的状态,并且次序不是事先确定的。在并发环境下执行的程序就是并发程序。

1.3 定义

进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位

特征

组成

①程序
描述进程要完成的功能
②数据集合
程序在执行时所需要的数据和工作区。
③程序控制块PCB
包含进程的描述信息和控制信息。它是进程存在的唯一标志。

1.4 进程控制块-PCB

1.4.1 PCB中需要保存的信息

1.4.2 换个角度看PCB的内容


说明:从上图中可以看到第一列是和进程管理相关的字段,第二列是存储管理的字段,第三列是文件管理的字段。

二、进程状态及状态转换

2.1 基本状态

2.2 进程的其他状态

2.3 五状态模型

2.4 七状态模型


2.5 Linux状态转换示意图


说明:这里使用fork()创建一个进程。浅度睡眠和深度睡眠不同在于前者在睡眠时会接收信号,而后者则不会。正在运行的程序可能因为调试断点可能出现一个暂停的状态。

三、进程队列

3.1 五状态进程模型的队列模型

四、进程控制

进程控制操作完成进程各状态之间的转换,由具有特定功能的原语(其实就是程序,只是这些程序不许与被中断)完成。

原语:完成某种特定功能的一段程序,具有不可分割性或不可中断性,即原语的执行必须是连续的,在执行过程中不允许被中断。又称原子操作。

4.1 创建

4.2 撤销

结束进程

4.3 阻塞

处于运行状态的进程,在其运行过程中期待某一事件发生,如等待键盘输入、等待磁盘数据传输完成、等待其他进程发送消息。当被等待的事件未发生时,由进程自己执行阻塞原语,使自己由运行态变为阻塞态。在UNIX中我们使用wait,在Windows中使用WaitForSingleObject

4.4 UNIX的几个进程控制操作

UNIXfork()实现:

五、深入理解

5.1 分类

5.2 进程层次结构

5.3 进程和程序的区别

5.4 进程的地址空间

操作系统为每个进程分配了一个地址空间



这个程序我们从命令行中输入数据,比如:

myval 7
myval 8

此时我们会发现虽然进程不同,但是打印出来的地址确实一样的。这里我们从进程地址空间来分析:


说明:上面的两个进程都有这样一个地址空间,也就是说这两个进程是在不同的地址空间上的相同的位置,所以虽然地址是一样的,但是实际上在实际内存中的地址是不一样的。

5.5 进程映像

对进程执行活动全过程的静态描述(快照)。由进程地址空间内容、硬件寄存器内容及与该进程相关的内核数据结构、内核栈组成

5.6 上下文切换

六、线程

6.1 引入

引入理由

6.1.1 应用的需要

我们看一个例子,一个web服务器的工作方式

可以看到每次从磁盘读取的时候进程都是暂停的,这样会导致性能低下,那如何提高服务器的工作效率?通常情况下是使用网页缓存,在没有线程情况下的两种解决方案

多线程的解决方式


说明:这是一个多线程的web服务器的工作方式,首先读取客户端的请求,之后由分派线程将各个任务分派给工作线程,这里还是采用了网页缓存

于是我们可以看到一个web服务器的实现有三种方式:

6.1.2 开销的考虑

6.1.3 性能的考虑

如果有多个处理器的话,一个进程就会有多个线程同时在执行了,这样可以极大的提高运行性能

6.2 线程的基本概念


属性

6.3 实现

一般有三种实现机制

6.3.1 用户级线程


线程是由运行时系统管理的,在内核中只有进程表。典型例子就是UNIX
POSIX线程库--PTHREAD

6.3.2 核心级线程

6.3.3 混合模型

6.4 线程状态(Java)

0)新建:创建后尚未启动
1)运行:包括了 OS 中 Running 和 Ready 状态,也就是处于此状态的线程可能正在运行,也可能正在等待 cpu 为它分配执行时间
2)无限期等待:处于这种状态的线程不会被分配 cpu 执行时间,要等待其他线程显示唤醒。以下方法会让线程进入无限期等待 :

3)有限期的等待:处于这种状态的线程也不会被分配 cpu 执行时间,不过无需等待被其他线程显示唤醒,而是在一定时间后,他们会由 OS 自动唤醒 1.设置了 timeout 的 object.wait() 方法 2. 设置了 timeout 参数的 Thread.join() 3.LockSupport.parkNanos()
4.LockSupport.parkUnit()
4) 阻塞:与"等待"的区别:

进程的通信类型

管程(Monitors,也称为监视器)

基本概念

一种程序结构,结构内的多个子程序(对象模块)形成的多个工作线程互斥访问共享资源。
这些共享资源一般是硬件设备或一群变量
管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计。

管程提供了一种机制,线程可以临时放弃互斥访问,等待某些条件得到满足后,重新获得执行权恢复它的互斥访问。

七、死锁

临界区管理的基本原则
①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。
②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
④如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。

1.1 定义

一组进程中,每个进程都无限等待被该组进程中另一进程所占用的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程

1.2 死锁的产生原因

资源数量有限、锁和信号量错误使用。

1.3 活锁和饥饿


说明:

1.4 产生死锁的必要条件

二、资源分配图(RAG:Resource Allocation Graph)

用有向图描述系统资源和进程的状态


2.1 资源分配图画法说明

2.2 死锁定理

2.3 资源分配图化简

化简步骤:

三、死锁预防

3.1 解决死锁的方法

3.2 死锁预防(Deadlock Prevention)(重点)

3.2.1 破坏“互斥使用/资源独占”条件

3.2.2 破坏“占有且等待”条件

3.2.3 破坏“不可抢占”条件

只适用于状态易于保存和恢复的对主存资源和处理器资源的分配适用于资源。如cpu和内存等。

3.2.4 破坏“循环等待”条件

存在下述严重问题:
限制了新类型设备的增加。
造成对资源的浪费。
必然会限制用户简单、自主地编程。

四、死锁避免

五、死锁避免算法:银行家算法

这是Dijkstra1965年提出的,是仿照银行发放贷款时采取的控制方式而设计的一种死锁避免算法。

(1)若Request[i] <= Need[i],转(2);否则,报错返回。

(2)若Request[i] <= Available,转(3);否则,报错返回。

(3)假设系统分配了资源,则有:

Available = Available - Request[i];
Allocation[i] = Allocation[i] + Request[i];
Need[i] = Need[i] = Request[i]
`</pre>

若系统新状态是安全的,则分配完成;若系统新状态是不安全的,则恢复原来状态,进程等待。

为了进行安全性检查,定义了数据结构:



安全性检查的步骤:

(1)`Work = Available; Finish = false;`

(2)寻找满足条件的`i`:
如果不存在,则转(4)
(3)

`Work = Work + Allocation[i] ;
转(2)

(4)若对所有i,Finish[i] == true,则系统处于安全状态,否则,系统处于不安全状态。

六、死锁检测与解除

6.1 一个简单的死锁检测算法

6.2 死锁的解除

发生死锁后重要的是以最小的代价恢复系统的运行。方法如下:




image.png
image.png image.png
image.png
image.png
image.png
上一篇 下一篇

猜你喜欢

热点阅读