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

👍作者主页:进击的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.mzph.cn/news/86524.shtml

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

相关文章

【最新!企知道AES加密分析】使用Python实现完整解密算法

文章目录 1. 写在前面2. 过debugger3. 抓包分析4. 断点分析5. Python实现解密算法1. 写在前面 最近华为各方面传递出来的消息无不体现出华为科技实力与技术处于遥遥领先的地位。所以出于好奇想要了解一下咱们国内这些互联网科技企业有哪些技术专利,于是就有了这篇文章! 分析目…

【操作系统】聊聊Linux软中断

什么是中断 中断是系统用来响应硬件设备请求的一种机制&#xff0c;会打断进程的正常调度和执行&#xff0c;转而去执行内核中的中断处理程序。 比如你正在看书&#xff0c;你女朋友叫你出去逛街。你就需要先放下手里的事情&#xff0c;然后逛街。回来之后&#xff0c;在接着看…

Parasoft Jtest 2023.1

Parasoft Jtest 2023.1 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

Codeforces Round 848 (Div. 2)C

B. The Forbidden Permutation 一定要注意题目中说的是对于all i满足才算不好的&#xff0c;我们做的时候只要破坏一个i这个a就不算好的了,被这一点坑了&#xff0c;没注意到all。 #include <bits/stdc.h>using namespace std; typedef long long LL; const int N 2e5 …

Linux系统100条命令:关于Ubuntu和 CentOS 7 相同功能的不同的终端操作命令

安装软件包&#xff1a; Ubuntu&#xff1a;apt-get install package_name CentOS 7&#xff1a;yum install package_name 更新软件包列表&#xff1a; Ubuntu&#xff1a;apt-get update CentOS 7&#xff1a;yum update 卸载软件包&#xff1a; Ubuntu&#xff1a;apt-…

制作学生查询小程序

学生个人成绩查询小程序&#xff0c;一款助力教师实时了解学生学习情况的便捷工具。本文将为您揭秘它的制作过程&#xff0c;并提供实用的建议。然而&#xff0c;简便易用的方法莫过于选择现有的工具。 许多教师都偏爱使用易查分来快速创建查分网站。与传统的独立开发方式不同…

kubeadm搭建k8s高可用集群(keepalived+nginx+3master)

目录 前言服务器准备架构讲解环境初始化安装keepalived软件安装nginx软件初始化k8s节点安装docker初始化master01节点的控制面板master02、master03节点加入集群node01、node02节点加入集群检查集群配置docker和kubectl命令补全创建应用验证集群功能验证master节点高可用方式二…

深入解析TI毫米波雷达ROS驱动器的改进:从雷达参数配置、多普勒数据集成,到多雷达协同及传感器融合

第一部分&#xff1a;概述与与原始TI版本的主要区别 1.1 背景简介 毫米波雷达是近年来在汽车、无人机和其他应用中越来越受欢迎的传感器。其优点包括在恶劣天气条件下也能工作、可以提供速度和距离数据、以及不受环境光线影响。Texas Instruments&#xff08;TI&#xff09;是…

QT-day4

画一个时钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> #include <QPainter> #include <QTimer> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } Q…

Linux chmod命令——修改权限信息

我们可以使用chmod命令&#xff0c;修改文件、文件夹的权限信息。注意&#xff0c;只有文件、文件夹的所属用户或root用户可以修改。 chmod [-R] 权限 文件或文件夹 -R&#xff0c;对文件夹内的全部内容应用同样的操作 例如&#xff1a; chmod urwx,grx,ox hello.txt &…

100道JVM面试题大全最新版2023版

100道与JVM相关的面试题&#xff0c;包括JVM基本概念、内存管理、垃圾回收、性能调优、JVM内存模型、JVM是什么意思、JVM调优、JVM垃圾回收机制、JVM类加载机制、JVM原理。 1. 什么是JVM&#xff08;Java虚拟机&#xff09;&#xff1f; JVM&#xff08;Java Virtual Machine…

Kafka 笔记 (Non-Root/Container)

目录 1. Kafka 笔记 (Non-Root/Container)1.1. 启动1.2. bitnami/kafka1.2.1. Non-Root Containers 1. Kafka 笔记 (Non-Root/Container) 1.1. 启动 Kafka 需要与 ZooKeeper 一起启动: Kafka with ZooKeeper Run the following commands in order to start all services in…

LeetCode_贪心算法_简单_605.种花问题

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。给你一个整数数组 flowe…

机器学习 day35(决策树)

决策树 上图的数据集是一个特征值X采用分类值&#xff0c;即只取几个离散值&#xff0c;同时也是一个二元分类任务&#xff0c;即标签Y只有两个值 上图为之前数据集对应的决策树&#xff0c;最顶层的节点称为根节点&#xff0c;椭圆形节点称为决策节点&#xff0c;矩形节点称…

PythonWeb服务器(HTTP协议)

一、HTTP协议与实现原理 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种用于在网络上传输超文本数据的协议。它是Web应用程序通信的基础&#xff0c;通过客户端和服务器之间的请求和响应来传输数据。在HTTP协议中连接客户与服务器的…

Shel简介入门

Shell编程: 1.了解入门 2.变量 变量子串知识 3.特殊位置变量 4.脚本的执行方式 5.脚本传参 6.数值运算 7.数值比较 8.字符串比较 9.正则比较方式 10.条件控制语句 if while for case break continue exit 11.数组 12.案例 一. Shell介绍 Shell的作用 系统…

计算机视觉: 三维物体生成

三维物体生成与编辑 论文地址: Controllable Mesh Generation Through Sparse Latent Point Diffusion Models 背景 数据是目前数字化和AI领域最宝贵的财富之一&#xff0c;但是对于目前的开发者来说&#xff0c;收集数据都意味着极大的成本。所以建立一个高效的生成模型能极…

关于亚马逊云科技云技能学习

云计算作为当今信息技术领域的热门话题&#xff0c;正以其强大的计算和存储能力&#xff0c;灵活性和可扩展性&#xff0c;逐渐改变着人们的工作方式和生活方式。而其中的一家龙头企业——亚马逊云科技&#xff08;Amazon Web Services&#xff0c;AWS&#xff09;&#xff0c;…

用Bosch Sensortec的BMI08X传感器API在C语言中控制IMU传感器:一个完整的集成指南

介绍 在现代的硬件开发领域&#xff0c;惯性测量单元(IMU)已经成为了一个关键的组件&#xff0c;尤其在运动追踪和定位应用中。Bosch Sensortec 的 BMI08X 是其中的一种高度受欢迎的IMU系列传感器。为了更简单、更快速地在C语言项目中集成和使用这些传感器&#xff0c;Bosch S…