操作系统-线程

1 背景

自从20世纪60年代提出进程这个概念以来,在操作系统中一直都是以进程为运行的基本单位。直到20世纪80年代中期,人们才又提出了更小的能独立运行的基本单位线程。为什么要引入线程这个概念呢?主要是因为在实际的应用中,人们需要提出一种新的实体,这个实体必须满足两个特性:


1 各个实体间可以并发执行。

2 实体间可以共享相同的地址空间。就像在同一个进程内部的各个函数,共享该进程的地址空间一样。


对于进程而言,它只能满足第一个特性,不能满足第二个特性。因为对于不同的进程而言,它们的地址空间是相互独立的,在一个进程中分配的数据缓冲区,在其他的进程中是不能直接访问的。这样就无法实现进程之间的互相通信和数据共享。因此需要提供新的实体来替代进程,这种实体就是线程。



2 概念

有必要再对进程的概念做一个回顾,因为线程是从进程中发展出来的。我们从两个角度理解进程:


1 从资源组合的角度。进程把一组相关的资源组合起来,构成了一个资源平台,或者称为资源环境,其中包括地址空间(代码段、数据段)、打开的文件资源等。

2 从运行的角度。进程就是一个正在运行的程序,这是它的一个本质特征。根据这个角度可以把它看成是代码在这个资源平台上的一条执行流程(如山间的一条溪流一般),也就是线程。


原先资源平台和执行流程密不可分,常常把二者不作区分。但后来由于实际应用的需要,必须把这两者分隔开来,资源平台就是资源平台,代码的执行流程就称为线程这样就可以得到一个公式:进程=线程+资源平台。这样做的优点是:

1 在同一个进程中,即同一个资源平台中,可以同时存在多个线程。

2 可以用线程作为CPU的基本调度单位,使各个线程可以并发执行。

3 由于各个线程运行在相同的资源平台上,因此它们可以共享相同的地址空间,可以方便进行数据的共享和交流。



3 资源共享

既然线程是代码在进程的资源平台上的一条执行流程,那么是不是该平台的所有资源都能共享呢?答案是否定的。一个进程的资源以分为两部分来看:


1 共享资源。包括进程管理方面的大部分信息,如进程的标识符ID、优先级和状态等,存储管理方面的信息,如代码段、数据段、堆等,以及文件管理方面的信息,如打开的文件等。这些都是进程一级的资源。这些都是进程内部所有线程共享的内容,因此整个进程只有一份。例如一个线程中定义的全局变量,另一个线程中可以访问。在一个线程中打开的文件,在另一个线程中可以访问。


2 独享资源。主要是两个,即寄存器和栈。这部分的资源是线程独有的,每一个线程都有自己独立的一份,N个线程就有N份。


为什么寄存器资源是线程独享的呢?因为在线程运行过程中,它们是必不可少的硬件资源。每个线程在执行的时间都要用到CPU寄存器,而且每执行一条指令时,寄存器中的值很可能发生变化。例如在执行每条指令后,程序计数器PC的值肯定发生变化,程序状态字PSW的值也会发生变化。因此未来防止各个线程在并发执行时相互干扰,就需要把它们执行时CPU寄存器的值单独保存起来,即每一个线程都需要一组寄存器。


为什么栈资源也是线程独享的呢?因为在一个线程的内部,可能会包含多个函数,会出现函数调用。前面《操作系统-进程》一文中说明,在函数调用时需要在栈当中分配一段内存空间,即所谓的栈帧(stack frame)用来存放这次函数调用的形参和局部变量。林外在线程运行时,也需要用到独立的栈,用来保存运行上下文。因此在这种情况下,栈必须是独享的。



4 总结

A 进程是系统资源的分配单位,在没有出现线程这个概念之前,进程同时还是CPU的调度范围。但是在线程出现后,进程就只作为单位的分配单位,而线程作为CPU的调度单位。

B 进程拥有完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈。

C 线程同样具有就绪、阻塞、运行三种状态,适用于进程的状态转换,同样也适用于线程。

D线程能有效减少并发执行的时间和空间开销,被称为轻量级进程


本文内容摘录自清华大学出版社《操作系统》第二章节。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值