进程内存空间

简介: 进程内存空间

我们直接用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区域

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

第四个申请的堆的空间

相关文章
|
29天前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
139 2
|
2月前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
3月前
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
55 6
|
10天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
179 1
|
4月前
|
存储 算法 调度
深入理解操作系统:从进程管理到内存分配
本文将探讨操作系统的核心概念,包括进程管理、内存分配以及文件系统等。我们将通过具体的案例和数据来分析这些概念的工作原理,以及它们如何影响计算机的性能和稳定性。文章将提供对操作系统内部机制的深入理解,帮助读者更好地理解和使用计算机。
83 0
|
1月前
|
缓存 算法 调度
深入浅出操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅。我们将从进程管理的基本概念出发,逐步深入到内存管理的复杂世界,最终探索如何通过实践技巧来优化系统性能。文章将结合理论与实践,通过代码示例,帮助读者更好地理解操作系统的核心机制及其在日常技术工作中的重要性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往操作系统深层次理解的大门。
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
111 5
|
1月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第5天】麒麟系统mate-indicators进程占用内存过高问题解决
118 0
|
4月前
|
存储 算法 定位技术
深入理解操作系统:从进程管理到内存分配
【7月更文挑战第27天】本文旨在为读者提供一个全面而深入的视角,以理解操作系统的核心概念和机制。我们将通过探讨进程管理、内存分配等关键主题,揭示这些复杂系统如何协同工作以确保计算环境的稳定和高效。文章将采用比喻和实例来阐释抽象的概念,使技术内容更加贴近生活,易于理解。
|
2月前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
42 1