Linux进程概念 (下) 地址空间

前言

中篇讲了进程为什么要有优先级,以及环境变量和通过代码获得环境变量 本篇主要讲解什么是地址空间 , 地址空间是怎么设计的?为什么要有地址空间?


程序地址空间

先看下图 

 验证上图的正文代码至堆的地址是不是从低地址向高地址增加栈相反。我们用下面这段代码试试

 #include <stdio.h>2 #include <stdlib.h>3 4 int unval;5 int val = 10;6 7 8 9 10 int main()11 {12     printf("code addr: %p\n", main);13     printf("init global addr: %p\n", &val);14     printf("uninit global addr: %p\n", &unval);15     char *heap_mem = (char*)malloc(10);16     printf("heap addr: %p\n", heap_mem);17     int a = 10;18     printf("test stack addr: %p\n", &a);                                                                                                                                                                    19                                                                                                                           20     return 0;                                                                                                             21 }                       

 

从上图看地址确实是如上图的所画那样从低地址向高地址增加。 

我们再看一段代码运行结果

int main()
{pid_t id = fork();if(id < 0){perror("fork");return 0;}else if(id == 0){ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取            g_val=100;printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);}else{ //parentsleep(3);printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);}sleep(1);return 0;
}

请看下面的视频

虚拟地址

从视频得出的结论,怎么和以往的C语言和C++不一样 在语言中同一个变量,值怎么可能会有两个? 下面我就要引出一个概念:虚拟地址

虚拟地址

1.1 什么是虚拟地址?

首先我先讲一个故事

在一家公司里有小明小美和小红三个员工,有一天老板对这个三个员工分别单独在没有其他人情况下许下了承诺(PUA)"你今年努力干工作年底给你调职加薪"

许下承诺后三个员工就继续干工作了,但是他们都以为自己是唯一一个被老板叫去谈话的且认为自己独享这福利待遇。

故事到这里先暂停一哈

我们先引出几个相对应的概念

这里的老板就是操作系统

三个员工就是进程

调职加薪就是虚拟地址 ->(物理内存)

看到这里你就会明白了 所有的进程都会有一份自己的虚拟地址。之前讲的程序地址空间是不准确的,准确来说应该是进程地址空间

总结:在C/C++言语中所看到的地址,全部都是虚拟地址,物理地址用户看不到,OS按照地址空间这种结构设计出虚拟地址,然后将虚拟地址映射到物理内存中。

1.2地址空间又是如何设计的?

Linux源代码 内核数据结构如下图设计地址空间 感兴趣的自己可以去官网下载源代码看看

地址空间用结构体定义出来,再用数据结构进行管理(先描述后组织)然后把它的指针放在task_struct PCB 这个结构体里。

1.3为什么要有地址空间?

如果进程直接访问物理地址空间会怎么样?

上图是以前计算机设计时 磁盘越过OS 直接访问内存,现在计算机在OS中增加虚拟地址 然后通过页表映射到物理内存中。看下图

加入了虚拟地址和页表映射机制后,你的写程序出现野指针问题OS直接就把你的进程给你杀掉了,它其实是运行了得。在运行那一瞬间 OS发现你的虚拟地址通过映射到物理内存中和之前正在进程访问的是同一块物理内存地址 ,这时OS就不会把你的进程虚拟地址映射到物理内存中,直接kill。这就是程序崩溃的原因。

到这里 我们就能回答刚才的问题了 为什么同一个地址会有两个不同的值看下图

父进程先运行虚拟地址通过页表映射到物理内存中,子进程继承父进程的所有代码和数据

和页表(地址空间和页表每个进程都会私有一份)OS做的就是每一个进程页表,映射到物理内存不同区域中,然后写时拷贝 就改变了子进程的val值。

 没看懂在看一次

重新理解挂起

加载本质就是创建进程,那是不是非得要把程序所有代码和数据加载到内存中?

答案不是。

