Procfs

出自Local Chinese Wikipedia
imported>Ohtashinichiro2023年12月19日 (二) 09:24的修訂 参考
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
跳至導覽 跳至搜尋

package.lua第80行Lua錯誤:module 'Module:CGroup/core' not found Template:Lowercase 在許多類 Unix 計算機系統中, procfs進程 文件系統 (file system) 的縮寫,包含一個偽文件系統(啟動時動態生成的文件系統),用於通過內核訪問進程信息。這個文件系統通常被掛載到 /proc 目錄。由於 /proc 不是一個真正的文件系統,它也就不佔用存儲空間,只是佔用有限的內存。

以下作業系統支持 procfs :

歷史[編輯]

UNIX 8[編輯]

Tom J. Killian 實現了 UNIX 8 版本的 /proc:他1984年6月向 USENIX 提交了一份題為 "Processes as Files" 的論文。procfs 的設計目標是用來替代進行進程跟蹤的 ptrace 系統調用。 詳細文檔請參考當時的 proc(4) 用戶手冊[1]

SVR4[編輯]

Roger FaulknerRon Gomes 將 Unix 8 的 /proc 移植到了 SVR4,並在1991年1月的 USENIX 上發表了一篇題為 "The Process File System and Process Model in UNIX System V" 的論文。 此類 procfs 在功能上已經足夠實現 ps 命令了, 但是其中的文件只能通過 read()write()ioctl() 系統調用來訪問。從1995到1996年, Roger Faulkner 又為 Solaris 2.6 編寫了 procfs-2 接口, 提供了一個結構化的, 基於子目錄的 /proc 文件系統。

Plan 9[編輯]

Plan 9 實現了一個進程文件系統,但比 V8 做得更多。V8 的進程文件系統中,對一個進程相關的所有函數都在一個文件進行操作。九號計劃使用單獨的文件,提供這些函數,使得 /proc 成為文件系統真正的一部分。

4.4BSD[編輯]

4.4BSD 從 Plan 9 復刻了 /proc 的實現。然而從2011年2月開始, FreeBSD 逐步淘汰了 procfs [2],轉而使用sysctl接口來獲取進程相關信息。默認安裝的 base 系統不依賴 procfs,FreeBSD 原生 ports 也不再依賴 procfs。macOS則完全棄用了procfs,只支持sysctl接口。[3]

為了提供對Linux用戶空間程序的二進制兼容性,FreeBSD內核也提供類似於 Linux /proc/ 的linprocfs[4]

Solaris[編輯]

Solaris 從一開始就提供對 /proc 的支持。 在1996年, Solaris 2.6 引入了由 Roger Faulkner 編寫的 procfs2 。

Linux[編輯]

Linux中的 /proc實現也克隆了 九號計劃 中對應的部分。

每個正在運行的進程對應於/proc下的一個目錄,目錄名就是進程的PID,每個目錄包含:

(用戶可以獲得PID使用工具如pgrep, pidofps:

$ ls -l /proc/$(pgrep -n python)/fd        # List all file descriptors of the most recently started `python' process
samtala 0
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 0 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 1 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 2 -> /dev/pts/3
$ readlink /proc/$(pgrep -n python)/exe    # List executable used to launch the most recently started `python' process  
/usr/bin/python3.1

)

Linux 2.6把 /proc 下大量的非進程相關的系統信息移動到一個專門的偽文件系統,稱為 sysfs(該文件系統是掛載到 /sys 上面):

"siblings" = (HT per CPU package) * (# of cores per CPU package)
"cpu cores" = (# of cores per CPU package)

CPU package是指單獨封裝的一顆CPU。這可以區分超線程與雙核,例如每顆CPU超線程數量為siblings / CPU cores. 如果二者的值相等,則CPU不支持超線程.[7]

Linux下使用 /proc 的基本工具是 procps (/proc processes) 中的程序,這個程序只對 procfs 具有意義。procfs 對部分功能從核心態移到用戶態的過程中產生重大的意義。像是 GNU 版本的 ps 只需在用戶態底下運作透過 procfs 取得資料便可以完成所有的工作。

相關命令:

  • sysctl
  • lsdev 收集相關設備的DMA, IRQ, I/O端口信息並匯總顯示
  • procinfo

Cygwin[編輯]

Cygwin實現的 /proc 與Linux基本一致。

Cobalt[編輯]

外部連結[編輯]

參考[編輯]

  1. package.lua第80行Lua錯誤:module 'Module:Citation/CS1/Identifiers' not found
  2. package.lua第80行Lua錯誤:module 'Module:Citation/CS1/Identifiers' not found
  3. package.lua第80行Lua錯誤:module 'Module:Citation/CS1/Identifiers' not found
  4. package.lua第80行Lua錯誤:module 'Module:Citation/CS1/Identifiers' not found
  5. package.lua第80行Lua錯誤:module 'Module:Citation/CS1/Identifiers' not found
  6. package.lua第80行Lua錯誤:module 'Module:Citation/CS1/Identifiers' not found
  7. package.lua第80行Lua錯誤:module 'Module:Citation/CS1/Identifiers' not found
  8. package.lua第80行Lua錯誤:module 'Module:Citation/CS1/Identifiers' not found

package.lua第80行Lua錯誤:module 'Module:Navbar/configuration' not found package.lua第80行Lua錯誤:module 'Module:Navbar/configuration' not found