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

Linux线程(二): 线程控制之创建

一、线程相关概念知识补充1.1 提升检索的方法TLBCPU给MMU传虚拟地址MMU去问TLB有没有 TLB全称为转移后备缓冲器也俗称快表是集成在CPU内的一段存储空间它与MMU紧密协同工作。其核心作用是缓存虚拟地址到物理地址的映射关系以此提升地址转化效率避免直接查页表带来的多次访存延迟。当CPU进行虚拟地址到物理地址的转化时MMU会优先在TLB中查询是否有对应的映射若命中则直接获取物理地址无需再访问内存中的页表若未命中才会通过查页表获取物理地址并同步将该映射关系添加到TLB中刷新记录进而加快后续的地址转化速度。TLBTranslation Lookaside Buffer的关键特性速度TLB在CPU芯片内访问速度≈寄存器比内存快100倍容量通常64-1024项存放最常用的映射进程切换必须刷新TLB或标记无效因为不同进程页表不同1.2 缺页中断缺页中断是CPU访问虚拟地址时因未在 TLB 和 页表 中找到对应物理页且虚拟地址合法而触发的硬件异常核心作用是实现虚拟内存的按需分配具体内容如下触发条件与本质当CPU传递虚拟地址进行物理地址转化时若TLB和页表均未命中对应物理页但该虚拟地址处于进程锁定的合法地址空间内CPU硬件会自动触发缺页异常本质是操作系统对物理内存的延迟申请机制——仅在程序真正需要访问对应内存时才触发物理内存的分配。处理流程程序中断与入口切换缺页异常产生后用户程序被中断CPU转而执行中断向量表中对应的缺页中断处理方法由内核处理器接管处理。按类型分类处理硬件缺页主要缺页错误若物理内存中无对应物理页操作系统会查找管理物理内存的数据结构申请物理内存将内存的占用标志位设为使用中随后构建物理页框与页表的映射关系若数据在磁盘还需从磁盘读取数据到物理内存再完成映射。次要缺页错误若物理内存中已存在对应物理页如动态库被其他进程提前载入则无需读取数据仅需建立虚拟地址与该物理页的映射关系即可。越界与无效情况区分若触发异常的虚拟地址页号非法或地址超出进程内存映射范围会被判定为越界或无效缺页错误操作系统会直接终止进程而非执行内存申请与映射。核心价值缺页中断实现了虚拟内存的延迟申请程序申请虚拟地址空间时无需立即分配物理内存仅在真正访问时触发中断分配。未使用的内存可分配给其他进程大幅提升了内存的使用充分度是虚拟内存机制的核心支撑。1.3 如何理解 new/malloc用户态内存申请malloc 本质用户态向内核申请内存的接口底层依赖系统调用brk/sbrk/mmap。小内存申请128KB用brk扩展堆低地址向上扩展复用空闲内存块。大内存申请128KB用mmap映射匿名页独立虚拟区域释放直接 munmap。new vs mallocnew 是 C 运算符底层调用 malloc还会调用构造函数。malloc 是 C 库函数仅分配内存不初始化。核心逻辑用户态 malloc≠直接分配物理内存是分配虚拟地址空间物理内存由缺页异常延迟分配。1.4 如何区分越界 / 缺页类型核心特征内核处理方式缺页虚拟地址有映射但无物理页分配物理页建立页表映射软 / 硬缺页越界虚拟地址无映射或权限非法判定为非法地址发送 SIGSEGV 信号判断依据内核查vmavm_area_struct若虚拟地址不在任何 vma 范围内→越界若在 vma 内但无物理页→缺页。1.5 是不是线程越多越好线程过多的问题切换开销爆炸线程切换需保存 / 恢复上下文线程数 CPU 核心数时切换成本占比飙升反而降低效率。资源竞争共享资源全局变量、锁竞争加剧导致死锁、性能下降。内存溢出每个线程默认栈大小8MB线程过多会耗尽进程内存。合理线程数计算密集型CPU 核心数 1避免线程空闲时切换浪费。I/O 密集型CPU 核心数 ×2~4IO 等待时线程切换利用空闲 CPU。1.6 为什么 I/O 的时候创建多线程是好的I/O 密集型核心特征线程大部分时间阻塞等待 IO如 read/write/recvCPU 空闲。多线程价值一个线程阻塞时操作系统调度其他线程执行充分利用 CPU避免资源浪费。多线程可并发处理多个 IO 请求如网络服务端每个线程处理一个连接提升并发量。对比单线程单线程 I/O 时一个请求阻塞整个程序停滞无法处理其他请求。1.7 什么是计算密集型 / I/O 密集型1计算密集型定义程序运行时大部分时间在做 CPU 计算IO 操作极少CPU 利用率高。特征任务数值计算、数据加密、矩阵运算、算法竞赛CCF / 算法赛。资源需求高 CPU 算力、低延迟内存访问。瓶颈CPU 性能而非 IO / 网络。2I/O 密集型定义程序运行时大部分时间在等待 IO磁盘 / 网络 / 用户输入CPU 空闲时间多。特征任务网络请求HTTP、文件读写、数据库操作、日志处理。资源需求高并发 IO 处理、低 IO 延迟。瓶颈IO 速度而非 CPU 性能。GPU 核心设计大量计算核心流处理器专为并行计算优化无复杂 IO 控制单元。计算密集型场景图形渲染顶点 / 片元着色器计算并行处理大量像素 / 顶点。大模型训练 / 推理矩阵乘法、张量运算海量并行计算。科学计算流体力学、气象模拟并行处理数据块。对比 CPUCPU 有复杂的分支预测、缓存、IO 控制适合通用场景GPU 无 IO 冗余纯计算效率拉满。二、进程和线程2.1 进程和线程进程是资源分配的基本单位线程是调度的基本单位2-2 进程的多个线程共享同一地址空间因此Tex Segment、Data Segmentt 都是共享的如果定义一个函数在线程中都可以调用如果定义一个全局变量在各个线程中都可以访问到除此之外各线程还共享以下进程资源和环境文件描述符表每个信号的处理方式SIG_IGNSIG_DFL 或者自定义的信号处理函数当前工作目录用户id和组id关系图对于之前学习的单进程其实是只有一个线程执行流的进程三、线程控制在linux中如果想要创建多线程需要用到第三方库3.1 POSIX线程库在Linux下编写多线程程序几乎都使用POSIX线程库简称pthread。它定义了一套标准API在所有遵循POSIX的系统上通用Linux、macOS、BSD等。头文件#include pthread.h编译链接gcc program.c -lpthread注意是小写l-lpthread函数命名所有线程相关函数都以pthread_开头例如pthread_create创建pthread_self获取自身IDpthread_exit退出pthread_cancel取消pthread_join等待pthread_detach分离⚠️ 注意pthread库中的函数不修改全局errno而是直接返回错误码。这和很多系统调用如open、read不同需要适应。3.2 创建线程int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);参数thread输出型参数线程创建成功后线程ID会存入这里。attr线程属性如栈大小、调度策略。传NULL表示使用默认属性。start_routine线程启动后要执行的函数返回void*参数也是void*。arg传递给start_routine的参数。返回值成功返回0失败返回正数错误码如EAGAIN、EINVAL等。3-2-1 线程创建demo#include iostream #include string #include pthread.h #include unistd.h void *threadrun(void *args) { std::string name (const char *)args; while (true) { std::cout 我是新线程:name: name std::endl; sleep(1); } return nullptr; } int main() { pthread_t tid; pthread_create(tid, nullptr, threadrun, (void *)thread-1); while (true) { std::cout 我是主线程... std::endl; sleep(1); } return 0; }查询一共有多少个进程在运行 ps ajx | head -1 ps ajx | grep test_thread用ps -aL命令可以看到每个线程实际上都是一个独立的 LWP它们拥有独立的 PID进程 ID但共享同一组虚拟地址空间CPU 调度时依据的是 LWP而非用户层面的线程概念ps -aLLWP:轻量级进程CPU 调度的时候 看lwp !!!!Linux 系统不存在真正意义上的线程它所谓的线程概念是使用轻量级进程模拟的。但 OS 中只有轻量级进程所谓模拟线程是我们的说法3-2-2 核心理论解析1. 资源分配时间片等分双核创建两个线程总时间片均分地址空间共享父子进程通过clone()系统调用实现2. 异常传播特性崩溃影响范围任一线程崩溃导致整个进程终止信号处理所有线程共享信号处理动作健壮性对比多线程程序比多进程更容易整体崩溃3. 资源共享问题显示器竞争多个线程并发写入终端导致输出混乱解决方案预告后续将引入互斥锁(Mutex)机制3-3-3 为什么要有线程库系统调用与用户层的封装Linux 只提供创建轻量级进程的系统调用如clone用户只需要关心线程不需要关心底层的 LWP 实现pthread 库将创建轻量级进程的细节封装起来向用户提供统一的线程操作接口层级说明用户层pthread 库提供线程创建、同步、销毁等接口内核层实际创建的是轻量级进程LWP本质用户级线程—— 在线程库层面实现的线程概念链接 pthread 库编译多线程程序时必须链接 pthread 库# 错误示例未链接库 g -o test_thread TestThread.cc # 报错undefined reference to pthread_create # 正确做法 g -o test_thread TestThread.cc -lpthread # 使用 C11 线程时也要链接 g -stdc11 -o test_thread TestThread.cc -lpthread实现原理平台底层实现LinuxC11 的std::thread本质封装了 pthread 库Windows封装 Windows 创建线程的接口如CreateThread跨平台原理所有平台各实现一份通过条件编译形成统一接口的库。

