Подтвердить что ты не робот

Системный вызов vs Вызов функции

В чем разница между системным вызовом и вызовом функции? Является ли fopen() системным вызовом или вызовом функции?

4b9b3361

Ответ 1

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

fopen - это функция из библиотеки C, которая внутренне выполняет один или несколько системных вызовов. Как правило, в качестве программиста на C вам редко приходится использовать системные вызовы, потому что библиотека C обертывает их для вас.

Ответ 2

fopen - вызов функции.

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

В системах * nix открываются обрывы fopen, что делает системный вызов (open - это C-обертка для syscall). То же самое происходит с fread/read, fwrite/write и т.д.

Здесь есть приятное описание задач, выполняемых системным вызовом unix.

Ответ 3

На самом деле системный вызов не связан с вызовом функции. Единственным распространенным из этих двух механизмов является то, что они оба предоставляют услуги вызывающему абоненту.

  • Из представления выполнения потока, чтобы увидеть системный вызов:

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

  • Параметры Syscall:

    Параметр системного вызова (номер syscall, params...). Значение и формат параметров зависят от номера системы.

  • Из представления библиотеки syscall, предоставленной программе userland:

    Программа пользовательского режима обычно вызывает библиотеку glibc для вызова системного вызова. Например, функция open() в glibc:

    • введите номер системного вызова SYS_OPEN в регистре eax
    • запрос системного вызова путем вызова программного прерывания или команды sys_enter

Ответ 4

Если вы используете Linux, вы можете контролировать системные вызовы, выполняемые приложением:

strace appname...

Его вывод может дать вам хорошее представление о том, что происходит внутри libc, и какие функции на самом деле являются системными вызовами.

Ответ 5

Системный вызов фактически вызывает API, выполняемый ядром. При всех связанных с этим расходах это предполагает (см. Wiki или эту ссылку для деталей)

Вызов функции - это вызов части кода в пользовательском пространстве.

Однако обратите внимание, что вызов функции МОЖЕТ быть в функции, которая в процессе ее выполнения выполняет системные вызовы - "fopen", являющийся одним из таких примеров. Таким образом, хотя вызов fopen сам является вызовом функции, не означает, что системный вызов не будет обрабатывать фактический IO.

Ответ 6

Точка зрения для добавления к этому обсуждению состоит в том, что вызов функции, обычно в наиболее оптимистичном случае, имеет накладные расходы на несколько 8-битных инструкций (в среднем 4-10) в x86.

Системный вызов имеет следующие свойства.

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

Для этих трех примитивных причин (их, вероятно, больше) необходимо уменьшить количество системных вызовов там, где это возможно - например, сетевое системное программное обеспечение поддерживает дескрипторы сокетов (и другие внутренние структуры данных, используемые приложением) назначить новому соединению, зачем беспокоить ядро?

Помните, что программное обеспечение построено как перевернутая пирамида. Системные вызовы находятся в базе.

Ответ 7

fopen - вызов функции, но иногда его можно назвать системным вызовом, потому что он в конечном итоге обрабатывается "системой" (ОС). fopen встроен в библиотеку C.

Ответ 8

Чтобы завершить изображение, представленное другими, fopen обычно реализуется в качестве обертки вокруг open, что также доступная пользователю функция. fopen в некотором смысле более высокий уровень, чем open, поскольку структура FILE* возвращает инкапсуляции для пользователя. Некоторые пользователи используют open напрямую для особых нужд. Поэтому было бы неправильно называть fopen "системный вызов" каким-либо образом. Он также не выполняет системные вызовы напрямую, так как open также является функцией, вызываемой пользователем.

Ответ 9

Системный вызов выполняется на уровне ядра, а не в пользовательском spce, потому что для доступа к оборудованию требуется некоторый prievilege.

При программировании в пользовательском пространстве и при вызове какой-либо обычной функции, например, fopen на языке C, libc обычно обертывает эту функцию на конкретный кодовый код, где генерируется прерывание для переключения из пространства пользователя в пространство ядра, а затем в пространстве ядра требуемый системный вызов для выполнения функциональных функций вызова функции на аппаратном уровне будет выполняться в пространстве ядра.