為什麼Linux上可以刪除正在執行的程式呢?

2021-08-20 23:27:10 字數 959 閱讀 1078

在跑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系統中檔案儲存和刪除的底層過程

金為什麼可以生水?水為什麼可以生木?

五行相生,金生水 水生木 木生火 火生土 土生金,在現代人看來,有些不可理解,例如 金為什麼可以生水?水為什麼可以生木?同理,五行相剋,金剋木 木剋土 土剋水 水剋火 火剋金當中,木剋土 土剋水之類,也有點不好理解,似乎與常識有些格格不入。其實,一切產生於古代的文化,都必須用那個時代的常識或理念來解...

exe為什麼可以在不同機器上執行

1,很多資料都說,exe檔案是二進位製碼 指令 是可以直接被機器執行的 2,但是,所謂的二進位製碼 指令 不是因機而異的嗎?不同的機器,使用的cpu是不一樣的,指令集也不一樣,那為什麼在一台機器上生成的exe可以在別的不同指令集上的cpu上執行?3,在我看來,這個所謂的指令,恐怕指的並不是對應硬體的...

機器為什麼可以學習

機器學習 人工智慧炙手可熱,但是機器到底為什麼可以學習呢?本文將從霍夫丁不等式講到vc維,機器學習的原因所在。機器什麼時候可以學習 機器怎麼學習 如何讓機器學得更好總結 機器學習乍聽之下很厲害,這時候人就會想,這乙個普普通通的死板的機器,怎麼會學習呢?很容易地,人們舉了個簡單的問題 如下圖 x,y,...