##一、什么是线程
本文主要介绍linux下面的线程。在linux实际上没有线程的概念,实际是进程的变种,被称作轻量级进程(LWP)。线程通常由线程ID、指令指针、寄存器集合和堆栈组成。通常一个进程有多个线程组成,各个线程之间共享程序的内存空间和进程的资源(打开的文件和信号)。一个经典的进程和线程的关系。
二、线程的权限
线程可以访问进程内存里面的所有数据,甚至包括其他线程的堆栈,单实际线程也有自己的私有存储空间。
三、线程的调度和优先级
不论在多处理器还是单处理器上面,线程总数“并发”执行的。当线程数量小于处理器数量时,线程并发是真正的并发,反之,线程的并发是模拟出来的并发,操作系统会轮流执行多个线程,每个线程都有一个时间片运行,当时间片运行完,会运行下一个线程,由于速度很快,给人的感觉是多个线程并发执行。线程调度有三种状态:
运行:正在执行的线程
就绪:此时线程可以立即运行,但CPU被占用
等待:线程正在等待某一事件发生,无法执行
线程调度自多任务操作系统出现不断被提出线的方案和算法,最经典的是优先级调度和轮转法。轮转法是让各个线程轮流执行一小段时间。优先级调度是根据线程优先级来判断谁先执行,优先级越高,操作系统优先执行相应的现场。
在优先级调度下,可能存在饿死现象,一个线程被饿死,说他的优先级较低,在执行前,总是有高优先级的现场试图执行,所以这个低优先级的现场是在无法执行。为了避免饿死现象,调度系统会逐步提高等待时间过长的线程,这样一段时间最终这个线程会被执行。
四、linux多线程
linux内核并不存在真正意义的线程概念。linux将所有的执行实体都称为任务,每一个任务类似一个单线程的进程,具有内存空间、执行实体、文件资源等。不过,linux下不同的任务之间可以选择共享内存空间。共享同一内存空间的多个任务构成一个进程,这些任务也构成了进程里的现场。有下面几个方法创建一个新任务。
系统调用 | 作用 |
---|---|
fork | 复制当前进程 |
exec | 使用新的可执行镜像替换当前可执行镜像 |
clone | 创建子进程并从指定位置执行 |
五、线程安全
可以参考学习多线程同步方法:
https://blog.csdn.net/yangzai_0551/article/details/112801010
六、线程模型
大多数操作系统,都在内核理提供现场的支持,而用户使用的现场并不是内核现场,而是存在于用户态的用户现场,用户线程并不一定在操作系统内核理对应同等数控的内核线程,所有分下面三种模型:
1.一对一模型
一个用户现场对应一个内核使用的线程
2.多对一模型
3.多对多模型
具体可以参见:
https://kernel.blog.csdn.net/article/details/51892437