操作系统第二章

先来看看什么是程序,程序就是一系列指令序列的集合

程序运行时,程序代码存放在内存中的程序段中,程序处理的数据(变量)放在数据段中

为了提高计算机资源的利用率,引入了多道程序技术。

引入多道技术后,内存中可以同时存放多个程序,系统为每个运行的程序配置一个PCB(进程控制块),用来描述进程的各种信息(如程序代码和数据放在哪里)

PCB,程序段,数据段 组成一个 进程实体。

而进程是程序的一次执行过程,是动态的。进程是系统进行资源分配和调度的一个独立单位,是资源分配的最小单位。

创建进程时新建PCB并分配PID,进程结束后撤销PCB。进程存在的唯一标志是PCB

PCB中应含有操作系统对其进行管理所需的各种信息

操作系统所需的所有信息都在PCB中

注意,当进程进程切换时,要把cpu寄存器中的状态保持起来,放在PCB中,以便切换回来能正常运行

----------------------------------------------------------------------------------------------------------------------

下面讨论进程的组织方式

分为链接方式和索引方式

链接方式:按照进程状态将PCB分为多个队列,操作系统持有指向各个队列的指针

索引方式:按照进程状态,分别建立索引表。操作系统持有指向各个索引表的指针

单核cpu中,同一时间只能有一个进程处于 运行态

对于阻塞态进程,可能根据不同的阻塞原因再细分为多个队列。(阻塞态进程的 代码段,数据段 仍然在内存中)

索引表中的每项是执向PCB的指针

进程和程序截然不同!!!

进程是程序的执行过程!是动态的

进程具有独立性(资源分配,调度的独立单位),并发性,异步性,结构性(PCB+程序段+代码段)

总结:

进程是进程实体的运行过程,是资源分配和调度的独立单位

PCB是进程存在的唯一标志

PCB中含有操作系统所需的关于进程的全部信息

-----------------------------------------------------------------------------------------------------------

进程的状态与转换

上面的,运行态 ---》阻塞态,是因为进程运行过程中发出I/O请求而得不到满足

就绪态什么都有,只差CPU

阻塞态:等待IO资源

--------------------------------

进程还有 创建态和终止态

若进程运行出现错误或者运行结束,需要撤销进程,回收已分配的资源,撤销PCB

进程状态转换的完整表示如下:

进程被创建后,处于就绪态,处于就绪态的进程可以被处理机调度而进入运行态,处于运行态的进程可能由于时间片用尽或被其它进程抢占处理机而进入就绪态。

阻塞态只能是运行态主动发出系统调用请求资源而进入的,就绪态的进程不能转为阻塞态。

阻塞态的进程得到资源分配后进入就绪态,不能直接进入运行态

运行态的进程运行结束或意外退出后进入终止态

-------------------------------------------------------------------------------------------------------------

进程间通信方式

三大类: 共享存储,消息传递,管道通信(内存缓冲区)

各进程的内存空间是相互独立的,一个进程不能访问另一个进程的内存空间。

但是进程间的相互通信是不可避免的

方案一  共享存储

为两个进程设立一个共享存储区,两个进程需要互斥(通过PV操作)的访问共享空间。

共享存储分为 基于数据结构 和 基于存储区 两种

基于数据结构:只能放固定数据结构的数据,速度慢,限制多,是一种低级通信方式

基于存储区:数据形式由进程控制,是高级通信方式

管道通信

管道通信只能使用半双工,一段时间内只能单向通信。管道就是内存中的缓冲区,缓存区未满时不能读数据,缓冲区未空不能写数据。当写入方将缓冲区写满后,读入方才能开始读,只有读入方将缓冲区读空以后,缓冲区才能重新被写入数据。

管道满时,写进程的write()调用将被阻塞,管道空时,读进程的read()调用将被阻塞

对于管道来说,两个读进程之间,两个写进程之间,读进程与写进程之间都是互斥的。

两个写进程可能会覆盖写入以及乱序写入

由于管道中的数据在读进程读取之后便丢失了(这与文件不同,文件读取不改变文件里的值),因此两个读进程一起读的话可能会导致错误(想读的已经被读走了,只能读不该读的了)

进程通信的第三种方式: 消息传递

进程间通过 “发送消息”、“接受消息”这两个 原语 来进行数据交换

类似与邮件,有一个消息信箱作为进程间消息的中转站,进程要先将消息发送到信箱中去,进程收到消息后将消息挂到消息队列上

消息类似于网络报文,分为消息头和消息体两部分。消息头包括 发送进程id,接受进程id,消息类型,消息长度等(和计网完全类似)

注意:

共享存储方式中,两个进程必须互斥的访问共享空间

管道通信方式,一个管道只能实现半双工通信,要想实现全双工通信,需要设置两个管道(两个缓冲区)

-----------------------------------------------------------------------------------------------------------

线程的引入

进程是伴随着多道程序技术而引入的

考虑QQ,可以同时聊天和视频和传送文件,这些功能显然不可能是程序按顺序执行能实现的

进程可能要同时做很多事,因此将进程分解为多个线程。现在,线程成为了程序执行流的最小单位,可进行线程调度。

 

通过引入线程,可以进一步提高并发度。进程只作为资源分配的最小单元,调度的最小单位是线程。

同一进程的线程,由于不需要切换进程环境,切换起来开销比进程间开销小的多。即并发带来的系统开销小

同一个进程的各线程可能在多个cpu核中运行

和进程一样,线程有它的TCB和ID,也有就绪,阻塞,运行三种状态

线程几乎不拥有系统资源,系统资源是分配给进程的,同一进程内的线程共享进程的资源

同一进程内的线程间切换,不用切换进程环境。

 

----------------------------------------------

线程分为 用户级线程 和 内核级线程(即守护线程)

用户级线程 由 应用程序 通过 线程库 创建和管理

用户级线程间的切换 也由 应用程序 负责管理(在用户态下就可以完成)

事实上,对用户来说,是有多个线程,但是对操作系统内核来说,并看不见线程的存在。

用户级线程只有用户能看到,操作系统根本看不到!!!

内核级线程 由操作系统负责管理

内核级线程的切换 需要在核心态下完成

内核级线程 就是 操作系统能看到的

注意: 内核级线程 才是 处理机分配的 单位

下图中的这个进程有三个用户级进程,两个内核级线程。但即使在一个四核CPU上,最多只能占用两个核,只能有两个用户线程并行执行。

多线程模型问题:

所谓多线程模型就是指 几个用户级线程映射到几个内核级线程的问题

 

多对一模式:多个用户线程映射到一个内核线程

优点:用户级线程 在 用户态 即可完成切换,开销小

缺点:并发度低,一个用户线程阻塞将导致整个进程阻塞。多个线程也不能在多处理机上运行

一对一模式:一个用户线程对应一个内核级线程

优点:并发度高,一个线程阻塞后其它线程可以继续执行

缺点:线程切换要在核心态下完成,开销大

 

多对多模式:

n个用户线程映射到m个内核线程(n>=m)

既克服了 多对一模型中并发度低的缺点,又克服了一对一模型中占用太多内核级线程的缺点

回顾:

线程是处理机调度的单位

内核级线程才是操作系统进行处理机分配的单位

多对一模型中,一个用户级线程阻塞将导致整个进程的阻塞

-------------------------------------------------------------------------------------------------------------

处理机调度

进程调度就是指,按照某种调度算法从就绪队列中选择某个进程执行它

进程调度分为作业调度(高级调度),内存调度(中级调度),进程调度(低级调度)

高级调度(作业调度):

作业调度指的是

  调入:按照某种算法,由操作系统将作业从外存的后备队列中挑选一个或多个,分配内存,在内存中建立PCB

 调出:作业调出时撤销PCB

作业调入和调出只发生一次

中级调度(内存调度): 将暂时不能运行的进程调度至内存外,等进程具备了条件后再次调入内存,这样可以提高内存利用率和系统吞吐量

注意,内存调度 调出的时候PCB仍然在内存中,PCB中会记录进程在外存中的存放位置

进程被调出内存后,进程的PCB放到挂起队列中(挂起态)

内存调度可能多次发生

由于挂起态(进程的内存调出)的引入,产生了新的进程状态模型

挂起态又可以分为就绪挂起和阻塞挂起

挂起态下,进程已经不在内存里(PCB常驻内存)  而阻塞态下进程并未离开内存

低级调度(进程调度):从就绪队列里选择一个进程进行执行

进程调度的频率最高

三类调度的对比如下:

其实高级调度(作业调度)  就是创建进程/撤销进程

 

------------------------------------------------------------------------------

什么时候需要调度呢?

主动:

1 当进程正常终止

2 当进程由于发生异常而终止

3 当进程主动发出I/O请求, 而产生阻塞

被动:

1 时间片用尽

2 CPU需要处理紧急事件,如I/O中断

3 有更高优先级的进程进入优先队列

以下过程不能进程进程调度:

1 处理中断过程中,中断处理很复杂

2 进程在操作系统内核程序临界区中(进程运行到了会访问 临界内核资源 的代码段),进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其他进程运行,以加快该共享数据的释放。否则可能引起死锁

3 原子操作,原子操作不能中断

注意,进程处于临界区时是可以进行处理机调度的!只有进程处于操作系统内核程序临界区时才是不能调度的!

进程调度可分为 非剥夺式调度(非抢占式调度) 和 剥夺式调度(抢占式调度)

进程切换时,要先将当前进程的状态信息(CPU中各种寄存器的状态)保持在PCB里,然后再加载要调入的进程的转态信息(从它的PCB里),然后才能运行

因此,进程调度是有代价的,过于频繁的切换将使得系统效率降低

进程调度是为了提高系统资源利用率而引入的,但是过于频繁的调度会降低系统效率

----------------------------------------------------------------------------------------------

CPU利用率:CPU忙碌时间/总时间

系统吞吐量:单位时间内完成作业的数量

周转时间:作业完成时刻 减去 作业提交时刻

包括等待作业调度,等待进程调度,执行,等待I/O完成 所有这些时间

周转时间相同,但是实际执行时间有的长,有的短,执行时间短的进程也等了这么久,心里难免不满意

引入 带权周转时间: 作业周转时间/作业实际运行时间 

带权周转时间必定大于等于1

周转时间相同,运行时间短的作业的带权周转时间更长

进程等待时间:进程建立之后的等待时间(注意等待IO完成的时间不属于等待时间,IO不可用而进入阻塞态属于等待时间)

作业等待时间:进程等待时间 加上 作业在外存后备队列中的等待时间

响应时间:用户提交请求 到 首次产生响应 所用的时间

-----------------------------------------------------------------------------------------------------------------------------

调度算法

先来先服务,即日常生活中的先来后到

这种调度算法对于短作业很不友好,短作业的带权周转时间将会很长

短作业优先: 追求最少的 平均等待时间,平均周转时间,带权平均周转时间

可以是抢占式(最短剩余时间),也可以是非抢占式

 

最短剩余时间算法: 每当有新的进程加入就绪队列,检查新的就绪态进程所需运行时间是否比目前执行的进程需要的剩余执行时间短,如果更短则切换进程

短作业优先调度算法的平均等待时间,平均周转时间很少(最短剩余时间调度算法的平均等待时间,平均周转时间最短!!)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值