内核级线程

内核级线程与用户级线程 这两天在写这篇blog的时候,顺带复习操作系统的资料,遇到了一个之前没有弄明白的问题,就是关于内核级线程与用户级线程。在查阅了一些资料之后,发表一下我个人简介。 线程已经在许多系统中实现,到那时各个操作系统实现方式不完全相同。 比如在有的系统中,特倍是一些数据库管理系统如IBM的infomix系统,所实现的用户级线程(UserLevel Threads ,ULT);而另一些系统如(Mac os的前 阅读详情

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

用户级线程的ThreadCreate(),Yield(),是用户程序,不进入内核。
而内核级线程的ThreadCreate()是系统调用,会进入内核,TCB在内核中,内核管理TCB。Yiled()用户不可见,调度点由系统决定,在内核级线程中Yield就不叫Yield了,进入了内核叫Schedule。

内核级线程阻塞后,内核知道这个进程中的其他线程,会切换到其他线程去。所以内核级线程的并发性更好。

而用户级线程阻塞了,那它在的整个进程都会被挂起,直接切到别的进程去执行了。

用户级线程:
这里写图片描述

内核级线程:
这里写图片描述

内核级线程

因为进程要分配资源,访问内存,访问文件等等,所以必须要在内核态才能访问控制这些资源,所以进程必须在内核中,切换进程实际是切换资源+切换内核级线程。

内核级线程不仅要在用户态跑,还要在内核态跑,所以在用户态要有用户栈,在内核态要有内核栈。内核级线程需要一套栈。

用户级线程的切换是TCB切,根据TCB切换用户栈;
内核级线程的切换是TCB切,根据TCB切换一套栈,内核栈切,用户栈也要切。

用户栈和内核栈之间的关联

进入内核的唯一方法就是中断(INT中断,时钟中断,键盘鼠标硬件中断…)。
先是在用户态的用户栈里面来回折腾,但是只要一有中断,就启用内核栈,操作系统就通过硬件的一些寄存器找到线程对应的内核栈,找到这个内核栈后就压在用户态执行的栈SS,SP,还要压刚才在用户态执行到什么地方。

这里写图片描述

而IRET就是返回,将压入内核栈的5个寄存器弹出,根据弹出的这5个寄存器又可以找到用户栈了。

举例来描述:
这里写图片描述

read()是个库函数,就会展开成一段int指令。int中断。
中断返回的时候,cs,pc一弹,就又可以找到用户栈和我们在用户态代码执行到哪里。这样就实现了执行指令序列的跳转了。

内核级栈的切换

//线程S代码
100: A(){
   B();
   104:
}
200: B(){
   read();
   204:
}
300:read(){
   int 0x80;
   304;
}
system_call:
  call sys_read;
1000:
2000:sys_read(){
  启动磁盘读;
  将自己变成阻塞;
  找到next;//下一个线程的TCB
  switch_to(cur,next);
  //switch_to通过TCB找到内核栈指针,然后通过ret切到某个内核程序
  //最后再用CS:PC切到用户程序
}

//线程T代码
500:C(){
....
}
interrupt:
  call sys_xxx;
3000:
4000:sys_xxx(){

}

这里写图片描述

内核线程switch_to的五段论

中断入口:(进入切换)
push ds;
...;
mov ds,内核段号;...
call 中断处理
}//ret

中断处理:(引发切换)
 启动磁盘读或时钟中断;
 schedule();
}//ret

schedule: next=..;
 call switch_to;
}//ret

switch_to:(内核栈切换)
 TCB[cur].esp=%esp;
 %esp=TCB[next].esp;
 ret

中断出口:(第二级切换)
 ...;
 pop ds;
 iret

补充(不需要太在意,与本次内容关系不大):

S、T非同一进程:(地址切换)
 要首先切换地址映射表;
 TCB[cur].ldtr=%ldtr
 %ldtr=TCB[next].ldtr

内核级线程中的ThreadCreate

void ThreadCreate()
{
   TCB tcb=get_free_page();//因为是在内核中,所以分配不是malloc
   *krlstack=...; //内核栈
   *userstack传入;
   填写两个stack;
   tcb.esp=krlstack;//关联tcb与内核栈
   tcb.状态=就绪;
   tcb入队;
}

用户级线程、内核级线程的对比

这里写图片描述

11、内核级线程 1、用户级线程的局限:用户级线程的切换不需要进入内核,内核不知道各个线程(TCB)的存在,所以如果某个线程进入内核并且发生阻塞后,内核可能会对进程进行调度,从而阻塞了所有的线程。例如chrome中的每个标签页都是线程,如果某个网页卡了,整个浏览器都动不了,其他网页也点不了,因为CPU已经把控制权交给别的进程了。因为内核不知道多线程的存在,自然不能给线程分配硬件,不能发挥多核处理器的优势。 多处理器与多核的区别:多核有多个CPU,但是只有一个内存和一个MMU,只有一套内存映射。多处理器有多个内存和MMU。 阅读详情

