进程内存空间

简介: 进程内存空间

我们直接用linux演示

我们将这个代码编译成目标文件,然后查看内容

#include <stdlib.h>
#include <pthread.h>
int sum(int x,int y)
{
        return x+y;
}
int main(){
        sum(2,3);
        return 0;
}

编译

我们反汇编这个目标文件

我们发现这些汇编代码不好阅读,其实这里是因为 这个文件还没有link(链接)

注:c语言执行过程:程序的编译、链接和执行

我们link这个文件

我们可以看到两个函数的入口

这里其实是内存的虚地址

objdump -d p

这里有个公式:物理地址:基址+逻辑地址(虚地址)

如果这里基址为1000,那么main函数的物理入口地址为1000+1141

内存空间示例

这里是示例不一定为实际参数

内核指令在内核空间内,程序执行所在的空间是用户空间

我们用objdump 查看的就是text代码段的内容

堆和栈需要运行时才可以看到

我们这里可以查看下data段的数据

我们写一个有静态变量的进程

int global_var = 5;
int main(){
        static int static_var = 6;
        return 0;
}

我们编译(不是link)

objdump -s -d p1.o

我们注意一下上面的.text

大家可以看到规律了吧,其实上面的就是一串一串的机器指令串

我们在写一个程序,来观察堆和栈

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int global_var = 5;
int main(){
static int static_var = 6;
int local_var = 7;
int*p = (int*)malloc(100);//Be careful: %lx我的Ubuntu系统报错,我用%p输出
printf("the global_var address is %p\n", &global_var);
printf("the static_var address is %p\n", &static_var);
printf("the local_var address is %p\n", &local_var);
printf("the address which the p points to %p\n", p);
free(p);
sleep(1000);
//We need watch the process state, so let it sleep deeply.
return 0;
}

记录一下ps -e的进程地址

我们看下进程的状态

看下进程的map

我们可以观察前面的代码输出

the global_var address is 0x559827164010
the static_var address is 0x559827164014
the local_var address is 0x7ffdf146573c
the address which the p points to 0x559828e642a0

第一、二个全局变量对应这一行的区间,证明这里是data区域

第三个局部变量对应这一行的区间

第四个申请的堆的空间

相关文章
|
4天前
|
安全 Java Python
GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。
【6月更文挑战第20天】GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。线程池通过预创建线程池来管理资源,减少线程创建销毁开销,提高效率。示例展示了如何使用Python实现一个简单的线程池,用于执行多个耗时任务。
17 6
|
6天前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
32 3
|
5天前
|
存储 缓存 运维
深入理解操作系统:从进程管理到内存分配
在数字时代的心脏,操作系统扮演着至关重要的角色。本文将深入探讨操作系统的核心机制,包括进程管理、内存分配和文件系统,揭示它们如何协同工作以支持现代计算需求。通过技术深度解析和实际应用示例,我们将一窥操作系统的复杂性与优雅,理解其在软件开发和系统性能优化中的重要性。
|
9天前
|
安全 Linux 编译器
Linux进程——进程地址空间
Linux进程——进程地址空间
20 2
|
18天前
|
存储 安全 Python
进程通信 , 信号量 , 队列 , 管道 , 共享内存
进程通信 , 信号量 , 队列 , 管道 , 共享内存
|
20天前
|
存储 算法 Linux
【Linux】进程的地址空间
【Linux】进程的地址空间
|
11天前
|
存储 IDE 编译器
c++primer plus 6 读书笔记 第九章 内存模型和名称空间
c++primer plus 6 读书笔记 第九章 内存模型和名称空间
|
1月前
|
存储 Web App开发 运维
|
13天前
|
缓存 Linux Shell
Linux 内存管理与 Swap 空间扩展实践
该文介绍了Linux系统中`free`命令的使用,解析了其输出信息,包括物理内存(总内存、已用、空闲、缓存)和交换空间(总大小、使用和空闲)。Linux优先使用物理内存作缓存,当内存紧张时使用Swap空间。文章还提供了扩展Swap空间的步骤,并强调适度Swap使用对性能的影响,建议合理平衡物理内存和Swap的比例。
|
1月前
|
存储 安全 Linux
Linux:进程地址空间
Linux:进程地址空间
32 10

热门文章

最新文章

相关实验场景

更多