8.内核级线程(核心级线程)

【README】

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;

2.为什么要讲线程呢。实际要讲进程的切换;进程的切换包括切换指令,切换资源;切换指令就是切换线程简单讲,线程就是程序指令,线程的切换就是程序指令的切换);

  • 进程必须在内核中,切换进程实际上是切换内核级线程,而不是用户级线程
  • 切换用户级线程是切换内核级线程的一部分

2)为什么没有用户级进程?

  • 因为进程要分配资源,如访问内存,所以必须进入内核态才能访问这些资源;

【1】开始核心级线程

1) 多核:多个物理cpu,但共用同一个缓存,同一个MMU内存映射单元;
2)多处理器:多个物理cpu,每个cpu有自己的缓存,自己的MMU内存映射单元;

【补充1】内存映射单元

  • 内存逻辑地址 与 内存物理地址 映射表;

【补充2】并发与并行区别

  • 并发:交替执行(单核运行多个线程,相互有影响);
  • 并行:同时执行(多个线程在多个物理核上运行,可以理解一个核运行一个线程,相互独立不干扰);

3)用户级线程与内核级线程

  • 用户级线程(缺点):操作系统看不到,操作系统无法分配硬件,没有发挥出多核价值;
  • 多进程:也无法发挥多核价值,因为只有一套MMU,无法做到多个进程同时执行;
  • 内核级线程(优点): 操作系统可以看到,为每个线程分配一个cpu,发挥出多核价值,多个内核线程可以同时执行(并行执行);

【1.1】内核级线程原理


1)要有核心级线程,需要既在用户态(用户栈)运行,也在内核态(内核栈)运行;
所以 每个内核级线程需要一套栈(包括用户栈,内核栈),而不一个栈
即 内核线程切换,需要TCB切换一套栈,切换用户栈和内核栈;


【1.2】用户栈与内核栈

1)用户栈与内核栈组成同一个线程的一套栈;
2)INT 0x80 中断指令:使得 进程(线程)从用户态切换到内核态;
3)进入内核态前,把线程的用户栈信息(元数据)压入到内核栈,即把同一个线程的用户栈与内核栈关联起来,如下表所示:

内核栈(栈元素)

含义(对应用户栈的寄存器值)

源SS

用户态的ss寄存器值;

ss 指的是堆栈段寄存器;存放栈的段基址;内存是分段使用的;

源SP

用户态的栈指针寄存器值;

sp指的是堆栈指针寄存器;存放栈的偏移地址;

说的直白点,

栈基址(栈起始内存地址)=段基址左移n位 加上偏移地址;如n取4 ;

EFLAGS

用户态的标志寄存器值;

源PC

用户态的pc寄存器值; pc=程序计数器寄存器;

源CS

用户态的cs寄存器值;cs=代码段寄存器;

4)用户栈与内核栈的关联:

5) IRET (从内核态切换到用户态)

  • 出栈:把内存中内核栈的5个寄存器值弹出到cpu的寄存器中,回到用户态;

6)用户态切换到内核态的步骤

6.1) sys_read() :启动磁盘读,把自己变成阻塞状态(等待磁盘控制器响应时,当前线程阻塞,cpu需要切换运行其他线程)

6.2)switch_to(cur, next)
切换到下一个内核线程; cur表示当前线程tcb,next表示下一个线程tcb;具体过程:

  • 通过线程tcb找到内核栈指针;
  • 通过ret切换到某个内核程序;
  • 用cs:pc 切换到用户程序;

上图中, 线程S调用函数A, 线程T调用函数C;

  • PC=?? 表示 线程T的用户态代码;
  • CS=?? 表示  线程T的用户态代码;
  • ???? 表示 iret指令,从中断返回;

6.3)内核线程切换 switch_to 实际上是对两套栈的切换;每套栈包含用户栈和内核栈;


【2】内核线程切换switch_to 五段论(*非常重要)

