首页 > 编程语言 >程序地址空间

程序地址空间

时间:2024-09-30 21:18:25浏览次数:11  
标签:val 程序 进程 地址 内存 空间 物理 页表

文章目录

  • 程序地址空间
  • 进程地址空间
    • 关于页表
  • 早期内存的分配方式

程序地址空间

计算机得物理内存大小是固定的,就是计算机主板内存槽上的实际物理空间,CPU可以直接继续寻址,物理内存的容量是固定的,但是寻址的卡空间取决于CPU地址线的数量。32位系统上,线性地址空间可达4G,那么这4G的内存是如何分配的呢?一般情况下,是以3:1来分配的,用户进程配有3G的空间,而内核独自配有1G的内存。
在C语言的学习期间,大家都学习了这样得空间分布图:
空间分布图

写段代码来测试一下吧

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

int val = 10;
int main()
{
    pid_t id = fork();
    if(id<0){
        perror("fork");
        return 0;
    }

    if(id == 0){
        //child
        printf("child[%d] val = %d &val = %p\n",getpid(),val,&val);
    }
    else{
        //parent
        printf("parent[%d] val = %d &val = %p\n",getpid(),val,&val);
    }
    sleep(1);

    return 0;
}
//打印结果:
/*
parent[1297] val = 10 &val = 0x60104c
child[1298] val = 10 &val = 0x60104c
*/

我们发现,输出出来的变量和地址是一模一样的,难道是因为子进程是按照父进程位模板,父子并没有对变量进行任何修改?

那么我们换一个代码版本来看看。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int val = 10;
int main()
{
    pid_t id = fork();
    if(id<0){
        perror("fork");
        return 0;
    }

    if(id == 0){
        //child
        val = 100;
        printf("child[%d] val = %d &val = %p\n",getpid(),val,&val);
    }
    else{
        //parent
        sleep(3);//让子进程先运行完
        printf("parent[%d] val = %d &val = %p\n",getpid(),val,&val);
    }
    sleep(1);
    return 0;
}
//打印结果
/*
child[1948] val = 100 &val = 0x60104c
parent[1947] val = 10 &val = 0x60104c
*/

什么!一样的地址居然存放着不同的值!这是不可能的。
那么真相就出来了。

  • 变量内容不一样,所以父子进程输出的变量绝对不是一个同一个变量。
  • 但是显示的地址相同,就说明了该地址绝对不是物理地址。
  • 在Linux地址下,这种地址叫做虚拟地址。
  • 我们在使用C/C++语言所看到的地址,全部都是虚拟地址,物理地址用户是看不到的,由OS统一管理。
    操作系统OS赋值将虚拟地址转化位物理地址

进程地址空间

先前所说的程序的地址空间是不正确的,准确的应该说成进程地址空间,那该如何理解呢?
进程地址空间

同一个变量,地址相同,其实是虚拟地址相同,内容不同是因为映射到了不同的物理地址。

关于页表

页表的概念:

  • 页表是一个特殊的数据结构,放在内存空间的页表区。
  • 每一个进程都有一个页表,PCB表中有指针指向页表。
  • 页表用来存放逻辑地址于物理地址的对应关系,是否映射,是否缓存。
  • 页表的每一个表项分为两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存的地址
  • 当进程访问某个虚拟进程地址时,会去查页表,如果发现对应的数据没有在物理内存上,则会发现缺页异常。
  • 缺页异常异常处理过程:将进程需要覆盖的数据从磁盘中拷贝到物理内存时,如果物理内存满了,没有空地方了,那就找一个页覆盖,当如果被覆盖的页曾经被修改过,就需要将此页写回磁盘。
    页表的状态
  • 如果页表的有效位置为1,那么就说明虚拟地址存储的内存存在物理页中了。
  • 如果页表的有效位置为0,那么就说明虚拟地址存储的内存没有存储在物理页中,发生了缺页异常,需要处理这个异常。
    页表的工作原理
  • 当CPU想访问父进程的val时,会先根据虚拟地址找到虚拟页,根据页表,找出页表val对应的位置,查看该页表是否有效,有效则为1,DRMA换命中,根据物理页中的内容返回。
  • 若无效(0),则参数缺页异常,调用内核缺页异常处理程序,内核会选择一个无理由作为牺牲页,将该页的内容刷新到磁盘空间,然后将val映射到物理页上面,然后页表中该表有效位置1,第二位存对应的物理页的地址内容。
  • 缺页处理完成后,返回中断前的指令,重新指向,此时缓存命中,执行1.
  • 将找到的内容映射到告诉缓存中,CPU从告诉缓存中获取该值,结束。

