【Linux学习笔记】进程概念(下)

news2024/11/15 9:13:23

  • 进程地址空间
    • 1. 虚拟地址
    • 2. 什么是进程地址空间
    • 3. 进程地址空间的映射。
    • 4. 地址空间存在的意义
    • 5. 写时拷贝

进程地址空间

1. 虚拟地址

来看这样一段代码。

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

int global_value = 100;

int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        printf("fork error\n");
        return 1;
    }
    else if(id == 0)
    {
        int cnt = 0;
        while(1)
        {
            printf("我是子进程, pid: %d, ppid: %d | global_value: %d, &global_value: %p\n", getpid(), getppid(), global_value, &global_value);
            sleep(1);
            cnt++;
            if(cnt == 10)
            {
                global_value = 300;
                printf("子进程已经更改了全局的变量啦..........\n");
            }
        }
    }
    else
    {
        while(1)
        {
            printf("我是父进程, pid: %d, ppid: %d | global_value: %d, &global_value: %p\n", getpid(), getppid(), global_value, &global_value);
            sleep(2);
        }
    }
    sleep(1);
}

运行结果:

img

上面的这种现象,是因为这里所打印出来的地址并非物理地址,而是虚拟地址。所以这里就引出了进程地址空间。下面用个例子来描述进程地址空间。

img

img

其中所画的大饼是需要管理起来的,好比老板昨天让员工好好干,一个月后升经理。但是今天老板见员工,却说一个月升总监。大饼画的多了,自然就需要管理起来,否则容易混乱。对于软件来说,管理的本质就是先描述,再组织。所以这里的一个个大饼,其实可以理解为是一个个的结构体。img

2. 什么是进程地址空间

  1. 进程地址空间的概念

上面讲过操作系统给进程画的大饼可以认为是进程地址空间,具体来说就是一个结构体。那结构体里面有什么呢?

首先,先做好规定,这里的背景是32位机器背景。

  1. 32位机器的数据可以有2^32个,约42亿,以字节为单位。
  2. 所以表示的空间大小约为4GB的空间范围。
  3. 地址确保唯一性,所以有2^32个地址。

所以,进程地址空间整体上应该是这样的,如下图:

img

对于上面的这个图,你可以想象成一把尺子。尺子是有刻度,所以就可以用刻度来划分区域。可以用一个结构体描述出上面的进程地址空间。如下结构体:

struct mm_struct
{
	unit_32t code_start;
	unit_32t code_end;
	unit_32t data_start;
	unit_32t data_end;
	unit_32t heap_start;
	unit_32t heap_end;
	//......
}

所以可以认为有这么一个进程地址空间对应着这么一个结构体,其中结构体的变量就是地址,这些地址就如同尺子上的刻度,划分好了区域。

img

其中堆栈空间是动态开辟的,所以当你写代码定义变量或者new变量的时候,其实就是在更改对应区域的start or end。

3. 进程地址空间的映射。

程序当加载到内存的时候,确实是加载到了物理内存里面,但是操作系统并不允许进程直接访问物理内存,而是在进程PCB里面存放一个进程地址空间,让进程地址空间通过页表和物理地址进行映射,从而让进程可以访问到物理内存。如图所示:img

所以进程是无法直接访问到物理地址的,是操作系统在管理进程的时候,同时给进程画了个大饼,让进程可以通过进程地址空间,再通过页表的映射,从而访问到物理地址。

4. 地址空间存在的意义

  1. 为了保护物理地址

设想一下,如果一个进程可以随意访问物理地址,然后这个进程将数据恶意写入到物理地址,将会破坏物理地址。操作系统为了保证物理地址的安全,就有了地址空间。通过地址空间的虚拟地址,再通过页表映射访问到物理地址,保证了物理地址的安全。

用压岁钱的例子来解释上述内容。你的压岁钱实际就是物理地址,但是中间有父母(页表)的存在,所以你确实是知道有那么多钱,但是当你用的时候,要通过父母的同意,如果父母觉得你的要求合理,那么就通过你的要求,让你拿到钱去买东西。如果要求不合理,那么父母将会拒绝你的要求,拒绝给你拿钱。

img

  1. 为了保证进程间的独立性

具体可看下面写时拷贝的内容。

5. 写时拷贝

