线程概念
在初学进程时,认为进程就是一个pcb,在linux下是一个task_struct结构体,是程序动态运行的描述,通过这个描述操作系统实现对程序运行的调度以及管理。
那线程是什么呢?
我们先通过一个比喻来区别进程与线程。
工厂中,至少有一个工人,工人是工厂中干活的人,工厂是集体资源的实体。实际上,工厂就是进程,工人就是线程。
理解起来,就是在一个进程中有一个或多个线程,每个线程都执行各自的任务。比如在程序中有多段代码,每个线程执行其中一段代码。但是对于系统内核来说,并没有线程这个说法,内核中只有轻量级进程(LWP),在用户态创建一个线程,相对应在内核中创建一个轻量级进程,所以线程也叫做用户态线程。
画图理解:
一个进程中可以有一个或多个线程,线程是进程中的一条执行流,负责进程中一段代码的运行调度。在linux下,线程是通过pcb实现的,一个进程中可以有多个pcb。 线程之间共用进程中的同一个虚拟地址空间,通过同一个页表来完成映射。
在Linux下PCB可以实现对程序的调度运行,所以可以将其作为一个执行流,实现线程。
线程概念:线程就是进程中的一条执行流,在linux下是通过pcb实现的,一个线程中可以有多个执行流pcb,这些pcb共享进程中的大部分资源(pcb共用进程中的同一页表和虚拟地址),相较于传统pcb较为轻量化,因此也被称作轻量级进程。
进程与线程的关键性区别:进程是系统进行资源分配的基本单位;线程是系统进行运行调度的基本单位
线程间的独有与共享
线程的独有:
- 标识符:唯一的标识符用来区分线程
- 栈:独有的函数调用栈,防止栈混乱
- 寄存器:其实就是pcb中的上下文数据、程序计数器等
- 信号屏蔽字:阻塞信号集合。信号会打断当前操作,但是这个线程不想被打断,就可以将这个信号阻塞,让其他线程去处理这个信号。
- errno: 由于同一个进程中可能有很多个线程在同时运行,可能某个线程进行系统调用后设置了errno值,而在该线程还没有处理这个错误,另外一个线程也进行系统调用设置errno值,这样错误值就有可能被修改。所以,不同的线程应该拥有自己的errno。
- 优先级:各有各的调度优先级
线程的共享:
- 虚拟地址空间:线程之间共享代码段和数据段
- IO信息
- 信号处理方式:信号是针对整个进程的,所以线程处理信号的方式都一样。哪个线程拿到时间片并且没有阻塞信号就去处理这个信号
- 工作路径
面试题:
面试中,关于进程概念以及线程概念的回答。
- 在最早学习进程的时候,认为进程就是一个pcb,在linux下是一个task_struct结构体,是程序运行的动态描述,通过这个描述操作系统实现对程序运行的调度以及管理。
- 在学习线程的时候,知道线程是进程中的一条执行流,是cpu调度的基本单位,linux中的实现线程执行流使用的是pcb,一个进程中可以包含多个线程(pcb),这些pcb共享进程中的大部分资源,相较于传统pcb较为轻量化,因此也被称为轻量化进程。也知道了,进程是系统进行资源分配的基本单位。