Maison  >  Article  >  Opération et maintenance  >  Explication détaillée des différents types de sémaphores sous Linux

Explication détaillée des différents types de sémaphores sous Linux

PHP中文网
PHP中文网original
2017-06-21 13:58:513598parcourir

Définition : Protéger les ressources partagées afin qu'un seul processus (thread) possède la ressource à la fois

Principe : Lorsque la valeur du sémaphore est positive, cela signifie qu'il est inactif, si elle est 0 ou négative, cela signifie qu'il est occupé

Classification : sémaphore noyau et sémaphore utilisateur, le sémaphore utilisateur est divisé en sémaphore POXIS et sémaphore SYSTEMV, le sémaphore POXIS est divisé en sémaphore nommé et sémaphore sans nom

Sémaphore noyau :

  • #include

  • void sema_init(struct semaphore *sem, int val);

  • void init_MUTEX(struct semaphore *sem); //Valeur initiale 1

  • void init_MUTEX_LOCKED(struct semaphore *sem); //Valeur initiale 0

  • void down(struct semaphore *sem); //Peut dormir

  • int down_interruptible(struct semaphore *sem); //Peut être interrompu

  • int down_trylock(struct semaphore *sem); //m non bloquant

  • void up(struct semaphore *sem);

Sémaphore SYSTEMV :

  • #include

  • int semget(key_t key, int nsems, int oflag);

  • int semop(int semid, struct sembuf *opsptr, size_t nops);

  • int semctl(int semid , int semum, int cmd,...);

Sémaphore POSIX sans nom

  • #include

  • sem_t sem;

  • int sem_init(sem_t *sem, int pshared, unsigned int val) //Si pshared vaut 0, il est partagé entre threads, pshared S'il vaut 1, les processus parent et enfant partagent

  • int sem_wait(sem_t *sem); //Blocking

  • int sem_trywait(sem_t *sem); / /non bloquant

  • int sem_post(sem_t *sem);

  • int sem_destroy(sem_t *sem); );

  • Pour le partage inter-processus, sem doit être placé dans la zone de mémoire partagée (mmap, shm_open, shmget Stockage dans les variables globales, le tas et la pile du parent). le processus n'est pas acceptable

POSIX nommé sémaphore

  • sem_t *sem_open(const char *name, int oflag, mode_t mode, int val);

  • int sem_wait(sem_t *sem);

  • int sem_trywait(sem_t *sem);

  • int sem_post(sem_t *sem);

  • int sem_close(sem_t *sem);

  • int sem_unlink(const char *name) ;

  • chacun La position d'ouverture nécessite de fermer et de dissocier, mais seule la dernière dissociation exécutée prend effet

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn