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)