用户级线程

WRF移动嵌套结合伏羲模型与CFD(PALM)高精度多尺度降尺度分析研究 WRF移动嵌套(Moving Nesting):动态调整高分辨率嵌套网格位置,追踪天气系统(如台风、强对流系统)以提高局地预报精度。伏羲(Fuxi)模型:国产数值模式,提供对WRF模拟的初始及边界条件优化。CFD(Computational Fluid Dynamics)PALM模型:精细化局地流场、湍流、温度分布。 阅读详情

线程的切换

在看进程切换前,我们先来看线程的切换吧。
这一篇主要说的是用户级线程的切换。
因为 进程的切换=资源切换+指令执行序列切换。
将资源和指令序列分开看,如果只是从一个执行指令序列切换到另一个执行指令序列,那么这就是线程的切换。

线程保留了并发(一个cpu上交替的执行多个程序)的优点,避免了进程切换代价,不需要切资源(映射表),只是切执行指令序列。线程切换的实质就是映射表不变而PC指针变。

用户级线程的切换

一个网页浏览器
一个线程用来从服务器接收数据
一个线程用来显示文本

开始实现这个游览器…

void WebExplorer()
{
    char URL[]="http://cms.hit.edu.cn";
    char buffer[1000];
    pthread_create(...,GetData,URL,buffer);
    pthread_create(...,Show,buffer);
}

void GetData(char* URL,char *p){...};
void Show(char* p){...};

我们下载了一段时间的数据后,切出去执行另一个线程,显示文本后,切回来继续下载。

这里写图片描述

Yield与Create

pthread_create()让多个线程同时触发,yield()能完成线程的切换,使线程交替执行。

现在有两个执行序列,我们想要其中执行了一段时间后,跳到另一个去执行,之后又切回来。(线程的切换)
这里写图片描述

这里写图片描述

Yiled从100跳到300
这里写图片描述

//B中的Yield
void Yield()
{
   找到300;
   jmp 300;
}
//D中的Yield
void Yield()
{
   找到204;
   jmp204;
}

两个执行序列与一个栈…

从100开始执行,在A函数中遇到B函数的调用,B的返回地址即下一句指令的地址104压栈,又在B中遇到Yield()调用,Yield()的返回地址204压栈。在B中的Yield()jmp到300,执行C函数,在C中遇到D()调用,304压栈,执行D(),遇到D中的Yield()调用,Yield()的返回地址404压栈。

这里写图片描述

D中的Yield()执行后,跳到204

200:B()
{
   Yield();
   204:
}

204开始执行遇到”}”,会弹栈,栈顶元素404被弹出执行404,这里就出现问题了,我们刚才已经回到100那个线程了,现在却又切到了300那个线程。

所以两个序列一个栈是不行的。

一个栈到两个栈

每个序列对应一个栈,Yield切换先切栈。

这里写图片描述

//D中的Yield
void Yield()
{
   TCB2.esp=esp;
   esp=TCB1.esp;
   jmp 204;
}

现在两个栈的情况是:

这里写图片描述

执行D中的Yield,使栈完成了切换,esp=1000。但是遇到jmp 204,就跳到204,那么Yield()就永远不能返回了。

//D中的Yield
void Yield()
{
   TCB2.esp=esp;
   esp=TCB1.esp;
  //jmp 204;
}

把jmp 204去掉,此时栈已经完成了切换esp=1000,然后Yield执行遇到“}”,弹栈,此时弹栈弹出栈顶元素 204,执行204(“}”相当于ret),再ret,弹栈就是104了。

所以两个线程的样子:两个TCB、两个栈、切换的PC在栈中。

而ThreadCreate的核心就是申请一个栈,一个TCB(线程控制块),再将栈与TCB关联。

void ThreadCreate(A)
{
   TCB* tcb=malloc();
   *stack=malloc();
   *stack=A;//100 执行线程的起始地址
   tcb.esp=stack;//栈和TCB关联
}

