Linux(线程概念)

article/2025/6/8 10:37:21

目录

一 虚拟地址到物理地址的转换

1. 操作系统如何管理物理内存:

2. 下面来谈谈虚拟地址如何转换到物理地址:

3. 补充字段:

二 Linux中的线程

1. 先来说说进程:

2. 线程:

3. 线程相比较于进程的优缺点:

4. 线程独有的字段:

5. pthread库:


一 虚拟地址到物理地址的转换

1. 操作系统如何管理物理内存:

假设物理内存是4GB,管理物理内存基本单位是1字节吗?不是,一般是以4KB为一个基本单位,称为页框(页桢),正好操作系统与磁盘交互也是以4KB为基本单位,即读取8个扇区,既然4KB为单位,4GB有很多个4KB,势必也要进行管理吧,这里简单一点当成数组进行管理,实际是伙伴系统/slab....机制。

4GB / 4KB = 1,039,386个4KB,忽略其他字段:页框的使用情况...等。

也就是说数组大小为100w,假设地址从 0 ~ 4GB 编制,第0~1023字节,也就是对应的第0号下标,1024 ~ 2*4KB,对应第二个下标,取模,余数丢掉,所以只要拿着任意的地址都能索引到这个数组的任意下标,反向也能转回到页框的起始地址,当然,这个数组肯定也要在内存中开辟空间,100w * 4 = 400w 字节 -> 4k,每个下标存放页框的起始地址,这个不考虑。

2. 下面来谈谈虚拟地址如何转换到物理地址:

32位平台下:

虚拟地址主要是通过页表转换到物理地址,虚拟地址是 0 ~ 4G,如果按一对一进行映射,页表存放虚拟地址和物理地址的指针,一共4G,也就是4G * 8 = 32G的内存大小,显然是不现实的。

上面是把虚拟地址整体使用了,下面来看看另一个方案。

指针大小也就是 0 ~ 2^32次方,那能不能从这个虚拟地址的bit位入手?

实际上不仅仅只有一个页表,会有一个页目录,和页表。

页目录:存放指针高位前10bit位,也就是 2^10次方,1024,页目录一共1024个项,里面每一项存放的是页表的起始地址。

页表:页目录能索引到页表,页表大小是多少呢?也是1024项,取指针中间的10个bit位,每一项存放的是页框的起始地址,所以页表主要是用来建立页框的起始地址,也就是映射。

还有12bit位干嘛的?

页框是4KB,2^12次方刚好也是4KB,所以后面剩余的12bit是用来在页框中偏移的,页表以及存放的是页框的起始地址了,在进行页内偏移,最终拿到页框中某一个字节。

所以上述方案是利用了指针大小的bit位来进行转换划分的,而不是当整块使用暴力映射。

不同的进程虚拟地址完全一样,索引路径也一样,但最终页表存放的物理地址不一样,也侧面证明了进程是相互独立的,父子进程除外。

最后再来算一算页表和页目录占用内存的大小:

页目录:1024项 + 存放页表的地址:1024 * 4 = 4KB

页表:1024个页目录 + 每个页目录对应的页表也是1024项 + 页表每一项和物理地址的映射也就是存放页框的起始地址 = 1024 * 1024 * 4 = 4M

最终占总大小:4M + 4KB,这是最坏的情况,所有的虚拟地址全用上了,实际可能只会用一点点。

3. 补充字段:

1. 谁拿页表进行寻址呢?

OS?不是,CPU内部集成了一个硬件MMU,作用是用来进行页表转换的,怎么拿到页表?CPU内又有一个寄存器CR3,记录页表的起始地址在交给MMU,自此从MMU出来的就是实际的物理地址。

2. 如果在程序某个地方打了个死循环,MMU每次都要查相同的虚拟地址,是不是没必要啊?所以在CPU内部还有个寄存器TLB,主要用来缓存MMU之前查过的虚拟地址,以便后续省了查表的过程,变相提高了虚拟到物理的转换了。

3. 页表下标存放页框的地址,也就是指针4字节整数(2^32),直接用来索引页框吗?上面说的页框有100w个,2^20次方就是100w,剩下的12位浪费了吗?不是,页表不仅仅只有映射,还有比如该地址对应的对象的读写权限位,用户/内核态标记等字段,所以也就利用了这些剩余的bit位来标记比如虚拟地址是否合法,是否命中物理内存(否则缺页中断)等标记位。

二 Linux中的线程

1. 先来说说进程:

当创建一个进程,加载可执行文件代码和数据,创建内核数据结构:PCB,mm_struct,文件描述符表....等对象,都需要在内存中申请空间,被CPU调度,切换保护进程上下文数据,重新填充pc指针,MMU,TLB,CR3,等一系列的寄存器,每个进程新创建/被切换,带来的开销势必是很大的,这也就是为什么进程是资源分配的基本单位,要什么资源直接给进程分配物理内存。

2. 线程:

