首先必须知道内核等概念
内核
内核的本质是一个软件,其作用是为了控制计算机资源如:控制磁盘IO、CPU资源等,提供上层程序的应用环境。
系统调用
就是一种不能再化简的系统操作,但是系统调用过于繁琐,因此封装了公用函数库供程序员使用,而shell是一种命令行工具,用来解释命令。
进程:
是代码静态指令的集合,进程是程序的动态执行过程的描述。为了避免某个任务过长占用资源,因此引入了pcb等概念让进程能够并发执行。进程的文章很多,这里不再赘述。
线程:
线程为什么会被引进,最早的进程都是内核中实现的,通过内核直接进行调度。
1)两个进程相互切换,既要保存进程状态和数据又要负责切换进程。
这两件事情使得进程的切换较为繁琐和沉重。因此引入线程,一个进程管理多个线程。进程只负责管理数据,每次系统切换时只需要进行线程的切换即可。
这些都是单核系统的情况下,线程的作用
2)时间回到线程没有被创造时,我们出现了多核cpu,支持了多个进程并行执行。如果只有一个进程,那么执行的时间依旧没有改变,也就是说多核提升了多个进程总任务的执行时间,但是没法提升单个进程的执行完其任务的时间。
因此, 我们提出线程的概念,假如多个cpu只有一个进程,我们将进程的多个执行操作分隔,交给每一个线程执行,每个cpu核心负责一个线程,也就是说线程成为了最小调度单元,内核只需要控制线程即可,多个cpu可以控制同意进程的多个线程加速操作,这样就算一个进程也可以充分利用多核的优势。
注意:这里所说的线程就是 内核线程 ,依然通过内核调用。如下图
这种概念虽然很好,可是需要对内核进行修改,而内核过于复杂,因此首先在用户程序的层次实现了线程的概念,通过一个线程管理器进行线程的管理,也就是 用户线程 。如下图:
我们发现用户线程仍然是通过单核心控制的。没法实现真正意义上的并行。并且当用户线程陷入系统调用,如执行IO等操作,依旧会阻塞当前进程。使得当前进程无法进行任何操作。因为内核是不知道用户线程的存在,它只知道进程的存在,当用户线程通知进程需要IO时,此时这个进程就会阻塞。
这确实是用户线程的问题,但是有点在于:切换用户线程不需要操作系统进行切换,避免了 状态转换 (因为内核的操作都是需要内核态的权限才能执行。而内核线程是在内核的实现,每次转换都需要切换至内核态级别执行才可以,而用户线程则不需要)。因此会快很多
用户态和内核态:
指的是两种cpu的运行级别,不同的级别对应着不同的权限,内核态级别最高,可以执行内核各种操作,而用户态则不行。这么做是为了安全性。
内核态用户态指的是级别 而 用户线程和内核线程指的是不同层面的线程实现 ,没什么直接关系。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。