【Linux】初识多线程深入理解进程地址空间

news2024/12/25 23:46:45

目录

1 多线程的引入

1.1 相关概念

1.2 Linux操作系统理解多线程

特殊的进程结构

创建子进程的过程

创建多线程 

进程与线程之间的关系

1.3 对多线程结构的管理

Windows管理多线程

Linux管理多线程

1.4 理解多线程与多进程相比,调度的成本更低

2 深入理解进程地址空间&页表&物理内存&文件之间的关系(32位)

文件与物理内存之间的关系

进程地址空间与页表之间的关系&整体之间的关系

为什么要以块为单位(4KB)进行数据的处理?

页表相关属性的介绍


1 多线程的引入

1.1 相关概念

  • 教材观念
  1. 线程是一个执行分值,执行粒度比进程更细,调度成本更低。
  2. 线程是进程内部的一个执行流
  • 内核观点
    • 线程是CPU调度的基本单位,进程是承担分配系统资源的基本实体

1.2 Linux操作系统理解多线程

特殊的进程结构

我们之前学过,进程的大体结构,有task_struct(PCB)、进程地址空间(虚拟内存)、页表(建立虚拟与物理内存之间的映射关系)

创建子进程的过程

子进程复制父进程的task_struct,进程地址空间,页表的数据,对应的时写时拷贝 

这就是多进程,需要复制父进程的三样东西,且父子进程之间相互独立!

创建多线程 

创建多线程就只需要复制一个struct_task就可以了,多线程就是,一个进程里面有多个struct_task,这些PCB共用一个进程地址空间。

进程与线程之间的关系

一个进程,会进程地址空间,对应的页表,加上多个task_struct结构;CPU执行程序的时候,不会区分是进程还是线程,只认识并执行task_struct结构体;一个task_struct就是一个线程,可以执行相应的任务(不同的函数),多个task_struct可以同时被CPU调度执行。所以,线程是在进程里面的一个结构。

  • 线程的作用:CPU调度的基本单位;
  • 进程的作用:承担分配系统资源的基本实体。

1.3 对多线程结构的管理

多线程有很多,所以OS需要对多线程结构进行管理--》先描述,在组织!

Windows管理多线程

TCB:线程控制块。属于进程PCB;结构不同,所以要进行不同的管理,要分别调度线程,调度进程。所以,Windows系统内核里面是有真线程的。

Linux管理多线程

Linux内核的设计者:复用PCB结构体,用PCB模拟实现是TCB--》这样就很好的复用的代码和结构 -- 操作和理解简单! -- 好维护,效率高,也更安全! -- Linux才可以不间断的运行几年!

所以,Linux没有真正意义上的线程,而是用进程的方案来模拟线程!


实际上,一个款OS系统,使用最频繁的功能,除了OS本身,接下来就是进程了!所以进程和线程设计的好,该OS系统就越稳定!

1.4 理解多线程与多进程相比,调度的成本更低

CPU内部:运算器,控制器,寄存器,MMU,硬件cache L1、L2、L3

CPU在调度某个task_struct的时候,会将task_struct对应的进程地址空间相关的数据加载到CPU的cache中;CPU在调度task_struct时候会判断,该结构是否指向的进程地址空间和加载到cache的内容是否是一样的,如是线程,就不需要在重新废置加载新的;而另一个进程进来,就需要重新加载内容到cache中--》所以,线程减少了加载从内存到CPU的数据交换,进而让调度的成本变低!

2 深入理解进程地址空间&页表&物理内存&文件之间的关系(32位)

文件与物理内存之间的关系

通过之前的学习,我们知道,文件存储到磁盘的时候,是以数据块为单位进行存储的,一个数据块的大小默认是4KB

物理内存,每一个地址存储一个字节,根据局部性原理(同时加载要执行代码的相邻相近的代码块到内存中),所以,要访问文件中几行代码(可能是10B左右)的时候,需要将该代码所属的数据块同时加载到内存中——意思就是说:需要10B的内容,需要加载4KB到内存中。无论怎么样,读取和写入文件,都需要以4KB为单位进行数据的处理!

OS系统也需要对物理内存进行管理!通过前面的分析,管理物理内存的单位也应该要以4KB进行管理,称物理内存一个数据块为页page/页框。此时操作系统只需要描述一个页框的属性struct page,用数组struct page mem[1,048,576]大小来对物理内存进行管理!

进程地址空间与页表之间的关系&整体之间的关系

页表结构的思考

页表需要将KV(映射进程地址空间与物理内存)+对应的属性--一行至少需要12B内存