上面说的进程,不管是创建,调度等策略,线程是否也需要构建和进程一样的策略呢?如果采用,编码方面肯定复杂,其次比如调度和进程不一样,CPU是不是还要识别是进程还是线程?

所以在Linux中,线程没有单独制定个进程类似的策略,直接共享进程大部分属性,比如:调度算法,CPU一视同仁,不过线程也要有自己的一些其他字段。

既然线程能共享进程内的大部分资源,那么如何理解线程是CPU调度的基本单位?

进程也能被调度,线程也能:

进程调度,当时间片到了切换到下一个进程时,保存上下文更新,CR2指向的页表,TLB缓存内容,全部都失效重新加载新的进程,重新进行TLB缓存预热。

不仅仅是TLB缓存虚拟地址和物理地址的映射,CPU内部还有cache缓存,缓存代码块和数据,比如:访问第10行代码,把第10行代码周边的数据按4KB为基本单位缓存到cache缓存中,下次也能直接读取,不用间接寻址,遵循局部性原理规则,虽然不一定访问到,但极大概率访问到。

最重要的就是TLB,cache缓存,TLB存放高频访问的虚拟地址直接失效,cache缓存存放高频的数据块和代码块,进程会更新导致失效并重新进行寻址加载,而线程共享这些属性,无需更改,直接查,效率要高得多。

在Linux中没有真正的线程,只有轻量级进程(LWP),不管是单进程里面的一个执行流,也是轻量级进程,创建多个线程也是轻量级进程,而轻量级进程就是模拟进程的策略而诞生出来的。

3. 线程相比较于进程的优缺点:

优点:

  • 线程占用的资源比进程少,共享进程大部分资源,进程需要重新分配资源
  • 线程创建成本小,共享进程大部分资源
  • 线程共享进程虚拟地址空间,切换无需更改,进程则需要
  • 进程切换会更新TLB快表,cache缓存,导致热数据直接失效,重新访问内存填充
  • 线程共享数据容易,进程需要通信机制:fork(),管道,system v,posix通信机制提供的系统调用

缺点:

  • 线程共享大部分资源,会导致资源竞争导致数据不一致,静态条件等问题
  • 线程创建越多不会导致效率更高,主要以CPU的个数 * CPU的核心数来创建线程对象
  • 进程独立不会影响另一个进程,某一个线程异常,其他同级线程也会异常,线程异常代表进程异常,因为线程共享进程大部分属性,OS直接把这个线程有关联的数据全部释放,其他线程也就没意义了
4. 线程独有的字段:

线程ID:多个线程也要有ID区分轻量级进程,总不能这些线程没有编号吧

优先级:调度优先级肯定也会不一样,如果一样先调度谁?

栈:线程执行函数,调用函数就会建立栈帧,如果共享,线程是并发执行的,入栈,弹栈顺         序就乱了

寄存器:不同的线程被切换也要将该线程当前的上下文数据保存起来,下次进行恢复

信号block表:线程共享handler表,block可以自行屏蔽,比如给进程发信号,所有的线程都要执行这个信号,某个线程可以单独屏蔽他不执行。

5. pthread库:

上面说Linux中没有真正的线程,只有LWP,即轻量级进程,所以为了保证操作系统学科的线程的概念,向上封装了一层软件层,pthread库,也就是对轻量级进程接口进行了封装,属于第三方库,使用必须 -lpthread 指定库名,具体pthread库如何管理这些线程,请看下章。


http://www.hkcw.cn/article/OxumpQZTdu.shtml

相关文章

手把手教你用Appsmith打造企业级低代码平台:从部署到性能调优实战