相关文章:

Linux线程(二): 线程控制之创建

一、线程相关概念知识补充1.1 提升检索的方法:TLBCPU给MMU传虚拟地址,MMU去问TLB有没有 !TLB全称为转移后备缓冲器,也俗称快表,是集成在CPU内的一段存储空间,它与MMU紧密协同工作。其核心作用是缓存虚拟地址…...

看AI如何为历史着色:cv_unet_image-colorization 上色作品精彩分享

看AI如何为历史着色:cv_unet_image-colorization 上色作品精彩分享 1. 当黑白照片遇见AI色彩魔法 翻开泛黄的老相册,那些定格在黑白胶片里的历史瞬间总是让人浮想联翩:奶奶年轻时的碎花裙到底是什么颜色?爷爷参军时的军装是深绿…...

PPTist:如何用开源Web演示工具解决企业级演示文稿制作难题?

PPTist:如何用开源Web演示工具解决企业级演示文稿制作难题? 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPo…...

WebPShop插件:Photoshop中WebP格式的终极专业解决方案

WebPShop插件:Photoshop中WebP格式的终极专业解决方案 【免费下载链接】WebPShop Photoshop plug-in for opening and saving WebP images 项目地址: https://gitcode.com/gh_mirrors/we/WebPShop 还在为Photoshop无法完美处理WebP格式而烦恼吗?W…...

