Избегайте переключения приложений [процессов] для общего ресурса в Linux

Общий ресурс используется в двух прикладных процессах A и в процессе B. Чтобы избежать состояния гонки, решил, что при выполнении части кода, имеющей дело с общим ресурсом, отключите переключение контекста и снова включите переключение процессов после выхода из общей части процесса.

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

Или есть лучший способ избежать гонки?

С Уважением,
ученик

3 ответа

Решение

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

Вы не можете сделать это напрямую. Вы можете делать то, что вы хотите с помощью ядра. Например, ожидание на Mutex или один из других способов сделать IPC (межпроцессное взаимодействие).

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

Или есть лучший способ избежать гонки?

Избегать условий гонки - это все о компромиссах. Ядро имеет много разных методов IPC, каждый с разными характеристиками. Получить хорошую книгу по IPC, и посмотреть, как такие вещи, как Postgres масштабируется на многие процессоры.

Для всех приложений пользовательского пространства и подавляющего большинства кода ядра действительно невозможно отключить переключение контекста. Причина этого в том, что переключение контекста - это не ответственность приложения, а операционная система.

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

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

Если вы хотите более авторитетные и подробные объяснения того, что и почему сходных сценариев, вы можете посмотреть этот урок MIT, например.

Надеюсь это поможет.

Я бы предложил посмотреть на именованные семафоры. sem_overview (7). Это позволит вам обеспечить взаимное исключение в ваших критических разделах.