題 Unix中交換器進程的主要用途是什麼?


Unix中交換器進程的主要用途是什麼?

Swapper進程具有PID 0,我猜它是第一個加載的進程。任何人都可以更多地關注這個話題嗎?


4
2018-01-12 09:12


起源


這是否存在於所有UNIX變體中?我不認為我以前見過它。但是可能與任務調度有關。 - John Chadwick


答案:


自20世紀90年代以來,它一直不是一個交換過程,自20世紀70年代以來,交換並沒有真正使用過。

Unices很久以前就停止了使用交換。從System V R2V5和4.0BSD開始,它們幾十年來一直是需求頁面操作系統。交換器進程,用於執行 流程交換 操作。它曾用於交換整個流程 - 包括所有流程 內核空間 進程的數據結構 - 輸出到光盤並再次交換它們。它會被內核定期喚醒,並會掃描進程表以確定可以交換哪些交換和準備運行的進程以及交換進程中的交換進程可以換掉。從20世紀80年代開始,Unix上的任何教科書都將更加詳細地介紹,包括交換算法。但它與需求分頁的Unices基本無關,即使它們保留了舊的交換機制已有好幾年了。 (例如,BSD努力避免交換,支持分頁。)

進程#0是系統中的第一個進程,由內核手工製作。它 fork()進程1,第一個用戶進程。它除了那之外做了什麼 取決於操作系統實際上是什麼Unix。如前所述,FreeBSD 5.0之前的BSD保留了舊的swapper機制,而進程#0只是簡單地放入了內核中的swapper代碼中, scheduler() 完成系統初始化後的功能。系統V大致相同,只是過程#0通常被命名 sched 而不是 swapper。 (名稱幾乎是任意選擇。)事實上,大多數 - 可能全部 - Unices有一個(很大程度上未使用過的)舊的交換機制,它作為進程#0掛起。

傳統上,Linux與Unices有些不同,因為過程#0就是 閒置過程,跑步 cpu_idle()。它在無限循環中什麼都不做。它存在以便存在 總是 準備安排的任務。

即使這是一個過時的描述。 20世紀80年代末和90年代初是多線程操作系統的出現,其結果是#0變得簡單 系統過程。在舊的單線程Unices的世界中,人們只能獲得單獨的執行流來執行連續的內核任務 fork()一個過程。所以所有的內核任務(vmdaemonpagedaemonpagezerobufdaemonsyncerktrace等等,例如FreeBSD系統上的進程是低編號的進程, fork()由進程#0編輯 fork()ED ìnit。在多線程Unices中,為完全在內核空間中運行的東西創建一個全新的進程上下文是沒有意義的,並且不需要地址空間,文件描述符表以及其他所有東西。因此,所有這些任務都成為(基本上)線程,共享單個系統進程的地址空間。

一路上,幾個Unices失去了舊的交換機制,他們正在盡最大努力避免使用任何方式。 OpenBSD的初始化代碼現在簡單地落入了一個 while(1) tsleep(…); 例如,循環,在任何地方都沒有交換機制。

所以 如今 Unix上的進程#0是 系統過程,這有效地掌握了一些 內核線程 做一些事情,從頁面調出操作,文件系統緩存刷新和緩衝區清零,到沒有其他任何東西運行時的空閒。


11
2018-01-12 15:25



請注意,idle(2)系統調用是Linux中的遺留物,自內核2.3.13(大約15年!)以來就不存在了。有關更多歷史詳細信息,請參閱電話的手冊頁(仍在大多數現代發行版中提供)。


進程0是一個特殊的進程(稱為交換器或空閒進程),它在系統空閒時運行,即沒有安排其他進程。這是唯一可以調用的過程 idle() 系統調用。

這是第一個產生的過程,然後創建 init (PID 1)啟動其他進程。

root         1     0 /sbin/init

你也可以檢查一下 man idle

也可以看看: 了解Linux內核 - 進程調度


5
2018-01-12 09:47





原因是歷史和編程。如果沒有其他任務可以運行,那麼空閒任務就是任務正在運行,就像你說的那樣。它具有最低可能的優先級,因此它運行沒有其他任務的原因是可運行的。

編程原因:這大大簡化了流程調度,因為您不必關心特殊情況:“如果沒有任務可運行會發生什麼?”,因為始終至少有一個任務可運行,即空閒任務。您還可以計算每個任務使用的CPU時間量。沒有空閒任務,哪個任務獲得cpu-time佔用沒有人需要?

歷史原因:在我們擁有能夠降級或進入省電模式的cpu之前,它必須隨時全速運行。如果沒有任務可運行,它會運行一系列NOP指令。今天,空閒任務的調度通常通過使用HLT指令(停止)來降低CPU,因此節省了電力。所以在我們這個時代的閒置任務中有某種功能。

在Windows中,您可以在進程列表中看到空閒任務,這是空閒進程。


1
2017-09-13 22:25