赞
踩
在操作系统中引入进程的目的,是为了使多个程序能并发执行,以提高资源的利用率和系统的吞吐量,那么在操作系统中再引入线程(mini进程),则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发行。本小节主要是学习以下内容
我们以软件生活中,常见的应用为例,我们要编写一个MP4的播放软件,其核心功能模块有以下三个:
方案存在的问题:
存在的问题
对于这三个进程,都是为了完成该软件的某一部分功能,但是功能与功能之间必须并发的执行,当切换进程,需要保存/恢复进程运行环境,还需要切换内存的地址空间,更新块表等开销,所以在进程内部增加了一类实体,这个实体就是线程(Thread),满足以下特性
我们在回过头去看刚才的例子,其处理过程如下图所示
一个进程可以包含多个线程,不同的线程之间可以执行不同的代码序列,例如,我们的读取视频数据,解码,播放分别为3个线程。引入线程后,线程是CPU调度的基本单位,也就是说现在CPU为各个线程服务。虽然引入了进程,但是进程依然是资源分配的基本单位,从属于统一进程的各个线程共享进程的资源。所以针对以下问题,就需要引入线程的概念
从上面可以看出,线程是进程的一部分,描述指令流执行状态,它是进程中的指令执行流的最小单元,是CPU调度的基本单位。
从上图可以看出,所以线程 = 进程 - 共享资源。线程的优点
线程的缺点:
进程 | 线程 |
进程是资源分配单位 | 线程是CPU调度单位 |
进程拥有一个完整的资源平台 | 线程只独占指令执行流执行的必要资源,如寄存器和栈 |
进程具有就绪、等待和运行三种基本状态和状态间的转换关系 | 线程具有就绪、等待和运行三种基本状态和状态间的转换关系 |
线程能减小并发执行时间和空间开销
用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全又库函数在用户空间完成,不需要内核的帮助。因此这种线程是极其低消耗和高效的。由于早期的操作系统(如早期的unix)只支持进程,不支持线程,但是的线程是由线程库实现的,我们还是以我们上面的播放软件为例:
从代码的角度,线程其实就是一段代码逻辑,上述三段代码逻辑可以看成三个“线程”。while循环就是一个最弱智的“线程库”,线程库完成了对于线程管理工作。很多 编程语言都提供了强大的线程库,可以实现线程的创建,调度,销毁等功能。对于用户线程我们需要解释以下问题
首先我们来看看用户线程的概念
用户线程是由应用程序通过线程库实现的,所有的线程管理工作都是由应用程序负责,包括线程的切换工作,也就是说
下面我们来看看用户线程的特征
用户线程的不足:
由内核通过系统调用实现的线程机制,由内核完成线程的创建、终止和管理
优点 | 缺点 |
当一个线程被阻塞,其他的线程还可以继续执行,并发能力强,多线程可以在多核处理器上并发执行 | 一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到内核态,因此管理的成本高,开销大 |
它是内核支持的用户线程,一个进程可有一个或多个轻量级进程,每个轻量级进程由一个单独的内核线程来支持(Solaris和Linux)
目前使用的三种主要线程库是:posix pthreads、Windows API、JAVA。pthreads作为POSIX标准的扩展,可以提供用户级和内核级的库,实现是在pthread在Linux的libc中实现。通常的libc是glibc-glibc pthreads实现称为NPTL,其源可在gitweb中获得ftp.gnu.org/gnu/glibc。
在支持内核级线程的系统上,根据用户级线程和内核级线程的映射关系,可以化为为以下几种多线程模型
一个用户级线程映射到一个内核级线程,每个用户进程有与用户线程同数据的内核线程
优点 缺点
当一个线程被阻塞后,别的线程还可以继续执行,并发能力强,多线程可以在多核处理器上并发执行 一个用户进程占用多个内核级线程,线程切换由操作系统内核完成,需要切换到内核态,因此管理的称根本较高,开销较大
多个用户级线程映射到一个内核级线程,且一个进程只被分配一个内核级线程
优点 缺点
用户级线程的切换在用户空间即可完成,不需要切换到内核态,线程的管理开销小,效率高 当一个用户级线程被阻塞,整个进程都会被阻塞,并发度不高,多个线程不可在多核处理机上并行运行
n个用户级线程映射到m个内核级线程(n >= m),每个用户进程对应m个内核级线程,这种方式克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点
用户级线程是“代码逻辑”的载体
内核级线程是“运行机会“的载体
内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中正在运行的代码逻辑都呗阻塞了,这个进程才会被阻塞
本章分析了为什么需要线程,其主要包括,同时也介绍了线程的基本概念和分类
看了一遍排在前面的答案,类似”进程是资源分配的最小单位,线程是CPU调度的最小单位“这样的回答感觉太抽象,都不太容易让人理解。
做个简单的比喻:进程=火车,线程=车厢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。