06核心级线程

  前面已经说了,由于操作系统感知不到用户级线程的存在,当某个用户级线程异常阻塞(页面故障)时会一直卡在那,无法调用其他线程,并且有些操作必须陷入内核,因此尽管内核级线程开销大,但仍然需要。实际上很多进程中既有用户级线程也有核心级线程,如下图所示

               

1 另外插一句:多核计算机真正意义上实现了内核级线程的并行(不同于切换),在此我们区分一下多处理器和多核
              

多处理器只是通过总线相联,而各个处理器的缓存和内存管理单元(MMU)是分离的,而多核是共享缓存和MMU的。我们回忆一下线程:线程就是进程内共享内存的“轻量级进程”。因此多处理器并不能支持同一进程内的多线程并行,而多核计算机,统一进程内的多线程可以分给不同的核同时执行,即并行。而在用户级线程中,由于核心只将处理器分配给进程,因此同一进程内的两个用户级线程不能分到两个处理器。

2 和用户级线程相比,核心级线程有什么不同?
 内核级线程的创建,管理(TCB),切换等都是由内核负责,而用户级线程的创建、切换等由用户设置。
在05节用户级线程中说到,用户级线程各有自己的一个栈存放状态信息,两个线程间的切换通过两个栈的切换完成。而内核级线程的切换是通过两套栈之间的切换完成的,即用户栈内核栈。如下图所示
 

对于用户来说,进程1和进程2的切换只能看到用户栈切换,内核是不可见的。实际上两个进程切换用户态和内核态的都有。过程如下:

1.用户栈和内核栈相关联:通过中断陷入内核时,将用户态的SS:SP压入内核栈,SS是栈的段地址,SP是栈的偏移地址,SS:SP指向栈顶。

2.通过中断线程1的用户栈切到内核栈

3.线程1通过Schedule调度算法调到线程2.由TCB1切到TCB2,完成线程的切换,这时内核里是线程2的用户栈

4.线程2通过iret指令,由内核栈切到用户栈

5.用户看到的是线程1的用户栈切到了线程2的用户栈

最后比较一下用户级线程和内核级线程

 

发布了12 篇原创文章 · 获赞 1 · 访问量 1495
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览