【1++的Linux】之进程(三)

news2024/11/24 20:40:52

👍作者主页:进击的1++
🤩 专栏链接:【1++的Linux】

文章目录

  • 一,什么是进程地址空间?
  • 二,进程地址空间是怎么设计的?
  • 三,为什么要有进程地址空间?

一,什么是进程地址空间?

我们先来看一幅图
在这里插入图片描述
这就是我们的进程地址空间的分布。
其分为了内核空间和用户空间。从具体进程的角度来看,每个进程可以拥有4G字节的虚拟地址空间(也叫虚拟内存)。其中每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB内核空间则为所有进程以及内核所共享。
而用户空间又被细分为我们所熟知的:堆区,栈区,代码区…
接下来我们对用户空间的分布进行验证:

#include<stdio.h>
#include<stdlib.h>
int global=3;
int uninit_global;
int main()
{
    printf("正文代码:%p\n",main);
    printf("初始化数据:%p\n",&global);
    printf("未初始化数据:%p\n",&uninit_global);
    int* ptr=(int*)malloc(sizeof(int));
    printf("堆区:%p\n",ptr);
    printf("栈区:%p\n",&ptr);
    return 0;
}

运行结果:
在这里插入图片描述
由此我们可以基本得出,我们所谓的数据在进程地址空间中就是那样分布的。
还需要补充的就是:堆栈相对而生;static修饰的变量本质是将其开辟在全局区域。

在来一个有意思的小实验:
代码如下:

#include<stdio.h>
#include<unistd.h>

int global=0;
int main()
{
    size_t ret=fork();
    if(ret<0)
    {
        perror("进程错误");
    }
    else if(ret==0)
    {
        global=3;
        printf("child::pid:%d---global:%d---address:%p\n",getpid(),global,&global);
        sleep(1);
    }
    else{
        printf("father::pid:%d---global:%d---address:%p\n",getpid(),global,&global);
    }
    return 0;
}

在这里插入图片描述
我们观察结果可以发现:全局变量global在父子进程的值不一样,但是其地址却是相同的。
我们可以得出:
其首先变量的内容内容不同,其肯定不是同一个变量。
然后不同变量,但地址却相同,其肯定不是物理地址。
那是什么呢?
这就是虚拟地址—也就是我们今天要将的进程地址空间。
我们编写代码时所说的地址都是虚拟地址。而我们的数据都是通过虚拟地址—页表—物理地址
这样的映射关系与物理内存产生联系的。如下图-----同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了,不同的物理地址!我们在后面会对这部分做出详细的说明。
在这里插入图片描述

二,进程地址空间是怎么设计的?

地址空间本质是一种数据结构,其里面至少要有各个区域的划分,将来要和一个特定的进程相关联。也就是说,每一个进程都会有一个地址空间,因此也就有了上述例子中地址相同的情况。
区域划分本质就是在一个范围里定义start和end。
我们的程序在编译时,编译器就形成了地址空间中的各个区域,并且采用和内核中一样的编址方式,给每一行代码,每一个变量都进行了编制。所以在程序编译时,每一个字段就已经有了虚拟地址。只有当程序加载到内存中,其才会有物理地址。

地址空间,页表最开始的数据则是由磁盘给的。

那么操作系统是如何管理地址空间的呢?
我们直到OS是通过PCB来管理进程的,每个进程都有一个独立的地址空间,我们前面一直提到的管理方式:先描述,后组织。对于地址空间的管理也是一样的,我们将其组织成为一种数据结构,在PCB中会有一个指向地址空间的指针mm_struct。OS通过这个指针就可以间接的对进程的地址空间进行管理。

三,为什么要有进程地址空间?

原因一:
对于物理内存来,它是可以任意进行读写的,因此若没有地址空间,用户直接对内存进行操作,则会引起安全问题。凡是非法的访问或映射,OS都会识别到,并且终止掉这个进程(也就是说:所有的进程奔溃就是进程的退出)地址空间和页表是由OS创建的,所以凡是想要通过地址空间和页表进行映射,都要在OS的监控下,那么就保护了物理内存中的数据的安全。

原因二:
因为有了地址空间,我们的物理内存和进程之间就可以分开管理,完成解耦合。
我们在编程时所说的申请空间(new,malloc)都是在地址空间中申请,所以我们采用延迟分配的策略,来提高效率,只有我们的程序真正对物理内存进行访问时,才会给你申请物理内存。也就是说,使用地址空间可以提高整机效率。