综上

void ThreadCreate(func,arg1)
{
   申请栈;
   申请TCB;
   func等入栈;
   关联TCB与栈;
}
void GetData(char* URL,char *p)
{
   连接URL;
   下载;
   Yield();
   ...
}
void Yield()
{
   压入现场;
   esp放在当前TCB中;
   Next();//调度函数,对系统影响很大,可优先调度Show
   从下个TCB取出esp;
   弹栈切换线程;
}

用户级线程

因为这里的Yield,Create是用户程序,没有进入内核,所以说是用户级线程。
用户级线程对于内核是不可见的。
如果进程的某个线程进入内核并阻塞,对于内核来说,它是看不到那个进程里面有其他线程的,所以会直接切到别的进程去执行。此时用户级线程的并发性就没有什么用了。

例如

GetData()
{
  连接URL发起请求;
  等待网卡IO...
  进程阻塞
}
Show()
{
  显示文本和连接;
  ...
}

用户级线程只能在用户级切来切去,不进入内核。

这里写图片描述

通俗易通解释SLAM问题的数学描述:运动方程和观测方程 高翔博士在他的《视觉SLAM十四讲》中把SLAM问题的数学描述抽象成了两个数学方程,以下对此做个总结,并且对此做一些通俗易懂的解释: 一、方程的总体形式 作为理性层次的描述,我们引入数学方程来描述SLAM过程,其中第一个方程叫做运动方程、第二个方程叫做观测方程,想象一下我们在研究SLAM的时候肯定需要观测机器人(无人汽车、无人机等都可以统称为机器人)的运动(画面感很强哈哈),这样很容易理解并且记忆这两个方程的名称和意义: 二、变量的含义 我们看到,这两个方程中有大量的英文字母作为变量存在其中,下面介绍一下 阅读详情

相关推荐

DSP在线升级方案:TMS320C6678使用网络或者串口输出升级数据进行固件升级

下面这段先引用创龙的说明 IBL 运行后, 将从 NOR FLASH 或 NAND FLASH 的 0x00080000 地址引导 ELF/BBLOB 格式 用户程序。 当引导 ELF 格式用户程序时, IBL 会解析用户程序头部信息,并根据头部信息 拷贝不同的代码段至指定 CPU 内存地址,然后将 PC 指针跳转至_c_int00, 再运行用户程 序。当引导 BBLOB 格式用户程序时,由于无头部信息, IBL 会将用户程序拷贝至 0x9E000000 (该内存地址为 IBL 代码指定),并将 PC..

ToneChip的专栏,一个传统的嵌入式码农,裸机编程 1941

用户级线程和内核级线程

用户级线程# “既然你已经看过线程的基本概念,那我就直接跳过这一部分了。很久很久之前,线程的概念是出现了,但操作系统厂商可不能直接就去修改操作系统的内核,因为对他们来说,稳定性是最重要的。贸然把未经验证的东西加入内核,出问题了怎么办?所以想要验证线程的可用性,得另想办法。” “我知道我知道,那些研究人员就编写了一个关于线程的函数库,用函数库来实现线程!”小白得意的说:“这个我刚刚在网上看到了。” “是的,他们把创建线程、终止线程等功能放在了这个线程库内,用户就可以通过调用这些函数来实现所需要的功能。”

只为成功找方法 不为失败找借口 4402

国内优秀MES开源框架

一套springboot 开源框架 代码标准规范化。 界面展示 演示地址 http://wangziyangmes.pzzd.xyz 用户名admin 密码123 系统管理 工艺管理 计划管理 物料管理 *用户管理* *工艺路线管理* 工单下达...

q707231019的博客 2万+

7.用户级线程

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;2.本文会产生进程与线程的区别;问题:把进程pid1 切换到进程 pid2时,是否可以不切换进程内逻辑内存与物理内存地址映射表;1)引入线程:2)实际情况是:2) 进程与线程区别补充:3) 多个执行序列(指令序列或线程)+一个地址空间是否实用?