1)五段论步骤

步骤

描述

1

用户态1切换到内核态1;

把用户态1的物理寄存器的值保存到内核栈1;(完成用户栈切换到内核栈)

2

执行读磁盘等中断操作;触发中断;

3

因为中断,调用 switch_to 切换到其他内核线程,如线程2;

4

Switch_to函数找到内核线程2的tcb,通过tcb找到内核线程2的内核栈2;

切换到内核栈2(完成内核栈间的切换);

5

通过 iret 把内核栈2中保存的用户态2的寄存器值弹出到物理寄存器;

即 ss:sp, cs:ip 通过内核栈2的用户态寄存器值赋值,从而完成从内核态2切换到用户态2;(完成内核栈切换到用户栈

 用户线程与内核线程:用户线程与内核线程实际上同一个线程

  • 当操作的内存空间在用户态,则是用户线程;
  • 当操作的内存空间在内核态,则是内核线程;

2)附加段:进程切换(S,T);

  • 进程切换还需要切换映射表;

3)创建线程代码细节 (tcb 是对线程的结构体抽象)

void threadCreate()

{

  TCB tcb = get_free_page(); // 申请一段内存作为tcb;

  *krlstatck = …; // 申请一段内存作为内核栈;

  *userstack 传入; // 用户栈

  填写两个stack; // 内核栈与用户栈初始化

  tcb.esp = krlstack; // tcb 关联内核栈

  tcb.状态=就绪;// 状态为就绪

  tcb入队;

}

 4)用户级线程与核心级线程对比

用户灵活性, 用户线程大于核心线程;
原因:

  • 用户线程的调度,开发人员可以自己编写调度策略进行控制,如调用 yield让出cpu;
  • 而内核级线程无法修改调度,即内核线程调度策略是操作系统写死的,无法修改;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(五F)之11g show spparameter 命令的使用

转载自 oracle 11g show spparameter 命令的使用 当我们要获取oracle数据库当前的参数值时,可以通过查询v$parameter动态性能视图得到,当然了也可以使用show parameter p_name这样的方式得到。但是在Oracle11g以前,show parameter只能获得当前…

跨平台与云端创新,为企业和开发者开辟更广阔的未来

从制造业到零售业,从市场营销到客户关系,数字化转型正在给各行各业带来巨大的变革和冲击。面对云计算、大数据、社交和移动计算,企业需要更主动地加速自身业务模式的转变,而开发者和开发团队将在这一转变过程中发挥至关重要的作用…

注解@resource的作用_Bean基于Annotation(注解)的装配方式

在Spring中,尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中有很多Bean时,会导致XML配置文件过于臃肿,给后续的维护和升级工作带来一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。Spring中…

Oracle入门(十二H)之设置、恢复和删除不可用列

转载自 Oracle设置和删除不可用列一、不可用列的定义 1、不可用列是什么? 就是表中的1个或多个列被ALTER TABLE…SET UNUSED 语句设置为无法再被程序利用的列。 2、使用场景? If you are concerned about the length of time it could take to drop colu…

9.内核级线程代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 【说明】 本文中提到的父线程可以理解为父进程因为进程包括运行资源和执行指令,又执行指令表示为线程,所以也可以说 进程包括…

python 列表生成表格_【转】Python 列表生成式

原文:https://blog.csdn.net/heartyhu/article/details/509880071. 生成列表要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11):>>> range(1, 11)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]但如果要生成[1x1, 2x2, 3x3, ……

Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi(跨平台)

1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有了很多这方面的文章,故而我就想我是写还是不…

10.操作系统演进过程

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》的《操作系统的那棵树》,内容非常棒,墙裂推荐; 2.思维僵化与发散 the mind is not a vessel that needs filing, but wood that needs igniting. 头脑不是需要归档的容器&am…

Oracle入门(十二I)之误删除数据的恢复方法

