Имя и безымянный семафор
Я пытаюсь понять сходства и различия между именованным и неназванным семафором, поэтому мои поиски 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