当前位置: 首页 > news >正文

进程与线程:03 用户级线程

多进程与操作系统基础

上一个内容我们讲了多进程图像,强调多进程图像是操作系统最核心的图像。我们还通过Windows任务管理器,实际观察了操作系统里的进程。

  • 进程是操作系统的核心内容,管理好多个进程,就能管理好操作系统和CPU。
  • 上节课提到操作系统支持多进程图像的四个方面:
    • 组织方式:操作系统通过状态(如就绪态、阻塞态等)和队列(就绪态队列、阻塞队列等)来组织进程,涉及简单数据结构知识,此部分不做详细讲解。
    • 进程切换:多进程的切换非常关键,是重点内容。
    • 进程分离:在内存管理部分详细展开如何让进程之间地址空间不相互影响 。
    • 进程合作:在进程同步章节详细讲解操作系统如何让多个进程合作。

线程概念的引出

本次课重点探讨操作系统如何实现多个进程的切换。然而,讲进程切换却提到线程,这是因为线程的切换是进程切换的重要组成部分。
在这里插入图片描述

  • 多进程图像回顾:一个进程执行一系列指令,执行时可能因启动I/O(如磁盘操作)而执行不下去,需要切换。这里引发思考:能否只切换指令序列,而不切换资源(如映射表) ?
  • 线程概念形成:实际上,将资源和指令执行分开,只切换指令序列是可行的。这样切换速度更快,因为只需切换程序计数器(PC)和一些寄存器,无需切换映射表等资源。这种在一个资源下启动多个轻巧的指令序列,且可来回切换的方式,就是线程。线程保留了并发优点,同时避免了进程切换的高代价,其实质是映射表不变而PC指针变化。
    在这里插入图片描述

线程实用性的示例——网页浏览器

以网页浏览器为例说明线程的实用性。
在这里插入图片描述

  • 浏览器显示过程:打开斯坦福网站时,网页数据包含文本、图片等。若所有操作按顺序执行,先下载文本,再显示文本,最后显示图片,会出现一段时间屏幕空白,用户体验差。
  • 多线程实现方式:实际浏览器是通过多线程实现的:
    • 一个线程从服务器接收数据。
    • 一个线程显示文本。
    • 一个线程处理图片(如解压缩)。
    • 一个线程显示图片。
  • 线程共享资源优势:这些线程共享资源,比如接收的数据放在缓冲区,显示文本和图片的线程都从该缓冲区读取数据。若采用进程方式,因进程地址空间分离,数据传递会很麻烦,所以采用线程方式更合适。

线程切换实现示例

WebExplorer应用程序为例,展示线程切换的实现:
在这里插入图片描述

  • 程序基本结构:程序申请共享缓冲区,创建多个线程,每个线程执行一个函数。如GetData函数负责从网站下载数据(建立Socket连接,下载数据包并放入缓冲区),Show函数从缓冲区取出内容显示到显示器上。
  • 线程交替执行关键:核心是实现线程交替执行,这需要用到Yield函数。当GetData函数下载一部分数据后,调用Yield函数暂停当前线程执行,操作系统保存当前线程状态(如PC值、寄存器值等),然后从线程就绪队列中选取另一个线程(如Show线程),恢复其状态并让其执行。Show线程执行完相关操作后,也调用Yield函数,将执行权交回操作系统,操作系统再选取其他就绪线程执行,如此循环实现线程交替执行。

线程切换原理深入分析

  • CreateYieldCreate用于制造第一次切换时的状态,Yield是线程切换的核心。
    在这里插入图片描述
    在这里插入图片描述

    能切换就需清楚切换时的状态,比如Yield操作就是程序计数器(PC)从一个地址跳到另一个地址,如从100跳到300 。

  • 栈的变化:开始是一个栈,存在问题。后来发展为两个栈(对应两个线程),每个线程有自己的栈和线程控制块(TCB)。Yield切换时要先切换栈,例如Yield函数中先将当前栈指针(esp)保存到当前TCB中,然后将esp设置为下一个线程TCB中的esp值,实现栈的切换。
    在这里插入图片描述

  • ThreadCreate核心ThreadCreate函数的核心是创建两个TCB、两个栈,并将切换的PC值存于栈中。具体实现为申请TCB和栈的内存空间,将函数入口地址(如100)存入栈中,并将栈指针与TCB关联。
    在这里插入图片描述

