Системный вызов по сравнению с Вызовом функции

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

29
задан VividD 14 March 2014 в 13:56
поделиться

7 ответов

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

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

  1. Он выполняет гораздо больше инструкций, он должен заморозить процесс, а не просто состояние стека.
  2. Выбор времени в основном недетерминированный.
  3. Часто это место для планирования, и планировщик может выбрать другое расписание.

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

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

2
ответ дан 28 November 2019 в 01:24
поделиться

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

strace appname ...

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

3
ответ дан 28 November 2019 в 01:24
поделиться

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

1
ответ дан 28 November 2019 в 01:24
поделиться

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

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

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

2
ответ дан 28 November 2019 в 01:24
поделиться

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

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

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

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

9
ответ дан 28 November 2019 в 01:24
поделиться

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

1
ответ дан 28 November 2019 в 01:24
поделиться

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

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

32
ответ дан 28 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: