2019年6月24日 下午1:31
作者:赵谜
链接: https://www.nowcoder.com/discuss/18
来源:牛客网
- 既然说到操作系统,面试官接着又问了个底层的问题:一个程序,访问函数中某个变量时,操作系统做了什么事情?我的第一反应是这个变量是存在可执行文件中,所以在访问这个变量的地址时,如果相应的页面加载到内存中了就可以直接访问,否则去交换区里头找;如果连交换区看里都没有,就上硬盘里找……说到这我才意识到,面试官问的是函数中的变量,即局部变量!刚才说的都是错的!哎哟我紧张得要命,赶紧解释说不好意思,刚才说错了……面试官很nice地说没关系,把你知道的说出来就行。我松了口气,把C语言运行时函数调用引起的栈帧变化解释了一下,访问局部变量就是访问fp加上相应偏移的地址。
- 面试官没有纠着我的错误,反而顺着问下去:刚才你说到页错误和交换区,那么操作系统如何处理页错误的呢?交换区的作用是什么?
- 我说有两种情况会引起页错误, 一种是访问不存在的页面、一种是对只读页面执行写操作 ,刚才说的页错误是缺页错误,就是第一种情况。
- 这种情况下,::被访问的内存地址会被写入CPU的寄存器中(CR2),操作系统可以访问这个寄存器从而知道引起缺页错误的内存地址,然后在交换区和硬盘中寻找相应的页面::。
- 而交换区的作用是利用局部性原理,存放被操作系统置换出来的页面,在物理内存紧缺的时候,某些久不使用的页面就会被交换到交换区,这些页面仍然可能在将来被使用,放在交换区中可以更快地被找到 。