综合示例与用户级线程特点

  • 综合示例:将所有相关函数组合在一起,WebExplorer函数(类似main函数)中创建线程(调用ThreadCreate),并通过while(1)Yield()不断进行线程切换;GetData函数在下载数据过程中调用Yield实现线程切换;ThreadCreate函数负责申请栈和TCB等操作;Yield函数负责保存现场、切换栈等操作。还提到编译相关命令,如gcc -o explorer get.c yield.c...gcc get.c... -lthread
    在这里插入图片描述

  • 用户级线程特点:强调Yield是用户程序,说明这是用户级线程。用户级线程切换控制权在用户程序手中,在用户态执行。若进程中的某个线程进入内核并阻塞(如GetData函数中连接URL发起请求后等待网卡I/O ,导致进程阻塞),其他线程仍可通过Yield进行切换执行,实现并发效果。但用户级线程也有局限性,如线程长时间执行不主动调用Yield,会导致其他线程无法执行,后续会讲解内核级线程来解决此类问题。
    在这里插入图片描述

**此处可插入对应图片,展示相关代码结构、线程切换流程、栈与TCB关系等内容,帮助理解** 。

相关文章:

进程与线程:03 用户级线程

多进程与操作系统基础 上一个内容我们讲了多进程图像,强调多进程图像是操作系统最核心的图像。我们还通过Windows任务管理器,实际观察了操作系统里的进程。 进程是操作系统的核心内容,管理好多个进程,就能管理好操作系统和CPU。…...

四种阻抗匹配的方式

一、串联端接方式 即靠近输出端的位置串联一个电阻。 要达到匹配效果,串联电阻和驱动端输出阻抗的总和应等于传输线的特征Z0 二、并联端接方式 并联端接又被称为终端匹配。 要达到阻抗匹配的要求,端接电阻应该和传输线的特征阻抗Z0相等。 三、AC并联端…...

WebRTC通信技术EasyRTC音视频实时通话安全巡检搭建低延迟、高可靠的智能巡检新体系

一、方案背景 在现代安防和工业领域,安全巡检是确保设施正常运行和保障人员安全的关键环节。传统的巡检方式往往依赖人工,效率低下且容易出现遗漏。随着技术的发展,实时通信技术EasyRTC为安全巡检提供了更加高效和智能化的解决方案。 二、方…...

使用json_repair修复大模型的json输出错误

json_repair 有些 LLM 在返回格式正确的 JSON 数据时会有些问题,有时会漏掉括号,有时会在数据中添加一些单词。不至于这种错误每次都要丢弃,再次生成太浪费时间了,因此能修复错误时还是要尽量修复。这就是 json_repair 的主要目的…...

聊透多线程编程-线程互斥与同步-12. C# Monitor类实现线程互斥

目录 一、什么是临界区? 二、Monitor类的用途 三、Monitor的基本用法 四、Monitor的工作原理 五、使用示例1-保护共享变量 解释: 六、使用示例2-线程间信号传递 解释: 七、注意事项 八、总结 在多线程编程中,线程之间的…...

鸿蒙系统的 “成长烦恼“:生态突围与技术迭代的双重挑战

一、应用生态:从 "有没有" 到 "好不好" 的漫长爬坡 作为一款诞生于中美科技博弈背景下的国产操作系统,鸿蒙(HarmonyOS)自 2019 年发布以来,已在设备装机量上取得突破 —— 截至 2023 年底&#xf…...

ESP8266_ESP32 Smartconfig一键配网功能

目录 SmartConfig一键配网基本原理设备绑定流程 ESP8266/ESP32 SmartConfig配网AT指令配置方式Arduino程序配置方式 总结 SmartConfig一键配网 SmartConfigTM 是由 TI 开发的配网技术,用于将新的 Wi-Fi 设备连接到 Wi-Fi 网络。它使用移动应用程序将无线网凭据从智…...

图解Agent2Agent(A2A)

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创AI未来! 🚀 嘿,朋友们!今天咱们来聊聊 Agentic 应用背后的两大神器:A2A 和 …...

Kotlin基础(①)

open 关键字:打破 Kotlin 的“默认封闭”规则 // 基类必须加 open 才能被继承 open class Animal {// 方法也要加 open 才能被子类重写open fun makeSound() {println("Some sound")} }class Dog : Animal() {override fun makeSound() {println("W…...

Android Kotlin+Compose首个应用

本教程将创建一个简单的基于 Kotlin 语言的 APP,并使用 Compose 来管理 UI。 创建一个基于 Kotlin 的Android 应用 打开 Android Studio,选择New Project来创建一个应用,然后在Phone and Tablet选项卡,选择 Empty Activity&…...

《AI大模型应知应会100篇》第30篇:大模型进行数据分析的方法与局限:从实战到边界探索

