进程,线程,进程与线程

进程

  
进程的存在,是为了让多个程序可以并发执行。举个例子,意思就是,我想在编辑文档的时候,同时听听音乐。所以也可以类似于网上大多数资料的说法,一个进程,就代表一个程序。

这里就涉及到了一个问题,如何去描述不同的程序。这个问题的本质意义在于,程序在计算机中的存储形态都是一致的,如何对他们加以区分,使得可以界定他们为不同的程序。

为此,操作系统为每个进程,分配了一个专门的数据结构,PCB(Process Control Block),进程控制块。PCB完成了对进程资源的抽象,因此,当我们创建进程时相当于在创建PCB,在撤销进程时,相当于在撤销PCB。

到此,我们可以给出基于前述资料的一个新的进程定义,或者说程序的定义:程序段+数据段+对应PCB。也如书上所述:“进程,是进程实体的运行过程,始系统进行资源分配和调度的一个独立单位。”

说说PCB

PCB是用于对进程进行管理的数据结构。

进程控制块

一般来说,PCB的结构大体如上图所示,当然不同的操作系统会有自己的实现机制,但万变不离其宗,大都包含以下内容:

  1. 进程描述信息:
    • UID:用户标识符
    • PID:进程标识符
  2. 进程控制和管理信息:
    • 进程当前状态
    • 进程优先级
    • 代码运行入口地址
    • 程序的外村地址
    • 信号量的使用
  3. 资源分配清单:
    • 代码段指针
    • 数据段指针
    • 堆栈段指针
    • 文件描述符
    • 外接设备等
  4. 处理机相关
    • 各种寄存器值

第四条处理机相关的意义在于,当处理机在不同的进程之间切换时,对应的进程的PCB,要记录好当前处理器的各类寄存器值,以便在处理机重新处理该进程时,能从断点继续执行。

线程

 

随着多处理机系统的出现,为了充分利用计算资源,提高程序并发执行的速度,即引入了进程之后,又引入了线程的概念。

充分理解为什么引入线程

在单处理机系统时期,进程作为能拥有资源和独立调度的基本单位。到了多处理机系统时期,进程就显得太“重”,主要体现在以下几点:

  • 创建进程:分配资源,建立PCB
  • 撤销进程:收回资源,撤销PCB
  • 进程切换:保存当前运行环境,设置新选中进程的运行环境,花费处理机大量的时间

并且,进程作为独立调度的基本单位,有很多缺憾之处,比如一个文本处理软件,在输入文本的同时,却不能同时在屏幕上显示输入的内容,这在当今的应用环境下,是不能忍受的。

线程的基本特点

一般来说,线程有以下几个特点:

  • 一个进程中包含多个线程
  • 线程共享进程的资源

线程的实现

线程的种类,参考书上所述,有:

  1. 内核支持线程
  2. 用户级线程

每种线程有不同的实现方式方法,用户级线程因为可以做到部分与OS隔离,作为用户程序的一部分,所以被广泛使用,如java中的线程采用的就是第二种线程的内核控制线程实现方式。具体见相关书目。

事实上,线程的原理虽与进程不同,但其实现机制却与进程相似。进程采用PCB对进程进行控制,而线程采用TCB对线程进行控制。

线程的体现

为了更好的理解线程的意义,我们依旧用刚才的文本处理器举例子。

在刚才的例子中,讲到一个进程无法实现边输入文本,边在屏幕上输出文本。这是自然的,因为这两项工作不同,且都需要处理机时间,所以当一个任务执行时,另一个任务只能等待。

引入线程后,我们启动一个线程,负责处理文本输入,在启动另一个线程,负责文本输出。处理机的时间片,在两个线程间随机分配,关键点在于处理机的处理速度是飞快地,所以几乎给用户一种,输入文本的同时,文本就已经显示在屏幕上的感觉。

这便是线程的最基本应用。

线程与进程

 

每每提到进程,总会说到线程,而反之亦然。二者的关系,一定要认清。

学者们的智慧

刚才我们提到了进程的两个重要属性:

  1. 拥有资源
  2. 独立调度的基本单位

经过前文分析,我们也大概能了解,事实上,就是第二条属性,导致了进程太“重”。作为独立调度的基本单位,由内核直接管理,每次切换时,都要占用大量的处理机的宝贵时间。

而操作系统学者们的智慧就在于:

  • 线程成为了独立调度的基本单位
  • 进程拥有资源

如此一来,有点单一职责原则的味道,但是正是这种做法,大大提高了在多处理机情况下的程序运行速度。

其具体体现在于:当一个进程内并发时,无需消耗大量的处理机时间去切换上下文,线程由于不拥有资源(不由线程进行管理),所以只需要保存很少量的上下文,从而,提高了程序的并发执行速度。

老生常谈:区别

即使,是一个老话题,自己总结时,总归有一番收获。

调度基本单位的转换

在传统OS时期,进程作为独立调度的基本单位。而引入线程后,线程切换开销小的优势,其代价远小于进程,使其顺利成为了调度的基本单位。

并发性比较

不同于传统OS时期,仅进程之间能够并发。在引入线程后,进程的线程间可并发,进程间的线程间可并发,大大提高了系统资源的利用率,以及系统的吞吐量。

拥有资源

进程拥有资源,线程本身不拥有系统资源。如前文所述

独立性

进程之间独立性高,线程之间独立性很低。毕竟,一个进程的所有线程是共享该进程所拥有的资源和内存地址空间。

系统开销

无论是从创建,切换,撤销,进程的速度远远低于线程。在书上有一例子:Solaris 2 OS 中,线程创建比进程创建快30倍,线程切换,比进程切换,快5倍。

对多处理机支持

这里,要明确什么是调度基本单位。一个调度基本单位,意味着在执行时,占用一个处理机。所以在以传统OS下,无论多少处理机,进程都只能在一个处理机上执行。而引入线程后,便可将线程作为调度基本单位,将一个进程的多个线程,分配到不同处理机并发执行,其用时可想而知,要远远小于前者。

tips

 

  1. 如对文章内容有异议,望大家不吝赐教,不胜感激。
  2. 本文中所提到的“书”:《计算机操作系统(第四版)》-汤小丹等
  3. 转载请注明出处
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值