原因三:
物理内存在理论上可以在任意位置加载,那么在物理内存中的所有数据和代码也都是混乱的。
有了页表的存在,可以将虚拟地址和物理地址之间进行映射,那么在进程视角,内存分布就时有序化的。因为由地址空间和页表的存在,每个进程都认为自己拥有全部的空间,并且各个区域是有序的,通过页表映射到物理内存不同的区域,实现进程的独立性。

补充知识:

  1. 什么是挂起?
    加载的本质就是创建进程,但创建好的进程,不是必须把代码和数据马上加载到内存中,并创建内核数据结构(task_struct)。在极端情况下:可能只有内核结构被创建出来了。因此理论上可以对程序进行分批加载。既然可以分批加载,那么就可以分批换出—当一个进程短时间不再执行----例如阻塞,那么其数据和代码就会被换出,这就叫做挂起。
  2. 页表在映射时不仅仅能映射内存,磁盘也可以进行映射。
  3. 读时共享:即不涉及写操作时,子进程并不会复制父进程的地址空间,而是和父进程共享一块地址空间。
  4. 写时拷贝:父进程执行部分和子进程执行部分都会对某一变量进行操作,但是父进程和子进程对这个变量的操作是独立的、互不相干的,此时便需要子进程复制父进程的地址空间,然后父、子进程在各自空间中对这个变量进行操作。这样做可以提高内存的使用效率。
  5. 父进程和子进程在执行的过程中是交替执行的,执行的先后顺序是不确定的,当一方的时间片执行结束后,便会执行另一方。

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

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

相关文章

【C++杂货铺】一颗具有搜索功能的二叉树

文章目录 一、二叉搜索树概念二、二叉搜索树的操作2.1 二叉搜索树的查找2.2 二叉搜索树的插入2.3 二叉搜索树的删除 三、二叉搜索树的实现3.1 BinarySearchTreeNode&#xff08;结点类&#xff09;3.2 BinarySearchTree&#xff08;二叉搜索树类&#xff09;3.2.1 框架3.2.2 in…

【力扣485】最大连续 1 的个数

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析1、最值模拟2、双指针 一、题目描述 题目链接&#xff1a;最大连续 1 的个数 给定一个二进制数…

辨析常见的医学数据分析(相关性分析回归分析)

目录 1 常见的三种分类结果&#xff1f; 2 什么是相关性分析&#xff1f; 相关性分析的结果怎么看&#xff1f; 3 什么是回归分析&#xff1f; 1&#xff09;前提 2&#xff09;常见的回归模型 4 对于存在对照组实验的医学病例如何分析&#xff1f; 1&#xff09;卡方检验…

万字解析30张图带你领略glibc内存管理精髓

最近在逛知乎的时候&#xff0c;看到篇帖子&#xff0c;如下&#xff1a; 看了下面所有的回答&#xff0c;要么是没有回答到点上&#xff0c;要么是回答不够深入&#xff0c;所以&#xff0c;借助本文&#xff0c;深入讲解C/C内存管理。 1 写在前面 源码分析本身就很枯燥乏味…

服务注册发现_解读Eureka注册中心UI界面

参数&#xff1a; Environment: 环境&#xff0c;默认为test&#xff0c;该参数在实际使用过程中&#xff0c;可以不用更改Data center&#xff1a; 数据中心&#xff0c;使用的是默认的是 “MyOwn”Current time&#xff1a;当前的系统时间Uptime&#xff1a;已经运行了多少时…

JavaScript系列从入门到精通系列第六篇:JavaScrip当中的运算符,主要涉及JavaScript当中的六大数据类型的四则运算

文章目录 前言 一&#xff1a;算数运算符 1&#xff1a;Number类型的四则运算 2&#xff1a;其他数据类型的四则运算 (一)&#xff1a;加法运算 (二)&#xff1a;减法运算 3&#xff1a;乘法运算 4&#xff1a;除法运算 5&#xff1a;取模运算 前言 运算符也叫操作符。…

极大似然函数和似然函数的区别

极大似然函数和似然函数 "极大似然函数"和"似然函数"是统计学和机器学习中常见的两个概念&#xff0c;它们之间的区别在于它们在不同上下文中的使用方式&#xff1a; 似然函数&#xff08;Likelihood Function&#xff09;&#xff1a; 似然函数通常表示为…

[pai-diffusion]pai的easynlp的diffusion模型训练

PAI-Diffusion模型来了&#xff01;阿里云机器学习团队带您徜徉中文艺术海洋 - 知乎作者&#xff1a;汪诚愚、段忠杰、朱祥茹、黄俊导读近年来&#xff0c;随着海量多模态数据在互联网的爆炸性增长和训练深度学习大模型的算力大幅提升&#xff0c;AI生成内容&#xff08;AI Gen…