大模型进行数据分析的方法与局限:从实战到边界探索 摘要 在金融分析师用自然语言询问季度财报趋势,电商平台通过对话生成用户画像的今天,大模型正在重塑数据分析的协作模式。本文通过实战代码与行业案例,揭示大模型如何成为数据…...

基于SSM+Vue的社群交流市场服务平台【提供源码+论文1.5W字+答辩PPT+项目部署】

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...

Python Cookbook-6.7 有命名子项的元组

任务 Python 元组可以很方便地被用来将信息分组,但是访问每个子项都需要使用数字索引,所以这种用法有点不便。你希望能够创建一种可以通过名字属性访问的元组。 解决方案 工厂函数是生成符合要求的元组的子类的最简单方法: #若在2.4中可使用operator…...

软件功能测试和非功能测试有什么区别和联系?

软件测试是保障软件质量的核心环节,而软件功能测试和非功能测试作为测试领域的两大重要组成部分,承担着不同但又相互关联的职责。 软件功能测试指的是通过验证软件系统的各项功能是否按照需求规格说明书来正确实现,确保软件的功能和业务流程…...

Java Lambda表达式指南

一、Lambda表达式基础 1. 什么是Lambda表达式? 匿名函数:没有名称的函数函数式编程:可作为参数传递的代码块简洁语法:替代匿名内部类的更紧凑写法 2. 基本语法 (parameters) -> expression 或 (parameters) -> { statem…...

K8s使用LIRA插件更新安全组交互流程

在Kubernetes集群中,当使用Lira作为CNI(容器网络接口)插件,并且需要更新ConfigMap中的安全组()securityGroups字段)时,实际上你是在配置与Pod网络相关的高级选项。Lira作为一种支持P…...

利用TCP+多进程技术实现私聊信息

服务器: import socket from multiprocessing import Process from threading import Threaduser_dic {}def send_recv(client_conn, client_addr):while 1:# 接收客户端发送的消息res client_conn.recv(1024).decode("utf-8")print("客户端发送…...

【图问答】DeepSeek-VL 论文阅读笔记

《DeepSeek-VL: Towards Real-World Vision-Language Understanding》 1. 摘要/引言 基于图片问答(Visual Question Answering,VQA)的任务 2. 模型结构 和 三段式训练 1)使用 SigLIP 和 SAM 作为混合的vision encoder&#xf…...

深度学习预训练和微调

目录 1. 预训练(Pre-training)是什么? 2. 微调(Fine-tuning)是什么? 3. 预训练和微调的对象 4. 特征提取如何实现? 预训练阶段: 微调阶段: 5. 这样做的作用和意义 …...

面经-浏览器/网络/HTML/CSS

目录 1. http缓存机制 缓存机制 流程概述 2. 常见的http状态码 1xx(信息性状态码) 3xx(重定向状态码) 4xx(客户端错误状态码) 5xx(服务器错误状态码) 3. http和https的区别…...

轻松实现文件批量命名的实用工具

软件介绍 今天要给大家介绍一款超实用的批量文件重命名小工具,它完全可以称得上是同类产品的绝佳替代品。 软件特性 这小工具叫 MiniRenamer,身材十分苗条,大小还不到 300KB 呢。解压完后,不用任何复杂操作,直接就能…...

基于Redis实现高并发抢券系统的数据同步方案详解

在高并发抢券系统中,我们通常会将用户的抢券结果优先写入 Redis,以保证系统响应速度和并发处理能力。但数据的最终一致性要求我们必须将这些结果最终同步到 MySQL 的持久化库中。本文将详细介绍一种基于线程池 Redis Hash 扫描的异步数据同步方案&#…...

【Pandas】pandas DataFrame sub

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

4.21总结

正式开始设计和实现前端页面 1.目标效果 2.今日实现内容 在前端编写了相应的store,api,utils文件,以便后续的组件复用 2.编写了相应的css文件...

VLA论文精读(十四)PointVLA: Injecting the 3D World into Vision-Language-Action Models

这篇论文瞄准的是2025年在arxiv上发布的一篇VLA领域论文。这篇文章最大的创新点在于将3D点云信息作为补充条件送入模型,而不是DP3一样只用纯3D数据从头训练模型,按照作者的说法这样可以在保留模型原有2D解释能力的同时添加了其3D能力,并且可以…...

BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection

