操作系统笔记-3-线程

缺页中断过程详解 缺页中断机构 总而言之: 对于我们的缺页的访问,会发生一个缺页中断。(缺页中断由当前指令发出,所以属于内中断) 中断后该程序就阻塞了,然后等待中断程序结束,再执行。 中断程序判断,内存中是否有空闲内存块: 如果有,就调入该内存块,并且修改页表项。 如果没有,则启动调度算法选择一个页面淘汰。调入该页面。 如果这个淘汰的页面有被修改过,那么就要把它重新写进外存。没有修改就直接淘汰。(所以说,我们从外存调入内存,是进行的复制。) 产生缺页中断的几种情况 1、当内存管理单元(MMU)中确实没有创建虚拟物理页映射 阅读详情
多线程出现

传统的进程都是单线程的程序。我们总是希望自己的程序有更高的并行性,传统进程也是有办法实现这种并行性,那就是通过子进程,但是子进程是独立的数据空间,很多时候程序的不同任务都是需要访问相同数据的,因此子进程有很大的局限性。

在这种需求场景下,多线程出现了,它弥补了子进程的缺陷,因为进程内的线程共享进程的资源,可以很容易实现数据共享。

线程概念

线程在进程内部,它共享进程的地址空间。

线程属性

线程共享执行代码,data分段和打开的文件。但是有独立寄存器、程序计数器、状态和栈。第一列是线程共享的进程属性,第二列是线程独立的属性。
在这里插入图片描述

线程和进程关系

下图是一个进程包含3个线程
在这里插入图片描述

线程状态

同传统进程一致

多线程实现
用户态多线程
  • 用户态多线程结构
    在这里插入图片描述
    1. Run-Time System:用户态实现的多线程,线程的创建、调度、销毁都是在用户态,因此运行时系统负责管理线程调度,每个进程都有一个运行时系统
    2. Thread table:线程表,记录当前进程拥有的线程
  • 用户态多线程的优点
    1. 线程切换不需要切换上下文
    2. 线程切换不需要刷新缓存
    3. 可以在不支持线程的系统中实现多线程
  • 用户态多线程的缺点
    1. 虽然实现了多线程,但是因为对系统是透明的,系统并不知道进程是多线程,因此用户态多线程并不能真正并行,只能利用单核
    2. 阻塞系统调用,当进程的一个线程调用了阻塞系统调用时,整个进程都会陷入阻塞状态。内核线程阻塞了之后,无法通知进程运行时系统线程调度器导致的进程阻塞。解决方案是jacket,将阻塞系统调用替换为非阻塞系统调用,比如同步的I/O替换为异步I/O
    3. 缺页中断也会导致进程阻塞
    4. 用户态线程因为没有时钟中断,因此不能实现轮转调度
内核态多线程
  • 内核态多线程结构
    在这里插入图片描述
    1. 内核线程由系统调度
    2. 线程表,在内核空间
  • 内核态多线程优点
    1. 可以利用多核cpu,能真正提升进程的并行
    2. 阻塞系统调用问题不会导致进程阻塞,因为内核多线程是由系统调用,系统管理着线程,因此知道线程已阻塞,就可以调度其他线程执行
    3. 缺页中断时可以切换其他线程执行
  • 内核态多线程缺点
    1. 内核线程每次切换都会陷入内核,从用户态切换到内核态,这个过程是有开销的
    2. 创建和销毁线程开销,线程复用
    3. 信号是发送给进程而不是线程
    4. 当线程创建新的进程时,新进程属性(含有线程数)问题
混合实现
  • 混合实现结构
    混合模式下,一个内核进程可以映射多个用户态线程
    在这里插入图片描述
  • 混合实现的优点
    实现了最大的灵活性
线程调度激活机制
  • 线程调度激活机制结构
    在这里插入图片描述
  • 避免阻塞
    为了避免用户态线程在调用阻塞系统调用时阻塞进程,内核在发现线程执行阻塞调用时会通过upcall通知进程,进程run-time system设置当前线程为block状态,然后调度其他线程运行;当阻塞操作调用完成会再次通知进程,run-time system可以选择立即运行或者加入就绪队列
  • 硬件中断
    如果进程对该中断不感兴趣,可能是其他进程的I/O完成,run-time system可以忽略,然后恢复线程到中断前的状态继续运行;如果进程对该中断感兴趣,比如可能是某个线程的缺页加载完成,此时运行哪个线程取决于run-time system
多线程程序设计的挑战
识别任务

识别出可以独立、并发的任务,可以独立运行在多核处理器上

平衡

考虑多核运行是否值得, 根据Amdahl定律,一个应用通过增加cpu可以获得的加速,S代表任务必须串行执行占比,N代表核心数
在这里插入图片描述