进程地址空间对于32位来说一共有2^32B==4GB

如果页表只是简单的一一映射,那么一张页表的大小就至少需要4*12=48GB的内存空间!怎么可能呢!所以,这种页表结构不对!

【32位下页表真实结构】

虚拟地址:XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 共32位

物理内存:4GB=1024*1024*1024*4 B=2^10*2^10*2^12B

将虚拟地址按照比特位划分成:10 + 10 + 12

用前十位做一个页目录(一级页表),用后十位做页表项(二级页表),页目录中每一行数据对应一个页表项!1024*1024=1,048,576;这样就可以通过,页目录+页表项找到物理内存中对应的页框下标(基地址)!

找到了基地址,加上后12位(4096B,一个数据块的大小)的偏移量,就可以确定虚拟地址在物理地址上确定的位置啦!!

分析该页表结构的内存:2^10*2^10B=1MB,加上一行属性的大小4,也就是4MB左右!无论怎样,量级都只是在MB。

实际上,一个程序不会一下子申请物理内存的 ,所以页表映射的结构也不会一下子创建映射完的,最多也就几行页目录,这样页表的大小就会还要小于4MB!

总结:页表是通过 基地址+偏移量 确定在物理内存中的位置的!

提问1:我们在语言中定义的变量是如何读取和写入的?

 提问2:我们malloc的时候OS系统会立即给我们申请吗?否!

为什么要以块为单位(4KB)进行数据的处理?

因为读取数据的几行的代码的时候,下一刻80%左右的机会会访问到该代码的上下的几百行代码。如果只是按需从磁盘加载到内存的话,下一刻的话,就需要再次访问外设,将对应的代码加载到内存中!就相当于,对于4KB的数据,有80%左右的概率,短时间内要进行多次的IO访问!根据冯诺依曼体系,访问外设的速度是很慢的,一块数据IO10次得到比IO一次得到的速度要慢的很多!所以,以块为单位进行数据的处理,可以减少IO的次数,从而提高效率!这就是局部性原理的特性!

页表相关属性的介绍

【现象分析】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[JAVAee]volatile关键字

目录 1.volatile的特性 ①保持线程可见性 2.volatile注意事项及适用场景 ①注意事项 ②适用场景 1.volatile的特性 ①保持线程可见性 volatile,译为"易变的". 对此我们就可以这样理解,对于被volatile修饰的变量的数值,是容易变化的. 在之前的线程安全文章中,…

XILINX ZYNQ 7000 AXI总线 (二)

了解了AXI 的大部分内容后,开始做一个实战,就是完成AXI 结构的输入输出搭建。 一.创建一个IP 3. 4. 5. 6.选择AXI FULL,创界主接口和从接口 7. 8.可以看到XILINX AXI FULL 的源代码 二.创建一个新的工程,把IP导入到这个工…

ARP系统的命令行基础

系列文章目录 华为数通学习(2) 一、基本命令结构 二、命令行视图 设备提供了多样的配置和查询命令,为便于用户使用这些命令,VRP系统按功能分类将命令分别注册在不同的命令行视图下。 2.1,命令行视图介绍 我们接下来…

DevOps系列文章 之GitLabCI模板库的流水线

目录结构,jobs目录用于存放作业模板。templates目录用于存放流水线模板。这次使用​​default-pipeline.yml​​作为所有作业的基础模板。 作业模板 作业分为Build、test、codeanalysis、artifactory、deploy部分,在每个作业中配置了rules功能开关&…

栈和队列 --- C语言实现

本篇文章来详细介绍一下栈和队列,并且通过数组或链表来实现。 目录 1.栈 1.1栈的概念及结构 1.2栈的实现 2.队列 2.1队列的概念及结构 2.2队列的实现 3.栈和队列面试题 4.相关概念选择题 1.栈 1.1栈的概念及结构 栈:一种特殊的线性表&#xff…

项目初始化--uniapp--vscode--vue3--ts

HBuilderX 创建 uni-app 项目 注意开启服务端口 目录结构 ├─pages 业务页面文件存放的目录 │ └─index │ └─index.vue index页面 ├─static 存放应用引用的本地静态资源的目录(注意:静态资源只能存放于此) ├─unpackage …

eclipse中经常遇到的maven相关的问题

maven工程依赖的jar包无法部署到tomcat中 右键maven工程&#xff0c;选择“属性” 将工程在tomcat重新发布即可。 2、Update Project or use Quick Fix maven工程总是提示更新&#xff0c;一更新java版本又回到1.5 在pom.xml添加如下&#xff1a; <build><finalN…