背景 对于现有的BEVDet方法,它对于速度的预测误差要高于基于点云的方法,对于像速度这种与时间有关的属性,仅靠单帧数据很难预测好。因此本文提出了BEVDet4D,旨在获取时间维度上的丰富信息。它是在BEVDet的基础上进行拓展,保留了之前帧的BEV特征,并将其进行空间对齐后与当…...

Java学习路线--自用--带链接

1.Java基础 黑马:黑马程序员Java零基础视频教程_下部 2.MySQL 尚硅谷:MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板 3.Redis 黑马:黑马程序员Redis入门到实战教程,深度透…...

【锂电池容量特征提取】NASA数据集锂电池容量特征提取(Matlab完整源码)

目录 效果一览程序获取程序内容代码分享研究内容基于NASA数据集的锂电池容量特征提取方法研究摘要关键词 1. 引言1.1 研究背景1.2 研究意义1.3 研究目的 2. 文献综述2.1 锂电池容量特征提取相关理论基础2.2 国内外研究现状 3. NASA数据集介绍3.1 数据集来源与构成3.2 数据采集方…...

vue2使用markdown-it解析markdown文本

1.安装markdown-it npm instal markdown-it 2. 页面中引用 import MarkdownIt from markdown-it ...const mdRender MarkdownIt(); ...data {return {md: new MarkdownIt(),} } 3. html <p v-html"md.render(conetnt)" ></p>...

云服务器怎么选择防御最合适

用户问的是怎么选择云服务器的防御最合适。这个问题看起来是关于云安全方面的&#xff0c;尤其是如何配置防御措施来保护云服务器免受攻击。首先&#xff0c;我需要理解用户的需求可能是什么。他们可能是一个企业或者个人用户&#xff0c;正在考虑上云&#xff0c;但担心安全问…...

ubuntu20.04安装安装x11vnc服务基于gdm3或lightdm这两种主流的显示管理器。

前言&#xff1a;在服务端安装vnc服务&#xff0c;可以方便的远程操作服务器&#xff0c;而不用非要插上显示器才行。所以在服务器上安装vnc是很重要的。在ubuntu20中&#xff0c;默认的显示管理器已经变为gdm3&#xff0c;它可以带来与 GNOME 无缝衔接的体验&#xff0c;强调功…...

汽车动力转向器落锤冲击试验台

汽车动力转向器落锤冲击试验台依据标准&#xff1a;QC/T29096-1992《汽车转向器总成台架试验方法》&#xff1b;以工控机为控制核心&#xff0c;采用步进电机举升机构&#xff0c;高精度的光电编码器为位置反馈元件。能够自动完成落锤的起吊、精确的定位、释放、冲击过程的测量…...

Mybatis延迟加载、懒加载、二级缓存

DAY22.2 Java核心基础 Mybatis 延迟加载、懒加载 提高程序运行效率的技术 延迟加载&#xff0c;也叫惰性加载或者懒加载 延迟加载如何提升程序的运行效率&#xff1f; 持久层操作有一个原则&#xff1a;Java 程序和数据库交互频率越低越好 Java 程序每次和数据库进行交互…...

Linux网络编程 多进程UDP聊天室:共享内存与多进程间通信实战解析

知识点1【项目功能介绍】 今天我们写一个 UDP &#xff0c;多进程与不同进程间通信的综合练习 我这里说一下 这个项目的功能&#xff1a; 1、群发&#xff08;有设备个数的限制&#xff09;&#xff1a;发送数据&#xff0c;其他所有客户端都要受到数据 2、其他客户端 都 可…...

网络结构及安全科普

文章目录 终端联网网络硬件基础网络协议示例&#xff1a;用户访问网页 OSI七层模型网络攻击&#xff08;Hack&#xff09;网络攻击的主要类别&#xff08;一&#xff09;按攻击目标分类&#xff08;二&#xff09;按攻击技术分类 网络安全防御 典型攻击案例相关名词介绍网络连接…...

CAD文件如何导入BigemapPro

问题描述 在使用 BigemapPro 加载 CAD 文件的过程中&#xff0c;会出现两种不同的情况&#xff1a;部分文件能够被软件自动识别投影并顺利加载&#xff1b;而另一部分文件则无法自动识别投影&#xff0c;需要手动干预才能准确加载到影像上。下面为您详细介绍这两种情况的具体操…...

Spring-AOP分析

Spring分析-AOP 1.案例引入 在上一篇文章中&#xff0c;【Spring–IOC】【https://www.cnblogs.com/jackjavacpp/p/18829545】&#xff0c;我们了解到了IOC容器的创建过程&#xff0c;在文末也提到了AOP相关&#xff0c;但是没有作细致分析&#xff0c;这篇文章就结合示例&am…...

