进程地址空间

        这篇文章应该不能说是原创的,这里的记录都是我通过阅读整理来的,并没有太多的自己的想法。(资料:《现代操作系统》)

        之所以去了解地址空间也是因为在学习dll的时候看到要将dll映射到程序的地址空间,不甚明了所以去查找相关的资料。地址空间其实很好理解(当然针对早期的机器),早期的机器是没有ram,rom,cache,磁盘这样多种存储介质的,程序要写到rom中(大学里就写过这样的rom芯片),然后处理器就到rom中去取指令,这时这个rom能被cpu访问的空间就是地址空间。这个空间取决于两个方面,一方面内存的实际物理大小,如这个rom只有512M那么cpu最多也只能访问到这么大的地址空间,另一方面也取决于机器的字长,如8为的cpu能访问的地址对多有2的8次方即256B,16位的cpu能访问64K的内存,当然借助于寄存器的地址拼接能访问更大的地址空间。

        早期的程序都是将程序写入rom中,他们一个接着一个,所以要实现多道程序设计很困难,程序中的跳转指令可能会使这个程序跳到另一个程序,使程序崩溃,更有可能跳到操作系统程序,引起系统崩溃。早期的IBM360机器采取了保护键的硬件机制,一个保户键就记录一个程序编号,当取指令时判断寄存器中的程序编号是否和保户键中的编号一样,不同就是错误,而针对跳转指令等则需要对程序重定位,可以在寄存器中加入程序的偏移量,然后和指令中的地址相加,但无疑这种做法费时费力。

        随着硬件的发展,存储设备也越来越丰富,现在采用的是分层策略,快速昂贵的如cache和内存做的小,速度慢便宜的做的体积大。同时程序也在不断变大,现在的内存已经无法将所有程序全部载入内存之中,有两种解决方式:

1.交换技术(swapping),需要的程序才载入内存。如果发现要执行的程序不在内存中,首先会进入一个陷阱指令,然后到硬盘中载入程序代码,载入的时候要考虑原有的内存够不够,不够就要将暂时不用或少用的程序换出,还要考虑得给这个程序分配多少内存,因为程序可能在执行期间会在堆栈开辟新的空间,所以就要就要事先分配较大的内存空间。这里面就涉及到内存管理,他也有两种方式:1位图,将内存按一定大小分成若干块,然后用一位记录是否被使用,1表示使用,0表示未使用,分的越细用于存储位图的空间就越大,但这种方式在交换程序过程中要搜索出一块合适大小的内存比较慢;2.链表记录,同样也是将内存划分成块,这样载入或交换内存都比较方便,还可以考虑双向链表,或者使用和空闲内存各一张链表,采用的交换算法有:首次匹配,下次匹配,最优匹配,最差匹配等。

2.虚拟内存:这种技术被广泛使用,他为程序逻辑上分配一个很大的寻址空间,每个程序都能拥有这样大的逻辑地址空间,然后将这个空间映射到实际的物理地址。映射是如何实现的呢?首先将虚拟地址和物理地址分块,块的大小一样,虚拟地址的一块叫一页,物理的叫一个叶匡。然后有一张表存放了虚拟地址业和实际物理叶匡的对应关系,虚拟地址会被送到一个叫mmu的地方进行地址解析,如果发现当前的页没有对应的页会出现缺页中断,就到磁盘中将代码载入到内存中,这里载入也涉及到算法。

        总结:这里简要的介绍了地址空间的概念,其中很多设计操作系统的知识没有深入探究。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值