早期内存的分配方式

在早期的时候,计算机还没有虚拟机制,程序指令所访问的内存地址就是物理地址,所以就要将所有程序都加载到内存中,但是我们实际的物理内存是有限的,那么就会出现一些问题:

  • 当多个程序重新运行时,必须保证这些内存用到的内存总量小于计算机实际的物理内存的大小。
  • 内存使用效率低,内存空间不足,就需要将其他程序暂时拷贝到硬盘中,然后重新将新的程序装入内存,但是由于大量的数据转入与转出,内存的使用效率会非常低。
  • 进程地址空间不隔离,由于空间时直接访问物理内存的,所以每一个进程都可以修改其他进程的内存数据,设置修改内核地址空间的数据,那么可能会导致一些恶意程序可以随意修改别的进程,就会造成一些破坏。
  • 程序运行地址的不确定,因为内存地址是随机分配的,所以程序运行的地址也是不正确的。
    为此才会引入虚拟地址。用户进程间的地址互补可见,互不影响。

标签:val,程序,进程,地址,内存,空间,物理,页表
From: https://blog.csdn.net/2303_79015671/article/details/142620493

相关文章

  • 微信小程序处理交易投诉管理,支持多小程序
    大家好,我是小悟1、问题背景玩过微信小程序生态的,或许就有这种感受,如果收到投诉单,不会及时通知到手机端,而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交易类投诉情况,包括待处理交易投诉、待补充凭证和待补充处理凭......
  • PBOOTCMS网站程序提示“执行SQL发生错误!错误:DISK I/O ERROR”
    当遇到PBootCMS网站提示“执行SQL发生错误!错误:DISKI/OERROR”时,通常是因为服务器磁盘空间已满。这可能是由于PBootCMS系统生成了过多的缓存文件导致的。解决方法清理缓存文件步骤:打开FTP客户端,连接到服务器。找到 runtime 文件夹。将 runtime 文件夹内......
  • springboot+vue作业管理系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景在教育信息化快速发展的今天,传统的教学管理模式正逐步向智能化、高效化转型。作业管理作为教学过程中的重要环节,其效率与质量直接影响到学生的学习效果和教师的教学质量。然而,当前许多学校的作业管理仍依赖于纸质作业和人工批改,这种方......
  • springboot+vue招聘系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景在当今竞争激烈的就业市场中,招聘系统作为连接求职者和企业的桥梁,扮演着至关重要的角色。随着信息技术的飞速发展和互联网的普及,传统的招聘方式已经难以满足企业和求职者日益增长的需求。传统的招聘会、报纸招聘等模式不仅效率低下,而且......
  • springboot+vue闸口社区管理系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着城市化进程的加速,社区管理成为了城市治理中的重要一环。闸口社区作为城市中的一个典型代表,面临着人口密集、流动性大、管理复杂等多重挑战。传统的社区管理方式已经难以满足当前的需求,特别是在居民健康管理方面,缺乏系统化、信息化......
  • springboot+vue只租不卖汽车租赁平台【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人们生活水平的提高,汽车已成为现代生活中不可或缺的交通工具。然而,购车成本高、停车难、车辆维护繁琐等问题日益凸显,使得一部分人群对拥有私家车望而却步。与此同时,共享经济模式的兴起为汽车租赁市场带来了新的......
  • java计算机毕业设计社区食堂就餐管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人口老龄化的加剧,社区作为居民生活的基本单元,其服务功能的重要性日益凸显。社区食堂作为连接居民日常生活的重要一环,不仅承载......
  • springboot+vue在线医院服务系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展,医疗行业也迎来了数字化转型的重要契机。传统的医院服务模式往往存在排队时间长、信息不透明、管理效率低下等问题,严重影响了患者的就医体验和医疗资源的有效利用。在线医院服务系统的出现,旨在通过信息化手段......
  • springboot+vue在线审稿系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展,各行各业都在逐步实现数字化转型,学术期刊和出版行业也不例外。传统的审稿过程通常涉及繁琐的邮件往来、纸质文档传递以及人工管理,这不仅效率低下,还容易出错。为了提高审稿效率,缩短出版周期,并减轻编辑部和审稿......
  • springboot+vue在线音乐系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和数字娱乐产业的崛起,音乐已成为人们日常生活中不可或缺的一部分。在线音乐系统作为数字音乐传播的重要平台,不仅改变了传统音乐产业的格局,也为广大音乐爱好者提供了更加便捷、丰富的音乐体验。近年来,随着智能......