(未完)【操作系统】进程那些事

来源:互联网 发布:上海神机妙算软件定额 编辑:程序博客网 时间:2024/05/20 10:12

此文没有高深的学术讨论,只有一些浅薄的概念理解,有些内容还是转载的。

一、早期的内存分配机制

早期的操作系统会将程序全部装入内存,程序中所访问的内存地址都是实际的物理地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于实际物理内存的大小。这种简单的内存分配策略存在若干问题:

  • 进程地址空间不隔离。由于程序直接访问物理内存,所以恶意程序可以随意修改别的进程的内存数据。有些非恶意的但有Bug的程序也可能不小心修改其它程序的内存数据,就会导致其它程序运行异常。这种情况对用户来说是无法容忍的,因为用户通常希望一个程序运行异常了,其它程序不受其影响。
  • 内存使用率低。试想一下,当内存装满程序时,如果又新运行了一个程序,系统必须将内存中已运行的程序所占用的大块内存暂时拷贝到磁盘上,再将新程序装入内存中。可以想象,有大量的数据在装入换出,效率十分低下。

二、虚拟地址空间

每个进程都有独立的地址空间,称为虚拟地址空间。32位CPU最多寻址4G,因此虚拟地址空间大小为4GB。操作系统将虚拟地址空间分为两部分:内核空间用户空间。对于Linux来说,内核空间为1GB(从虚拟地址0xC0000000到0xFFFFFFFF),由所有进程共享,但只有运行在内核态的进程才能访问,用户进程可以通过系统调用切换到内核态访问内核空间;用户空间为3GB(从虚拟地址0x00000000到0xBFFFFFFF),由每个进程独立拥有,运行在用户态和内核态的进程都可以访问用户空间。

动态加载(Dynamic Loading):操作系统不必加载程序的所有部分到内存,只有当这些部分被调用时才被载入

分段(Segmentation):将程序看成不同长度的段组成(全局变量、栈帧、函数代码、函数中的局部变量……),并为每个段分配段号。逻辑地址为<段号偏移>,段号用来在段表中寻找段基址,段基址包含该段在内存中的起始物理地址。

分页(Paging):将物理内存分为固定大小的帧,将逻辑内存也分为同样大小的页。逻辑地址由页码和偏移组成,页码作为页表中的索引,页表包含每页所在物理内存的基地址,这些基地址和偏移的组合就形成了物理地址。分页的特点是逻辑地址连续,物理地址不必连续,即页表中的每一项不必连续,从而将用户观点的内存和实际的物理内存分离。用户程序不能访问非它所占用的内存,因为页表只包括进程所拥有的那些页。同时按页换入换出也能提高内存使用率

同一进程内的线程共享进程的用户空间