一个例子,横坐标是核心数,纵坐标是加速倍数,曲线代表不同必须串行执行占比在不同核心数下的加速
在这里插入图片描述

数据划分

如果应用划分为独立的任务,那么任务访问和操作的数据必须划分到不同的cpu上

数据依赖

如果并行的任务访问的数据之间有依赖,需要同步机制来保证数据一致性,在后续的笔记中会详细介绍线程同步

测试和调试

当应用是由多线程实现时,测试和调试都比较困难

多线程应用举例
Java的多线程模型

了解完多线程后,很好奇Java的多线程模型是怎么实现的呢?JVM中并没有说明Java的多线程是用户态实现还是内核态实现。网上查了一番资料后,感觉知乎的R大的回答比较靠谱一点,链接。在较新的Hotspot VM,在除了Solaris的平台上实现的是1:1的模型,也就是内核态实现多线程。感兴趣的可以点击上面的链接查看详情。

Go语言的goroutine

Go语言中的goroutine就是一种用户态多线程,它有自己实现的调度器。

总结

多线程在提升性能的同时也给编程带来了复杂性。不过在开发过程中,不管是用什么语言,都会经过一些封装,使其可用性更高。比如Java的JUC下的线程池,它已经封装了很多细节,让我们只需要关注任务和数据的拆分,而不用关注多线程实现的细节。可关注公众号,一起学习
在这里插入图片描述

参考
  1. 《Modern Operating Systems》第4版
  2. 《Operating System Concepts》第10版
  3. JVM中的线程模型是用户级的么?
  4. Golang 的 goroutine 是如何实现的?
操作系统学习笔记3--多线程编程 1.进程与线程 1.1线程和进程的异同 进程是系统资源分配的基本单位,线程比进程小,是调度的基本单位。 线程独立资源包括:线程id,程序计数器,寄存器租和堆栈。与其他线程共享资源包括:同一进程的代码段,数据段和其他资源,如io等。如果一个进程具有多个线程,那么对于多核cpu,可以同时执行多个线程。对于单核cpu,虽然同一时刻只有一个线程执行,但是cpu可以再空闲时调度其他线程进行执行,当某个... 阅读详情

相关推荐

李治军操作系统 笔记

一、操作系统基础二、操作系统之进程与线程L10:用户级线程进程 和 线程 都是动态概念 进程 = 资源 (包括寄存器值,PCB,内存映射表)+ 指令序列 线程 = 指令序列线程 的资源是共享的, 进程 间的资源是分隔独立的,内存映射表不同,占用物理内存地址是分隔的线程 的切换只是切换PC,切换了指令序列 进程 的切换不仅要切换PC,还包括切换资源,即切换内存映射表用户级线程:调用Yield

nkltc的博客 7669

简述缺页中断

时钟轮转法将所有的页组成一个圆,圆心的指针指向下一个要被置换的页面,置换前同样检查使用位,如果使用位为1,同样将其使用位置为0,随后将顺指针旋转,检查下一个页面,直到发现某页的使用位为0,将此页置换出内存。Second Chance算法在将页面换出内存前检查其使用位(使用位前文有介绍),如果其使用位为1,证明此页最近有被使用,猜测它还可能被使用,于是不把它置换出内存,但是把其使用位置为0,随后检查下一个页面,直到发现某页的使用位为0,将此页置换出内存。而较长时间内没有被访问的页面,可能最近不会被访问。

weixin_52669146的博客 4832

考研系列—操作系统:冲刺笔记(1-3章)

本文摘要:计算机操作系统核心知识点整理,涵盖系统结构、进程管理和内存管理三大部分。系统部分重点讲解内核态/用户态、中断机制、系统调用及虚拟机架构;进程管理详解调度算法、同步互斥实现(软件/硬件方法)及经典PV问题;内存管理包括连续/非连续分配、虚拟存储及页面置换算法(特别强调CLOCK算法)。文章通过真题案例和易错点分析,系统梳理了操作系统的关键概念和解题技巧,适合考研复习快速掌握核心考点。

Nelson_hehe的博客 623

【线程】线程中断详解

文章目录中断线程判断线程是否被中断如何中断线程(中断原理)底层中断异常处理方式 中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为true)。 它并不像stop方法那样会中断一个正在运行的线程。 判断线程是否被中断 判断某个线程是否已被发送过中断请求,请使用Thread.currentThr

m0_45406092的博客 2903

汽车LED驱动芯片TPS92682-Q1 SPI接口配置与调试实战指南