文章目录 前言1.什么是Appsmith2.Docker部署3.Appsmith简单使用4.安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在当今快速变化的商业环境中,企业正面临内部系统建设的双重挑战。传统开发模式不仅需要漫长的开发周期(通常需要数月&a…

PyTorch 入门学习笔记(数字识别实战)

目录 一、关于 PyTorch 的一个重要概念——神经网络 二、PyTorch 是如何解决问题的(解决案例) 1 案例:手写一个数字,让计算机识别出是哪个数字。 2 PyThorch 解决问题大约需要以下几个步骤: 3 代码示例&#xff1…

OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤

一、靶机介绍 靶机地址:https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop%2C231/ 靶机难度:中级(CTF) 靶机发布日期:2018年3月21日 靶机描述: Boot2root挑战旨在创建一个安全的环境&…

CANopen转Profinet 全攻略:打通施耐德变频器与西门子 300PLC通讯链路

Profinet转CAN open西门子300PLC与施耐德变频器通讯 项目 福建某公司在国外的一个工业自动化项目中,控制中心系统通过监控变频器的不同状态发送不同的命令启动/停止变频器,设定变频器的运行速度进而控制变频器所连接的伺服电机。监控中心系统使用的是西…

Shell脚本编程

shell概述 什么是shell? 在Linux内核与用户之间的解释器程序 Linux默认解释器为/bin/bash负责向内核翻译及传达用户/程序指令相当于操作系统的“外壳” shell的使用方式 交互式-命令行 人工干预,智能化程度高逐条解释执行,效率低、 非交…

win11中使用grep

一、下载 https://nchc.dl.sourceforge.net/project/gnuwin32/grep/2.5.4/grep-2.5.4-setup.exe?viasf1 二、控制面板的环境变量 Path中增加 E:\software\GnuWin32\bin 三、测试使用

负载均衡相关基本概念

负载均衡在系统架构设计中至关重要,其核心目标是合理分配负载,提升系统整体性能和可靠性。本文简要介绍了负载均衡的基本概念,包括四层和七层负载均衡、负载均衡的使用场景和实现方式、负载均衡的常用算法以及一些配置相关知识。 1、负载均衡…

Houdini POP入门学习03

跟着教程学习降雪效果制作,这部分包含blast裁剪、外部引脚获取等。 阶段1 1.Geometry中创建grid,连接popnet。 2.双击进入popnet,在wire_pops_into_here前添加popforce,这一步并不是为了添加重力,而是增加一些乱流。 …

ULVAC DC-10-4P 400V input 10kW DC Pulse power supply 爱发科直流电源

ULVAC DC-10-4P 400V input 10kW DC Pulse power supply 爱发科直流电源

星野录(博客系统)测试报告

目录 一. 项目背景 二、项目功能 三、测试计划 1. 功能测试 1.1 测试用例 1.2 执行测试部分操作截图 2. 使用selenium进行自动化测试 2.1 添加相关依赖 2.2 登录页面测试 3.3 注册页面测试 3.4 博客列表页面测试 3.5 博客详情页测试 3.6 博客编辑页面测试 3.7 个人…

WPF技术体系与现代化样式

目录 ​​1 WPF技术架构解析​​ ​​1.1 技术演进与定位​​ ​​1.2 核心机制对比​​ ​​2 样式与资源系统​​ ​​2.1 资源(Resource)定义与作用域​​ ​​2.2 样式(Style)与触发器​​ ​​3 开发环境配置(.NET 8)​​ ​​3.1 安装流程​​ ​​3.2 项目结…

智能快递地址解析接口如何用PHP调用?

一、什么是智能快递地址解析接口 随着互联网技术的普及和电子商务的迅猛发展,网购已成为现代人日常生活的重要组成部分。然而,在这个便捷的背后,一个看似不起眼却影响深远的问题正悄然浮现——用户填写的快递地址格式混乱、信息不全甚至错漏…

Day11

1. HTTP常见状态码有哪些? 1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用的比较少。2xx 类状态码表示服务器成功处理了客户端的请求。3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请…

Windows 下部署 SUNA 项目:虚拟环境尝试与最终方案

#工作记录 #回顾总结 本文记录了在 Windows 系统上,通过 PyCharm 图形界面(尽量减少命令行操作)部署 SUNA 项目时,针对不同虚拟环境方案的尝试过程、遇到的问题以及最终选择的可行方案,并补充了整体部署思路与推荐。…

Mycat的监控

参考资料: 参考视频 参考博客 Mysql分库分表(基于Mycat)的基本部署 MySQL垂直分库(基于MyCat) Mysql水平分表(基于Mycat)及常用分片规则 视频参考资料及安装包: https://pan.b…

安科电动机保护器通过ModbusRTU转profinet网关与PLC通讯

安科电动机保护器通过ModbusRTU转profinet网关与PLC通讯 在工业自动化领域,设备间的通信和数据交互至关重要。Modbus作为一种常用的通讯协议,广泛应用于各种工业现场;而Profinet则凭借其高效、实时性,在工业以太网通讯中占据重要…

CLion社区免费后,使用CLion开发STM32相关工具资源汇总与入门教程

Clion下载与配置 Clion推出社区免费,就是需要注册一个账号使用,大家就不用去找破解版版本了,jetbrains家的IDEA用过的都说好,这里嵌入式领域也推荐使用。 CLion官网下载地址 安装没有什么特别,下一步就好。 启动登录…

【快见刊】2025年应用材料、机械与制造工程国际会议(ICAMMME 2025)

2025年应用材料、机械与制造工程国际会议(MMME 2025)将在美丽的六朝古都南京隆重召开。南京,这座兼具现代都市风貌与深厚历史文化底蕴的城市,将以其独特的魅力迎接来自世界各地的应用材料、机械与制造工程领域的专家、学者及业界精…

TopCode之最大子数组和

题目链接 53. 最大子数组和 - 力扣(LeetCode) 题目解析 算法原理 解法1: 暴力(一个循环用来固定,一个用来找最大的子数组O(n^2),每次往后拓展一个元素就判断是否是最长的),枚举出每一种情况, 然后不断更新最大的 解法二: dp 1> dp的含义: dp[i]记…

SAP是什么?SAP概述

SAP 概述 一、核心定义 ‌SAP‌(Systems, Applications & Products in Data Processing)是德国 SAP 公司开发的集成化 ‌ERP(企业资源规划)‌ 系统,通过模块化架构整合企业财务、供应链、生产等核心业务流程&…