Linux进程分析(一) 虚拟内存和物理内存

物理内存面临的问题

问题 1

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

问题2

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

问题3

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

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

虚拟内存

虚拟内存的示意图:

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

受保护的地址不允许被占用,NULL就在这里。
虚拟地址空间:运行程序时,产生进程,同时产生虚拟内存空间。

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

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

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

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

进程控制块


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

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

进程ID,类型为pid_t,实际是unsigned int
进程状态,包括就绪、运行、挂起、停止
进程切换时保存和恢复的寄存器
描述虚拟地址空间的信息
描述控制终端的信息:进程由哪个终端启动
当前进程的工作目录
umast掩码: 一般默认为002
文件描述符表
信号相关的信息
用户id和组id
会话和进程组
进程可用的资源上限

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

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

参考:
Linux从程序到进程

猜你喜欢

转载自blog.csdn.net/yao5hed/article/details/82226890