SPI(串行外设接口)作为一种高速、全双工的同步串行通信总线,广泛应用于微控制器与外围设备之间的数据交换。其工作原理基于主从架构,通过时钟、数据线和片选信号实现设备间的精准时序控制。在汽车电子和工业控制领域,SPI因其简单高效、易于扩展的特性,成为配置复杂电源管理芯片、传感器和存储器的关键技术。通过SPI接口,工程师能够动态调整设备参数、实时读取状态信息,并实现复杂的故障诊断与保护策略,极大地提升了系统的灵活性与可靠性。本文以汽车级双通道LED恒流驱动器TPS92682-Q1为例,深入解析如何通过SPI接口

weixin_29185493的博客 288

Win11显卡驱动安装失败的全面解决方案

Windows 11显卡驱动安装失败是一个比较常见的问题,但通过上述方法,我们可以有效地解决这一问题。方法一通过调整组策略编辑器的驱动程序安装策略,可能解决一些因签名问题导致的安装失败;而方法二则通过重装Windows 11系统,为系统提供一个全新的、干净的环境,从而可能解决更复杂的安装问题。在实际操作中,用户可以根据具体情况选择合适的方法来解决显卡驱动安装失败的问题。

nntxthml的博客 2662

缺页中断发生

当缺页中断发生时,操作系统会负责将相应的页面加载到内存中,以满足程序对该页面的访问需求。此时,如果需要访问的页面不在内存中,就会发生缺页中断,触发页面置换算法,将一个不再需要的页面调出内存,将需要访问的页面调入内存。缺页中断(Page Fault)是指在程序执行时,访问的页面(页)不在当前内存页表中,需要从辅助存储(通常是硬盘或固态硬盘)中调入到内存中的情况。在某些情况下,多个进程共享同一页面,当其中一个进程尝试写入该页面时,操作系统会将页面复制一份,然后进行写操作。

Recursions的博客 1240

不用Root!这些隐藏代码能一键开启安卓诊断端口(小米/OPPO/魅族机型实测)

本文提供了一份无需Root权限即可开启安卓手机诊断端口的实用指南。通过拨号盘输入特定隐藏代码,小米、OPPO、魅族等机型的用户可以一键激活此工程模式,从而连接电脑进行基带数据备份(如QCN文件)或故障排查。文章详细列出了各品牌指令、操作验证步骤,并强调了备份IMEI等关键数据的重要性与操作风险,旨在帮助用户在紧急情况下修复网络问题。

weixin_29260291的博客 273

缺页中断处理

缺页中断

qq_42693685的博客 581

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9234

DEA-Malmquist指数模型实战:从理论到应用的全流程解析

本文全面解析了DEA-Malmquist指数模型从理论到应用的全流程。文章详细阐述了该模型如何动态衡量效率随时间的变化,并将其分解为技术效率变化与技术进步,从而精准定位效率变动的根源。通过实战步骤演示了数据准备、软件操作(如DEAP 2.1)及结果解读,并结合水资源环境效率等案例,展示了其在包含非期望产出时的应用价值,为研究者进行动态效率分析提供了清晰指南。

b0c1d2的博客 222

操作系统笔记3——进程和线程

一个正在执行中的程序。一个正在计算机上执行的程序实例。能分配给处理器并由处理器执行的实体。一个具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集。运行态:该进程正在执行;假定只有一个处理器,因此一次最多只有一个进程处于这一状态也就是说,100个在内存中的进程,最多只有一个在运行态(可以有0个)就绪态:进程做好了准备,只要有机会就开始执行;100个在内存中的进程有最多有99个在就绪态阻塞/等待态:进程在某些事件发生前不能执行,如 I/O 操作完成;

FandonMark的博客 559

如何对EMB电子机械制动器的热衰退问题进行优化

摘要 电子机械制动器(EMB)在新能源汽车和自动驾驶中具有重要应用价值,但其在高强度工况下会出现热衰退现象。本文分析了EMB热衰退的五大机理:摩擦副热效应、电机热衰退、减速机构热失效、温度对控制策略干扰以及结构设计导致的热积累。针对这些问题,提出了从材料、结构、控制三个维度的优化措施:升级耐高温材料、改进散热设计、优化控制算法等。通过"热生成抑制-热传导优化-热失效补偿"的系统方案,可有效改善EMB的热衰退问题,为智能汽车提供更可靠的制动保障。

m0_59012156的博客 342

操作系统笔记(3)- 进程和线程

操作系统笔记(3)- 进程和线程

Weber's blog 471

STM32F103(二十三)通用同步异步收发器(USART)

