我们将程序的地址空间有低地址到高地址分为正文代码,初始化数据,未初始化数据 ,堆,共享区,栈,命令行参数环境变量,内核空间。
早期内存管理机制:要运行一个程序,会把这些程序全都装入内存,当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小问题。
进程地址空间不隔离,由于程序都是直接访问物理内存,所以恶意程序可以随意修改别的进程的内存数据,以达到破坏的目的。
内存使用效率低:在多个程序同时运行的情况下,系统空间可能会不够用,所以,此时系统必须在已运行的程序中选择一个将该程序的数据暂时拷贝到硬盘上,释放出部分空间来供程序C使用,然后在将程序C的数据全部装入内存中运行。
程序运行的地址不确定,当内存中剩余空间可以满足时,操作系统会在剩余空间中随机分配一段连续的内存给程序C 使用,因为是随机分配的,所以程序运行的地址是不确定的,这种情况下,程序的起始地址都是物理地址,而物理地址都是在加载之后才能确定。
分段:在编写代码的时候,只要指明了所属的段,代码段和数据段中出现的所有地址,都是从0开始的,映射关系完全由操作系统维护,CPU将内存分割成了不同的段,于是指令和数据的有效地址并不是真正的物理地址而是相对于段首的偏移地址。
解决问题:因为段寄存器的存在,使得进程的地址空间得一隔离,越界问题很容易被判定出来,实际代码和数据中的地址,都是偏移量,所以第一条指令可以从0地址开始,系统会自动进行转化映射,也就解决了程序运行的地址不确定的问题,可是,分段并没有解决性能问题,在内存空间不足的情况下,依旧要换入换出整个程序或者整个段,无疑要造成内存和硬盘之间拷贝大量数据的情况,进而导致性能问题。但这时我们可以用分页去解决这个问题。
操作系统之随笔
最新推荐文章于 2022-06-12 00:00:00 发布