参考资料:哈工大操作系统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调度就好啦!

一些性能上的对比

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

linux0.11内核源码——用户级线程及内核级线程的更多相关文章

  1. 鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体? | 开篇致敬鸿蒙内核开发者 | v1.11

    子曰:"见贤思齐焉,见不贤而内自省也."<论语>:里仁篇 百篇博客系列篇.本篇为: v01.xx 鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体 | 51.c ...

  2. 鸿蒙内核源码分析(时间管理篇) | 谁是内核基本时间单位 | 百篇博客分析OpenHarmony源码 | v35.02

    百篇博客系列篇.本篇为: v35.xx 鸿蒙内核源码分析(时间管理篇) | 谁是内核基本时间单位 | 51.c.h .o 本篇说清楚时间概念 读本篇之前建议先读鸿蒙内核源码分析(总目录)其他篇. 时间 ...

  3. 鸿蒙内核源码分析(CPU篇) | 整个内核就是一个死循环 | 祝新的一年牛气冲天 ! | v32.02

    百篇博客系列篇.本篇为: v32.xx 鸿蒙内核源码分析(CPU篇) | 整个内核就是一个死循环 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...

  4. v75.01 鸿蒙内核源码分析(远程登录篇) | 内核如何接待远方的客人 | 百篇博客分析OpenHarmony源码

    子曰:"不学礼,无以立 ; 不学诗,无以言 " <论语>:季氏篇 百篇博客分析.本篇为: (远程登录篇) | 内核如何接待远方的客人 设备驱动相关篇为: v67.03 ...

  5. Linux内核源码分析之调度、内核线程模型 And Centos7.2's Kernel Resource Analysis

    本文分为概述.历史.el7.2代码架构图解三部分. 解决的问题: a.Kernel调度发展过程: b.以架构图的方式,详解el7.2具体调度实现.内核线程模型.调度时间片计算,以及探究整个Kernel ...

  6. 鸿蒙内核源码分析(线程概念篇) | 是谁在不停的折腾CPU? | 百篇博客分析OpenHarmony源码 | v21.06

    百篇博客系列篇.本篇为: v21.xx 鸿蒙内核源码分析(线程概念篇) | 是谁在不断的折腾CPU | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...

  7. 鸿蒙内核源码分析(并发并行篇) | 听过无数遍的两个概念 | 百篇博客分析OpenHarmony源码 | v25.01

    百篇博客系列篇.本篇为: v25.xx 鸿蒙内核源码分析(并发并行篇) | 听过无数遍的两个概念 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...

  8. 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 百篇博客分析OpenHarmony源码 | v5.05

    百篇博客系列篇.本篇为: v05.xx 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...

  9. 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 百篇博客分析OpenHarmony源码 | v4.05

    百篇博客系列篇.本篇为: v04.xx 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...

随机推荐

  1. centos7中没有service iptables save指令来保存防火墙规则

    1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 如果上述命令 ...

  2. Vagrant 手册之 Vagrantfile - SSH 设置 config.ssh

    原文地址 配置的命名空间:config.ssh config.ssh 中的设置与配置 Vagrant 如何通过 SSH 访问您的计算机相关. 大多数 Vagrant 设置一样,一般使用默认设置即可,但 ...

  3. jdk (Java Development Kit)

    JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具. JD ...

  4. Pikachu漏洞练习平台实验——越权漏洞(八)

    1.概述 由于没有对用户权限进行严格的判断 导致低权限的账号(比如普通用户)可以去完成高权限账号(比如超管)范围内的操作 水行越权:A用户和B用户属于同一级别用户,但各自不能操作对方个人信息.A用户如 ...

  5. [Linux] 015 用户管理命令

    1. 用户管理命令:useradd 命令名称:useradd 命令所在路径:/bin/sbin/useradd 执行权限:root 语法:useradd 用户名 功能描述:添加新用户 范例: $use ...

  6. LeetCode #237. Delete Node in a Linked List 删除链表中的节点

    https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ 非常巧妙的一道题. 题目没有给head,心想没有head我怎么才能找到要删 ...

  7. 部署Lighttpd到252板子

    1.先到lighttpd官网下载对应版本的软件包: 如: lighttpd-1.4.30.tar.gz 2. 将压缩包解压到任意目录得到文件夹 lighttpd-1.4.30 3. 执行配置命令:  ...

  8. Mata标签,og标签

    一.Mata标签 meta是用来在HTML文档中模拟HTTP协议的响应头报文,meta 标签用于网页的<head>与</head>中.meta 的属性有两种:name和http ...

  9. Windows 下 MySQL 备份脚本

    @title MySQL备份脚本 @echo off @echo root@127.0.0.1:3306 set host=127.0.0.1 set port=3306 set user=root ...

  10. jieba库的使用

    jieba库的使用 jeiba库是一款很优秀的用于中文分词的第三方库,它通过一个汉词词典来确定汉字之间的关联概率,将概率较大的组成分词. 精准模式 把文本精准的分割开来,不存在冗余单词. jieba. ...