Каково различие между системным вызовом и вызовом функции? Является fopen () системным вызовом или вызовом функции?
Точка зрения, которую следует добавить к этому обсуждению, заключается в том, что вызов функции, как правило, в наиболее оптимистичном случае имеет накладные расходы в виде нескольких 8-битных инструкций (4- 10 в среднем) в x86.
Системный вызов имеет следующие свойства.
По этим трем примитивным причинам (их, вероятно, больше) следует уменьшить количество системных вызовов там, где это возможно - например, сетевое системное программное обеспечение хранит дескрипторы сокетов (и другие специфичные для приложения внутренние структуры данных, используемые соединением), чтобы назначать новое соединение, зачем беспокоить ядро?
Помните, что программное обеспечение построено как перевернутая пирамида. Системные вызовы находятся в базе.
Если вы используете Linux, вы можете отслеживать системные вызовы, выполняемые приложением:
strace appname ...
Его вывод может дать вам хорошее представление о том, что происходит внутри libc, и какие функции на самом деле являются системными вызовами.
Чтобы завершить картину, представленную другими, fopen
обычно реализуется как оболочка вокруг open
, которая также является доступной для пользователя функцией. fopen
в некотором смысле выше уровня, чем open
, поскольку структура FILE *
, которую он возвращает, инкапсулирует материал для пользователя. Некоторые пользователи используют open
напрямую для особых нужд. Поэтому было бы неправильно называть fopen
«системным вызовом». Также он не выполняет системные вызовы напрямую , поскольку open
также является функцией, вызываемой пользователем.
Системный вызов фактически вызывает API, выполняемый пространством ядра. Со всеми сопутствующими затратами, это предполагает (см. Wiki или эту ссылку для подробностей)
Вызов функции - это вызов фрагмента кода в пользовательском пространстве.
Однако обратите внимание, что вызов функции МОЖЕТ относиться к функции, которая в процессе своего выполнения выполняет системные вызовы - «fopen» является одним из таких примеров. Таким образом, хотя вызов fopen сам по себе является вызовом функции, это не означает, что системный вызов не будет обрабатывать фактический ввод-вывод.
fopen - это вызов функции.
Системный вызов взаимодействует с базовой ОС, которая управляет ресурсами. Это на порядки дороже, чем вызов функции, потому что необходимо предпринять много шагов, чтобы сохранить состояние процесса, который совершил системный вызов.
В системах * nix команда fopen обертывает open, что вызывает системный вызов (open - это оболочка C для системного вызова). То же самое происходит с fread / read, fwrite / write и т. Д.
Здесь есть хорошее описание задач, выполняемых системным вызовом unix.
fopen
- это вызов функции, но иногда его можно назвать системным вызовом, поскольку он в конечном итоге обрабатывается «системой» (ОС). fopen
встроен в библиотеку времени выполнения C .
Системный вызов - это вызов кода ядра, обычно выполняемый путем выполнения прерывания. Прерывание заставляет ядро выполнять запрошенное действие, а затем возвращает управление приложению. Это переключение режима является причиной того, что системные вызовы выполняются медленнее, чем эквивалентная функция уровня приложения.
fopen
- это функция из библиотеки C, которая внутренне выполняет один или несколько системных вызовов. Как правило, программисту на C редко нужно использовать системные вызовы, потому что библиотека C обертывает их за вас.