PacosonSWJTU的博客 1107

UFS 3.1协议分析(第五章) -- UFS协议栈

ContentsUFS顶层架构应用层UFS命令集UFS 设备管理器UFS任务管理器传输层互连层 UFS顶层架构     UFS基于SCSI SAM架构模型定义了一个完整的协议栈,从上到下依次为应用层、传输层、数据链路层、物理层。UFS使用MIPI联盟的UniPro作为数据链路层和MIPI的M-PHY作为物理层,两者合起来称之为互连层(UFS InterConnect Layer) 应用层     应用层包括UFS命令集、设备管

Frank_sample的专栏 7367

从零手写神经网络:用NumPy实现全连接网络与反向传播

神经网络本质上是可微分的函数复合体,其核心在于仿射变换与非线性激活的交替堆叠,以及基于链式法则的自动微分实现。理解前向传播的矩阵运算逻辑和反向传播的梯度流动机制,是掌握深度学习底层原理的关键路径。权重初始化(如He/Xavier)、激活函数选择(ReLU/Sigmoid)与数值稳定性处理(如1e-8防下溢)共同决定了训练的收敛性与鲁棒性。这些基础要素不仅支撑学术推导,更直接影响工业场景中的模型调试、FPGA部署及梯度异常定位。本文以纯NumPy实现三层全连接网络为载体,聚焦‘From Scratch’过程中

weixin_32495691的博客 285

操作系统学习笔记——用户级线程和核心级线程

绪论 为什么要说线程的切换 操作系统是多进程的,我们关注的应该是进程之间的切换,那为什么关注线程的切换呢?因为理解了线程的切换之后可以更好的理解进程的切换,换句话说线程的切换是进程切换的基础。 进程的切换其实是包含两个部分的,第一个指令的切换,第二个内存映射表的切换。指令的切换就是从这段程序跳到另外一段程序执行,内存映射表切换涉及到内存管理这部分的内容,相对来说比较复杂。线程的切换只有指令的切换,同处于一个进程里面,不存在内存映射表的切换。因此理解了线程的切换之后可以更好的理解进程的切换。 一、用户级线程

garbage_man的博客 5028

基于openwrt平台搭建局域网技术验证之四

1、测试目的 验证l2tp客户端模式的可行性。 提供vpn-l2tp模式的客户端功能。 2、参考资料 参考链接1:https://www.lucktang.com/191.html 3、测试过程 测试过程需要用到的资源: 路由器俩个 win7系统电脑俩台 ③ 交换机一个 ④ 网线三根 测试组网如下图所示: 组网说明: R0公司路由器 S1 交换机 R1 路由器1 R2 路由器2 PC1 个人电脑1 PC2 个人电脑2 (R0) lan口接(S1)...

caofengtao1314的专栏 1960

【操作系统】进程管理(二)—— 线程

在上图中,内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞。缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。每个用户进程有与用户级线程同数量的内核级线程。在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型。

haoweixl的博客 2045

Codex本地部署指南:从环境配置到API集成实战

Codex作为OpenAI推出的代码生成模型,能够根据自然语言描述自动生成代码片段,大幅提升开发效率。这次我们重点分析Codex的本地部署方案、硬件门槛、接口调用方式和实际使用效果,帮助开发者判断是否值得投入时间部署。 从技术架构看,Codex基于GPT-3模型微调,专门针对代码生成任务优化。最新版本支持多种编程语言,包括Python、JavaScript、Java、C++等主流语言。对于国内开发者来说,最关心的是能否在本地环境稳定运行,以及是否需要特殊网络配置。 1. 核心能力速览 能力项 技术说明 模型

weixin_33309048的博客 523

Unity 热更新技术 | (二) AssetBundle - 完整系列教程学习

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来从 AssetBundle - 完整系列教程学习 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