学习板:STM32F103ZET6 往期博客: STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结 STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置 STM32F103五分钟入门系列(三)GPIO的常用库函数使用方法总结+一个网络上的误区 STM32F103五分钟入门系列(四)蜂鸣器实验(库函数+寄存器) STM32F103五分钟入门系列(五)按键实验(库函数+寄存器) STM32F103五分钟入门系列(六)时钟框图+相关寄存器

Curnane0_0的博客 1019

泛微OA自定义post接口和路径(无侵入)

泛微OA自定义post接口和路径(无侵入)

技术分享 3871

操作系统学习笔记——第四讲——线程(4.3多线程模型)

1. 线程库 2. Pthreads线程库 3. 常用线程操作 4. Pthreads例子 5. Java线程库 如, 6. Java线程状态 7. Win32线程库 8. Win32线程库 如, 9. Windows线程状态 ...

预见未来to50的专栏 230

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

现代操作系统学习笔记--3--线程

一、什么是线程    开个QQ,开了一个进程;开了迅雷,开了一个进程。在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ的运行,那么这“多个工作”分别有一个线程。所以一个进程管着多个线程。通俗的讲:“进程是爹妈,管着众多的线程儿子”    --------从知乎...

u012892524的博客 259

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

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

操作系统笔记-2.1.6.3 线程的状态与切换

本节为2022大纲新增考点。

m0_62638970的博客 205

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Week3-进程线程模型-Coursera北大操作系统课程-个人笔记

Week3 进程线程模型1. 进程(Process)的基本概念1.1 进程的定义1.2 进程控制快(PCB,Process Control Block)2. 进程状态及状态转换2.1 进程的基本状态2.2 进程状态的转换2.3 进程队列3. 进程控制3.1 进程的创建3.2 进程的撤销3.3 进程阻塞3.4 Unix常见进程控制操作简介4.深入理解进程概念4.1 进程的分类与层次结构4.2 进程与...

Lavendelion的博客 410

现代操作系统第3版 第2章 进程与线程 读书笔记1

1.进程间通信: 进程间常需要相互通信,需要解决3个问题? 1.一个进程如何把信息传递给另一个? 2.确保多个线程在关键活动中不会出现交叉? 3.正确的顺序? 2.竞争条件: 多个进程读写共享数据,最后的结果取决于进程的执行顺序,称为竞争条件(race condition) 3.互斥: 一个进程在操作共享资源时,其他线程不能对该资源进行操作。4.临界区: 我们把对共享内存进行访问的程序片...

diaopitian0181的博客 181

操作系统原理 - 学习笔记(2 - 3)进程管理 - 线程

casc

Henry1991back的博客 225

[笔记]《操作系统精髓与设计原理》---(3)线程

进程和线程进程概念包括2个特点: 资源所有权:进程映像是程序、数据、栈和进程控制块中定义的属性的集合,进程拥有对资源的控制、所有权,包括内存、I/O设备、文件等。 调度/执行:一个进程沿着可以通过一个或者多个程序的执行路径(轨迹)执行,其执行过程可能与其他进程交替进行。一个进程具有执行状态和被分配的优先级,是一个可被操作系统调度和分批的实体。 多线程环境中,进程被定义成资源分配的单位和一个被保护的单

neilooo的博客 437

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

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

garbage_man的博客 5029

操作系统期末复习笔记

操作系统期末复习目录一、引论1. 操作系统概念2. 操作系统的作用?3. 操作系统提供的服务?4. 操作系统的演变?5. SPOOLing假脱机技术6. 操作系统的基本概念:7. 个体重复系统发育:8. 系统调用9. 操作系统的功能10. 操作系统的特点?11. OS的发展与分类12. 中断、异常和陷入13. 操作系统的结构①单体系统②层次式系统③微内核④客户机——服务器⑤虚拟化ⅠVM/370Ⅱ 虚拟机的再现Ⅲ Java虚拟机6.外核二、进程与线程(一)进程1、创建进程的四种主要事件:2、进程的状态3

qq_43984062的博客 3270

Java线程和操作系统线程的关系

1.操作系统线程模型1.1 线程实现在用户空间下 当线程在用户空间下实现时,操作系统对线程的存在一无所知,操作系统只能看到进程,而不能看到线程。所有的线程都是在用户空间实现。在操作系统看来,每一个进程只有一个线程。过去的操作系统大部分是这种实现方式,这种方式的好处之一就是即使操作系统不支持线程,也可以通过库函数来支持线程。 我们换一种通俗的方式来讲解这段话,首先就是在这在模型下,程序员需要自己实

CringKong的博客 2万+
上一篇: 操作系统笔记-2-进程
下一篇: 操作系统笔记-4-进程&线程调度
VioletCherry
博客等级 码龄14年 21粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值