Web Designer架构解析:三步构建企业级可视化页面生成系统

Web Designer架构解析:三步构建企业级可视化页面生成系统 【免费下载链接】web_designer 网页设计器图形化工具,通过拖拽组件进行页面排版和生成页面代码 项目地址: https://gitcode.com/gh_mirrors/we/web_designer Web Designer是一款基于Vue.js和ElementU…...

Lingyuxiu MXJ LoRA开发技巧:VSCode调试配置详解

Lingyuxiu MXJ LoRA开发技巧:VSCode调试配置详解 1. 为什么需要在VSCode里调试LoRA项目 你可能已经用过Lingyuxiu MXJ LoRA镜像生成出不少惊艳的人像作品,但当想修改模型行为、排查生成异常,或者给引擎加新功能时,光靠重启服务和…...

034.前端界面开发:用HTML/CSS/JS搭个检测结果展示页面

上周调试YOLO模型时遇到个尴尬场景:算法团队在服务器上跑通了检测demo,但验收方盯着黑乎乎的终端输出直皱眉。“这框框和数字在哪呢?能不能直观点?”——一句话点醒我,算法再准,没个像样的展示界面,在非技术伙伴眼里约等于没干活。连夜用最基础的HTML/CSS/JS搭了个结果展…...

Simulink全局变量实战:Data Store Memory模块的权衡与最佳实践

1. 为什么我们需要全局变量? 在Simulink建模过程中,我们经常会遇到需要在多个模块间共享数据的情况。想象一下你在设计一个汽车控制系统,油门踏板模块需要将踩踏深度传递给发动机控制模块,同时仪表盘模块也需要这个数据来显示当前…...

CosyVoice开发环境配置:Windows系统下Anaconda虚拟环境搭建

CosyVoice开发环境配置:Windows系统下Anaconda虚拟环境搭建 最近有不少朋友在尝试本地部署语音合成模型,特别是像CosyVoice这样效果不错的开源项目。但很多人在第一步——搭建开发环境上就卡住了,尤其是在Windows系统上,各种依赖…...

