zoukankan      html  css  js  c++  java
  • linux0.11内核源码——用户级线程及内核级线程

    参考资料:哈工大操作系统mooc

    用户级线程

    1.每个进程执行时会有一套自己的内存映射表,即我们所谓的资源,当执行多进程时切换要切换这套内存映射表,即所谓的资源切换

    2.但是如果在这个进程中创建线程,共用一套资源,那么进行线程切换时,只要切换pc指针和栈指针esp即可,这样便省去了许多资源切换的操作

    即资源不变但切换指令序列

      例如,一个网页浏览器,需要有多个线程:一个线程用来从服务器接收数据 一个线程用来处理图片(如解压缩) 一个线程用来显示文本 一个线程用来显示图片

      但是这些线程完全可以共用一套资源,即:接收数据放在某地址处,显示时要读, 所有的文本、图片都显示在一个屏幕上

    那么这个浏览器的实现可能是这样的

     其中: yield函数用来进行线程之间的切换

        create函数就是要制造出第一次切 换时应该的样子

    我们让每个线程都有一个属于自己的栈,栈顶指针esp在线程控制块全局变量tcb中维护:

     这样程序在往下执行时就能通过yield来进行线程切换了,注意yield最后一句jmp 204应该去掉,因为yield函数返回时,esp已经切换过去了,cpu只要正常取指令执行即可

    然后我们来分析一个线程该有的资源:代码段,数据段,以及一个属于该线程的栈,栈顶指针esp维护着切换时要用的pc指针,还有一个tcb块,tcp.esp存的是这个线程自己的栈顶

     而create函数要做的有这几件事:

      1.在用户空间申请资源:申请栈空间,tcb块

      2.初始化线程对应的tcb:关联tcb和栈

    所以所有的代码实现就是

    内核级线程概览和用户级线程与内核级线程的区别

    现代多核计算机的样子

    内核级线程和用户级线程的图示

     用户级线程的缺点在于,硬件是看不到用户级线程的,因此当用户级线程所在的进程阻塞时,所有的用户级线程都会被阻塞

    因此需要引入内核级线程,来充分发挥多核计算机的优势

    内核级线程(进程)

    首先,和用户级线程相比,内核级线程的ThreadCreate是系统调用,内核管理TCB,内核负 责切换线程

    但是内核级线程必须和用户级线程相关联,才能完成从用户到内核的切换,因为执行的代码还在用户态,内核只是完成了线程的切换工作

    所以内核线程切换后,还要再切换回对应的用户线程

    关联方式:一个栈到一套栈;两个栈到两套栈

     具体方法:当用户态引发中断进入内核后,内核栈里保存了用户栈的栈指针ss:sp和指令指针cs:pc,然后返回时通过IRET函数进行出栈工作,让ss:sp和cs:ip再切换到对应的用户栈

    解决完用户栈和内核栈的绑定工作,然后开始进行内核态线程的切换工作:switch_to

     

    内核级线程切换的五个步骤

    1.从用户态->内核态(出发中断),这个步骤传给内核用户态的栈信息

     2.内核态线程被阻塞(时钟中断或读数据):进入调度算法,引发切换,这个ret返回的是父进程call下面的

     3.调度函数找到next,引发switch_to:这个ret在父子进程里都会返回

     4.switch_to函数内切换内核栈:这个ret只在子进程返回

     5.从切换过来的内核栈IRET至用户态:返回到子进程的用户态

    要注意的是,如果切换的不是线程而是进程,那么还要进行内存映射表的切换,此时只要在switch_to里增加地址映射表切换就可以

    对应的,create线程函数的实现方式:

      首先要在内核里申请一页空白页(这一个步骤对应用户态的malloc)

      然后是申请内核栈,把用户栈也放进去

      然后新建的tcb和内核栈绑定,处理线程的状态,加入到就绪队列里等待cpu调度就好啦!

    一些性能上的对比

    实际上,只要掌握了内核级线程的切换,内核级进程的切换和其极其相似,只是新增了一个映射表(所谓的资源)切换

  • 相关阅读:
    【5】TensorFlow光速入门-图片分类完整代码
    【4】TensorFlow光速入门-保存模型及加载模型并使用
    科研数据库结构
    高并发请求的缓存设计策略
    iOS-KVC的原理
    iOS-KVO的原理
    Kafka too many open files问题解决
    VLOOKUP函数-Excel
    arcgis sql 字符串替换
    ArcGIS矢量转栅格再发布切片服务,还是直接发布切片服务?有何区别?
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12035219.html
Copyright © 2011-2022 走看看