Linux进程虚拟内存大 性能,Linux进程分析(一) 虚拟内存和物理内存

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

https://charon-cheung.github.io/

物理内存面临的问题

问题 1

我们现在常用的电脑有32位和64位,这里以32位为例。32位的系统可用的地址空间有就是2的32次方,即4G,现在的电脑物理内存大多都在4G以上,可以前的电脑内存都达不到4G,我们的程序希望能用4个G,这也就是内存面临的第一个问题:物理内存小于系统位数的要求大小该怎么处理?

eaf52c0d81e970fe83b5313add534dda.png

问题2

程序直接使用物理内存,会出现没有连续可用空间的情况,也是不能最大利用内存的缺点。例如内存有4G,现在有三个程序A,B,C,分别占内存1G,2G,2G,我们把A和B放到内存里,只剩1G了,没法再放C。那么我们把A拿出来,仍然不能放入C,因为内存两边各空闲1个G。

32d7c3627221d3303e67a176185a0093.png

问题3

直接使用物理内存,可能会出现不同程序使用相同内存地址的情况,此时会导致两个程序的崩溃

ahiNm9CeLARj0VXAg0fCBF-nsScfvR15pMi0X_KQoufVUWqGi7TUxbb6F_faDdd6KVjBSOvq=w328-h233-no

需要避免这种情况的出现。

虚拟内存

虚拟内存的示意图:

2588a69866989e746aa239c382efb335.png

全局变量默认为0,如果自己赋值为0,实际还是放在.bss段。

受保护的地址不允许被占用,NULL就在这里。

虚拟地址空间:运行程序时,产生进程,同时产生虚拟内存空间。

MMU位于CPU内部,把虚拟内存里的数据映射到物理内存上,到物理内存处理。虚拟地址对应到物理地址。

多道程序设计:多个进程看似同时使用CPU,CPU划分为多个时间轮片,先分给任务A,A执行100us,CPU收回时间轮片(时钟中断),然后分给任务B,B执行100us,再被收回,又分给任务C,。也就是说三者仍是轮流运行,每个任务只运行一小段时间。人眼反应时间是毫秒级,所以看起来是并行执行的。

CPU访问级别为0,1,2,3,级别依次降低。Linux下只用0和3。

运行同一程序两次,产生两个进程,但两个进程的内核虚拟内存都映射到同一块物理内存,用户内存的映射则不同。

进程控制块

3rXQfLpzCggT1xB8SXfv8LytvRpgNZMoDN4qldwaEOvsWOeRRLI4TN2cn5a2wimtAqmiDvzqHWqQ4d0_cKsZNKCtioWhtlPlP_A1rLK12x3FAyvbNJnvp-txijFjXlRE7wTp7DXa1_ANj1pO0bKYC6PrABVazmxyF0kVS8MTW8RPUCeK-CspQjYfZiz0MqBnK8i7oN_aVJt38zNpucfNAIIPncYWZNHi-yhQ_CrqukVGaJFdLEoxWPGVjs80SEZTd9JjLM_7uy1B2XApZ2I589EibYwPkmVqMm3c21nz65yNi1SnxFw_Wghh8waRzP_T3uAak0-Z4P-3GYg2yFsXJYocVgC7p2aa-_MPlgZeAywoxg1sfGyCZyaA78N8edSQuStalGsu6YveFRvffc5HwvlalvRqMI7g5qFVtPadX9j07n_FPLlJlEoq3GeWznBB6r37xCLozq4lmoYJGSnVOnwftcASCf103QFGsNHpKE5xSEgTo5exOZaFkvONeYtL9fpsqFGu1lHsMmcpZE6CkcbdQIJRkBWHhnaVuoaQoGJPJxROr2gvYzWM2Kl5slYmmmk98fe-6U6XTgH5uj-cXv2rLi-9EykWof9EXA=w1194-h818-no

PCB进程控制块本质是一个结构体task_struct,包含了文件描述符表,每个进程都有一个这样的表,最多包含1024个文件描述符,通过这个描述符可以找到文件的对应磁盘位置。文件指针FILE* 就封装了这个文件描述符。每打开一个文件,就占用一个文件描述符,取的是没有被占用而且是最小的,前三个已经被占用了。Linux标准函数open的返回值就是文件描述符,也用于read和write函数的参数。

PCB成员太多,重点的部分成员如下:1

2

3

4

5

6

7

8

9

10

11

12进程ID,类型为pid_t,实际是unsigned int

进程状态,包括就绪、运行、挂起、停止

进程切换时保存和恢复的寄存器

描述虚拟地址空间的信息

描述控制终端的信息:进程由哪个终端启动

当前进程的工作目录

umast掩码: 一般默认为002

文件描述符表

信号相关的信息

用户id和组id

会话和进程组

进程可用的资源上限

使用ulimit命令可查看Linux的部分进程控制块参数

5e0d451bb66ca

可以看到文件描述符有1024个,栈大小为8KB。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值