7.用户级线程

【README】

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

2.本文会介绍进程与线程的区别,线程切换,用户态线程,内核级线程等;


【1】多进程回顾

问题:把进程pid1 切换到进程 pid2时,是否可以不切换进程内逻辑内存与物理内存地址映射表;


【1.1】把资源和指令分开 

  • 进程表示:执行中的程序,包含了计算机资源,执行指令
  • 资源指的是计算机资源,如内存;
  • 指令指的是进程对应的程序指令;

1)引入线程:

  • 保留了并发优点;避免了进程切换代价高的问题;

2)实际情况是:

  • 进程内存与物理内存地址映射表不变,而PC指针变

2)    进程与线程区别

  • 2.1)进程:进程更大;在一个资源下面,启动了多个轻巧的指令序列,这几个指令序列还可以来回切换(交替执行);
  • 2.2)线程:指令序列;
  • 2.3)切换成本:进程切换成本高,需要保存的东西很多;而线程切换很简单,因为线程仅保存了指令,不涉及计算机资源;线程切换不需要切换内存地址映射表,仅需要切换从一段指令序列跳转到另一段指令序列;

补充:

  • 进程切换包含两部分,包括 指令切换(线程切换),计算机资源切换;而线程仅切换指令即可;这就是典型分治思想;

3)    多个执行序列(指令序列或线程)+一个地址空间是否实用?

一个网页浏览器,是一个进程包含多个线程,涉及的是线程切换

  • 线程1:接收服务器数据;
  • 线程2:显示文本,把接收到的数据送入显存;
  • 线程3:处理图片,解压缩;
  • 线程4:显示图片,把图片数据送入显存;

【补充】进程切换与线程切换不同(多次强调,非常重要)

  • 进程切换,包括资源和指令切换;如切换内存映射表(或内存地址空间);
  • 线程切换,指的是指令切换,所以它比较轻量;

【1.2】实现线程切换的浏览器


1)pthread_create: 创建线程;
2)线程切换(交替执行)实现方式:

  • getData() 线程下载数据后, 调用 yield() 让出cpu,让cpu执行其他线程如show();

3)yield线程切换函数


【2】线程切换与栈的关系(栈是否切换?)

线程切换与栈的关系;

线程切换,栈是否也需要切换,不切换有没有问题?

 

1)执行序列:

线程1

线程2

// 1

100:A()

{

  B();

  104:

}

// 3

200:B()

{

  Yield();

  204:

} // 右大括号是一条汇编指令 ret,地址404出栈,这是有问题的

// 2

300:C()

{

  D();

  304:

}

400:D()

{

  Yield();

  404;

}

上述执行过程是:

  • 线程1 先执行,先后把内存地址 104 204 压栈;然后执行 yield;
  • 同时 线程2也在执行,先后把内存地址 304 404 压栈;然后执行yield;
  • 得到的栈内容如下:

2)栈:

序号

内存地址

1// 栈底

104

2

204

3

304

4

404

问题:

  • 线程1执行完 yield() ,就应该执行204,结果栈顶弹出的元素是 404内存地址,这与指令预期不符,导致程序执行错误(同时线程2也有这个问题);

3)如何解决问题

  • 问题:因为2个线程共用同一个栈;
  • 解决方法:所以1个线程单独1个栈;2个线程就是2个栈

【2.1】从一个栈到两个栈(每个线程各自1个栈)

1)执行序列

线程1

线程2

// 1

100:A()

{

  B();

  104:

}

// 3

200:B()

{

  Yield();

  204:

}

// 2

Void yield()

{

  找到300;

  Jmp 300

}

400:D()

{

  Yield();

  404;

}

2)栈:

线程1

线程2

栈1:

104

204

栈2:

304

404

3)Yield进行线程切换时,还需要把栈1切换到栈2

void yield()

{

  TCB2.esp= esp;

   esp = TCB1.esp;

  jmp 204;

} // 右大括号把指令地址弹出栈,接着执行地址保存的指令;

TCB:

  • thread control block 线程控制块; 是一个全局结构体,用于存放每个线程对应栈的起始地址;

TCB1.esp:

  • 指的是线程1的栈指针;

esp:

  • 指的是物理扩展栈寄存器,用于存放栈的起始内存地址(线程栈地址)

【2.2】两个线程的样子

1)两个线程的样子:

  • 两个TCB,两个栈,切换的PC在栈中;
  • pc指的是 程序计数器,即下一条要执行指令的地址;

2)    线程创建函数 threadCreate的核心就是用程序实现这3样东西

  • TCB,线程控制块;
  • 栈;
  • 栈与TCB关联;

3)代码如下:

Void threadCreate(A)

{

  TCB *tcb = malloc(); // 申请内存赋值给TCB

  *stack = malloc(); // 申请内容赋值给栈;

  *stack = A; //100 // 为栈赋值 函数A的内存基址(起始地址);

  tcb.esp = stack;  // 把栈内容与TCB关联起来;

}

4)把线程切换的所有东西组合起来

【注意】上述内容介绍的是用户级线程的切换,内核级线程的切换放在后面讲;

线程分为用户级线程,内核级线程;


【3】引入核心级线程 

1)为什么说用户级线程-yield是用户程序

线程1 是用户态线程;
线程1调用网卡io,网卡io阻塞,无法切换到 用户态线程2;而是切换到 其他进程2

  • 因为网卡io属于内核态程序,无法识别用户态线程,也就无法切换到用户线程2;

2)线程切换

  • 内核态线程的切换:叫做schedule,调度;
  • 用户态线程的切换:yield;

【总结】用户线程切换内容;

  • 1个用户线程1个栈,1个TCB;
  • TCB:线程控制块,用于存储当前线程的栈地址;
  • 栈与TCB关联;

线程切换过程:

  • 在用户线程切换时,首先切换TCB;
  • 通过TCB.esp 可以获得栈;
  • 从栈中弹出pc指针获得下一条要执行指令的地址,然后执行下一条指令;

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

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

相关文章

Oracle入门(五D)之如何设置show parameter显示隐含参数

转载自 oracle如何设置show parameter显示隐含参数在sqlplus中show parameter是显示不了隐藏参数的,需要做一个处理,如下所示: 以SYS用户登录: C:\Documents and Settings\guogang>sqlplus / as sysdba; SQL> create or r…

使用VS Code 从零开始开发并调试.NET Core 应用程序

使用VS Code 从零开始开发并调试.NET Core 应用程序,C#调试。上一篇 使用VS Code开发 调试.NET Core 应用程序 得到了大家的支持。 现在为大家带来从零开始教程,让你更好的了解.NET Core 应用程序。使用VS Code 开发C# 程序 并调试程序。 并且也会解决上…

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

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.为什么要讲线程呢。实际要讲进程的切换;进程的切换包括切换指令,切换资源;切换指令就是切换线程(简…

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个元素也相同,一共有 种不同排列方式;…