1、虚拟地址
我们在学习C/C++的时候所看到的地址全部都是虚拟地址!物理地址用户一般看不到,由操作系统统一管理,操作系统负责将程序中的虚拟地址转化为物理。
2、进程虚拟地址空间
操作系统为每一个进程虚拟出来一个4G的虚拟地址空间(32位操作系统),程序在访问内存的时候,使用的是虚拟地址进行访问;
既然是操作系统虚拟出来的地址,所以不能直接存储数据,存储数据还是在真实的物理内存当中;
所以操作系统需要将虚拟地址转化为物理地址进行访问(页表映射)。
扩展:为什么操作系统需要给每一个进程都虚拟出来一个进程地址空间?为什么不直接使用访问物理内存,这样不是更加快一点。
原因:
——各个进程访问同一个物理地址的话,会造成不可控。在有限的内存空间内,进程是不清楚哪一个内存被其他进程使用,哪些内存是空闲的。所以这种场景之下冒昧的使用物理地址,一定会导致多个进程访问物理内存的时候出现混乱。
——内存又由操作系统统一管理,但是又不能采用预先分配内存的方式,毕竟操作系统也不清楚进程能使用多少内存,使用多久。所以虚拟给每一个进程分配了4G的地址(虚拟地址)。
——进程真正要保存数据,或者申请内存的时候,操作虚拟地址,让操作系统给进程进行分派,比较合理(同时也会节省很多空间)。
——每一个进程都无感的使用拿到的虚拟地址,背后就是操作系统进行了转换(页表映射)。
为什么32位操作系统给进程分配的是4G的虚拟地址空间?
——32位操作系统一共有32根地址线,每个地址线能模拟的数字位0/1,最小就是0x00000000,最大就是0xFFFFFFFF。(64位同理)
3、页表
页表与虚拟地址空物理内存之间的关系:
页表实现的功能:映射
操作系统可以通过虚拟地址+页表的方式找到具体的物理地址
虚拟地址=页号+页内偏移。
页号=虚拟地址/页的大小
页内偏移=虚拟地址%页的大小
扩展:
分段式:虚拟地址=段号+段内偏移
段表 段号:段的起始地址
段页式:虚拟地址=段号+页号+页内偏移
段表 段号:页表的起始位置
页表 页号:块号
4、进程优先级问题
-PRI,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,PRI值越小,进程优先级越高;
-NI,nice值,其表示进程可被执行的优先级的修正数值;
-nice值为负值的时候,该程序将会把PRI变小,即优先级变高,会更快被执行;
-调整进程优先级在Linux下,就是调整nice值;
-nice其取值范围是-20 - 19,一共四十个级别。
使用top命令更改已存在进程的nice(root用户可以修改)
输入top命令->进入top后按‘r'->输入进程PID->输入nice值。
进程概念章节至此结束...