一个大型单机游戏 小的几十个G 大一点的200G 内存才多大?内存要满了OS将进程的内核结构创建出来 ,一个游戏有不同模块

OS很聪明将这些模块分批加载 当然也可以分批换出,换出同时就成了挂起状态。

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

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

相关文章

Deep深度系统下载安装Beyond compare4

Beyond Compare 4下载和安装 1、在线安装 Debian, Ubuntu安装命令&#xff1a; wget https://www.scootersoftware.com/bcompare-4.4.6.27483_amd64.deb sudo apt update sudo apt install ./bcompare-4.4.6.27483_amd64.deb Redhat Enterprise Linux, Fedora, CentOS安装命令…

python-自动化篇-运维-网络-IP

文章目录 IP自我介绍IPy安装模块windowsLinux IPy介绍支持大多数 IP 地址格式IPv4 地址IPv6 地址网络掩码和前缀 派生网络地址将地址转换为字符串使用多个网络多网络计算方法 IP自我介绍 IP地址规划是网络设计中非常重要的一个环节&#xff0c;规划的好坏会直接影响路由协议算…

红队攻防之office文件钓鱼制作ppt钓鱼

为众人抱薪者&#xff0c;不可使其冻毙于风雪&#xff1b;为自由开路者&#xff0c;不可使其困顿于荆棘。 PPT手势触发 这种攻击则利用的是鼠标轨迹来进行操作&#xff0c;比如鼠标点击、鼠标移动等。 首先&#xff0c;创建一个普通的PPTX文件&#xff0c;随便填入一些内容&…

Shell脚本条件语句

1.条件测试 文件测试与整数测试 test命令 测试表达式是否成立&#xff0c;若成立返回0&#xff0c;不成立返回其他数值 格式1&#xff1a;test 条件表达式 格式2&#xff1a;[ 条件表达式 ] 测试 是否成功使用 $? 操作符&#xff1a; -d&#xff1a;测试是否为目…

【计算机网络】P2P应用

将会在两个例子中得出结果 1&#xff0c;对等文件分发 &#xff1b;2&#xff0c;大型对等方社区中的服务器 P2P文件分发 自拓展性 直接成因是&#xff1a;对等方除了是比特的消费者外还是它们的重新分发者BitTorrent 一个用于文件分发的P2P协议洪流 torrent 参与一个特定文件…

Python——列表

一、列表的特性介绍 列表和字符串⼀样也是序列类型的数据 列表内的元素直接⽤英⽂的逗号隔开&#xff0c;元素是可变的&#xff0c;所以列表是可变的数据类型&#xff0c;⽽字符串不是。 列表的元素可以是 Python 中的任何类型的数据对象。如&#xff1a;字符串、…

VQ35 评论替换和去除(char_length()和replace函数的使用)

