进程
进程的存在,是为了让多个程序可以并发执行。举个例子,意思就是,我想在编辑文档的时候,同时听听音乐。所以也可以类似于网上大多数资料的说法,一个进程,就代表一个程序。
这里就涉及到了一个问题,如何去描述不同的程序。这个问题的本质意义在于,程序在计算机中的存储形态都是一致的,如何对他们加以区分,使得可以界定他们为不同的程序。
为此,操作系统为每个进程,分配了一个专门的数据结构,PCB(Process Control Block),进程控制块。PCB完成了对进程资源的抽象,因此,当我们创建进程时相当于在创建PCB,在撤销进程时,相当于在撤销PCB。
到此,我们可以给出基于前述资料的一个新的进程定义,或者说程序的定义:程序段+数据段+对应PCB。也如书上所述:“进程,是进程实体的运行过程,始系统进行资源分配和调度的一个独立单位。”
说说PCB
PCB是用于对进程进行管理的数据结构。
一般来说,PCB的结构大体如上图所示,当然不同的操作系统会有自己的实现机制,但万变不离其宗,大都包含以下内容:
- 进程描述信息:
- UID:用户标识符
- PID:进程标识符
- 进程控制和管理信息:
- 进程当前状态
- 进程优先级
- 代码运行入口地址
- 程序的外村地址
- 信号量的使用
- 资源分配清单:
- 代码段指针
- 数据段指针
- 堆栈段指针
- 文件描述符
- 外接设备等
- 处理机相关
- 各种寄存器值
第四条处理机相关的意义在于,当处理机在不同的进程之间切换时,对应的进程的PCB,要记录好当前处理器的各类寄存器值,以便在处理机重新处理该进程时,能从断点继续执行。
线程
随着多处理机系统的出现,为了充分利用计算资源,提高程序并发执行的速度,即引入了进程之后,又引入了线程的概念。
充分理解为什么引入线程
在单处理机系统时期,进程作为能拥有资源和独立调度的基本单位。到了多处理机系统时期,进程就显得太“重”,主要体现在以下几点:
- 创建进程:分配资源,建立PCB
- 撤销进程:收回资源,撤销PCB
- 进程切换:保存当前运行环境,设置新选中进程的运行环境,花费处理机大量的时间
并且,进程作为独立调度的基本单位,有很多缺憾之处,比如一个文本处理软件,在输入文本的同时,却不能同时在屏幕上显示输入的内容,这在当今的应用环境下,是不能忍受的。
线程的基本特点
一般来说,线程有以下几个特点:
- 一个进程中包含多个线程
- 线程共享进程的资源
线程的实现
线程的种类,参考书上所述,有:
- 内核支持线程
- 用户级线程
每种线程有不同的实现方式方法,用户级线程因为可以做到部分与OS隔离,作为用户程序的一部分,所以被广泛使用,如java中的线程采用的就是第二种线程的内核控制线程实现方式。具体见相关书目。
事实上,线程的原理虽与进程不同,但其实现机制却与进程相似。进程采用PCB对进程进行控制,而线程采用TCB对线程进行控制。
线程的体现
为了更好的理解线程的意义,我们依旧用刚才的文本处理器举例子。
在刚才的例子中,讲到一个进程无法实现边输入文本,边在屏幕上输出文本。这是自然的,因为这两项工作不同,且都需要处理机时间,所以当一个任务执行时,另一个任务只能等待。
引入线程后,我们启动一个线程,负责处理文本输入,在启动另一个线程,负责文本输出。处理机的时间片,在两个线程间随机分配,关键点在于处理机的处理速度是飞快地,所以几乎给用户一种,输入文本的同时,文本就已经显示在屏幕上的感觉。
这便是线程的最基本应用。
线程与进程
每每提到进程,总会说到线程,而反之亦然。二者的关系,一定要认清。
学者们的智慧
刚才我们提到了进程的两个重要属性:
- 拥有资源
- 独立调度的基本单位
经过前文分析,我们也大概能了解,事实上,就是第二条属性,导致了进程太“重”。作为独立调度的基本单位,由内核直接管理,每次切换时,都要占用大量的处理机的宝贵时间。
而操作系统学者们的智慧就在于:
- 线程成为了独立调度的基本单位
- 进程拥有资源
如此一来,有点单一职责原则的味道,但是正是这种做法,大大提高了在多处理机情况下的程序运行速度。
其具体体现在于:当一个进程内并发时,无需消耗大量的处理机时间去切换上下文,线程由于不拥有资源(不由线程进行管理),所以只需要保存很少量的上下文,从而,提高了程序的并发执行速度。
老生常谈:区别
即使,是一个老话题,自己总结时,总归有一番收获。
调度基本单位的转换
在传统OS时期,进程作为独立调度的基本单位。而引入线程后,线程切换开销小的优势,其代价远小于进程,使其顺利成为了调度的基本单位。
并发性比较
不同于传统OS时期,仅进程之间能够并发。在引入线程后,进程的线程间可并发,进程间的线程间可并发,大大提高了系统资源的利用率,以及系统的吞吐量。
拥有资源
进程拥有资源,线程本身不拥有系统资源。如前文所述。
独立性
进程之间独立性高,线程之间独立性很低。毕竟,一个进程的所有线程是共享该进程所拥有的资源和内存地址空间。
系统开销
无论是从创建,切换,撤销,进程的速度远远低于线程。在书上有一例子:Solaris 2 OS 中,线程创建比进程创建快30倍,线程切换,比进程切换,快5倍。
对多处理机支持
这里,要明确什么是调度基本单位。一个调度基本单位,意味着在执行时,占用一个处理机。所以在以传统OS下,无论多少处理机,进程都只能在一个处理机上执行。而引入线程后,便可将线程作为调度基本单位,将一个进程的多个线程,分配到不同处理机并发执行,其用时可想而知,要远远小于前者。
tips
- 如对文章内容有异议,望大家不吝赐教,不胜感激。
- 本文中所提到的“书”:《计算机操作系统(第四版)》-汤小丹等
- 转载请注明出处