【操作系统内核】线程
为什么需要线程
比如我要做一个视频播放器,就需要实现三个功能:
① 从磁盘读取视频数据
② 对读取到的视频数据进行解码
③ 对解码的数据进行播放
- 如果串行执行(通过一个进程来执行):
那么播放一会就需要等待数据从磁盘加载(读磁盘很慢,会使得这个进程阻塞,CPU空置),然后通过CPU解码,就会一卡一卡的
- 如果三个进程来执行,分别负责IO的读写、CPU解码以及播放
进程1读磁盘内容,然后传递给进程2解码,再传递给进程3播放,这样就产生了两个问题:
- 创建了三个进程,实现一个简单的功能却耗费过多的系统资源
- 进程间的内存空间不一致,数据时独立,进程之间传递数据,需要操作系统协调(频繁陷入内核)完成,效率低
线程解决进程开销大的问题
① 线程直接共享进程的所有资源 (比如 mm_struct),所以线程就变轻了,创建线程比创建进程要快到 10 ~ 100 倍
② 线程之间共享相同的地址空间 (mm_struct),这样利于线程之间数据高效的传输
③ 可以在一个进程中创建多个线程,实现程序的并发执行
什么是线程:进程中的一条执行流(函数调用链),用于执行不同路径的代码指令,每个进程一开始都有一个主线程
因此,进程可视为由两部分组成:资源平台(地址空间、磁盘、网络资源等)、线程
线程可访问的三类数据
线程共享mm_struct,所以其执行的代码指令是存放在进程地址空间的代码段中
- 线程栈
前文说了线程就是一条函数调用链,所以每个线程需要有自己私有的线程栈,存放在当前进程的堆中
而主线程(如main函数)的栈则使用进程的栈
线程栈从高地址向低地址生长
-
全局变量(读/写数据段)
-
线程私有变量
线程创建代码实例 pthread_create():
线程私有数据设置:
- 创建一个私有数据key:pthread_key_create(“key”)
- 设置私有数据:线程 1:pthread_setspecific(“key”, 22)
- 获取私有数据:线程 1:pthread_getspecific(“key”)