操作系统-理解线程概念

在学习了进程的相关概念之后,这次引入了线程的概念。
从以下几点来讨论线程:

  1. 什么是线程
  2. 线程与进程(区别与联系)
  3. 线程的分类
  4. 线程的优缺点

什么是线程

首先要来看一张图,这张图在前面进程时画过很多次,就不再赘述了。
常规而言:一个pcb对应着一个虚拟地址空间,通过页表映射到物理内存中。
然后我们又知道,vfork出的子进程是共享地址空间的。
所以:假设我今天vfork出三个进程出来,意味着当前多出了三个pcb,与父进程映射至同一个虚拟地址空间。
操作系统-理解线程概念_第1张图片

那么:我就将上图中一个一个的pcb称为线程,整张图称为进程。
假设:我将父进程所拥有的资源平均分成四份,四个进程一人一份,大家都去执行一部分代码。但是地址空间只有一份,他们所处理事情所需的资源都来自于父进程的资源。所以这每一个pcb代表了一个执行流,每个执行流都在进程的地址空间中运行的。
所以每一个执行一部分代码的pcb就称为线程。

线程是指:在进程内部的一个执行流。
一切进程至少都有一个执行线程

线程与进程

两句话:
进程是系统分配资源的最小实体
线程是cpu调度的基本单位
说明:
就像上文所说,进程是指刚刚所画的那张图,也就是进程要包括若干pcb与地址空间,与一大堆的资源。也就是说,对于进程来说,资源是至关重要的。所以,进程承担起了操作系统中资源分配的最小实体。也就是说,在操作系统中,进程是竞争资源的最小单位。
而刚才我们也说了,真正去执行代码的是每一个进程内部的执行流,即就是线程,也就是每一个pcb,那么站在cpu的角度,它只能看到一个一个的pcb。意味着,cpu在调度时,是依据pcb来调度的,所以,线程是cpu调度的基本单位。
关键字记忆:
进程 资源
线程 调度 pcb

那么就会有一个问题;一个进程中的所有线程都共享该进程的所有共享资源吗?还是共享某一部分?共享那一部分?
一个进程的多个线程共享:

同一地址空间,代码与数据都是共享的,函数与全局变量都可以被各线程访问到。
文件描述符表
每种信号的处理方式
当前工作目录
用户id和组id

线程私有资源:

线程id
上下文
私有栈
errno
信号屏蔽字
调度优先级

线程的分类

线程可以分为两大类:用户级线程和内核级线程

在纯用户级线程中,管理线程的所有工作都由应用程序完成,内核意识不到线程的存在。任何应用程序都可使用线程库设计成多线程程序。线程库是管理用户级线程的一个例程包,它包含创建和销毁线程的代码,在线程间传递消息和数据的代码,调度线程执行的代码,以及保存和恢复线程上下文的代码。

在纯内核级线程中,管理线程的所有工作均有内核完成,应用级没有线程管理代码,只有一个到内核线程设施的API。

线程的优缺点

线程的优点:

  • 创建一个新线程的代价要比创建一个新进程代价小
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少得多
  • 线程占用的资源比进程少很多
  • 在等待慢速i/o操作结束的同时,程序可执行其他的运算任务。
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现。
  • i/o密集型应用,为了提高性能,将i/o操作重叠。线程可以等待不同的i/o操作。

线程的缺点:

  • 性能损失
  • 健壮性降低
  • 缺乏访问控制
  • 编程难度提高

你可能感兴趣的:(操作系统)