回到我们的第一个代码打印结果的问题,可以看到两个值的地址明明一样,但是值却不一样。这是为什么呢?

是由于进程具有独立性,虽然两个进程共享数据,但是每个进程都是有独立的进程地址空间和独立的页表。

img

因为进程有独立性,所以先有一个进程改变了global_value的值,也不会影响另一个进程的值。这是因为在有一个进程改变值的时候,OS会先进行数据拷贝,在物理地址上开辟空间,拷贝进去,然后更改另一个进程页表的映射。

img

所以这也就是打印结果的时候,为什么地址明明一样,但是两个进程的数值却不相同,是因为操作系统帮进程做了写时拷贝的操作,写时拷贝对虚拟地址无影响。所以这也证明了,打印出来的并非物理地址,而是虚拟地址。

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

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

相关文章

3206. 拼图

给出一个 nm 的方格图&#xff0c;现在要用如下 L 型的积木拼到这个图中&#xff0c;使得方格图正好被拼满&#xff0c;请问总共有多少种拼法。 其中&#xff0c;方格图的每一个方格正好能放积木中的一块。 积木可以任意旋转。 输入格式 输入的第一行包含两个整数 n,m&#xff…

scrapy+selenium框架模拟登录

目录 一、cookie和session实现登录原理 二、模拟登录方法-Requests模块Cookie实现登录 三、cookiesession实现登录并获取数据 四、selenium使用基本代码 五、scrapyselenium实现登录 一、cookie和session实现登录原理 cookie:1.网站持久保存在浏览器中的数据2.可以是长期…

3D视觉引导工业机器人上下料,助力汽车制造业实现智能化生产

在工业制造领域&#xff0c;机器人技术一直是推动生产效率和质量提升的重要力量。近年来&#xff0c;随着3D视觉技术的快速发展&#xff0c;工业机器人在处理复杂任务方面迈出了重要的一步。特别是在汽车制造行业&#xff0c;3D视觉引导工业机器人的应用已经取得了令人瞩目的成…

dockefile

文章目录 应用的部署MySql的部署Tomcat的部署 dockerfileDocker原理镜像的制作容器转镜像Dockerfile 服务编排Docker Compose Docker 私有仓库 应用的部署 搜索app的镜像拉去app的镜像创建容器操作容器中的app MySql的部署 容器内的网络服务和外部机器无法直接通信外部机器和…

软件测试 —— 移动端测试

1. 移动端 指移动设备&#xff08;如智能手机、平板电脑、智能手表等&#xff09;上的操作系统和应用程序。移动设备具有便携性和多功能性&#xff0c;可以随时随地连接互联网&#xff0c;提供丰富的应用和服务。 2. 移动端应用分类 (1) 原生应用&#xff08;Native App&…