转载自 oracle误删除数据的恢复方法今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法。(不考虑全库备份和利用归档日志)删除表中数据有三种方法:delete(删除一条记录)drop或truncate删除表格中数…

Oracle入门(七A)之表空间配额(quota)

转载自 oracle表空间配额(quota)一、quota相关视图 1)dba_ts_quotas(查看所有用户的表空间配额) BYTES字段表示用户已经使用的空间;MAX_BYTES如果为-1表示没有限制,其他值表示限制配额 --只有用alter user user_name quota on tab…

python嵌套列表字典_python中嵌套列表转为字典

题目:# 有一组用例数据如下:cases [[case_id, case_title, url, data, excepted],[1, 用例1, www.baudi.com, 001, ok],[4, 用例4, www.baudi.com, 002, ok],[2, 用例2, www.baudi.com, 002, ok],[3, 用例3, www.baudi.com, 002, ok],[5, 用例5, www.ba…

.NET之全平台一体化的体验

一、前言 近来利用空闲时间研究了一下Xamarin的技术,想想既然提供了如此好的支持,就该尝试一切可能,来一个”大小通吃“。 何为全平台:APP包括Android、IOS、WP,WEB可在Window和Linux部署运行(进可攻,退可守…

11.cpu调度策略与schedule调度函数

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.cpu调度: 指的是 cpu从就绪队列中选择一个进程来执行;选择哪一个进程是调度算法的执行结果; 3. 相关定义&…

Oracle入门(十二)之SQL的DDL

一、数据类型 Character 数据类型Number 数据类型Date 数据类型Raw 和 Long Raw 数据类型 LOB 数据类型 注:Oracle数据类型详解二、表 (1)创建表 create table emp ( emp_id char (10) primary key, emp_name varchar2 (30), sal number (…

2016微软开发者峰会在京举办 纳德拉要来做演讲

还有不到一个月的时间,2016 微软开发者峰会就要在北京举办了。 在这场开发者的盛会上,微软 CEO、技术牛人,还有来自微软亚洲研究院、亚太研发集团、Xamarin 团队以及微软中国开发体验的专家们将对各平台的开发进行技术探讨。 据了解&#xff…

centos 卸载ffmpeg_Linux下ffmpeg的完整安装

最近在做一个企业项目, 期间需要将用户上传的视频转成flv格式或mp4格式并用flash插件在前端播放, 我决定采用ffmpeg (http://www.ffmpeg.org/ )实现. 当然以前也用过ffmpeg, 但是没有安装额外的库, 只是源代码下简单地 ./configure, 最后发现好多功能都用不了, 比如最流行的x26…

1.概率论-组合分析

【README】 本文总结自《概率论基础教程》 by M.Ross ,墙裂推荐; 【1.3】排列(考虑顺序) 1)例3d: 用6个字母 PEPPER排列,共有多少种不同的排列方式? 2)推理 对于n个元素,如果其中n1个元素相同,其他n2个元素相同,......,nr个元素也相同,一共有 种不同排列方式;…

Oracle入门(十二B)之表创建

一、创建表(1)简单表 Create Table emp (Emp_id char(10) primary key,Emp_name varchar2(30),Sal number(5),Tel varchar2(20) ); (2)带参数的表格创建 create table emp (emp_id char (10) primary key,emp_name varchar2 (30),…

我的创作纪念日:感恩、感谢、感激!

/bin/bash 机缘 感恩、感谢、感激! 第一次进入到csdn,还是当初老师傅叫我们可以借鉴一下这里的文章 所以! 一开始进入到csdn网站,还以为这里也是和某些贴吧一样,一样的灌水呢! 但是正式在这里书写文章之后&#…

python中seaborn画swarm图_Python可视化 | Seaborn5分钟入门(四)——stripplot和swarmplot

微信公众号:「Python读财」如有问题或建议,请公众号留言Seaborn是基于matplotlib的Python可视化库。 它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易&#xf…