用户级线程和内核级线程的区别以及用线程池实现生产者消费者模型

但是这种切换是发生在用户态的,操作系统内核无法得知,所以在操作系统看来这些用户级线程仅仅是一个进程,只会给他分配一个cpu,如果在单核的处理器上,这并没有什么大的关系。在进行内核线程的切换时,会保存程序的上下文(就是程序的运行环境),处理器状态从用户态切换到内核态,这是一个很耗费资源的事情。而用户级线程的切换发生在用户级的应用程序空间,不用从用户态切换到内核态,只需要保存线程的运行状态就可以进行切换,提高了操作系统的执行效率。内核级线程的特点与用户级线程相反,那这么做的好处是什么呢?

m0_74782361的博客 1172

MC_SetOverride指令详细应用介绍(基恩士PLC)

基恩士KV系列PLC和松下总线绝对值伺服运动控制(详细配置+轴控完整ST源代码)

RXXW_Dor的博客 334

用户级线程与核心级线程

1、用户级线程把整个线程实现部分放在用户空间中,内核对线程一无所知,内核看到的就是一个单线程进程。只有一个用户栈优点:1)整个用户级线程的切换发生在用户空间,这样的线程切换至少比陷入内核要快一个数量级(不需要陷入内核、不需要上下文切换、不需要对内存高速缓存进行刷新,这就使得线程调度非常快捷)2)用户级线程有比较好的可扩展性,线程能够利用的表空间和堆栈空间比内核级线程多,这是因为在内核空间中内核线程...

成天天的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

用户级线程以及用户级线程的底层原理

前言 线程分为用户级线程和内核级线程,这节我们先来讨论一下何为用户级线程以及用户级线程的底层原理。 用户级线程和内核级线程 说到用户级多线程,我们有必要先来简单对比一下用户级线程和内核级线程之间的区别。 内核级线程,顾名思义,它的调度是依赖于操作系统的,即操作系统控制着内核级线程的切换,比如有A和B两个内核级线程,我们用户是不知道先执行哪个线程的代码和不知道什么时候切换到另一个线程执行代码的,这件事只有操作系统知道,我们无法干预。 用户级线程,顾名思义,它的调度是依赖于用户的想法的,比如有C和D两个用户级线

Ftwhale的博客 1298

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

用户级线程与内核级线程

文章目录前言一、线程的定义二、用户级线程三、核心级线程总结 前言 提示:以下是本篇文章正文内容 一、线程的定义 线程是操作系统能够调度和执行的基本单位,在 Linux 中也被称之为轻量级进程(LWP:light weight process),在 Linux 系统中,一个进程至少需要一个线程作为它的指令执行体,进程管理着资源比如 cpu、内存、文件,将线程分配到某个 cpu 上执行 一个进程可以拥有多个线程,它还可以同时使用多个cpu 来执行各个线程,以达到最大程度的并行,提高工作的效率。 线程..

风间琉璃的博客 6562

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

用户线程和内核线程的区别

