为什么Linux上可以删除正在运行的程序呢?

在跑gem5时发现一个神奇的现象:当已经开始运行gem5跑仿真实验时,假设为仿真实验A,试验运行时间很长,当实验还没结束,此时如果再对源码修改并编译之后再跑别的实验(假设为仿真实验B)是不影响第一个仿真实验A的进行的。
(ps:实验环境 ubuntu 14.04)

为什么呢?

最最简单的理解,程序在运行实验A时其代码以及数据已经被加载到内存中去了,所以此时重新编译gem5(也即覆盖掉实验A的可执行文件),是不会影响实验A的进行的。

但是,系统不是以分页的方式将程序部分的内容加载到内存的吗?如果需要访问 其他还没有被加载到内存的部分,可是文件已经被删除了,不会引起问题吗?

这是因为:
1、当文件被程序打开的时候,文件自身的连接数计数会加一(link),程序退出时文件连接数会减一(unlink /remove)。当文件被创建时,最起码有操作系统引用它,所以计数为1。假设文件同时被一个进程引用了一次,此时文件计数为2。当我们用rm操作时(remove),文件引用次数减为1。当程序退出时,引用次数减为0.当文件引用数减少到0的时候,文件才会真正被删除掉。
2、在linux系统中,有inode这个数据结构,inode中包含一个指向程序所在的数据块的指针,比如有数据块a~z。因为进程在加载这个程序的时候就已经获取到了该程序占用哪些data block(但可能只是加载了一部分数据块a~g)。当程序被删除的时候,inode只是删除指向data block的指针,但是数据块的bit map暂时还不会设置为0,所以文件系统认为这部分数据块还在”使用中”。也就是说,这个程序文件在文件系统中的占用的空间a~z暂时还未释放。直到程序结束,bit map才会将a~z的数据块标识为0,文件系统的空间才会释放,这部分数据块才能被其他文件覆盖,直到这时,文件才是完完整整地被删除。

参考:
[1] 为什么Linux上可以删除正在运行的程序呢?
[2] 详解linux系统中文件存储和删除的底层过程

猜你喜欢

转载自blog.csdn.net/baidu_35679960/article/details/80808371