Во-первых, позвольте мне привести некоторые термины. A критический раздел (CS) - это последовательность инструкций, которые могут выполняться не более чем одним процессом одновременно. При использовании критических разделов код может быть разбит на следующие разделы:
// Some arbitrary code (such as initialization).
EnterCriticalSection(cs);
// The code that constitutes the CS.
// Only one process can be executing this code at the same time.
LeaveCriticalSection(cs);
// Some arbitrary code. This is called the remainder section.
Первый раздел содержит код, такой как код инициализации. У нас нет названия для этого раздела. Второй раздел - это код, который пытается ввести CS. Третий раздел - это сама CS. Четвертый раздел - это код, который выходит из критического раздела. Пятый и последний раздел называется секцией , которая может содержать любой код. Обратите внимание, что сама CS может различаться между процессами (например, рассмотрим процесс, который получает запросы от клиента и вставляет их в очередь и другой процесс, обрабатывающий эти запросы).
Для обеспечения правильной работы критических секций необходимо выполнить три условия. Вы упомянули о двух из них (о чем я расскажу ниже). Третье - взаимное исключение, которое, очевидно, жизненно важно. Стоит отметить, что взаимное исключение относится только к CS и разделу отпуска. Однако остальные три раздела не являются исключительными.
Первое условие: прогресс. Цель этого условия состоит в том, чтобы убедиться, что какой-либо процесс в настоящее время находится в CS и выполняет некоторую работу, или, если есть хотя бы один процесс, который хочет войти в CS, он будет выполнять некоторую работу. В обоих случаях некоторые работы выполняются, и поэтому все процессы достигают прогресса в целом.
Прогресс: Если ни один процесс не выполняется в критической секции и некоторых процессы хотят ввести свои критические секции, то только те процессы, которые не задействуются в их остаточных секциях могут участвовать в принятии решений, которые будут вводить его следующий критический раздел, , и этот отбор нельзя отложить на неопределенный срок.
Давайте поймем это предложение определения предложением. не
Если ни один процесс выполняется в критической секции
Если процесс выполняется в критической секции (даже если не указано явно, это включает в себя раздел отпуска, а), то это означает, что некоторые работы выполняются. Поэтому мы добиваемся прогресса. В противном случае, если бы это было не так ...
и некоторые процессы желают вводить свои критические секции
Если ни один процесс не хочет войти в свои критические секции, то есть не больше работы, чтобы сделать , В противном случае, если есть по крайней мере один процесс, который хочет войти в критическую секцию ...
тогда только те процессы, которые не задействуются в их остаточным разделе
Это означает, что мы говорим о тех, процессы, которые выполняются в одном из первых двух разделов (помните, что ни один процесс не выполняется в критической секции или секции отпуска) ...
могут участвовать в принятии решений, которые будут входить в критическую секцию рядом,
Поскольку существует хотя бы один процесс, который хочет войти в его CS, мы должны выбрать один из них, чтобы ввести его CS. Но кто это сделает? Те, кто уже просил разрешения войти в свои критические разделы, имеют право участвовать в принятии этого решения. Кроме того, те процессы, которые могут, хотят войти в свои CS, но еще не просили разрешения на это (это означает, что они выполняются в первом разделе) также имеют право участвовать в принятии этого решения.
и этот отбор нельзя отложить на неопределенный срок.
Это означает, что для выбора процесса ввода его CS потребуется ограниченное время. В частности, не будет deadlock or livelock. Таким образом, через это ограниченное количество времени процесс войдет в его CS и проделает определенную работу, тем самым достигнет прогресса.
Теперь я объясню последнее условие, а именно ограниченное ожидание. Цель этого условия - убедиться, что каждый процесс получает возможность фактически войти в свой критический раздел, чтобы не было процесса starves forever. Однако учтите, что ни это условие, ни прогресс не гарантируют справедливость. Внедрение CS не должно быть справедливым.
Bounded ожидания: Там существует предел, или предел, на количество раз другие процессы позволили ввести их критические секции после того, как процесс сделал запрос на ввод в критическую секцию и до этого запроса предоставляется.
Давайте поймем это определение предложения предложением, начиная с последнего.
после того, как процесс сделал запрос на ввод своего критического раздела и , прежде чем этот запрос будет предоставлен.
Другими словами, если есть процесс, который запросил ввести его CS, но еще не ввел его. Давайте назовем этот процесс П.
Там существует предел, или предел, на количество раз другие процессы могут ввести их критические секции
В то время как P ждет, чтобы войти в CS, другие процессы также могут ждать, а некоторые процессы выполняются в его CS. Когда он покидает свой CS, необходимо выбрать другой процесс для ввода CS, который может быть или не быть P. Предположим, что был выбран процесс, отличный от P. Такая ситуация может случиться снова и снова. То есть, другие процессы получают возможность войти в свои CS, но никогда не помнят, что прогресс идет, но другими процессами, а не P. Проблема в том, что P не получает возможности выполнять какую-либо работу. Чтобы предотвратить голодание, должна быть гарантирована, что P в конечном итоге войдет в ее CS. Чтобы это произошло, количество раз, когда другие процессы входят в свои CS, должно быть ограничено. В этом случае P, безусловно, получит шанс войти в свою CS.
Я хотел бы упомянуть, что определение CS может быть обобщено так, чтобы в их критических разделах выполнялось не более N процессов, где N - любое положительное целое число. Существуют также варианты критических разделов считывающего устройства.
Замечательная строка за строкой –
Вы потрясаете. Отличное объяснение! – void