opencv 对图片的操作

对图片的操作 1.图片镜像旋转&#xff08;cv2.flip()&#xff09;2 图像的矫正 1.图片镜像旋转&#xff08;cv2.flip()&#xff09; 图像的旋转是围绕一个特定点进行的&#xff0c;而图像的镜像旋转则是围绕坐标轴进行的。图像的镜像旋转分为水平翻转、垂直翻转、水平垂直翻转…...

Python第一周作业

Python第一周作业 文章目录 Python第一周作业 如何在命令行中创建一个名为venv的虚拟环境&#xff1f;请写出具体命令编写一段代码&#xff0c;判断变量x是否为偶数&#xff0c;如果是则返回"Even"&#xff0c;否则返回"Odd"编写代码&#xff0c;使用分支结…...

jinjia2将后端传至前端的字典变量转换为JS变量

后端 country_dict {AE: .amazon.ae, AU: .amazon.com.au} 前端 const country_list JSON.parse({{ country_list | tojson | safe }});...

[渗透测试]渗透测试靶场docker搭建 — —全集

[渗透测试]渗透测试靶场docker搭建 — —全集 对于初学者来说&#xff0c;仅仅了解漏洞原理是不够的&#xff0c;还需要进行实操。对于公网上的服务我们肯定不能轻易验证某些漏洞&#xff0c;否则可能触犯法律。这是就需要用到靶场。 本文主要给大家介绍几种常见漏洞对应的靶场…...

二分查找、分块查找、冒泡排序、选择排序、插入排序、快速排序

二分查找/折半查找 前提条件&#xff1a;数组中的数据必须是有序的 核心逻辑&#xff1a;每次排除一半的查找范围 优点&#xff1a;提高查找效率 代码 public static int binarySearch(int[] arr, int num) {int start 0;int end arr.length - 1;while (start < end) {…...

【AI】SpringAI 第三弹:接入通用大模型平台

1.添加依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency> 2.设置 yml 配置文件 在 application.yml 中添加 DeepSeek 的配置信息&#xff1a; spr…...

C++常用函数合集

万能头文件&#xff1a;#include<bits/stdc.h> 1. 输入输出流&#xff08;I/O&#xff09;函数 1.1cin 用于从标准输入流读取数据。 1.2cout 用于向标准输出流写入数据。 // 输入输出流&#xff08;I/O&#xff09;函数 #include <iostream> using namespace…...

22. git show

基本概述 git show 的作用是&#xff1a;显示各种 Git 对象&#xff08;如提交、标签、树对象、文件对象等&#xff09;的详细信息 基本用法 1.基本语法 git show [选项] [对象]2.查看提交的详细信息 git show <commit-hash> # 示例 git show a1b2c3d # 显示某…...

使用blob文件流

1.后端 GetMapping(value "/static/**")public void view(HttpServletRequest request, HttpServletResponse response) {// ISO-8859-1 > UTF-8 进行编码转换String imgPath extractPathFromPattern(request);if(oConvertUtils.isEmpty(imgPath) || imgPath&q…...

操作指南:在vue-fastapi-admin上增加新的功能模块

近期在github上看到一个很不错的web框架&#xff0c;https://github.com/mizhexiaoxiao/vue-fastapi-admin。该项目基于 FastAPI Vue3 Naive UI 的现代化前后端分离开发平台&#xff0c;融合了 RBAC 权限管理、动态路由和 JWT 鉴权&#xff0c;可以助力中小型应用快速搭建&am…...

文字、语音、图片、视频四个模态两两之间(共16种转换方向)的生成技术及理论基础的详细说明及表格总结

以下是文字、语音、图片、视频四个模态两两之间&#xff08;共16种转换方向&#xff09;的生成技术及理论基础的详细说明及表格总结&#xff1a; 1. 技术与理论基础详解 (1) 文字与其他模态的转换 文字→文字 技术&#xff1a;GPT、BERT、LLaMA等语言模型。理论&#xff1a;T…...

FramePack:让视频生成更高效、更实用

想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具&#xff08;限时免费&#xff09;。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型&#xff0c;以发挥其…...

【大语言模型DeepSeek+ChatGPT+python】最新AI-Python机器学习与深度学习技术在植被参数反演中的核心技术应用

在全球气候变化与生态环境监测的重要需求下&#xff0c;植被参数遥感反演作为定量评估植被生理状态、结构特征及生态功能的核心技术&#xff0c;正面临数据复杂度提升、模型精度要求高、多源异构数据融合等挑战。人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;…...