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

目录

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的次数,从而提高效率!这就是局部性原理的特性!

页表相关属性的介绍

【现象分析】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacOS上安装Portainer

Portainer介绍 Portainer 是一个很方便的 Docker 可视化管理工具。主要的功能包括: 管理 Docker 主机,可以添加和删除 Docker 主机管理容器,可以启动、停止、删除等容器管理镜像,可以搜索、拉取、删除镜像管理卷,可以查看、删除卷管理网络,可以创建 Docker 网络管理用户和角色…

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…

DOS命令(windows)

DOS命令(windows) 目录 1. 打开命令提示符。2. 切换至根。3. 当前路径。4. 切换至上级路径。5. 查看当前目录。6. 查看文件内容。7. 删除文件。8. 进入长文件夹名时缩写。9. 复制文件。10. 移动文件。 1. 打开命令提示符。 命令:winR 输入&a…

CHI协议保序之Compack保序

一致性系统中,使用三种保序方式; Completion ack response ⭕Completion acknowledgment: □ 该域段主要是用来, □ 决定 RN 发送的 trans,与其他 RN 发送的命令产生的 SNP 之间的顺序; …

Scoop安装配置MySQL最详细版(含Navicat连接MySQL)

这是在DataWhale的第一次打卡文章,也是时隔三年再动笔,希望持续下去。 我没想到花费了一整天的时间来配置我的写作环境(TyporaPicGo腾讯云oss),因为我不想我的文字局限在某个平台上,很被动,想要…

python识别极验4滑块验证码实战

闲得无聊,趁着休息研究了一下极验4滑块验证码的安全性,是否有机器识别、自动化拖拽的可能性。首先看一下效果 如何识别验证码 1、下载图片 下载图片可以参考博客《采集极验4滑块验证码图片数据》 2、标记图片 3、标记滑动距离 实现代码 __author__ &…

Kotlin~Observer观察者模式

概念 定义一对多的依赖关系,让多个观察者同时监听一个主题对象。 角色介绍 Subject:主题,也称被观察者,它是具有状态的对象维护着一个观察者列表。提供添加、删除和通知观察者的方法。ConcreteSubject:具体主题&…

如何在armv6 armv7 armv8(aarch64)嵌入式板子上面安装nginx服务器,支持H265码流

如何在armv6 armv6 armv8 aarch64 嵌入式板子上面安装nginx服务器支持推送H265的视频流 开始吧 一,准备工作二,configure时遇到的出错问题1、checking for C compiler … found but is not working2,error: can not detect int size3&#xf…

【C++ 程序设计】第 1~9 章:常见知识点汇总

目录 一、C 语言简介 二、面向对象的基本概念 三、类和对象进阶 四、运算符重载 五、类的继承与派生 六、多态与虚函数 七、输入/输出流 八、文件操作 九、函数模板与类模板 一、C 语言简介 知识点名称内容C语言的发展简史★★1. C 语言是 C 语言的前身 &…

Flink写入数据到Doris

文章目录 1.Doris建表2.Doris依赖3.Bean实体类4.Doris业务写入逻辑5.测试写入类6.发送数据 1.Doris建表 Doris中建表 CREATE TABLE IF NOT EXISTS demo.user (id INT NOT NULL,name VARCHAR(255),age INT ) DISTRIBUTED BY HASH(id) PROPERTIES ("replication_num&qu…

顺丰基于 Flink CDC + Hudi 推进实时业务落地

摘要:本文整理自大数据研发高级工程师唐尚文,在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为三个部分: 应用场景 实践与优化 未来规划 点击查看原文视频 & 演讲PPT 一、应用场景 1.1 顺丰集团业务概览 顺丰除了大家…

宝塔的Redis绑定IP

宝塔安装Redis 软件商店搜索Redis 连接宝塔面板的redis服务器失败的解决办法 检查Linux是否放行6379端口修改Redis绑定IP检查阿里云/腾讯云的防火墙策略是否放行6379端口 1.bind 127.0.0.1 修改为 bind 0.0.0.0 127.0.0.1 表示只允许本地访问,无法远程连接 0.0.0.0 表…

51单片机--AT24C02数据存储

文章目录 存储器的介绍AT24C02I2C总线I2C时序结构AT24C02数据帧AT24C02数据存储实例 存储器的介绍 存储器是计算机系统中的一种重要设备,用于存储程序和数据,它可以通过电子、磁性介质等技术来记录和保持数据。在这里,主要介绍的是随机存储器…

TableGPT: Towards Unifying Tables, Nature Language and Commands into One GPT

论文标题:TableGPT: Towards Unifying Tables, Nature Language and Commands into One GPT 论文地址:https://github.com/ZJU-M3/TableGPT-techreport/blob/main/TableGPT_tech_report.pdf 发表机构:浙江大学 发表时间:2023 本文…

BeanFactory容器的构建和使用示例

BeanFactory容器的实现流程: BeanFactory是Spring框架中的一部分,它提供了IoC(控制反转)的实现机制。下面是BeanFactory的IoC实现过程: 定义Bean定义:首先,我们需要在配置文件中定义Bean的定义…

详解分类指标Precision,Recall,F1-Score

文章目录 1. Precision(精度)2. Recall(召回率)3. F1-Score4. Accuracy(准确率)5. P-R 曲线6. TPR、FPR6.1 TPR(真正率)6.2 FPR(假正率) 7. ROC曲线8. AUC曲线…

vscode使用g++编译.c文件或.cpp文件

vscode是一个跨平台、轻量级、插件非常丰厚的IDE,这里介绍在vscode里使用g来编译.cpp文件。g也叫GCC, 在Window中,是使用MinGW方式实现g的,它分为32位和64位2个版本,其中,MinGW-64是64位的,MinGW-32是32位的…

linux学成之路(基础篇)(二十)rsync服务器

目录 前言 一、概述 监听端口 二、特点 快捷 安全 三、数据的同步方式 四、rsync传输方式 本地传输 远程传输 守护进程 五、命令 作为远程命令 作为rsync服务 选项 六、配置文件 全局配置 模块配置 守护进程传输 七、rsyncinotfy实时同步 一、服务端 二、…

力扣奇遇记 [第一章]

文章目录 😦第一题:拿下LeetCode1769. 移动所有球到每个盒子所需的最小操作数学习内容:LeetCode1769. 移动所有球到每个盒子所需的最小操作数🙈思路分析:💖代码产出: 😦第二题&#…

优雅的设计测试用例

⭐️前言⭐️ 入职以后接触到了公司的具体业务,提升了设计测试用例的能力,于是沉淀出这篇文档与大家分享。 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录收获&…