c语言学习笔记十七
来源:互联网 发布:win7美化桌面软件 编辑:程序博客网 时间:2024/06/05 09:01
虚拟内存管理
查看进程: 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)
系统分配内存的总量=物理内存的大小+交换设备的大小
查看进程: 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)
系统分配内存的总量=物理内存的大小+交换设备的大小
- c语言学习笔记十七
- Allegro学习笔记十七
- 学习笔记(十七)
- c++学习笔记十七
- Django 学习笔记(十七)
- c++学习笔记十七
- c语言学习笔记
- C语言学习笔记
- C语言学习笔记
- C语言学习笔记
- C语言学习笔记
- C语言学习笔记
- C语言学习笔记
- C语言学习笔记
- C语言学习笔记
- C 语言学习笔记
- C语言学习笔记
- C语言学习笔记
- android - 为安全而设计 - 3 - 开发文档翻译
- why unsigned int 0xFFFFFFFF is equal to int -1?
- iOS开发:xcode4中使用静态库和工作区
- 如何快速开发CLI程序
- Storm指南
- c语言学习笔记十七
- [Microsoft][SQLServer 2000 Driver for JDBC]End of stream was detected on a read
- wzplayer for android V1.0快出炉了
- 代码能力
- poj_1787
- 内联函数与宏的区别
- c/c++ 内存管理与分配总结
- Which variables should I typecast when doing math operations in C/C++?
- hadoop入门阅读