(P36)线程介绍
文章目录
多线程有多个控制序列,单线程只有一个控制序列
控制序列(指令序列)
进程的相关概念
程序:完成特定功能的一系列有序指令的集合,通过编译链接成:
可执行文件:称之为程序,代码段(指令)+数据段(指令操作的程序),保存在磁盘上
进程:程序的一次动态执行过程,代码段+数据段+堆栈段+PCB(进程控制块:进程运行状态(包括:就绪状态,运行状态,等待状态),进程上下文,进程执行的CPU状态,当前运行到哪个地址:IP指令指针+SP堆栈指针+寄存器状态)
进程 | 程序 |
动态的(在不断的推进的过程中,会更改数据段,产生一些临时的数据保存在堆栈段当中,且PCB的的状态也是不断发生改变的) | 静态的(保存在磁盘上,程序文件信息是不会改变的) |
短暂的(只是程序的一次动态执行过程) | 永久的 |
代码段+数据段+堆栈段+PCB | 代码段+数据段 |
一个进程只能对应一个程序(一个进程是一个程序的动态执行实例,一个程序可以运行多个实例,一个程序可以对应多个进程
进程数据结构:多个线程共享下面的信息
进程ID,uid,gid,有效uid,有效gid,cwd当前工作状态,地址空间Memory Map每个进程都有2^32=4GB 的地址空间(对于32位的机器而言),信号分发表Signal Dispatch Table处理信号,文件描述表File Descriptor(维护当前打开的文件),
不共享的信息如下:
CPU state(单线程只有一个,多线程有多个,保存执行程序所必要的信息):优先级Poriority,信号屏蔽字Signal Mask,寄存器Registers,内核堆栈Kernel Stack
IP指令指针+SP堆栈指针+通用寄存器等
线程的局部变量
每个线程都有一个errno
每个线程都有一个对信号的处理状态
一个进程若有2个线程构成,则这2个线程可能竞争到2个CPU
密集:一个线程可以等待多个不同的IO,I/O密集型占用IO,可以让出CPU
一个进程不会随意破坏其它进程的地址空间,因为他受到内存管理单元MMU的保护
进程与进程之间竞争CPU时间片,这个CPU时间片分享给各个进程的多个线程
KERNEL THREADS:实际上就是进程,系统中并未提供线程的支持
USER THREADS:表示线程
只要一个线程阻塞了,另外一个线程也不能工作了
操作系统对线程开始支持了
USER THREADS的2个用户线程,对应KERNEL THREADS核心的2个线程,这2个线程可以调度到2个CPU
结合了1:1和N:1线程的优势,因为轻量级进程LWP比核心线程的切换开销小,所以用户线程的切换开销更小,另外也充分利用了多核处理器的功能,因为轻量级进程可以调度到核心线程KERNEL THREAD,每个核心线程可以调度到CPU,因为可以充分利用到多核的功能;
当前的POSIX 线程就是N:M混合线程实现的
进程数据结构
轻量级进程的数据结构,用他调度到核心线程,因而这些轻量级进程(线程)共享进程的数据结构,但是他也有自己的CPU状态,调度到核心线程,从而调度到CPU