相关推荐

DolphinScheduler租户配置踩坑实录:手把手教你修复‘tenant not exists‘报错

本文深度解析DolphinScheduler的租户模型,并提供一套从界面到数据库的系统性排查流程,手把手教你修复常见的'tenant not exists'报错。文章揭示了该错误的本质是用户与租户数据关联不一致,并给出了通过UI或SQL更新的具体修复方案,同时分享了根因分析与预防措施,帮助用户从根本上理解和避免此类问题。

2w3e4r5t6y的博客 541

thread_create(线程基本常识)

package com.gzhs.zsd.thread; /*** * 了解线程创建方式 * 线程Thread实现Runnable接口 * @author 谢泽鹏 * @version 1.0 */ public class Traditional_Thread { public static void main(String[

suenpeng 5856

Dify 1.1.3部署避坑指南:用wait-for-it.sh解决PostgreSQL初始化失败问题

本文详细解析了Dify 1.1.3部署中遇到的插件数据库初始化失败问题,并提供了使用wait-for-it.sh脚本的实战解决方案。通过剖析Docker Compose服务依赖管理的局限性,指导用户如何改造镜像与配置,确保服务按正确顺序启动,从而有效解决数据库连接失败等部署难题。

wdx012345的博客 1003

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

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

最后一个bug的博客 3782

Debian 11 下用hostapd+dnsmasq搭建WiFi热点:从命令行到实战(避坑指南)

本文详细介绍了在Debian 11系统上,使用hostapd和dnsmasq从命令行搭建稳定WiFi热点的完整实战流程。内容涵盖环境准备、无线网卡AP模式检查、服务深度配置,并重点提供了从服务启动失败到客户端无法上网等常见问题的系统性排错指南,帮助用户避开配置陷阱,成功创建可用的无线接入点。

CAT789的专栏 772

网络虚拟化介绍(OVS、DVS)

网络虚拟化概念网络虚拟化就是把网络层的一些功能从硬件中剥离出来,建立新的网络虚拟层;该虚拟层可以接管网络服务和配置,实现网络服务与物理层的解耦,打破物理资源限制;通过网络虚拟层能够在一个物理网络上模拟出多个逻辑网络,并且多用户在逻辑网络上相互隔离,保证网络安全网络虚拟化的特点隔离性:不同租户的流量相互之间不能互访;但是IP/MAC地址都可以独立规划可移动性:虚拟机可以跨二层/三层迁移,甚至可以跨广域网迁移(迁移前后虚拟机Vlan和IP地址都不会发生变化)可扩展性:逻辑网络的规模和数量可扩展。

m0_49864110的博客 1万+

C语言创建线程thread_create()

调用 thread_join()的线程会被阻塞,直到通过 thr 标识的线程执行完成,这里“阻塞”(block)指的是:线程会在调用 thread_join()的位置停留必要的时间。参数 func 的类型为 thrd_start_t,它被定义为 int(*)(void*)(这是一个函数指针,指向一个 void 指针作为其参数并返回一个 int 值的函数),因此,该线程执行的函数返回一个 int 类型的值。在大多数情况下,后续的其他操作均依赖于该线程的执行结果,并且只有当该线程完成后,才能执行其他操作。

m0_73922076的博客 1961

NVIDIA显卡驱动历史版本全攻略:从官网隐藏入口到精准下载

本文详细介绍了如何获取NVIDIA显卡驱动历史版本的完整攻略,包括官网隐藏入口的揭秘、精准筛选驱动版本的技巧以及安装避坑指南。特别针对游戏玩家、创作者和老显卡用户提供了实用建议,帮助用户解决驱动兼容性问题,提升显卡性能。

m2n3o4p5的博客 3723

用户态和内核态:用户态线程和内核态线程有什么区别?

转载 文章来源于 拉钩教育 重学操作系统 林䭽 用户态和内核态:用户态线程和内核态线程有什么区别? 什么是用户态和内核态 Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有很高的权限。按照权限管理的原则,多数应用程序应该运行在最小权限下。因此,很多操作系统,将内存分成了两个区域: 内核空间(Kernal Space),这个空间只有内核程序可以访问; 用户空间(User Space),这部分内存专门给应用程序使用。 用户态和内核态 用户空间中的代码被限制了只能使用一

张俊杰 的博客 9337

提供一个微信投票刷票的js代码

最近几天,有个朋友找我去写一个脚本帮他 在微信上刷票、微信投票刷票,我大概看了一下,本次微信投票刷票其实就是根据微信的openid来限制,每个openid只能投三次票的限制。上图可以看出,其实只要openid,和toopenid即可,openid是自己的微信id,toopenid是投票对象的微信id,那我们定时修改openid即可给某一个人刷投票。把这段代码复制到浏览器F12之后的console里,直接回车即可开始微信投票刷票(刷新或关闭浏览器即可停止刷票)//生成随机的ip地址。

qq_858865388专业提供快速微信投票教程攻略和方法的博客 2万+

使用广播星历进行 GPS 卫星位置的计算

目录1.计算卫星运动的平均角速度 n2.计算观测瞬间卫星的近地点角3.计算偏近点角4.计算真近点角 f5.计算升交角距 6.计算摄动改正项7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置9.计算观测瞬间升交点的经度 L10.计算卫星在瞬时地球坐标系中的位置11.计算卫星在协议地球坐标系中的位置使用广播星历进行GPS卫星位置的计算的详细步骤如下:关于在广播星历中各参数的分布情况可以参考下图:首先根据广播星历中给出的参数 计算参考时刻(TOE) 的平均角速度 式中,GM为万有引力常数 G 与地球总质量

qq_43381998的博客 5567

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

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

hust_sheng的专栏 1418

CHIP-Seq数据分析流程

文章目录CHIP-Seq数据分析流程相关软件安装数据下载将SRA转化为fastq文件数据质控,过滤数据质控然后进行质控,过滤低质量reads,去接头比对下载小鼠参考基因组的索引和注释文件比对sam文件转bam为bam文件建立索引载入IGV查看用MACS call peak安装MACS结果注释与可视化 CHIP-Seq数据分析流程 相关软件安装 所需要的软件有sratoolkit, fastqc,bowtie2,samtools,macs2,htseq-count,bedtools和前面RNA-seq数据分析

bio_meimei的博客 8789

用户级线程与内核级线程

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

风间琉璃的博客 6562

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

内核级线程切换

内核级线程的切换 用户级线程的切换,主要分为三步:TCB(thread controll block)切换,根据TCB中存储的栈指针完成用户栈切换,根据用户栈压入函数返回地址完成完成PC指针切换 不难想象,内核级线程的切换也要完成“TCB切换,栈切换,PC指针切换”三件事,那么它和用户级线程的区别在哪里呢?内核级线程的TCB存储在操作系统内核中,因此完成TCB切换的程序应该执行在操作系内核中。这是第一个重要区别,即用户及线程通过调用用户态Yield()完成切换,而内核级线程切换的故事应该从进入内核——中断开

weixin_43591948的博客 2439

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

用户级线程和内核级线程,你分清楚了吗?

前天晚上有个伙伴私信我说在学进程和线程,问我有没有好的方法和学习教程,刚好我最近也在备相关的课。 班上不少学生学的还是很不错的。拿班上小白和小明的例子吧(艺名哈)。小明接受能力很强,小白则稍差些。 关于多线程的资料很多,小白把线程的基本概念弄懂了,但关于「用户级线程和内核级线程」的概念,她却怎么也搞不清楚,只好向操作系统基础扎实的小明请教。 对于小白的问题,小明总会耐心解答:“线程里面这两个概念确...

chen801090的博客 3911

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

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

用户级线程和内核级线程

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

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

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

用户级线程和内核级线程的区别用户线程优点:缺点:内核级线程优点:缺点:关联性 线程的实现可以分两类:用户级线程,内核级线程和混合式线程。 用户线程 用户级线程是指不需要内核支持而在用户程序中实现的线程,它的内核的切换是由用户态程序自己控制内核的切换,不需要内核的干涉。但是它不能像内核级线程一样更好的运用多核CPU。 优点: (1) 线程的调度不需要内核直接参与,控制简单。 (2) 可以在不支持线程...

dream161110的博客 1万+

【笔记】内核级线程

用户线程就像超市一个收银员假装多窗口服务(快速切换),内核线程才是实打实开了多个收银台!,每个线程拥有独立的用户栈和内核栈,通过中断机制实现用户态与内核态的切换。必须通过内核级线程发挥,因为只有内核能感知硬件拓扑并分配计算资源。❗ 步骤4的switch_to是纯汇编代码(直接操作寄存器)- 用户栈是游戏进度(比如打到Boss半血)- 内核栈是通话记录(来电号码+通话时长)- 内核栈是后台控制台(吊威亚的机关)- 用户栈是演员表演区(自己蹦跶)4. 换传送带(栈切换)1. 包裹到达(中断)

n40404的博客 530

Java内核级线程测试&内核级线程与用户级线程区别

用户级线程 有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在. 应用程序可以通过使用线程库设计成多线程程序. 通常,应用程序从单线程起始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程。 用户级线程仅存在于用户空间中,此类线程的创建、撤销、线程之间的同步与通信功能,都无须利用系统调用来实现。用户进程利用线程库来控制用户线程。由于...

廖金龙的博客 1423

L6 内核级线程

由于Linux0.11中并未实现线程,因此本文主要以理论分析为主来介绍内核级线程。文中主要介绍了内核级线程的栈结构——“一套栈”,以及内核级线程的切换过程——“切换五段论”。

weixin_40909092的博客 1544
上一篇: 用户级线程
下一篇: CPU调度(进程调度)策略
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值