访问单通道Mat中的值之at()、ptr()、iscontinuous()【C++的OpenCV 第十四课-OpenCV基础强化(二)】

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; 目录 一、访问的方法 \color{blu…

voronoi diagram(泰森多边形) 应用 - Empire Strikes Back

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 voronoi 图求解点击前往 题目链接&#xff1a;https://vjudge.net/problem/URAL-1520 题目大意 有一个城市&#xff0c;形状是圆形。 城市里有很多化工场。 现在想…

matlab双目标定中基线物理长度获取

在MATLAB进行双目摄像机标定时,通常会获得相机的内参,其中包括像素单位的焦距(focal length)以及物理单位的基线长度(baseline)。对于应用中的深度估计和测量,基线长度的物理单位非常重要,因为它直接影响到深度信息的准确性。有时候,您可能只能获取像素单位的焦距和棋…

华为RS设备状态及接口配置命令

1、查看硬件信息 ①查看序列号 查看整机序列号 display esn display sn ②、查看功率 电源功率 display power 查看光模块功率 display transceiver interface gigabitethernet 1/0/0 verbose ③、查看风扇 display fan ④、查看温度 display temperature all ⑤、查看硬…

微信聚合聊天系统的便捷功能:自动发圈,跟圈

快到双十一咯&#xff0c;很多商家和自媒体、运营人都在发圈做运营&#xff0c;所以现在发圈的频率也会比以往的多一些&#xff0c;但事情一多就会担心今天的朋友圈忘记发、漏发或者错过发圈的时间导致错过私域里的好友、客户会错过活动时间。 其实这些都是可以不用担心&#…

Python 正则表达式(RegEx)指南

正则表达式&#xff08;RegEx&#xff09;是一系列字符&#xff0c;形成了一个搜索模式。RegEx 可用于检查字符串是否包含指定的搜索模式。 RegEx 模块 Python 中有一个内置的包叫做 re&#xff0c;它可以用于处理正则表达式。导入 re 模块&#xff1a; import rePython 中的…

怪物猎人世界Mod制作——替换模型、音效

太喜欢《怪物猎人&#xff1a;世界》这款游戏了&#xff0c;在冰原更新后&#xff0c;游戏版本趋于稳定。卡普空做一些bug修复后宣布不再更新此游戏&#xff0c;游戏版本稳定在v15.11.01。从此这个游戏长达三年未更新&#xff0c;我玩了八百小时也未发现什么明显BUG&#xff0c…

Linux多虚拟主机和配置限制访问与日志

目录 一、多虚拟主机 1.配置单网卡多个ip 2.给每个主机站点设置主页 3.测试访问 二、限制访问 1.限制所有 2.放行192.168.0.0/24网段访问 三、日志与状态页 1.定义访客日志 2.状态页配置 一、多虚拟主机 1.配置单网卡多个ip ip address add 192.168.0.231/24 dev e…

阿里云倚天实例已为数千家企业提供算力,性价比提升超30%

在2023云栖大会上&#xff0c;阿里云宣布倚天ECS实例已服务数千家企业&#xff0c;覆盖电商、生命科学、交通物流及游戏等领域&#xff0c;整体算力性价比提升超30%。 2022年&#xff0c;平头哥自研云原生CPU倚天710在阿里云数据中心规模化部署&#xff0c;并向云上企业提供算力…

“AI解析认知+大数据替代推荐”,云汉芯城推出【芯片智选】元器件替代查询工具

面对数以亿计的元器件型号&#xff0c;工程师们往往会遇到经常使用的物料需要替代但难以选型、遍查规格书也无法对应上所有参数&#xff0c;或是新找到的物料资料不全等问题。如何进行高效准确的选型与替代决策是一项极具挑战性的任务。 在此背景下&#xff0c;云汉芯城结合自研…

机器人制作开源方案 | 宠物智能机器人

一、作品简介 作者&#xff1a;陈瑛、卢文博、刘沈军、 浦津、葛望东单位&#xff1a;南京林业大学指导老师&#xff1a;金慧萍、田涛 1. 背景调研及研究意义 1.1背景调研 随着我国社会经济水平的飞速发展和城市化的进程加速推进&#xff0c;居民生活水平有了较 大幅度的提…

如何解决网站被攻击问题:高防服务器与高防CDN的选择

在当今数字时代&#xff0c;网站攻击已经成为严重的威胁&#xff0c;对网站的可用性和数据安全构成潜在风险。为了解决这个问题&#xff0c;企业需要考虑采用高防服务器或高防CDN等防护方案。本文将详细说明这两种方案的优劣势&#xff0c;并分析大、中、小型企业各自适合的防护…

5大自动化测试的Python框架 【实用干货】

自从2018年被评选为编程语言以来&#xff0c;Python在各大排行榜上一直都是名列前茅。 目前&#xff0c;它在Tiobe指数中排名第三个&#xff0c;仅次于Java和C。随着该编程语言的广泛使用&#xff0c;基于Python的自动化测试框架也应运而生&#xff0c;且不断发展与丰富。 因…

VB.NET—Form问题记录

目录 前言: 过程: 总结: 升华: 前言: 分享一个VB.NET遇到的一个问题&#xff0c;开始一直没有解决&#xff0c;这个问题阻碍着我前进成为我路上的拦路虎&#xff0c;千方百计的想要绕过去&#xff0c;但事与愿违怎么也绕不过去&#xff0c;因为运行不了窗体&#xff0c;程序…

【特殊矩阵的压缩存储】

文章目录 特殊矩阵的压缩存储特殊的矩阵 特殊矩阵的压缩存储 矩阵&#xff1a;一个由m x n个元素排成的m行n列的表。 矩阵的常规存储&#xff1a; 将矩阵描述为一个二维数组。 矩阵的常规存储的特点&#xff1a; 可以将元素进行随机存取&#xff1b; 矩阵运算非常简单&#xf…