Вызывает ли файл, прочитанный из приложения Java, системный вызов? - PullRequest
4 голосов
/ 03 июля 2010

Насколько я понимаю, пользовательское приложение, запрашивающее путь к файловой системе (например, / aFile), вызовет файловую систему и вернет виртуальный адрес запрошенного файла. Тогда приложение попытается выполнить операцию чтения / записи с этим адресом в качестве аргумента, то есть как инструкция процессора? При выполнении команды чтения модуль управления памятью преобразует этот адрес в физический адрес, просматривая таблицу страниц. Если у пользователя нет прав доступа к этой ячейке памяти (куда эта информация переносится?), Операция прерывается. В противном случае, если страница физического адреса находится в памяти, операция чтения / записи переносится на нее, в противном случае страница переносится с диска и операция повторяется.

Так что, похоже, системного вызова нет вообще. Может ли кто-нибудь исправить возможные ошибки в описанной выше процедуре?

Ответы [ 4 ]

2 голосов
/ 03 июля 2010

(обычно), когда вы открываете / читаете / пишете файл в Java, вызывается ядро ​​ОС, иначе.системный вызов для открытия / чтения / записи этого файла.Как это сделать и задействовать управление памятью, все в руках ядра, но в конечном итоге считанные из файла байты копируются обратно в буфер, передаваемый через системный вызов.

2 голосов
/ 03 июля 2010

В самом первом предложении (вызывать файловую систему), которое подразумевает системный вызов, поскольку он обязательно должен передать контроллер ядру ....

0 голосов
/ 03 июля 2010

Что вас интересует, так это дизайн операционной системы. Доступно много подходов, и, располагая абстракцию файловой системы поверх абстракции файла (все представляет собой файл, состоящий из потока байтов), вы можете сделать довольно много, не меняя абстракцию.

Только подумайте, как операционная система должна обращаться с RAM-диском по сравнению с FireWire-диском по сравнению с сетевым ресурсом Windows. Абстракция файла такая же.

Теперь, если вы действительно хотите ЗНАТЬ, что происходит, я настоятельно рекомендую загрузить и установить OpenSolaris и научиться работать с dtrace. Он позволяет вам спросить систему, что она делает, от вашего основного метода до отдельных драйверов поверх физического оборудования.

0 голосов
/ 03 июля 2010

То, что вы описываете - это Memory Mapped IO, который ни в коем случае не является единственным или даже стандартным способом. И даже в этом сценарии происходят системные вызовы, хотя они могут находиться позади приложения.

Если у вас ошибка страницы, то есть отсутствует часть памяти, ядру по-прежнему будет отправлено уведомление о том, что нужно сделать все возможное, чтобы получить страницы в память с блочного устройства. Есть кое-что, что нужно выяснить, с какого устройства можно получить информацию. С программным рейдом это может быть очень запутанным, с другими это может быть просто, как настройка передачи DMA и позволить ей разорваться. Может быть, есть наборы микросхем, которые могут делать это самостоятельно при определенных обстоятельствах, но, конечно, не все.

Это не потому, что ваша программа не выполняет их, что нет "системных вызовов". Однако такая абстракция дает специалисту по ядру больше свободы при извлечении последней унции производительности из аппаратного обеспечения.

...