Linux--程序地址空间

简介: Linux--程序地址空间

程序地址空间

程序地址空间是指操作系统中为每个运行的程序分配的内存区域。它包括了程序的代码、数据和堆栈每个部分。

在32位平台下,程序地址空间的大小为2^32,即4GB。这将是程序可以访问的最大内存范围。

程序地址空间通常被划分为不同的段:

程序地址空间的具体分布方式会因为操作系统和编译器的不同而有所差异。然而,不管具体分布方式如何,所有程序都必须在程序地址空间中找到自己的位置来执行和存储数据。

程序地址空间的大小和布局对程序的执行和性能有重要影响。合理利用和管理程序地址空间可以提高程序的运行效率和资源利用率

下面通过地址来验证地址空间的分布:

int g_unval;
137 int g_val=100;
138                                                                                                               
139 int main(int argc,char *argv[],char *env[])
140 {
141   printf("code addr:%p\n",main);
142   printf("init data addr: %p\n",&g_val);
143   printf("uninit data addr: %p\n",&g_unval);
144 
145   char *heap=(char*)malloc(20);
146   char *heap1=(char*)malloc(20);
147   char *heap2=(char*)malloc(20);
148   char *heap3=(char*)malloc(20);
149   static int c;
150   printf("heap addr: %p\n",heap);
151   printf("heap1  addr: %p\n",heap1);
152   printf("heap2 addr: %p\n",heap2);
153   printf("heap3 addr: %p\n",heap3) ;
154 
155   printf("stack addr: %p\n",&heap);
156   printf("stack addr: %p\n",&heap1);                                                                          
157   printf("stack addr: %p\n",&heap2);
158   printf("stack addr: %p\n",&heap3);
159   printf("c addr: %p, c: %d\n",&c,c);
160   int i;
161   for(i=0;argv[i];i++)
162   {
163     printf("argv[%d]=%p\n",i,argv[i]);
164   }
165   for(i=0;env[i];i++)
166   {
167     printf("end[%d]=%p\n",i,env[i]);
168   }
169 
170   return 0;
171   
172 }

虚拟地址

虚拟地址是计算机中用来表示内存地址的一种抽象概念,它是相对于实际物理内存地址空间而言的。

下面我们先来看个代码:

int g_gal=100;
int main()
{
  pid_t id=fork();
  if(id==0)
  {
    int cnt=0;
    while(1)
    {                                                                                                         
      printf("child , pid %d,ppid %d, g_gal %d &g_gal %p\n",getpid(),getppid(),g_gal,&g_gal);
      sleep(1);
      cnt++;
      if(cnt==5)
      {
        g_gal=200;
        printf("child change g_val: 100->200\n");
      }
    }
  }
  else 
  {                                                                                                           
    while(1)
      {
        printf("father pid %d ppid %d g_gal %d &g_gal %p\n",getpid(),getppid(),g_gal,&g_gal);
        sleep(1);
        
      }
  }
  return 0;
}

结果:

这里的拷贝称为写时拷贝:

在操作系统中,每个进程都有自己独立的虚拟地址空间,这个虚拟地址空间可以看作是进程可以使用的内存空间。虚拟地址由两部分组成:页号和页内偏移量(即页表)。操作系统使用页表来将虚拟地址映射到实际的物理内存地址,这样就可以实现不同进程之间的地址隔离和内存保护。

相关文章
|
2月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
165 6
|
3月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
606 2
|
3月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
64 2
|
26天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
32 1
|
1月前
|
网络协议 Linux 开发工具
linux系统配置固定地址
linux系统配置固定地址
|
2月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
39 5
|
Linux
linux 空间不够了,怎么办?Disk Requirements:At least 11MB more space needed on the / filesystem.
Disk Requirements:At least 11MB more space needed on the / filesystem.  linux 空间不够了,怎么办? 1>  查看空间多少:df -h 2>  查看当期内核: uname -r 3>  查找内核   rpm -qa | grep kernel 4>  删除多余的内核 su -c
6280 0
|
17天前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
126 5
|
17天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
57 4
|
4天前
|
缓存 监控 Linux