文章目录
动机
当多个程序的联系很紧密,需要共用很多内存空间一起完成功能时,进程间切换要切代码还要切换内存映射表,代价很大。能不能只进行代码切换而不切映射表呢?于是引出了线程的概念:不单独分配内存映射表但是可以允许CPU在其间来回切换的程序即是一个线程,它与别的线程公用一套内存映射表。
线程的切换
由线程的引出可以知道,线程的切换便是进程切换过程的指令切换。
要切出去需要为线程创建一个数据结构TCB(Thread control block)把自己当前执行状态保存下来。要能切回来则需要为每一个线程准备一个自己的栈。
所以切换需要切TCB和线程栈,而创建线程需要创建线程自己的TCB和栈,并将二者关联起来。
内核级线程
线程可以完成切换了,但是若线程在执行中进入计算即内核并且出错被阻塞了,它在错误修复在内核中执行完毕推出内核态之前一直被卡死,别的线程也如果需要它的资源也一直卡死,并发性没了(比如浏览器卡死不动多半就是这个原因)。
引入核心级线程的好处还有可以利用多个处理器充分利用起来实现真正的并行运行。(不进入内核操作系统不会为它分配核心)
进入内核要能正常运行也必须为它创建一个内核栈,所以只需要从一个TCB关联一个栈,两个栈之间切换扩展到一个TCB关联一套栈(用户栈和内核栈),在两套栈之间切换即可。
具体为:
进入内核必须要靠中断
中断进入后,万一要引发切换则需要先找到下一个要执行的TCB完成TCB切换