1.内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态;可以很好的利用smp,即利用多核cpu。windows线程就是这样的。 2. 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的。 线 程的实现可以分为两类:用户级线程(Us...

weixin_30815469的博客 1096

6.1.1 用户级线程和内核级线程

from: http://book.51cto.com/art/201006/206946.htm 6.1.1  用户级线程和内核级线程 线程有3种实现模型: 用户级或应用程序级线程 内核级线程 用户级和内核级混合线程 图6-1显示了3种线程实现模型。图6-1(a)显示了用户级线程,图6-1(b)显示了内核级线程,图6-1(c)则显示了用户线程和内核线程的混合。

fivedoumi的专栏 1233

计算机操作系统学习之用户级/内核级线程和多线程模型

一.概念 有的进程可能需要“同时”做很多事情,而传统进程只能串行的执行一系列程序。为此,引入了线程,来增加并发度 可以把线程理解为轻量级进程 线程是一个基本的CPU执行单元,也是程序执行流的最小单元 二.线程带来的变化 进程只是资源分配的基本单位,线程成为调度的基本单位 各线程间也可以并发,提高了并发性 线程间并发,如果是同一进程内的线程,则不需要切换进程环境,系统开销减小 三.线程的属性 线程是处理机调度的单位 多CPU计算机中,各个线程可以占用不同的CPU 每个线程都有一个线程控制块(TCB)

xhy123_的博客 3301

内核线程与用户线程的一点总结 《程序员的自我修养》·笔记

前言 linux内核不存在整真正意义上的线程。linux将所有的执行实体都称之为任务(task),每一个任务在干年上都类似于一个单线程的进程,具有内存空间、执行实体、文件资源等。但是,linux下不同任务之间可以选择公用内存空间,因而在实际意义上,共享同一个内存空间的多个任务构成了一个进程,而这些任务就成为这个任务里面的线程。 内核线程 内线程又称为守护进程,Linux内核使用内核线程来将内核分成几

hust_sheng的专栏 1418

操作系统常见「名词解释」、「简答题」

操作系统常见名词解释和简答题

imByte的博客 9112

三:操作系统线程管理之用户级线程与内核级线程

特性用户级线程 (ULT)内核级线程 (KLT)管理者用户空间的线程库操作系统内核内核感知无感知完全感知创建/销毁快速慢切换速度快慢阻塞调用阻塞整个进程只阻塞当前线程多核利用无法利用可以利用调度库定制,内核无感知(同进程内非抢占)内核调度,系统范围内公平实现复杂度库实现较易(对应用开发者),内核无需改动涉及修改内核用户级线程和内核级线程是实现多线程的两种基本方式,它们各自的优缺点直接影响了在其上构建的线程模型的特性。

柳絮飘扬 1233

进程,线程,协程(用户级线程)相关知识

这是因为,当进程在用户态运行时,使用的是用户栈,当进程陷入到内核态时,内核栈保存进程在内核态运行的相关信息,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因此每次进程从用户态陷入内核的时候得到的内核栈都是空的。当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。这样就实现了内核栈和用户栈的互转。......

c2510529649的博客 1363

内核线程与用户线程的区别

内核线程的创建、销毁、切换和调度都需要操作系统内核的支持,而用户线程的创建、销毁、切换和调度由应用程序自己控制。内核线程和用户线程都是线程的一种,但是内核线程是由操作系统内核创建和管理的,运行在内核态,可以访问操作系统的所有资源,而用户线程是由应用程序创建和管理的,运行在用户态,只能访问应用程序的资源。不同点:内核线程运行在内核态,可以访问操作系统的所有资源,而用户线程运行在用户态,只能访问应用程序的资源。不同点:内核线程的创建和销毁需要操作系统内核的支持,而用户线程的创建和销毁由应用程序自己控制。

最后一个bug的博客 3782

内核线程、轻量级进程、用户线程的对比

线程与进程的概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位。 一个进程的组成实体可以分为两大部分:线程集和资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。 线程概念的产生 传统单线程进程的缺点 现...

wandandi的博客 1364

【操作系统】2.3 线程和多线程模型

线程和多线程模型 阴雨进程的目的是更好的使多道程序并发执行,而引入现成的目的是见效程序在并发执行的时候所付出的时空开销,提高操作系统并发性能 对线程的最简单理解为“轻量级的进程”。它是一个基本的CPU执行单元,也是程序执行流的最小单元。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点必不可少的资源,但是可以和同属一个进程的其他线程共享进程拥有的资源。 线程的状态与转换 线程在运行时具有三种状态:执行状态、就绪状态、阻塞状态 线程的组织和控制 (1)线程控制块 系统

weixin_45434953的博客 839
上一篇: char* p与char p[]
下一篇: 内核级线程
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值