簡體   English   中英

從Java應用程序讀取的文件是否會調用系統調用?

[英]Does a file read from a Java application invoke a system call?

我的理解是,請求文件系統路徑的用戶應用程序(例如/ aFile)將調用文件系統並返回所請求文件的虛擬地址。 然后應用程序將嘗試使用該地址作為參數的讀/寫操作,作為CPU指令? 在執行讀命令時,內存管理單元將該地址轉換為物理地址,查看頁表。 如果用戶沒有權限訪問該內存位置(該信息攜帶在哪里?),操作將中止。 否則,如果在內存中找到物理地址頁面,則對其進行讀/寫操作,否則從磁盤引入頁面並重復操作。

所以,似乎根本沒有系統調用。 有人可以糾正上述程序細節中可能出現的錯誤嗎?

在第一句(調用文件系統)中暗示系統調用,因為它必須將控制器轉移到內核....

(通常)當您使用Java打開/讀取/寫入文件時,會調用OS內核,也稱為。 系統調用,用於打開/讀取/寫入該文件。 如何完成並且所涉及的內存管理必然掌握在內核中,但最終從文件讀取的字節將被復制回通過系統調用提供的緩沖區。

你所描述的是Memory Mapped IO,它絕不是唯一的方式,甚至不是標准方式。 即使在這種情況下,系統調用也會發生,盡管它們可能位於應用程序的后面。

當您遇到頁面錯誤時,即缺少一塊內存時,仍然會通知內核執行所有魔法操作以使頁面從塊設備進入內存。 有些東西需要弄清楚從哪個設備獲取信息。 使用軟件raid,這可能非常復雜,與其他人一樣,它可以很簡單,如配置DMA傳輸並讓它翻錄。 也許有些芯片組可以在某些情況下自行完成,但肯定不是全部。

這不是因為你的程序沒有執行它們沒有“系統調用”。 然而,這樣的抽象允許內核專家更自由地從硬件中擠出最后一盎司的性能。

你想知道的是操作系統設計。 有許多方法可用,並且通過在文件抽象之上提供文件系統抽象(一切都是由字節流組成的文件),您可以做很多事情而無需更改抽象。

試想一下,與火線驅動器相比,操作系統必須如何處理RAM磁盤,再次與Windows網絡共享進行比較。 文件抽象是一樣的。

現在,如果你想知道會發生什么,我強烈建議下載並安裝OpenSolaris並學習如何使用dtrace。 它允許您詢問系統從主方法到物理硬件頂部的各個驅動程序的所有功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM