上一篇文章是操作系统的一个简述,这一篇文章就记录操作系统几个重要功能的详细内容。操作系统的功能主要是由4大功能:处理机管理,存储管理,设备管理,文件管理,作业管理。下面看看处理机管理。
处理机管理
上一篇文章说了,处理机管理我们可以就归结为进程管理。那么进程到底是啥子?和程序又有什么区别呢?
程序是完成特定功能而编排的指令集合的有序集合,是静态的,特点是顺序执行。但在多道系统中,由于存在多个独立的程序,他们对系统的资源即共享又竞争,程序不再以顺序方式执行,程序的顺序性,可再现行(不管怎么运行,都得到相同的结果),封闭性,与时间无关性,这些特点就没有了。这个时候,系统中的程序的执行方式也有了本质的变化,从顺序执行变成了并发执行。
并发与并行
注意并发就是时间上有重叠,一个程序没有结束另一个程序就可以开始。这个时候,处理机在内的系统资源不再由一道程序独占,而是由多道程序共享。宏观上是并行的特征,微观上肯定还有顺序行的。毕竟同一个时刻,只有一个事物处于活动状态。
并行就是同一时刻,两个事物均处于活动状态。
进程的概念
进程是操作系统最基本,最重要的概念。
进程是一个具有独立功能的程序关于某个数据集合的一次活动,是系统进行资源分配和调度的一个独立单位。两点:1.是程序的执行活动2.是资源调度的基本单位。
进程的组成
进程 = 程序+数据+进程控制块(PCB)
PCB的组织方式
(其实大多数的组织方式,不仅仅是PCB都是类似下面的这种情况)
- 线性表结构
- 链接表结构
- 索引表结构
线性表特点肯定就是:在一个连续的区域中,并且每次都要扫描整个线性表,增加了系统开销。适用于进程比较少的操作系统。
链接表,由于系统中的进程的总数量以及处于各种状态下的进程数量是动态变化的,为了便于管理,就把有些操作系统使用链表数据结构把处于相同状态进程中的PCB链接在一起,成为进程队列。
索引表结构是利用索引表记载各种状态进程的PCB地址,将线性表中相同的进程的PCB建立一个索引表,形成比如说就绪索引表,等待态索引表等。索引表中就绪索引表只有一个。注意这个图中为啥美欧运行指针的索引表呢?因为运行的时候只有一个进程,那就不需要建立一个索引表啦。
PCB的状态及其转换
这是重点,三种状态:
- 运行态:进程获得了处理机,注意处于裕兴状态的进程个数不能大于CPU的数目。对于单处理操作系统,任何时刻,正处于运行状态的进程最多一个。
- 就绪态:指进程已经具备了可以在处理机上运行的条件,但因为出理解已经被其他的进程占用而处于一种等待处理机的状态。
- 等待态:当一个处理机上运行的程序,因为等待某一个事情发生而不能继续运行,那么这个进程处于等待太,比如中途一个进程需要申请使用某种I/O设备。
当一个进程刚被创建的时候,处于就绪态。进程的转换图如下,看到这里的时候想一想下面的转换分别会发生在什么时候。
进程的控制
进程的控制室操作系统的底层功能之一,本身属于操作系统的内核,内核在执行操时候,往往是通过各种原语操作实现的。
原语
为了防止进程在执行过程中被其他的程序给打断,并且要保证程序执行的唯一性和数据结构的完整性,我们一如了原语的概念。一般的,把系统态下的执行的某些具有特定功能的程序段成为原语。
包括创建原语,撤销原语,阻塞原语,唤醒原语。
这里只看下进程创建原语的功能:
- 首先申请一个空闲的PCB,并指定唯一的进程标志号PID
- 为新进程分配资源。根据调用者提供的所需内存的大小,为新进程分配必要的内存空间,并且装入该进程的试题(程序和数据)
- 将新进程的PCB初始化
- 讲进程加入到就绪队列中
进程调度
在多道的系统中,往往进程数目多余处理机的数目,他们都要使用处理机运行自己的程序,所以处理机成为竞争的主要资源。
进程调度的方式
- 可剥夺调度方式
- 剥夺原则1:优先级原则
- 剥夺原则2:短进程优先原则
- 剥夺原则3:时间片原则
- 剥夺原则4:强制性剥夺(人工干预)
- 非可剥夺调度方式
这种方式又称为不可抢占式方式。这是指一旦把处理机分配给某个进程之后,则该进程一直占用处理机,只有当进程运行完毕或者等待某种外部原因而不能继续运行自动放弃处理机的情况下。系统才把处理机分配给其他的进程。
进程调度算法
- 先来先服务调度算法(不利于段作业,但算法实现简单)
- 优先数法(先按照某种原则赋一个优先级,又分为下面几种)
- 静态优先数法(创建的时候赋给一个优先数)
- 动态优先数法(根据进程的生命期动态变化)
- 时间片轮转法(一个进程占用一点)
注意这里的时间片轮转法,太长的话,就会变成先来先服务,太短的话,调度程序剥夺处理机次数增多,会导致切换次数太大,而且加重了系统开销。
进程的同步与互斥
一方面进程需要互相协作才能待到运行用户作业的目的,另外一个方面就还存在某种简介或者直接的制约关系。
临界资源,临界区:一次只能一个进程使用的资源成为临界资源。访问临界资源的程序段成为临界区。
进程的同步:进程为了完成那个某个共同的目标,必须相互合作的协同工作,有前后次序de直接制约关系,成为进程的同步。
进程的互斥:多个进程不能同时访问临界资源而产生的制约关系。
一个是合作,一个是竞争。我觉得可以这么理解。这个过程中又设计了PV操作和信号量。
信号量是由两个部分组成的:一个成员变量是信号量的值,整型,另一个是PCB的指针。
当信号量的值大于等于0时候,就是表示当前可用资源的实体个数。当它的值小于0的时候,就表示正在等待使用该资源的进程个数。即在信号量队列上排队的PCB的个数。
进程的通信机制
刚刚的同步和互斥是低级通信,有的时候如果我们需要交换大量的信息,这种方式就需要专门的通信机制来实现。我们把实现进程交换大量信息的通信方式成为高级通信。
两种方式:
- 直接通信(消息缓冲通信)过程是:发送进程在发送消息之前,先在内存中设置一个发送区,把要发送的消息正文还有进程名填入其中,然后发送消息程序。接收程序在读取消息之前,先在自己占用的内存空间中设置一个消息接受区,然后调用接收消息的程序。
- 间接通信(信箱通信)这个最大的好处就是发送进程和接受进程之间没有时间上的限制。想想为啥叫信箱。
进程和线程
线程是一个进程的实体,是CPU调度和分派到基本单位,是进程的一个执行单元。
进程是操作系统资源分配的基本单位。
我们把计算机中执行的程序成为线程,而不是程序。所谓线程,是进程中某个单一顺序的控制流
线程很轻,所以切换非常迅速,减少了系统的开销。
在引入线程的操作系统中,调度的基本单位是线程,而不是进程。真正在CPU上执行的是线程。
进程是抢占处理机的调度单位。拥有一个完整的虚拟地址空间。
刚刚看了一个多线程,单线程的理解,简单的就这么理解:
你早上上班,正要打卡的时候,手机响了。。你如果先接了电话,等接完了,在打卡,就是单线程。
如果你一手接电话,一手打卡。就是多线程。
2件事的结果是一样的。。你接了电话且打了卡。 —-来自网络
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。多线程的出现就是为了提高效率。同时它的出现也带来了一些问题。
总结
进程调度是操作系统最核心的部分,要掌握线程和进程的区别和联系。要知道进程的调度算法。要了解同步和互斥的关系。还要知道并发和并行的区别。