Вызывает ли печать на экране переключение в режим ядра и запуск кода ОС в Unix? - PullRequest
4 голосов
/ 25 июня 2011

я учусь на тест ОС (юникс - наша модель).у меня следующий вопрос:

, что из следующих 2 НЕ приводит к остановке программы пользователя и переключению на код ОС?

A.программа обнаружила ошибку и выводит ее на экран.

B.Программа распределила память, которая будет прочитана позже с диска.

Хорошо, у меня есть ответы, однако я не уверен, насколько они хороши.они говорят, что ответ B. но, B, когда пользователь использует malloc, который является системным вызовом no?выделение памяти не проходит через ОС?и зачем для печати на экран нужна ОС для этого?

спасибо за помощь

Ответы [ 4 ]

5 голосов
/ 25 июня 2011

malloc не является системным вызовом . Это просто функция.

Когда вы звоните malloc, он проверяет, достаточно ли у него (внутри) памяти для вас. Если это так, он просто возвращает адрес - нет необходимости перехватывать в режиме ядра. Если он не имеет, он запрашивает операционную систему (на самом деле системный вызов).

В зависимости от способа печати это может вызвать или не вызвать системный вызов. Например, если вы используете stdio, то печать буферизуется пользователем. Это означает, что printf означает копирование в некоторый буфер stdio без какого-либо фактического ввода-вывода. Однако , если printf решит сбросить данные, то действительно должен быть выполнен системный вызов.

1 голос
/ 25 июня 2011

graph showing layers: program, libc, kernel

Вызовы

printf() и malloc() вызывают библиотеку времени выполнения C (libc). Библиотека времени выполнения C является слоем поверх ядра и может в конечном итоге вызвать ядро ​​в зависимости от обстоятельств.

Ядро обеспечивает несколько примитивное распределение памяти через brk() (расширение / сжатие сегмента данных) и mmap() (отображение страниц памяти в виртуальное адресное пространство процесса). malloc() Libc внутренне управляет памятью, полученной из ядра, и пытается минимизировать системные вызовы (среди прочего, она также пытается избежать чрезмерной фрагментации и пытается добиться хорошей производительности в многопоточных программах, поэтому приходится делать некоторые компромиссам).

stdio ввод / вывод (через *printf()/*scanf()) буферизуется и завершается вызовом системных вызовов ядра write()/read(). По умолчанию stderr (поток ошибок) небуферизован или буферизован строкой (ISO C §7.19.3 )7), так что ошибки можно увидеть сразу. stdin и stdout являются буферизованными или небуферизованными линиями, если не установлено, что они не подключены к интерактивному устройству, поэтому интерактивные запросы на ввод корректно работают. stdin и stdout могут быть полностью буферизованы (буферизованы блоком), если они ссылаются на файл на диске или другой неинтерактивный поток.

Это означает, что вывод ошибок по умолчанию гарантированно будет виден, как только вы выводите символ '\n' (перевод строки) (если вы не используете setbuf()/setvbuf()). Нормальный выход дополнительно требует подключения к терминалу или другому интерактивному устройству для обеспечения этой гарантии.

0 голосов
/ 25 июня 2011

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

В B ОС, безусловно, отвечает за управление памятью, а выделение может в какой-то момент запрашивать память у ОСили ОС, возможно, должна обеспечить замену диска.

Так что ответ, вероятно, строго ни тот, ни другой.Но A будет требовать системного вызова, тогда как B может потребовать системного вызова.

0 голосов
/ 25 июня 2011

Ответ: А. Обработка ошибки после ее обнаружения обрабатывается средой выполнения языка программирования и приложением пространства пользователя. С другой стороны, mmap для файла требует входа в режим ядра, чтобы выделить необходимые страницы и поставить в очередь любой дисковый ввод-вывод. Так что B определенно не правильный вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...