操作系统两种执行态概念
操作系统分为用户态和核心态
1.核心态,属于系统核心级的,拥有调用系统组件的功能,进程在运行过程中,会执行系统调用的时候,会进入内核运行,此时就称为内核态
2.用户态,属于系统核心外的级别,进程执行自己的代码,也不会进行系统级别调用,就是用户态。
一、简介
线程在操作系统中分为用户线程和内核线程;
Java的线程基本都是用户线程;
内核线程与用户线程之间存在一定的关系,这种关系通常是3种:多对一模型、一对一模型、多对多模型。
二、模型介绍
1、多对一模型
多对一模型,又名用户级线程模型,就是多个用户线程对应到一个内核线程上,线程的创建、调度、同步的所有细节全部都交给用户空间线程库来处理。
优点:
1.用户线程的很多操作对内核来说都是透明的,不需要用户态和内核态的频繁切换,使线程的创建、调度、同步非常快;
缺点:
1.多个用户线程对应一个内核线程,如果其中一个线程阻塞,其他用户线程也无法执行;
2.内核不知道用户态用哪些线程,无法拥有内核线程一样的完整调度、优先级等
python使用的这种方案
2、一对一模型
一对一模型,又名内核级线程模型,就是一个用户现场对应一个内核线程,内核负责每个线程的调度,可以调度到其他处理器上面。
优点:实现简单
缺点:
1.对用户线程的大部分操作都会映射到内核线程上,引起用户态和内核态的频繁切换;
2.内核为每个线程都映射调度的实体,如果系统出现大量线程,会对系统性能有影响(频繁切换线程等);
Java使用的一对一线程模型
3、多对多模型
多对多模型,又叫两级线程模型,它吸收了前两种线程模型的优点,又尽量规避它们的缺点
这个模型的用户线程和内核线程是多对多的关系(m个用户线程和n个内核线程,通常m >= n)的映射模型
多用户线程可以绑定在多个内核线程中,但是一条用户同时只能绑定在一个内核线程上,
如果当前内核线程失去了CPU,其他用户线程可以绑定到其他内核线程上。
优点:
1.兼具多对一模型的轻量;
2.由于对应了多个内核线程,一个用户现场阻塞时候,其他用户线程仍然可以执行;
3.由于对应多个内核线程,则可以实现较完整的调度、优先级等;
缺点:
实现复杂!
Go语言使用这种方式
三、总结
1.线程分为用户线程和内核线程;
2.线程模型分为多对一模型、一对一模型、多对多模型;
3.操作系统一般只实现一对一模型;
4.Java使用一对一模型,他的所有线程均会对应自己的内核线程,调度全部由系统来处理;
5.Go使用多对多模型,高并发给力啊,详细看上面;
6.python使用多对一线程,优缺点也可以看看上面;