操作系统———深入理解进程和线程

Table of Contents

1.进程和线程的定义

2.进程和线程的区别

3.进程间的通信方式

4.线程间的通信方式

5.进程的底层实现

6.线程的底层实现

6.1操作系统实现线程主要有 3 种方式

6.2内核级线程

6.2用户级线程

6.3二者的对比

7.CPU对线程的调度方式


1.进程和线程的定义

进程:是执行中一段程序,一个程序被载入到内存中并准备执行,它就是一个进程,是系统进行资源分配和调度的一个基本单位。

线程:是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时被称为轻量级进程。

2.进程和线程的区别

3.进程间的通信方式

4.线程间的通信方式

5.进程的底层实现

6.线程的底层实现

        主流的操作系统都提供了线程的实现,注意这句话,谁实现的线程?是操作系统,实际上实现线程的老大哥,是运行在内核态的操作系统。

6.1操作系统实现线程主要有 3 种方式

  • 用户级线程(非主流)
  • 内核级线程(主流)
  • 用户级线程 + 内核级线程,混合实现(非主流)

6.2内核级线程

内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。每个内核线程可以视为内核的一个分身。

程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Light Weight Process,LWP),轻量级进程就是我们通常意义上所讲的线程,由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。这种轻量级进程与内核线程之间 1 : 1 的关系称为一对一的线程模型,如下图所示。

在这里插入图片描述
由于有内核线程的支持,每个轻量级进程都成为一个独立的调度单元,即使有一个轻量级进程在系统调用中阻塞了,也不会影响整个进程继续工作,但是轻量级进程具有它局限性,主要有如下两点

  • 线程的创建、销毁等操作,都需要进行系统调用,而系统调用的代价相对较高,需要在用户态和内核态之间来回切换。
  • 每个轻量级进程都需要有一个内核线程的支持,因此轻量级进程要消耗一定的内核资源(比如内核线程的栈空间),因此一个系统支持轻量级线程的数量是有限的。

6.2用户级线程

用户级线程的实现就是把整个线程实现部分放在用户空间中,内核对线程一无所知,内核看到的就是一个单线程进程。

对于线程的底层实现,现在很少有操作系统会使用单纯的用户级线程这中线程模型来实现。

注:对于实现的是用户级线程的操作系统而言,CPU 调度的基本单位看起来像是进程(因为在内核看来,这些进程都是单线程的,所以对单线程的调度就像是在调度进程一样)。

在这里插入图片描述

使用用户线程的优势在于不需要内核支援,劣势也在于没有内核的支援,所有的线程操作都需要用户程序自己处理。线程的创建、切换和调度都是需要考虑的问题。因而使用用户线程实现的程序都比较复杂,除了以前在不支持多线程的操作系统中的多线程程序与少数有特殊需求的程序外,现在使用用户线程的程序越来越少了。

6.3二者的对比

关于用户级线程和内核级线程这两种线程模型的对比,个人认为主要可以从调度、开销、性能这三个角度来看待。

  • 调度:对于用户级线程,操作系统内核不可感知,调度需要由开发者自己实现,内核级线程则与之相反,开发者可以做个甩手掌柜,将调度全权交由操作系统内核来完成。
  • 开销:在前面介绍用户级线程的优点时,也提到了,在用户空间创建线程的开销相比之下会比内核空间小很多。
  • 性能:用户级线程的切换发生在用户空间,这样的线程切换至少比陷入内核要快一个数量级,不需要陷入内核、不需要上下文切换、不需要对内存高速缓存进行刷新,这就使得线程调度非常快捷。

在早期的操作系统中有不支持线程的,都是使用用户线程来实现的,现在都支持线程了,大多数都使用轻量级进程去映射内核线程的手段来实现多线程技术,包括常见的 Windows 和 Linux 就这种一对一的线程模型。

 

7.CPU对线程的调度方式

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值