Имя и безымянный семафор

Я пытаюсь понять сходства и различия между именованным и неназванным семафором, поэтому мои поиски google дали мне этой. У меня был вопрос о формулировке на странице, хотя, он говорит:

  • безымянные семафоры могут быть использовать более чем одним процессом
  • именованные семафоры sharable несколько процессов

создают ли эти два слова какое-либо важное различие между эти два типа семафоров или они не имеют значения?

пока вот что у меня есть:

Similarities
    -Several processes can do something with the semaphore

Difference
    -Named are referenced with pathname and unnamed are referenced by pshared value

это все, что я мог извлечь из этого определения. Это все, и они правы? Или я упускаю какую-то важную идею?

3 ответов


думайте в терминах кто может получить доступ к семафору.

безымянные семафоры (без какого-либо имени или дескриптора, чтобы найти их) должны существовать в некотором ранее существующем, согласованном местоположении памяти. Обычно это (1) общая память (наследуется детьми после fork) в случае дочерних процессов; или (2) общая память, глобальная переменная или куча в случае, когда они совместно используются между потоками одного процесса. Существенным здесь является то, что код в parent, child, или threads уже знает адрес семафора.

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

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


принятый ответ неверен (как и другой, данный @electron). Неименованные семафоры POSIX can используется несвязанными процессами. Вам просто нужно сохранить структуру данных в общей памяти, доступной соответствующим процессам, и ввести ее с флагом shareable, установленным на один, как показано здесь (бесстыдно скопированный из http://blog.superpat.com/2010/07/14/semaphores-on-linux-sem_init-vs-sem_open/):

int shm;
sem_t * mutex;

if ((shm = shm_open("myshm", O_RDWR | O_CREAT, S_IRWXU))   0) {
    perror("shm_open");
    exit(1);
}

if (ftruncate(shm, sizeof(sem_t)) < 0 ) {
    perror("ftruncate");
    exit(1);
}

if ((mutex = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0)) == MAP_FAILED) {
    perror("mmap");
    exit(1);
}

if (sem_init(mutex, 1, 1) < 0) {
    perror("semaphore initialization");
    exit(1);
}

другое отображение процесса, который общая память в адресном пространстве может получить доступ к тому же семафору и синхронизировать с исходным процессом. См. также спецификацию POSIX sem_init () и Linux man page.


именованный семафор есть actual name на file system и может быть shared несколько несвязанными процессами.

Неименованные семафоры может использоваться только threads принадлежащий тот же процесс.

семафоры are создано С помощью функции

                 sem init(ptr_semaphore, flag, initial_value);

где

ptr_semaphore: указатель на семафор

флаг: флаг, указывающий уровень обмена

initial_value: начальное значение семафоров

если вы передадите flag=0 to sem_init() затем семафор может будь совместно используется только потоками, принадлежащими процессу это создало семафор.Так он будет творить безымянных семафор!--12-->.

          sem_init(ptr_semaphore,0,initial_value)   //unamed semaphore

передает ненулевое значение б allow другие процессы для доступа к семафору, а также. Таким образом, это приведет к именованный семафор.

          sem_init(ptr_semaphore,1,initial_value)   //named semaphore