线程的概念
其实可以理解为“更小”的进程。记住一句话,如果CPU可以进行线程的状态的切换,那么线程就是程序执行流的最小单位。
在一个进程中的线程,进程中的资源是共享的。
线程的实现方式和多线程模型
线程的实现方式分为两种:
1:用户级线程
2:内核级线程
用户级线程:即用户层面的可以看到的线程。
举个例子,QQ有视频聊天功能、文件传输功能、文字聊天功能。
那么我们可以抽象为三个while 循环。
线程1 while (true) { 视频聊天 }
线程2 while (true) { 文字聊天 }
线程3 while (true) { 文件传输 }
抽象成上述图。
很明显,CPU是不知道线程的存在,他只知道一个进程进入CPU运行。
由操作系统对其管理。
在切换另一个线程的时候,CPU不需要变态。
操作系统意识不到线程的存在。
优点:线程的切换效率高
缺点:当一个线程阻塞的时候,整个进程会被阻塞。
内核级线程:
1:内核级的线程由操作系统来管理
2:需要CPU进行状态的切换
3:操作系统自然就意识到线程的存在了
优点:
当一个线程阻塞的时候其他线程还可以运行
缺点:
一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
多线程模型:
多对一:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级 线程。
操作系统只看得见内核级的线程。
优点:用户级的线程可以在用户态进行切换,不需要进入内核态进行切换 ,提高程序执行的效率。
缺点:当用户级的线程被阻塞的时候,整个进程被阻塞。
多对多: n 用户及线程映射到 m 个内核级 线程(n >= m)。每个用户进程对应 m 个内核级线程。
克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用 户进程占用太多内核级线程,开销太大的缺点。可以这么理解:用户级线程是“代码逻辑”的载体内核级线程是“运行机会”的载体