学习自
https://www.zhihu.com/question/19901763/answer/13299543
首先明确核心数和线程数的关系
4核8线程,就好比有4个运算核心,8个线程(intel研发出了1个核心可以运行2个线程)
单线程的cpu只开一个子线程,一个人在桌上吃饭
单线程的cpu开多个子线程,多个人在一张桌子上吃饭
多线程的cpu开多个子线程,多个人在多张桌子上吃饭
线程的引入可以解耦资源分配与执行调度。各个线程既可以共享进程资源,又可以独立调度。线程和进程的本质区别是线程是CPU调度的单位,进程是资源单位。
线程有3种实现方式
1.内核线程
由内核完成线程切换,内核会把任务映射到线程处理器上。每个内核线程可以视为内核的分身,这样操作系统就有单线程数“多开”的本领了。程序一般不直接使用内核线程,而是使用轻量级线程来和内核线程一对一。
2.用户线程
内核线程代价太高了,数量也是有限的。用户线程自己实现,创建、切换、调度,操作系统只负责把资源给到进程就可以了。这样的实现太复杂了。
3.两者混合实现
这样一来,用户线程的创建、切换操作依旧廉价。轻量级线程是用户线程和核心线程沟通的桥梁。
线程的调度
有同步方式
有时间片轮转调度
线程的几种状态
新建
启动了,运行
阻塞、等待(object.wait,thread.join,locksupport.park,epoll实现的进程睡眠)
结束
多线程使用中注意的问题
1.线程上下文切换的开销很大
2.死锁,比如Java的锁死锁了,比如数据库死锁了