基于微信小程序快递取件上门预约服务系统设计与实现(开题报告+任务书+源码+lw+ppt +部署文档+讲解)

文章目录 前言运行环境说明用户的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌…

电子电子架构——AUTOSAR信息安全机制有哪些(下)

电子电子架构——AUTOSAR信息安全机制有哪些&#xff08;下&#xff09; 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 人们会在生活中不断攻击你。他们的主要…

使用FastChat部署Baichuan2

1. 引言 近来&#xff0c;大型语言模型的市场需求呈现出蓬勃发展的态势。然而&#xff0c;仅仅掌握模型的数据准备和训练是不够的&#xff0c;模型的部署方法也变得至关重要。在这篇文章中&#xff0c;我们将以Baichuan2为例&#xff0c;利用FastChat进行模型部署的实战操作。…

IDEA 中 Maven 报错 Cannot resolve xxx【终于解决了】

问题 pom中已经添加相关依赖&#xff0c;maven刷新也没有用&#xff0c;依旧是疯狂报错 解决办法 不断的查询资料&#xff0c;总结一下试过的办法。 解决办法一&#xff1a;清除缓存 File -> Invalidate Caches/Restart -> Invalidate And Restart 试了之后也就报错 …

C# EPPlus 访问 Excel表格

EPPlus是什么&#xff1f; 一个访问Excel表格的库&#xff0c;调用相当简单 怎么访问&#xff1f; 表格可以简单理解成一个二维数组我希望访问表格像二维数组一样简单我希望消耗不算太大 封装一个类 下载DLL以及这个文件&#xff1a;《下载传送门->》 注意需要导入EP…

uniapp iOS离线打包——上传到App Store

uniapp iOS离线打包&#xff0c;如何打包上传到App Store&#xff1f; 文章目录 uniapp iOS离线打包&#xff0c;如何打包上传到App Store&#xff1f;打包上传 App Store App iOS 离线打包 上一篇分享部分工程配置 打包上传 App Store 选中项目工程&#xff1a;点击 工具栏 P…

虚幻4学习笔记(14)界面切换、局域网联机

虚幻4学习笔记 创建游戏加入游戏搜索服务器加入服务器刷新服务器 B站UP谌嘉诚课程&#xff1a;https://www.bilibili.com/video/BV164411Y732 创建游戏 新建三个UI界面 FindServer、JoinServer、MainMenu 打开MainMenu 打开FindServer 添加Scroll Box滚动框 添加Circular T…

【计算机网络】——应用层

// 图片取自王道 仅做交流学习 一、基本概念 应用层概述 协议是 网络层次模型 中多台主机之间 同层之间进行通信的规则。是一个水平概念 垂直空间上&#xff0c;向下屏蔽下层细节&#xff0c;向上提供服务接入&#xff0c;多台主机之间同层之间形成一条逻辑信道。 应用层的…

关于Pandas数据分析

pandas的数据加载与预处理 数据清洗&#xff1a;洗掉脏数据 整理分析&#xff1a;字不如表 数据展现&#xff1a;表不如图 环境搭建 pythonjupyter anaconda Jupyter Notebook Jupyter Notebook可以在网页页面中直接编写代码和运行代码, 代码的运行结果也会直接在代码块下显示…

zabbix学习2--zabbix6.x高可用

文章目录 1. server高可用-默认HA2. 访问高可用 1. server高可用-默认HA 1.部署zabbix单节点后&#xff0c;配置添加HANodeName和NodeAddress即为HA架构 2.zabbix1故障后切换zabbix2使用 3.浏览器访问主机1&#xff0c;使用主机1php前端连接mysql后zabbix2提供后台服务--------…

Linux:进程的本质和fork初识

文章目录 回顾进程查看进程的方式fork 回顾进程 前面对进程进行了一些初步的认知&#xff0c;比如进程可执行程序内核数据结构PCB&#xff0c;再比如可以通过ps命令搭配管道寻找进程&#xff0c;通过/proc系统文件夹查看进程的信息&#xff0c;这些都是前面对进程建立起来的一…

【数据结构】list.h 常用函数实现详解

目录 一、概述二、基础函数✨2.1 INIT_LIST_HEAD✨2.2 list_empty 三、添加结点的函数✨3.1 __list_add✨3.2 list_add✨3.3 list_add_tail 四、删除结点的函数✨4.1 __list_del✨4.2 list_del 五、获取结构体指针、遍历链表✨5.1 list_entry✨5.2 list_for_each✨5.3 list_for…