告别出差!用Rtty+Rttys低成本搞定嵌入式设备远程Shell(含交叉编译避坑指南)

嵌入式设备远程运维革命:基于Rtty/Rttys的零成本跨地域调试方案 想象一下这样的场景:凌晨三点,某海外工厂的生产线突然停机,设备日志显示内存泄漏但无法定位根源。传统解决方案需要工程师立刻订机票、办签证,至少48小时…...

【MobileNet】从V1到V3:轻量化CNN的演进之路与移动端部署实战

1. 引言:为什么我们需要轻量级网络? 如果你是一名移动端或者嵌入式设备的开发者,肯定遇到过这样的烦恼:好不容易在电脑上训练了一个效果不错的图像识别模型,准确率高达95%,兴冲冲地想把它塞进手机App或者智…...

效果惊艳!雯雯的后宫-造相Z-Image-瑜伽女孩生成作品案例展示

效果惊艳!雯雯的后宫-造相Z-Image-瑜伽女孩生成作品案例展示 1. 模型效果概览 雯雯的后宫-造相Z-Image-瑜伽女孩是一款专门针对瑜伽主题优化的AI图像生成模型。基于Z-Image-Turbo技术架构,通过LoRA微调实现了对瑜伽体式、服装和环境的精准理解与生成能…...

通义千问1.5-1.8B-Chat-GPTQ-Int4在运维自动化中的智能监控方案

通义千问1.5-1.8B-Chat-GPTQ-Int4:让服务器监控“开口说话”的智能运维新方案 想象一下这个场景:凌晨三点,你的手机被监控告警的短信轰炸。你睡眼惺忪地爬起来,面对屏幕上瀑布般滚动的日志,试图从成千上万行信息里找出…...

万物识别-中文镜像真实案例:工厂产线零部件识别与缺陷初筛联动应用

万物识别-中文镜像真实案例:工厂产线零部件识别与缺陷初筛联动应用 1. 项目背景与需求场景 在现代制造业中,工厂产线的质量控制一直是核心环节。传统的零部件识别和缺陷检测往往依赖人工目检,不仅效率低下,而且容易因疲劳导致误…...

解放Proxmox VE生产力:PVE Tools一键配置工具深度解析

解放Proxmox VE生产力:PVE Tools一键配置工具深度解析 【免费下载链接】pvetools proxmox ve tools script(debian9 can use it).Including email, samba, NFS set zfs max ram, nested virtualization ,docker , pci passthrough etc. for english user,please loo…...

DDR Study - LPDDR5 Read Training 中的时序参数与眼图优化

1. LPDDR5读训练的核心挑战 当你第一次接触LPDDR5读训练时,可能会被那些复杂的时序参数搞得晕头转向。作为信号完整性工程师,我花了整整三个月才真正理解tWCK2DQO和tDQSQ这些参数背后的物理意义。简单来说,读训练就是要解决一个核心问题&…...

PX4飞控系统终极指南:5个关键步骤掌握开源无人机固定翼开发

PX4飞控系统终极指南:5个关键步骤掌握开源无人机固定翼开发 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 想要快速掌握开源无人机开发吗?PX4飞控系统作为全球最受欢迎的开…...

SAP Fiori开发避坑指南:OData V2和V4到底怎么选?从项目实战角度聊聊

SAP Fiori开发实战:OData V2与V4选型决策框架 当技术评审会的投影仪亮起,会议室里十几位开发骨干的目光聚焦在PPT最后一页的决策点上——这个即将投入千万预算的S/4HANA转型项目,究竟该采用OData V2还是V4作为服务协议?作为经历过…...

华芯微特SWM341S调试实录:SDRAM映射SPI Flash存字库,串口DMA配置那些坑

华芯微特SWM341S嵌入式开发实战:SDRAM资源优化与外设配置避坑指南 在嵌入式系统开发中,资源管理和外设配置往往是决定项目成败的关键因素。华芯微特SWM341S作为一款内置8MB SDRAM的MCU,为图形界面开发提供了硬件基础,但如何高效利…...

【Verilog】Verilog 基础【1】从零到一:语法核心与设计起点

