我是靠谱客的博主 伶俐凉面,最近开发中收集的这篇文章主要介绍linux进程地址空间准备前言一、程序地址空间二、进程地址空间结语,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

准备

博主:大大怪先森(记得关注,下次不要迷路哦)
编程环境:xshell(点击下载)

在这里插入图片描述

文章目录

  • 准备
  • 前言
  • 一、程序地址空间
  • 二、进程地址空间
    • 1.引出及其概念
    • 2.进程地址空间
    • 3.回顾
  • 结语


前言

本节讲解进程地址空间的相关知识。

提示:以下是本篇文章正文内容


一、程序地址空间

我们在学习c语言的时候对于内存管理的问题,我相信大家的脑海里面一定有下面这张图!!!
(如果没有的话,宝子你还得加油呀!!!)
在这里插入图片描述
我们是否一直认为这就是当我们在写代码时代码在计算机内存的地址空间的分布?>错,大错特错,???那为什么我们用这样思想去写代码不会出现任何问题?它明明就是正确的呀!!!别急,今天我们就来正在的看懂“程序地址空间”到底是怎么样的。

这里不对各个区间的作用进行太多的讲解,需要了解可以参照《C语言篇(动态内存管理)》。
在这里插入图片描述

二、进程地址空间

1.引出及其概念

话不多说,我们先来一段代码感受一下,进程地址空间到底是怎样的!

代码如下(示例):

#include<iostream>
  2 using namespace std;
  3 #include<malloc.h>
  4 #include <unistd.h>
  5 #include <stdlib.h>
  6 int g_val = 0;
  7 int main()
  8 {
  9   pid_t id = fork();
 10   if(id < 0){
 11     perror("fork");
 12     return 0;
 13 
 14   }
 15   else if(id == 0){ //child
 16     g_val = 100;
 17     printf("child[%d]: %d : %pn", getpid(), g_val, &g_val);
 18   }else{ //parent
 19   printf("parent[%d]: %d : %pn", getpid(), g_val, &g_val);
 20   }        
 21   sleep(1);  
 22  return 0;
 23 }   

结果:
在这里插入图片描述

我们发现值不一样但是地址却是一样的,啊,真是大跌眼镜,怎么可能呢?
子进程继承父进程的数据,代码也是共享的呀!!!
既然是这样我们以前的认知都是错的吗?不。。。。
至少到这里我们能发现我们以前所说的程序地址空间其实并不是我们对应内存的物理地址空间,
既然这样的话那又是什么?
不要急往下看

2.进程地址空间

我们都知道进程是有数据,代码和数据结构组成的,那么内存地址空间是否也是由进程当中的一种数据结构来实现的呢:答案很显然是的。
进程中有个mm_struct的结构体来划分地址空间
形如:

struct mm_struct
{
unsigned int code_strat;//代码区间
unsigned int code_end;
  
unsigned int  init_data_start;//已初始化数据区间
unsigned int  inin_data_end;

unsigned int  uninit_data_stat//未初始化数据
unsigned int  uninit_data_end

 unsigned int  hep_start //堆区间
unsigned int  heap_end;
 ......

unsigned int  stack_start;//栈区间
unsigned int  statck_end;
}

每一个进程都会有一个这样的结构体,既然这样的话那么每一个结构体都认为自己是独占整个内存地址的,这么多的进程都是独占内存也不够分配呀。
于是操作系统就不能把他们都分配给内存,此时这些内存就是虚拟内存:进程以为自己拥有但是实际却不会给他们!!!
但是数据又是实实在在的存放在内存之中的,这就需要我们的中转站-----“页表”来实现讲虚拟内存的数据存放在内存得物理地址当中去。
在这里插入图片描述

3.回顾

我们在使用虚拟地址空间有什么好处?

  • 1.通过添加一层软件层,完成有效的对进程操作内存进行风险管理(权限管理),本质目的是为了,保护物理内存以及各个进程的数据安全!
  • 2.将内存里请和内存使用的概念在时间上划分清楚,通过虚拟地址空间,来屏蔽地层申请内存的过程,达到进程读写内存和OS进行内存管理操作,进行软件上面的分离!
  • 3.站在CPU和应用层的角度,进程统一可以看做统一使用4GB空间,而且每个空间区域的相对位置,是比较确定的!
    OS最终这样设计的目的,达到一个目标:每个进程都认为自己是独占系统资源的!

结语

希望本篇文章能给各位带来帮助,如有不足还请指正!!!
码字不易,各位大大给个收藏点赞吧!!!

宝子们,点赞,支持。
三连走一波!!!
在这里插入图片描述

最后

以上就是伶俐凉面为你收集整理的linux进程地址空间准备前言一、程序地址空间二、进程地址空间结语的全部内容,希望文章能够帮你解决linux进程地址空间准备前言一、程序地址空间二、进程地址空间结语所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部