操作系统(四)-------进程的基本概念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/li12412414/article/details/60141278

主要内容:进程基本概念;进程状态及状态转换;进程控制块的作用和内容;进程控制操作;进程地址空间与进程映像;为什么引入线程?线程的应用场景;Web服务器的实现;线程概念、线程与进程的区别;线程实现的三种方式;Pthreads线程库及应用;几个重要的概念:原语、可再入程序。

操作系统原理的第三讲 进程/线程模型,这一讲主要有两部分内容 第一个是进程模型,什么是进程? 操作系统在设计进程模型的时候 主要考虑哪些问题? 第二部分是线程模型 为什么引入线程?操作系统在支持线程方面 都要做哪些工作?首先我们来介绍一下进程的基本概念 我们从多道程序设计技术这个概念入手道程序设计技术是操作系统最早引入的软件技术它的基本思想是,允许 多个程序同时进入内存并运行为什么要有这个技术呢? 主要是为了提高 CPU的利用率 进而提高整个系统的效率 我们来看一个例子 在第一张图当中 在内存里头呢,有四个程序 这四个程序呢是串形执行的,为什么呢? 因为我们只有一个物理的程序计数器,所以A 程序执行完了,B 程序才能执行 那么有了多道程序设计技术之后 就得到了这样一个场景 每个程序呢 变换成了一个独立的控制流,占用一个 逻辑的程序计数器 这也是操作系统虚拟性的一个体现 把一个物理的程序计数器,给它变换成多个 逻辑的程序计数器,实际上每个程序都有自己的程序计数器 那么由于物理上只有一个程序计数器,所以每个程序真正的上CPU 就把逻辑程序计数器的内容,推送到物理程序计数器里头 那么通过这种变换,达到了 在内存中同时有多个程序,他们又能够并发执行的效果 我们来看一下第三张图 第三张图呢,表示出在一个时间间隔内,每一个程序A B C D 都执行过了 那么由于只有一个物理CPU 所以这些程序呢 是轮流在CPU 上执行 但是呢 从宏观上讲呢 它们都在并发执行 因此,在这样一个计算环境下多个程序并发执行,就给我们带来了一个新的挑战 如何管理在并发环境下 同时执行的这些程序,那么我们来看一下什么是并发环境? 所谓并发环境就指的是在一段时间间隔内在物理机器上,有两个或者两个以上的程序 它们同时处于开始运行,但尚未 结束的状态,也就是说一个程序已经开始执行了,但另一个程序呢 也,接着开始执行第一个程序没有结束的时候,第二个程序又开始执行了 那么在这个并发环境下还有一个特征 也就是说这些程序它们谁先执行,谁后执行,它的次序是不确定的是没法预测的好,这就是说并发环境下 若干程序处于开始执行,但尚未结束的状态它们的次序是事先不确定的 那么在并发环境下执行的程序,我们就把它称之为并发程序 我们来看这就是几个并发程序的例子那么 A B并发,或者是 BA 并发 那么这两个程序呢,这两个例子当中呢,实际上它们都有一些交错的、 重叠的部分 那么像后面两个例子,大家可以看到A 执行完了,B 才执行 或者是B 执行完了A 才执行,由于这两个程序的执行顺序是不可预测的 所以呢 这两种情况都可能在系统中发生,所以我们也可以说A B 呢 并发执行 那么在一个并发环境下 执行的并发程序,我们怎么样来刻画这样的程序呢? 于是呢,进程的定义就应运而生了 什么是一个进程?进程这个概念实际上是非常重要 而且是非常伟大的概念,准确的刻画了一个并发环境下的,并行程序的执行 那么什么是一个进程呢?我们来看一下 进程是具有独立功能的程序 关于某个数据集合上的一次运行活动 进程呢 是资源分配的单位 也是 CPU 调度的单位,从这个描述当中 实际上我们看到了以下非常重要的几个特点首先进程是程序的一次执行过程 那么一个程序执行了两次,执行了三次那就是不同的进程 进程呢又是运行程序的一个抽象 它代表了所运行的那个环境,也就是它代表了一个 CPU因此我们有时候说进程是对 CPU的一个抽象 正是因为有了虚拟化技术,所以 将一个 CPU把它变换成多个虚拟的 CPU每个进程好像都在跑在自己的 CPU上 啊这就是一个抽象的结果,那么 作为进程,它在运行过程中,需要各种各样的资源 所以操作系统的资源是以进程为单位来分配的,比如说内存 文件等等。 最重要的一个资源呢,实际就是地址空间 操作系统为每一个进程分配了一个独立的地址空间 关于这个概念,我们后面还会非常详细的去介绍那么操作系统 CPU 的控制权,交给了某一个进程 让这个进程上去运行,那么这就称之为一个调度 所以操作系统通过调度把CPU 的控制权 交给某个进程 好,那么我们怎么知道这个系统中,到底有多少个进程在运行呢?我们可以通过 Windows 下,任务管理器或者是在 linux 下, PS命令,我们就大概知道系统中,有多少个进程在运行了那么在操作 系统的这个执行过程中,会有很多的程序向操作系统提出申请来运行,那么操作系统 怎么知道这些进程是存在,还是不存在呢? 这里头我们就介绍操作系统为了管理进程所设计的一个非常重要的数据结构,进程控制块 PCB 那么程控制块其实又有一些其他的名称,比如说进程描述符比如说进程属性,那么这个数据结构实际上是专门用于 控制和管理进程的,操作系统设计这个数据结构 保存控制和管理进程所需要的 所有的信息,所以它是一个专门的数据结构,也是非常重要的数据结构 那么这些数据结构里头,记录了什么信息呢?主要是记录了进程的各种属性 并且描述出进程的运动变化过程,因为进程不断的往前进所以它进展到什么程度了呢?也记录在这个数据结构里头 操作系统是通过这个数据结构 PCB 来管理控制进程的,因此这个数据结构 就是操作系统感知进程存在的一个标志 有一个进程存在,就有一个 PCB所以它们是一一对应的 那么操作系统管理了很多的进程为了便于管理,就把所有进程的每个进程的 PCB,把它 集中在一起,放在了内存的固定区域那么这就是形成了进程表,啊,也就是所有进程的 PCB 的一个集合,就是进程表 那么这个进程表呢,大小呢,往往是固定的就是它的大小,确定了在一个操作系统中,最多支持多少个进程那么有的时候我们会说,这就是操作系统的并发度 最多有多少个进程可以执行下面我们来讨论 PCB都应该包含什么内容呢我们让小明同学来做这样的设计 好,那我们来看看首先 要对进程有一些基本信息的描述 那么进程是运动变化的,所以呢,我们需要一些控制操作,需要一些控制信息进程在运行过程中需要用到资源,那么资源的使用情况,我们要记录下来,另外在进程控制块当中,还要保存 CPU的现场信息 下面我们从四类信息当中分别介绍第一类呢 是进程描述信息 比如说创建了一个新的进程,就要给这个进程一个标识,唯一的一个 ID就像每个学生有一个学号一样,它是唯一的,通常呢是一个整数 那么也可以给进程,它的谁创建这个进程的用户的信息记录在这里如果这个进程有 子进程,有父进程,或者兄弟姐妹进程呢,也可以把他们的进程的之间的关系记录下来那么进程的控制信息呢,主要包括当前进程处于什么样的状态,这个进程为了调度它的优先级是多少,进程在执行过程当中的代码执行的入口地址,或者是可执行文件在磁盘上的位置 另外进程呢,还有很多的队列,所以呢这里头有一些队列的指针啊,就所以进程控制信息是比较多的进程在使用过程中会用到 存储空间,会用到一些打开的文件这些信息呢,要记录在资源和使用的这个情况的这个 类里头。 那么 CPU的现场信息是指当进程不运行的时候 操作系统要把一些重要的信息,硬件 执行的状态信息,保存在这个 PCB 里头 那么这些信息呢,包括了一些通用寄存器 然后程序计数器、 栈指针、 程序状态字等等还有一个比较重要的就是 跟地址空间相关的一个页表的指针 好,这就是进程控制块应该包括的几类信息 我们也可以从另外一个角度来看 PCB 的内容 比如说如果是进程管理,它又用到哪些信息? 这里头很多项我们前面都介绍过了如果从存储管理 进程控制块里要保存什么信息?从文件管理进程控制块要保存什么信息? 所以这是从另外一个角度看,按不同的操作系统的功能 来分类说哪些信息应该保存在进程控制块当中 PCB实际上是一个通用的名字 啊,它表示了这个数据结构的主要的特征 但实际上在一个实际的操作系统当中 进程控制块的名字呢是不一样的,比如说在 Linux当中,进程控制块的名字呢就是 task_struck Widows 当中,进程控制块呢由几部分组成 EPROCESSKPROCESS PEB ,我们来简单地看一下 Linux操作系统当中的进程控制块 我们这里选取了 Linux 2.6.x版本 那么我们也不详细来介绍,大家可以看一下 一个实际操作系统进程控制块有哪些信息非常之多 一页都放不下,我们有两页 具体的内容呢,我们不做介绍,感兴趣的可以自己找到相关的材料去浏览一下 那么我们这里得举一个 SOLARIS 的进程控制块和进程表的例子 我们来看 SOLARIS 的进程表 因为SOLARIS 是基于Unix 操作系统的 所以它的进程控制块的名字呢,一般叫Proc 结构 每一个Proc 结构代表一个PCB 把所有的Proc 结构,把它组织成一个链,那么这就是一个进程表 我们看一个Proc 结构应该保存什么信息。 这里头呢我们重点介绍三个 首先呢,是第一个是 可执行文件,也就是通过这样一个记录信息,可以找到 这个进程所对应的可执行文件,在磁盘上的位置 第二个,进程的地址空间 进程的地址空间,怎么样把它记录在 进程控制块当中,或者叫做Proc 结构中,因为进程地址空间呢 放了很多内容,每一项内容都放在一段里头。 所以我们呢是通过段 来把进程地址空间,把它描述清楚的,那么把这些段呢 按照地址大小的顺序,把它 建立成一个AVL 树,那么便于以后的查找 这个以后我们还会去介绍,大家只知道说一个地址空间呢,啊,分成很多的段 每个段放了一些内容,那么怎么找到这些段呢,要通过一个AVL 树去找 另外呢,进程运行过程中,需要用到 文件,所以这里头呢,有一张表叫做打开文件表 通过这张表可以把所有打开的文件都能找到 我们

没有更多推荐了,返回首页