Semáforo detallado

2.14 Semáforo (énfasis)

Los procesos colaboran pasando señales

  • El proceso está bloqueado debido a una determinada condición y no puede continuar avanzando.
  • El proceso se despierta debido a una determinada condición y puede seguir avanzando.
Variable entera que puede realizar la función de semáforo: semáforo

Tres operaciones de semáforo

  • Inicialización: la inicialización es un número no negativo que representa un cierto estado inicial
  • SemSignal autocreciente ( código de operación: V ): Esta operación hace que el semáforo sea +1, si el semáforo todavía está <= 0 en este momento, despierta el proceso bloqueado por la operación P
  • Auto-decremento semWait ( código de operación: P ): Esta operación hace que el semáforo sea -1, si el semáforo es menor que 0 en este momento, bloqueará el proceso de realizar la operación P

2.14.1 Clasificación de semáforos

  • Semáforo binario: el valor del semáforo es 0/1
struct binary_semaphore{
    
    
	enum {
    
     zero, one } value;
	queueType queue;//内置队列
};  
void semwaitB(binary_semaphore s){
    
    //P操作
	if(s.value == one)
		s .value = zero;
	else {
    
    									//此时阻塞
			place this process in s.queue;//当前进程加入阻塞队列
			block this process;//不是忙等,不占cpu时间,等待唤醒
	}
}
void semsignalB(semaphore s){
    
    //V操作
	if( s.queue is empty())
		s .value=one;
	else {
    
    
			remove a process P from s.queue;//从阻塞队列取出进程
			place process P on ready list;//唤醒阻塞进程
	}
}
  • Contando semáforo: el semáforo general, el semáforo tiene un rango de valores más grande
struct semaphore {
    
    
	int count;
	queueType queue;
};

void semwait ( semaphore s ){
    
    //P操作
	s.count--;
	if ( s.count <0 ){
    
    
		place this process in s.queue;
		block this process;
	}
}

void semsignal ( semaphore s){
    
    //V操作
	s.count++;
	if ( s.count <= 0 ){
    
    
		remove a process P from s.queue;
		place process P on ready list;
	}
}

2.14.2 Cola dentro del semáforo

  • Semáforo fuerte: el proceso se mueve de acuerdo con FIFO
  • Semáforo débil: no especifica el orden en el que se eliminan los procesos

2.14.3 Utilice semáforos para resolver problemas de exclusión mutua

Cuando el proceso no puede realizar la operación P, necesita esperar la operación V de otro proceso para lograr la exclusión mutua.

/* program mutualexclusion */
const int n = / *number of processes */;
semaphore s = 1 ;//初始化

void P(int i){
    
    
	while (true){
    
    
		semwait(s);//P操作:semaphore=1,可以--
		/*访问临界区*/;
		semsignal(s);//V操作:semaphore++
		/*remainder*/;
	}
}

void main (){
    
    
	parbegin (P( 1),P( 2), . . ., P(n) ) ;
}

Inserte la descripción de la imagen aquí

2.14.4 Implementación de semáforo

  • semWait y semSignal se implementan como primitivas
  • Solo un proceso utiliza la operación fotovoltaica para reparar el semáforo en cualquier momento
  • Puede implementarse en hardware
  • Se puede implementar usando las instrucciones de la máquina anterior.
semWait (s){
    
    P操作
	while (compare_and_swap(s.flag,0,1) == 1)//指令作用:s.flag=0?s.flag=1:;循环作用:s.flag=1跳出循环
		/ *do nothing */;
	s.count--;
	if (s.count < 0) {
    
    
		place this process in s.queue;
		block this process (must also set s.flag to 0);
	}
	s.flag = 0;
}

semSignal(s){
    
    //V操作
	while (compare and swap(s.flag, 0,1) == 1)//指令作用:s.flag=0?s.flag=1:;循环作用:s.flag=1跳出循环
		/* do nothing */;
	s.count++;
	if (s.count <= 0){
    
    
		remove a process P from s.queue;
		place process P on ready list;
	}
	s.flag = 0;
}

  • s.count ≥ 0, s.count representa el número de procesos que realizan la operación semWait (s) sin ser bloqueados (se puede considerar como el número de recursos disponibles). En este caso, el semáforo puede admitir sincronización y exclusión mutua.
  • s.count <0, s.count representa el número de procesos bloqueados en la cola de s.queue.

Ahora el semáforo contiene un nuevo elemento entero, s.flag, que, por supuesto, puede llevar a un nuevo tipo de espera ocupada. Sin embargo, las operaciones semWait y semSignal son relativamente cortas, por lo que la cantidad de espera ocupada involucrada no debería ser grande. Para los sistemas de un solo procesador, las interrupciones se pueden proteger durante la duración de las operaciones semWait o semSignal La duración relativamente corta de estas operaciones significa que este método es razonable.

Supongo que te gusta

Origin blog.csdn.net/qq_44722674/article/details/111507920
Recomendado
Clasificación