Системный вызов Futex в C

Системный вызов Futex в C Программирование и разработка

В общем, примитивы синхронизации потоков требуют использования системных вызовов программами пользовательского пространства. Системный вызов по своей сути неизбежен для перевода потока в спящий режим и ожидания другого потока или вывода потока из спящего режима. Например, получение неконтролируемой блокировки не требует системного вызова, по крайней мере, естественно. Futex — решение этой проблемы. Futex — это просто мгновенный целочисленный адрес. Адрес используется для идентификации очереди потоков, ожидающих обработки. Значение целого числа в этом месте используется для выполнения быстрого пути с атомарными операциями, если они доступны, а также для обработки ситуаций гонки крайних случаев в случае конфликта. Системный вызов futex () позволяет программе ждать изменения значения по определенному адресу, а также разбудить всех, кто ждет по этому адресу. Чаще всего он используется для реализации спорного случая блокировки разделяемой памяти, как упоминалось в futex (7). Когда действие futex (7) в пользовательском пространстве не может завершиться без ошибок, для решения проблемы требуется вызов ядра. Арбитраж может использоваться либо для перевода вызывающего процесса в спящий режим, либо для пробуждения ожидающего процесса. Ожидается, что семантика, определенная в фьютексе, будет выполняться вызывающими эту функцию (7).

Поскольку эта семантика требует создания непереносимых инструкций по сборке, большинство пользователей, скорее всего, будут авторами библиотек, а не разработчиками обычных приложений. Futex — это единый системный вызов, выполняющий множество операций. Это может показаться странным, даже озадачивающим, если не откровенным. Тем не менее, это стандартная процедура для единственного в своем роде системного вызова: системный вызов «ioctl» содержит значительно больше операций, чем фьютекс. В другом случае программисты вряд ли обнаружат это, потому что Glibc скрывает это, хотя система вызовов единственного сокета реализует все функции, связанные с сокетами. В результате, если потоки обращаются к нему в одном процессе, он может быть указан как глобальная переменная или сохранен в сегменте разделяемой памяти, если потоки из различных процессов используют его. Состояние, обновленное в пользовательском пространстве с помощью атомарных операций, сохраняется в общей переменной. Нет необходимости в системном вызове, когда состояние говорит об отсутствии конфликта. Если условие указывает на конкуренцию, с другой стороны, выполняется системный вызов futex, чтобы перевести вызывающую задачу в спящий режим.

Читайте также:  Базовые основы Foundation CSS

Пример объяснения системного вызова futex () на языке C

Чтобы понять системный вызов futex () на языке C, мы установили операционную систему Ubuntu 20.04 Linux. Создайте файл с названием «fc.c». Название файла можно изменить, но расширение останется прежним. Итак, сначала откройте оболочку установленной операционной системы Ubuntu 20.04 Linux, найдя ее в «Приложениях» или нажав клавишу «Ctrl + Alt + T». После открытия запустите прикрепленную инструкцию в терминале установленной операционной системы Ubuntu 20.04 Linux.

$ nano fc.c

Вы можете подтвердить успешное выполнение файла, только если у вас на экране появится редактор GNU nano. Теперь вам нужно написать код, показанный на прикрепленном скриншоте. Это один из самых простых примеров системного вызова futex ().

Это один из самых простых примеров системного вызова futex ()

<STDIO. H> — это файл, содержащий объявления для различных функций и макросов, которые необходимы для получения входных данных от входов и отображения выходных данных в окне вывода программы C. Нет необходимости добавлять «stdio. h », потому что мы можем предоставить ввод в программу c с помощью любой другой программы, такой как DOS, и сохранить результаты. В header предоставляет и объявляет множество символических констант и типов, а также множество функций. syscall () — это крошечная библиотечная функция, которая вызывает системный вызов с запрошенным количеством аргументов и заданным интерфейсом на языке ассемблера. Как только вы поймете приведенный выше код, вы готовы к проверке вывода. Мы установили компилятор GCC для компиляции кода. Компилятор GNU C или GCC, это самый известный и широко используемый компилятор среди программистов, использующих C в качестве языка программирования. GCC — это доступный компилятор, который бесплатно поставляется со всеми дистрибутивами Linux. Теперь выполните добавленную команду в терминале системы Ubuntu 20.04 Linux.

$ gcc fc.c
$ ./a.out

Результат можно увидеть на прикрепленном выше изображении

Результат можно увидеть на прикрепленном выше изображении.

Заключение

Эта статья представляет собой краткое введение в системный вызов futex () на языке программирования C. У нас есть простой и краткий пример системного вызова futex (). Реализация тех же примеров и добавление небольших изменений могут помочь вам понять системный вызов futex () на языке программирования C.

Оцените статью
bestprogrammer.ru
Добавить комментарий