我是靠谱客的博主 称心小蜜蜂,最近开发中收集的这篇文章主要介绍Linux:进程地址空间的简易认识进程地址空间可执行程序文件 vs 进程地址空间内存管理操作系统下的进程与内存管理虚拟内存参考,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 进程地址空间
    • 验证地址空间的基本排布
    • 址同值不同
    • 定义
  • 可执行程序文件 vs 进程地址空间
  • 内存管理
  • 操作系统下的进程与内存管理
  • 虚拟内存
  • 参考

全文约 2010 字,预计阅读时长: 7分钟


进程地址空间

验证地址空间的基本排布

在这里插入图片描述

  • 代码验证:
#include <stdio.h>
#include <stdlib.h>

int g_unval;
int g_val = 100;


int main(int argc, char *argv[], char *env[])
{
      printf("code addr         : %pn", main);
    const char *p = "hello bit!";
    printf("read only         : %pn", p);
    printf("global val        : %pn", &g_val);
    printf("global uninit val : %pn", &g_unval);
    char *q1 = (char *)malloc(10);
    char *q2 = (char *)malloc(10);
    char *q3 = (char *)malloc(10);
    char *q4 = (char *)malloc(10);
    printf("heap addr         : %pn", q1);
    printf("heap addr         : %pn", q2);
    printf("heap addr         : %pn", q3);
    printf("heap addr         : %pn", q4);

    int a = 0;
    static int b = 0;
    int c = 0;
    printf("stack addr        : %pn", &p);
    printf("stack addr        : %pn", &a);
    printf("b: stack addr        : %pn", &b);
    printf("stack addr        : %pn", &c);

    printf("args addr         : %pn", argv[0]);
    printf("args addr         : %pn", argv[argc-1]);

    printf("env  addr         : %pn", env[0]);

    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
		printf("child[%d]: %d : %pn", getpid(), g_val, &g_val);
 }else{ //parent
		 printf("parent[%d]: %d : %pn", getpid(), g_val, &g_val);
 }
		 sleep(1);
 return 0;
}
  • 得到,全局变量地址是相同的值,但看到的变量值是不一样的。

定义

  • 地址空间是进程看待内存的方式,抽象出来的一个概念,内核下是一个结构体。这样每个进程,都认为自己独占系统内存资源。
  • 区域划分:将线性的地址空间或分成位一个个的地址区间【start,end】
  • 虚拟地址:在【start,end】之间的各个地址。
  • 地址空间通过页表在物理内存上进行映射,通过各种倒腾,保证有那么多进程可以运行。相关工作由操作系统完成。
  • 假设某个进程越界访问,则可以通过页表查看该段的读写权限,进行报错中断程序运行。
  • 父子进程一个数据的虚拟地址一样,呈现的数值不一样;是因为子进程的大部分信息,继承自父进程;进程管理这一侧,映射关系没变;但在内存管理那一侧,在物理内存上又开辟了一块儿空间给子进程使用。
    在这里插入图片描述
  • 为什么存在地址空间?
  • 保护物理内存,不受到任何进程内的地址的直接访问,方便合法性校验。
  • 将内存管理和进程管理解耦,内存只需看这块儿空间有没有被人用,不需要关心是谁在用。
  • 让进程,以同样的方式,来看待代码和数据。这个区是代码区,这个区是数据区等等…
  • 因此,一个进程被创建时,都有独自的PCB,进程地址空间、和页表。
    在这里插入图片描述

可执行程序文件 vs 进程地址空间

  • 可执行程序本身,就已经被划分成了一个个的区域;方便模块化加载到内存和库文件的链接。

  • 两者的结构布局相呼应。
    在这里插入图片描述

  • 目标文件链接以后就是可执行;库代码的融合、库数据的融合等。

在这里插入图片描述
在这里插入图片描述


内存管理

在这里插入图片描述

  • 页框(page frame)是一个 内存管理 的概念定义。 是指 CPU 中添加了能自动把 虚拟内存 (即 逻辑地址 )地址转化为 物理内存 地址的电路,为了简化这种电路,就把 RAM 划分为 长度 为4KB或8KB的块。
    在这里插入图片描述

操作系统下的进程与内存管理

在这里插入图片描述
在这里插入图片描述


虚拟内存

在这里插入图片描述

  • 进程中的所有内存访问都是逻辑地址,这些逻辑地址会在运行时动态地转换为物理地址。 这意味着一个进程可被换入或换出内存,因此进程可在执行过程的不同时刻占据内存中的不同区域。
  • 一个进程可划分为许多块(页和段),在执行过程中,这些块不需要连续地位于内存中。动态运行时地址转换和页表或段表的使用使得这一点成为可能。
    在这里插入图片描述
    在这里插入图片描述

参考

  • 都是结构体,映射,倒腾;操作系统:进程管理,内存管理,驱动管理、文件管理。
  • 假如物理内存4个G,一个程序16个G。卡是正常的,能跑起来算不错的了…
  • 视频版:【操作系统】内存管理——地址空间

最后

以上就是称心小蜜蜂为你收集整理的Linux:进程地址空间的简易认识进程地址空间可执行程序文件 vs 进程地址空间内存管理操作系统下的进程与内存管理虚拟内存参考的全部内容,希望文章能够帮你解决Linux:进程地址空间的简易认识进程地址空间可执行程序文件 vs 进程地址空间内存管理操作系统下的进程与内存管理虚拟内存参考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部