Java教程

虚拟内存抽象,进程的地址空间

本文主要是介绍虚拟内存抽象,进程的地址空间,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.动态链接与静态链接区别

首先写一个main.c死循环程序

int mian() {
      while (1);
}

进入main.c所在的目录下,打开一个终端,执行动态链接

gcc main.c 

在此终端下进行静态链接

gcc -static main.c -o static.out

生成了可执行文件a.out static.out:
在这里插入图片描述比较静态链接和动态链接的时间上的区别:
在这里插入图片描述
在这里插入图片描述
动态链接花费的时间比静态链接的时间更短。

分别打开两个终端,运行a.out static.out可执行程序,进入死循环状态;新建一个终端输入:top。找到两个程序的进程号
在这里插入图片描述a.out的进程号是8175,在终端中输入pmap 8175(此时不要杀死死循环)

(base) bionic@bionic-DL:~$ pmap 8342
8342:   ./static.out
0000000000400000    728K r-x-- static.out
00000000006b6000     24K rw--- static.out
00000000006bc000      4K rw---   [ anon ]
0000000001e23000    140K rw---   [ anon ]
00007ffc0e820000    136K rw---   [ stack ]
00007ffc0e8b8000     12K r----   [ anon ]
00007ffc0e8bb000      4K r-x--   [ anon ]
ffffffffff600000      4K --x--   [ anon ]
 total             1052K


(base) bionic@bionic-DL:~$ pmap 8175
8175:   ./a.out
000055763c080000      4K r-x-- a.out
000055763c280000      4K r---- a.out
000055763c281000      4K rw--- a.out
00007fb0c3d43000   1948K r-x-- libc-2.27.so
00007fb0c3f2a000   2048K ----- libc-2.27.so
00007fb0c412a000     16K r---- libc-2.27.so
00007fb0c412e000      8K rw--- libc-2.27.so
00007fb0c4130000     16K rw---   [ anon ]
00007fb0c4134000    164K r-x-- ld-2.27.so
00007fb0c4306000      8K rw---   [ anon ]
00007fb0c435d000      4K r---- ld-2.27.so
00007fb0c435e000      4K rw--- ld-2.27.so
00007fb0c435f000      4K rw---   [ anon ]
00007ffcf307d000    136K rw---   [ stack ]
00007ffcf30b4000     12K r----   [ anon ]
00007ffcf30b7000      4K r-x--   [ anon ]
ffffffffff600000      4K --x--   [ anon ]
 total             4388K

动态链接的地址空间中比静态链接的多了不少如00007fb0c3d43000 1948K r-x-- libc-2.27.so,就是libc动态链接出来的,rx文件。动态链接后的可执行文件小了很多。

2.pmap是如何实现的呢?

strace pmap 8175
在这里插入图片描述pmap是打开map做read,打印信息
对proc作操作

(base) bionic@bionic-DL:~$ cat /proc/9169/maps
00400000-004b6000 r-xp 00000000 08:04 411558                             /home/bionic/static.out
006b6000-006bc000 rw-p 000b6000 08:04 411558                             /home/bionic/static.out
006bc000-006bd000 rw-p 00000000 00:00 0 
01a13000-01a36000 rw-p 00000000 00:00 0                                  [heap]
7ffe41024000-7ffe41046000 rw-p 00000000 00:00 0                          [stack]
7ffe41186000-7ffe41189000 r--p 00000000 00:00 0                          [vvar]
7ffe41189000-7ffe4118a000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]

这篇关于虚拟内存抽象,进程的地址空间的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!