c语言学习笔记十七

虚拟内存管理

查看进程: ps

显示结果:
PID TTY TIME CMD
1979 pts/0 00:00:00 bash
2048 pts/0 00:00:00 ps


查看bash的虚拟地址空间: cat /proc/1979/maps
或是pmap 1979

显示结果:

08048000-08123000 r-xp 00000000 08:01 786438 /bin/bash
08123000-08124000 r--p 000da000 08:01 786438 /bin/bash
08124000-08129000 rw-p 000db000 08:01 786438 /bin/bash
08129000-0812e000 rw-p 00000000 00:00 0
083a2000-08607000 rw-p 00000000 00:00 0 [heap]
b72d4000-b72f3000 r--p 00000000 08:01 787504 /usr/share/locale-


langpack/zh_CN/LC_MESSAGES/bash.mo
b72f3000-b72fa000 r--p 00000000 08:01 546952 /usr/share/locale-


langpack/en_AU/LC_MESSAGES/bash.mo
b72fa000-b7302000 r--p 00000000 08:01 547192 /usr/share/locale-


langpack/en_GB/LC_MESSAGES/bash.mo
b7302000-b7309000 r--s 00000000 08:01 288595 /usr/lib/i386-linux-


gnu/gconv/gconv-modules.cache
b7309000-b730a000 r--p 0043a000 08:01 270739 /usr/lib/locale/locale-


archive
b730a000-b734a000 r--p 002bd000 08:01 270739 /usr/lib/locale/locale-


archive
b734a000-b74ef000 r--p 006b4000 08:01 270739 /usr/lib/locale/locale-


archive
b74ef000-b76ef000 r--p 00000000 08:01 270739 /usr/lib/locale/locale-


archive
b76ef000-b76f1000 rw-p 00000000 00:00 0
b7701000-b7703000 rw-p 00000000 00:00 0
bfa71000-bfa92000 rw-p 00000000 00:00 0 [stack]



进程地址空间:

内核地址空间 0xc000 0000
0xbf?? ????
环境变量

命令行参数



共享库和mmap内存映射区



data segment

test segment




x86的虚拟空间地址是:0x0000 0000~0xffff ffff
前3G为用户空间,后1G为内核空间




虚拟内存所起作用:
1 控制物理内存的访问权限
2 让每个进程有独立的地址空间,不同进程的同一个va被mmu映射到不同的pa

再打开一个终端窗口执行以上命令
两个进程在同一个系统中运行,所以data segment 占用相同的va,
各自干各自的事情,所以data segment中有不同的数据
两个进程都是bash进程,text segment是一样的,共享相同的物理页面
共享库的地址并不相同,共享库可以节省内存
3 物理地址不连续的几块内存可以映射成虚拟地址连续的一块内存
4 系统如果同时运行着多个进程,为各个进程分配的内存之和可能大于物理内存,
虚拟内存管理使得各进程可以正常运行
交换设备(swap device):在磁盘上保存虚拟内存页面的磁盘分区/磁盘文件
换出(page out): 当物理内存不够用时,将不常用的物理页面的数据临时保存
到交换设备,这个物理页面就认为是空闲的了,可以重新分
配给内存使用
换入(page in): 如果进程要用到换出的页面,可以从交换设备加载回物理内存

以上两者统称为换页(paging)


系统分配内存的总量=物理内存的大小+交换设备的大小

你可能感兴趣的:(学习笔记)