PostgreSQL源码解读》(229)——Linux内核(进程虚拟内存# 3)

  

PostgreSQL使用进程架构,每个连接对应一个后台进程,为了更好的理解这种架构,有必要深入理解进程的相关知识。本节主要介绍了Linux下的进程虚拟内存结构,并以使用C语言样例程序进行说明。

  

#猫0-main.c root@localhost linux   # include & lt; stdlib.h>   # include & lt; stdio.h>/* *   *主要——什么都不做   *   *返回:EXIT_FAILURE如果失败了。否则EXIT_SUCCESS   */int主要(空白)   {   获取字符();   返回(EXIT_SUCCESS);   }      

编译并执行,查看进程的地图

  <>之前   <代码> [root@localhost ~] # ps ef | grep \ \ ./0   16根21802 18855 0分/7就是。/0   16根21832 21806 0分/0就是grep,颜色=汽车。/0   #猫/proc/21802/maps root@localhost ~   00400000 - 00400000 r-xp 00400000 fd: 00 252008457/数据/源/linux/0   00600000 - 00600000 r - p 00600000 fd: 00 252008457/数据/源/linux/0   00601000 - 00601000 rw-p 00601000 fd: 00 252008457/数据/源/linux/0   153635/usr/lib64/libc-2.17.so 7 fc6e03c5000-7fc6e057d000 r-xp 00000000 fd: 00   7 fc6e057d000-7fc6e077d000——- p 001 b8000 fd: 00 153635/usr/lib64/libc-2.17.so   7 fc6e077d000-7fc6e0781000 r - p 001 b8000 fd: 00 153635/usr/lib64/libc-2.17.so   001年7 fc6e0781000-7fc6e0783000 rw-p bc000 fd: 00 153635/usr/lib64/libc-2.17.so   7 fc6e0783000-7fc6e0788000 rw-p 00000000 0 0   153628/usr/lib64/ld-2.17.so 7 fc6e0788000-7fc6e07a9000 r-xp 00000000 fd: 00   7 fc6e099c000-7fc6e099f000 rw-p 00000000 0 0   7 fc6e09a7000-7fc6e09a9000 rw-p 00000000 0 0   7 fc6e09a9000-7fc6e09aa000 r - p 00021000 fd: 00 153628/usr/lib64/ld-2.17.so   153628/usr/lib64/ld-2.17.so 7 fc6e09aa000-7fc6e09ab000 rw-p 00022000 fd: 00   7 fc6e09ab000-7fc6e09ac000 rw-p 00000000 0 0   7 ffe3c606000-7ffe3c627000 rw-p 00000000 0 0(栈)   7 ffe3c6b3000-7ffe3c6b5000 r-xp 00000000 0 0 [vdso]   ffffffffff600000-ffffffffff601000 r-xp 00000000 0 0 [vsyscall]   root@localhost ~ #      

没有(堆)的存在。

  

malloc不是系统调用,男人malloc解释如下

  
  

[…]动态内存分配[…]   
void * malloc (size_t大小);   
[…]   
malloc()函数分配大小字节并返回一个指向分配的内存的指针。      

malloc调用了什么系统函数?可以通过strace来分析

  <>之前   <代码> #猫3-main.c root@localhost linux   # include & lt; stdio.h>   # include & lt; stdlib.h>   # include & lt; unistd.h>/* *   *主要——让我们找出哪个系统调用malloc使用   *   *返回:EXIT_FAILURE如果失败了。否则EXIT_SUCCESS   */int主要(空白)   {   void * p;   写(“MALLOC \ n”, 14);   p=malloc (1);   写(“MALLOC \ n”之后,13);   printf (" % p \ n, p);   获取字符();   返回(EXIT_SUCCESS);   }      

编译执行,strace输出如下

  <>之前   <代码>   root@localhost ~ # strace。/3   execve (”。/3”,["。/3”],[25 var/* */])=0   x1abe000 brk (NULL)=0   PROT_READ | PROT_WRITE分别mmap (NULL, 4096年,MAP_PRIVATE | MAP_ANONYMOUS, 1, 0)=0 x7fe132467000   访问(“/etc/ld.so。预加载”,R_OK)=1 ENOENT(没有这样的文件或目录)   ("/etc/ld.so开放。缓存”,O_RDONLY | O_CLOEXEC)=3   fstat (3 {st_mode=S_IFREG | 0644年,st_size=34897,…})=0   mmap (NULL, 34897年,PROT_READ MAP_PRIVATE 3, 0)=0 x7fe13245e000   (3)=0   (“/lib64/libc.so开放。6”,O_RDONLY | O_CLOEXEC)=3   读(3,“\ 177精灵\ \ 1 \ \ 3 \ \ 0 \ 0 \ \ \ 0 \ 0 \ \ 3 \ 0祝辞\ \ 1 \ \ 0 \ 0 35 \ 20 \ \ 2 \ \ \ 0 \ 0 \ 0”……832)=832   fstat (3 {st_mode=S_IFREG | 0755年,st_size=2127336,…})=0   mmap (NULL, 3940800, PROT_READ | PROT_EXEC, MAP_PRIVATE | MAP_DENYWRITE, 3 0)=0 x7fe131e84000   mprotect (0 x7fe13203c000, 2097152, PROT_NONE)=0   mmap (0 x7fe13223c000, 24576年,PROT_READ | PROT_WRITE分别MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE, 3 0 x1b8000)=0 x7fe13223c000   mmap (0 x7fe132242000, 16832年,PROT_READ | PROT_WRITE分别MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, 1, 0)=0 x7fe132242000   (3)=0   PROT_READ | PROT_WRITE分别mmap (NULL, 4096年,MAP_PRIVATE | MAP_ANONYMOUS, 1, 0)=0 x7fe13245d000   PROT_READ | PROT_WRITE分别mmap (NULL, 8192年,MAP_PRIVATE | MAP_ANONYMOUS, 1, 0)=0 x7fe13245b000   arch_prctl (ARCH_SET_FS,0 x7fe13245b740)=0   PROT_READ mprotect (0 x7fe13223c000 16384)=0   PROT_READ mprotect (0 x600000 4096)=0   PROT_READ mprotect (0 x7fe132468000 4096)=0   munmap (0 x7fe13245e000, 34897)=0   写(“MALLOC \ n”, 14之前MALLOC   )=14   x1abe000 brk (NULL)=0   brk (0 x1adf000)=0 x1adf000   x1adf000 brk (NULL)=0   写(“MALLOC \ n”之后,MALLOC后13   )=13   fstat (1, {st_mode=S_IFCHR | 0620年,st_rdev=makedev (136 5),…})=0   PROT_READ | PROT_WRITE分别mmap (NULL, 4096年,MAP_PRIVATE | MAP_ANONYMOUS, 1, 0)=0 x7fe132466000   写(1“0 x1abe010 \ n”100 x1abe010   )=10   fstat (0, {st_mode=S_IFCHR | 0620年,st_rdev=makedev (136 5),…})=0   PROT_READ | PROT_WRITE分别mmap (NULL, 4096年,MAP_PRIVATE | MAP_ANONYMOUS, 1, 0)=0 x7fe132465000   阅读(0,   

PostgreSQL源码解读》(229)——Linux内核(进程虚拟内存# 3)