1. 为什么Verilog是数字电路的起点? 第一次接触Verilog时,很多人会疑惑:为什么不用C语言直接写硬件?这要从数字电路设计的本质说起。想象一下,你要设计一个自动售货机的控制芯片,需要处理硬币识别、商品选择…...

大学生C语言课设实战:五子棋项目开发避坑指南(附完整源码)

大学生C语言课设实战:五子棋项目开发避坑指南(附完整源码) 五子棋作为经典棋类游戏,是C语言课程设计的常见选题。它不仅涵盖基础语法训练,还能锻炼模块化设计、算法实现和图形交互等核心能力。但在实际开发中&#xf…...

HeyGem批量版WebUI实测:口型同步自然,数字人视频生成效果展示

HeyGem批量版WebUI实测:口型同步自然,数字人视频生成效果展示 1. 数字人视频生成技术概览 数字人视频生成技术正在重塑内容创作方式。这项技术通过AI算法将输入的音频与视频素材智能结合,生成口型完全同步的数字人视频。相比传统视频制作需…...

PyTorch 2.8镜像创意应用:短视频创作者私有化AI视频生成工作流搭建

PyTorch 2.8镜像创意应用:短视频创作者私有化AI视频生成工作流搭建 1. 为什么短视频创作者需要私有化AI工作流 短视频创作行业正面临内容同质化严重、制作成本高企的痛点。传统工作流中,一个专业视频从创意到成品需要经历脚本创作、分镜绘制、素材拍摄…...

保姆级教程:在Ubuntu 24.04上从零部署Cloudreve私有网盘(含Nginx反代与HTTPS配置)

在Ubuntu 24.04上构建企业级私有云盘:Cloudreve全栈部署指南 当数据主权成为数字时代的新命题,越来越多的技术团队开始重新审视公有云存储的边界。本文将带您从零构建一个支持多存储后端、具备生产级可靠性的私有云盘系统——基于开源项目Cloudreve的完整…...

VMware macOS解锁神器:Auto-Unlocker完全指南与实战解析

VMware macOS解锁神器:Auto-Unlocker完全指南与实战解析 【免费下载链接】auto-unlocker Unlocker for VMWare macOS 项目地址: https://gitcode.com/gh_mirrors/au/auto-unlocker 在虚拟化技术日益普及的今天,许多开发者和技术爱好者都希望在Win…...

多链路聚合路由终端 高速网络与便携性的完美融合 YUOUT 宇东技术 5G HDMI视频无线图传 雄师M9多链路聚合终端 支持双向语音对讲 北斗定位 多链路聚合终端 YD-LY3001-5G

随着万物互联时代的到来,很多行业对网络传输的稳定性,高速传输性,安全性,随时随地性,提出来更高的要求,例如:应急指挥、施工现场、多场景直播、安防特种车辆、对视频传输这一块有极高的需求。该…...

TI F28P65 使用 ePWM 模块模拟 SPI 时钟的详细方法

引言 在嵌入式开发中,当芯片自带的硬件SPI接口数量不足,或者需要适配非标准时钟极性与相位的SPI从设备时,利用TI C2000系列芯片(如F28P65x)强大的ePWM(增强型脉宽调制)模块来模拟SPI时钟是一种…...

告别提示词工程:用RL训练你的LLM智能体,让它学会自己“上网搜答案”

智能体进化论:用强化学习解锁大模型的自主工具调用能力 当ChatGPT第一次展示出惊人的文本生成能力时,整个科技界为之震动。但很快,开发者们发现了一个尴尬的现实——这些看似无所不知的模型,在实际应用中常常表现得像个"书呆…...

深入解析Neurosim芯片架构设计(二):从Tile到PE的层次化实现

1. Neurosim芯片的层次化架构全景 第一次看到Neurosim芯片的架构图时,那种感觉就像初次拆解俄罗斯套娃——从最外层的Chip Level开始,逐层打开Tile、PE、Sub-array这些精妙的层级结构。这种层次化设计可不是为了好看,而是实实在在解决了神经网…...

副篇:从元融合到意义工程学——DOS痕迹论的实证转化方案

副篇:从元融合到意义工程学 ——DOS痕迹论的实证转化方案 引言:诊断之后是什么 《全球元融合史——DOS历史唯物观》完成了一项诊断工作。它以“痕迹”为微观中介,重新描述了从狩猎采集到算法时代的意义生态系统演化,揭示了现代性意…...