当前位置: 首页 > news >正文

网站建设专业导航网站广州公关公司

网站建设专业导航网站,广州公关公司,网站设计评级,学校网站平台建设方案✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——程序地址空间 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;我们一直随口就能说出来的栈区&#xff0c;堆区&#xff0c;常量…

✅<1>主页::我的代码爱吃辣
📃<2>知识讲解:Linux——程序地址空间
☂️<3>开发环境:Centos7
💬<4>前言:我们一直随口就能说出来的栈区,堆区,常量区,到底是什么?今天学习一下进程地址空间。

目录

一.程序地址空间回顾

二. 进程地址空间

三.为什么要存在进程地址空间

四.malloc 和 new 的机制


一.程序地址空间回顾

我们在学习C语言的阶段,大家一定见过这样的空间布局图:

我们仅仅只是知道有这个东西, 可是我们并不了解程序地址空间。

测试代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{pid_t id = fork();if (id < 0){perror("fork");return 0;}else if (id == 0) // child{printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);}else // parent{printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);}sleep(1);return 0;
}

输出结果:

我们发现,输出出来的变量值和地址是一模一样的,很好理解呀,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。

我们尝试让子进程,修改变量:

测试代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{pid_t id = fork();if (id < 0){perror("fork");return 0;}else if (id == 0) // child{g_val = 1000;printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);}else // parent{printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);}sleep(1);return 0;
}

输出结果:

 我们发现,父子进程,输出地址是一致的,但是变量内容不一样!!能得出如下结论:

  1. 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量。
  2. 但地址值是一样的,说明,该地址绝对不是物理地址!
  3. 在Linux地址下,这种地址叫做 虚拟地址
  4. 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理,OS必须负责将 虚拟地址 转化成 物理地址 。

二. 进程地址空间

上面说到用C/C++语言所看到的地址,全部都是虚拟地址或者说叫做线性地址,那么虚拟地址和物理地址有什么关系?

引入地址空间:

每一个进程都有自己的地址空间,进程地址空间地址实际上就是虚拟地址。我们通过堆虚拟空间位置上的数据修改,最终经过转换到物理内存上的数据修改。

虚拟地址是如何与物理地址进行映射的呢?

因为有页表的存在。

页表是一种K/V映射表,连接虚拟内存与物理内存,每一个进程都会有自己的进程地址空间,那么每一个进程地址空间都会有与之对应的页表。

注意:

  1. 通过页表不仅可是实现,虚拟地址到物理地址的映射问题,同时因为中间多了一层结构,就是的我们可以通过页表这个桥梁堆访问的地址,进行权限的审核 。
  2. 每一个进程都有自己的地址空间和页表,进程虚拟空间仅仅通过页表堆物理内存交互,这也是保证进程独立性的手段之一。

如何解释上面同一个地址却又不同的值的现象:

创建子进程的本质,就是创建了子进程PCB和加载对应的代码和数据。子进程和父进程代码共享,数据在修改时会发生写是拷贝。

注意:

上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!

 三.为什么要存在进程地址空间

如果没有进程地址空间,直接映射到物理地址不是更好吗,省去这么多中间的转换。效率不是更高吗?

如果没有进程地址空间,OS直接将映射到物理地址,如果有那一次我们地址映射错了,就有可能映射到其他地址空间上,这样进程之间独立性就会被破坏。

使用了地址空间,就不会出现进程错误的访问其他进程的地址空间吗?是的,即使我们出现了错误地址错误的地址也是一个虚拟地址,仍然在该进程的地址空间内,而地址空间是每一个进程独立的,映射到物理地址也是独立的。

综上所述:

  1. 防止地址随意的访问,保护物理内存与其他进程。
  2. 将进程管理和内存管理进行耦合。
  3. 可以让进程一同意的视角,看待自己的代码和数据。

四.malloc 和 new 的机制

我们在使用malloc和new的时候,我们都知道他们的功能都是在堆上开辟空间,然后返回开辟的空间的首地址。

如果我们开辟了空间我们不去使用,那么这个空间会属于我们吗?

注意:

  1. 操作系统补办不允许任何浪费或者不高效
  2. 我们申请了空间一般不会立马得到空间,只会给你分配虚拟内存,不会立马给你物理内存。
  3. 只有当我们对这块空间使用的时候,才会将物理内存给分配到位。我们称这种机制叫做:缺页中断。

http://www.yayakq.cn/news/815678/

相关文章:

  • 做宣传册网站泰安做网站的
  • 最好建网站系统的软件微信网页版登陆入口
  • 关于做网站的合同html用什么软件编写好一点
  • 网站建设有利于做恒生指数看什么网站
  • 桂园精品网站建设费用乐清在线网
  • 酒水在什么网站做推广好电子业网站建设
  • 音乐网站开发的目的微网站建设讯息
  • 动漫公司网站建设软文案例大全
  • 怎样自己动手做微官网站wordpress用什么服务器配置
  • 二级网站如何一级域名珠海专业网站建设
  • 免费网站模版 优帮云elementor做视频网站
  • 在那可以做公司网站手机商城+手机网站建设多少钱
  • 建设银行交罚款网站厦门网络推广培训
  • 网站建设 金手指排名霸屏宠物电商网站模板
  • 国外建设短视频网站无锡网站营销公司哪家好
  • 网站 ca证书怎么做电商平台的优势和劣势
  • 宝安区网站建设营销推广型网站
  • 网站制作费计入什么科目通过WordPress开发的主题
  • 网站开发技术课程设计总结简述建立一个网站模板步骤
  • 网站建设最难的部分技能训练企业网站建设可行性分析
  • 网站制作与建立网站运营与网站策划
  • 西安建设规划局网站建设网站的机构
  • 服装生产厂商网站建设方案大连建设银行官网招聘网站
  • 企业网站建设hnktwl网站做商城
  • 英国网站域名本网站只做信息展示不提供在线交易
  • 怎样推广一个网站品牌网站制作公司哪家好
  • 做牙的网站叫什么赣州有做网站推广的公司吗
  • 百度推广和网站建设推广的区别推荐网站建设
  • 郑州网站推广公司服务企业咨询管理公司起名
  • 中企潍坊分公司网站做的网站怎么样才能再网上看到