代码 select id ,replace(comment,&#xff0c;,) as comment from comment_detail where char_length(comment)>3知识点 要注意替换的是中文逗号 由于题目说的是汉字长度大于3&#xff0c;所以这里就要使用char_length()而不是length() char_length()&#xff1a;单位为字…

java解决最大字符串配对数目

java解决最大字符串配对数目 01 题目 给你一个下标从 0 开始的数组 words &#xff0c;数组中包含 互不相同 的字符串。 如果字符串 words[i] 与字符串 words[j] 满足以下条件&#xff0c;我们称它们可以匹配&#xff1a; 字符串 words[i] 等于 words[j] 的反转字符串。0 &…

Windows10使用u盘制作linux启动盘踩坑记

双系统方法有三种&#xff1a;1.虚拟机2.windows提供了ubuntu虚拟软件3.制作启动盘 本篇提供Windows10为基础使用u盘做启动盘可以使用linux双系统。 步骤一、 在Ubuntu官网下载镜像&#xff0c;很简单找到对应版本和机器型号&#xff0c;注意区分64位和x86&#xff0c;基本上…

day1 2/18

1> 使用fgets统计给定文件的行数 #include<myhead.h> int main(int argc, const char *argv[]) {if(argc!2){printf("enter error\n");return -1;}FILE*fpNULL;if((fpfopen(argv[1],"r"))NULL){perror("fopen error");return -1;}i…

详解C语言10大字符串函数【超详细建议点赞收藏】

目录 1. strlen----求字符串长度1.1 函数介绍1.2 函数使用1.3 模拟实现 2. strcpy----字符串拷贝2.1 函数介绍2.2 函数使用3.3 模拟实现 3. strcat----字符串追加3.1 函数介绍3.2 函数使用3.3 模拟实现 4. strcmp----字符串比较4.1 函数介绍4.2 函数使用 5. strncpy----长度受限…

【算法题】109. 有序链表转换二叉搜索树

题目 给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,…

Code Composer Studio V6 (CCS) - 添加 simulation 功能

Code Composer Studio V6 [CCS] - 添加 simulation 功能 References copy 整个 D:\ti\ccsv5\ccs_base\simulation\ 到 ccsv6 对应目录下 D:\ti\ccsv5\ccs_base\simulation C:\ti\ccsv6\ccs_base\simulation\ copy 整个 D:\ti\ccsv5\ccs_base\common\targetdb\configurations\…

innoDB page页结构详解

Page是整个InnoDB存储的最基本构件,也是InnoDB磁盘管理的最小单位,与数据库相关的所有内容都存储在这种Page结构里。 Page分为几种类型,常见的页类型有数据页(B+tree Node)Undo页(Undo Log Page)系统页(System Page) 事务数据页(Transaction System Page)等 Page 各…

建议收藏:Java学习路径:从入门到精通的分阶段指南!如何快速掌握Java知识体系?学习Java的最佳路径和分步阶段详解

Java&#xff0c;作为一种跨平台、面向对象的编程语言&#xff0c;自1995年诞生以来&#xff0c;就因其稳定性和广泛的应用范围而深受欢迎。 对于编程新手来说&#xff0c;掌握Java不仅能够开启软件开发的大门&#xff0c;还能为未来的职业生涯奠定坚实的基础。 本文将详细介…

二.重新回炉Spring Framework:Spring Framework主要组件概览

1.写在前面的话 这里主要简单说一下Spring Framework的几个核心组件的总体情况。为了比较直观&#xff0c;这里使用了ClassPathXmlApplicationContext的类图来进行说明。它基本上包含了 IoC 体系中大部分的核心类和接口。类图如下图所示&#xff1a; 2.Resource 组件体系 R…

JS的面向对象:一.创建对象

在JavaScript中&#xff0c;有多种方法可以创建对象。以下是一些常见的方法&#xff1a; 使用对象字面量&#xff1a;这是创建对象最简单的方法之一。可以直接在代码中定义对象及其属性和方法。 let person {name: "Alice",age: 30,greet: function() {console.lo…

常用类与基础API-String的理解和不可变性

1.String类的理解 1.1类的声明 public final class String >final &#xff1a;String是不可继承的。 >Serializable :可序列化的接口,凡是实现此接口的类的对象就可以通过网络或本地流进行数据的传输 >comparable:凡是实现此接口的类,其对象都可以比较大小. 1.…

Qt - 不同类之间槽函数和信号的连接

说明 本文记录了自己在写一个五子棋游戏中的所遇到的一个问题&#xff0c;我被这个小问题卡了好久才解决。作为一个Qt小白 &#xff0c;如有错误请多多包含&#xff0c;并可以在评论区留言~~ 方案一 widget类&#xff08;相当于游戏主菜单&#xff09; // widget.h Chessbo…

华清远见嵌入式学习——驱动开发——作业1

作业要求&#xff1a; 通过字符设备驱动分步注册过程实现LED驱动的编写&#xff0c;编写应用程序测试&#xff0c;发布到CSDN 作业答案&#xff1a; 运行效果&#xff1a; 驱动代码&#xff1a; #include <linux/init.h> #include <linux/module.h> #include &l…