【jenkins】idea+jenkins+docker+dockerfile+compose流水线部署java应用

目录 整体架构 环境准备 安装docker以及docker-compose jenkins安裝 maven安装 portainer面板安装 sonarqube安装 在项目中增加dockerfile和compose.yml脚本 Dockerfile脚本内容 compose.yml脚本内容 jenkins安装必要插件 jenkins增加流水线任务 增加pipeline任务j…

windows下搭建php开发环境

http://wed.xjx100.cn/news/139397.html?actiononClick https://www.bilibili.com/read/cv23429835/ https://www.php.cn/faq/498307.html 安装iis 选择卸载程序 安装php 官网https://www.php.net/下载 选择线程安全 国内地址 下载完成后解压放到想存放的路径 添加p…

【Deviation】50 Matplotlib Visualizations, Python实现,源码可复现

详情请参考博客: Top 50 matplotlib Visualizations 因编译更新问题&#xff0c;本文将稍作更改&#xff0c;以便能够顺利运行。 本文介绍一下5中图示&#xff1a; Diverging Bars Diverging Texts Diverging Dot Plot Diverging Lollipop Chart with Markers Area Chart 1 Di…

OpenCv之车辆统计项目

目录 一、加载视频 二、去除背景 三、通过形态学识别车辆 四、对车辆统计 一、加载视频 代码如下: import cv2 import numpy as np import matplotlib.pyplot as plt# 视频加载 cap cv2.VideoCapture(2.mp4)# 循环读取视频帧 while True:ret,frame cap.read()if ret Tr…

【Vue】day03-VueCli(脚手架)

day03 一、今日目标 1.生命周期 生命周期介绍 生命周期的四个阶段 生命周期钩子 声明周期案例 2.综合案例-小黑记账清单 列表渲染 添加/删除 饼图渲染 3.工程化开发入门 工程化开发和脚手架 项目运行流程 组件化 组件注册 4.综合案例-小兔仙首页 拆分模块-局部…

Java-API简析_java.net.Proxy类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131881661 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

Element Ui 时间组件

很多时候在我们做项目的时候一般都会用到时间组件&#xff0c;其次js中&#xff1a;new dateNow new Date();得到的是Thu Jul 28 2022 15:04:32 GMT0800 (中国标准时间)&#xff0c;都需要去转换自己需要的时间格式。 接下来介绍Element Ui中的一个组件: <el-date-picker…

windows 服务器允许 ping

打开 Widnows 防火墙&#xff0c;高级 – 入站规则 找到以下 4 条规则&#xff0c;一条一条的点击右边的 &#xff1a; 启用规则 文件和打印机共享(回显请求 - ICMPv4-In) 文件和打印机共享(回显请求 - ICMPv6-In) 虚拟机监控(回显请求 - ICMPv6-In) 虚拟机监控(回显请求- IC…

【Linux网络编程】- 认识 ‘’协议‘‘ | 网络版本计算器

目录 一、“协议” 的概念 二、结构化数据的传输 三、序列化和反序列化 序列化和反序列化的目的 四、网络版本计算器 服务端&#xff08;server&#xff09; 协议定制&#xff08;protocal&#xff09; 客户端&#xff08;client&#xff09; 服务器处理请求逻辑&#…

【Unity3D】地面网格特效

1 前言 本文实现了地面网格特效&#xff0c;包含以下两种模式&#xff1a; 实时模式&#xff1a;网格线宽度和间距随相机的高度实时变化&#xff1b;分段模式&#xff1a;将相机高度分段&#xff0c;网格线宽度和间距在每段中对应一个值。 本文完整资源见→Unity3D地面网格特效…

C++ —— 类与对象(上)

前言 由于C在C语言的基础上移植了新的编程理念&#xff0c;所以我们先回顾一下C语言所遵循的旧的理念。一般来说&#xff0c;计算机语言要处理两个概念——数据和算法。数据是程序使用和处理的信息&#xff0c;而算法是程序使用的方法。C语言与当前最主流的语言一样&#xff0…

关于 Qt中的QString内容存在\u0000使用QChart(0x00)消除 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131860574 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

Maven 基础之简介,基础配置

Maven 基本概念 Maven 是基于项目对象模型&#xff08;Project Object Model&#xff09;&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的软件项目管理工具。 Maven 主要有 2 个功能&#xff1a;「项目构建」和「依赖管理」。 &#x1f58b; 说…