Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет yigal_s ([info]yigal_s)
@ 2011-11-01 12:14:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
семафоры...
Что-то я не вполне понимаю документацию линукса:

sem_post() increments (unlocks) the semaphore pointed to by sem. If the semaphore's value consequently becomes greater than zero, then another process or thread blocked in a sem_wait(3) call will be woken up and proceed to lock the semaphore.

sem_wait() decrements (locks) the semaphore pointed to by sem. If the semaphore's value is greater than zero, then the decrement proceeds, and the function returns, immediately. If the semaphore currently has the value zero, then the call blocks until either it becomes possible to perform the decrement (i.e., the semaphore value rises above zero), or a signal handler interrupts the call.

Сие, собственно, означает, если я правильно пониамаю, что т.н. fairness у данной реализации отсутствует (или может отсутствовать) напрочь, иными словами нет никаких гарантий, что некий тред, повисший на семафоре, когда-нибудь разблокируется, если этот семафор сигналить, поскольку эти сигналы могут быть перехвачены другими тредами.

Даже хуже, можно засигналить семафор, который кто-то ждет, тут же самому сделать на нём sem_wait и проглотить этот сигнал. А тот, кто ждет - так и не дождется.

Вообще говоря, интересно, какие неявные допущения мы делаем, когда использует семафоры или критические секции, т.е. будет ли наш код работать лишь при определенном уровне faireness, либо же при любом, в том числе и самом минимальном, т.н. weak faireness, примером которого и является данный спек. Относительно некоторых простейших алгоритмов этот вопрос прост и на него можно ответить сразу, разумеется, но в целом я не уверен, что всегда отдаю себе в этом отчет.

Можно даже проще поставить вопрос: существует ли алгоритм общего вида (а не специально злостно написанный), который будет работать на fair mutex/semaphore и не рабоать на unfair? Да даже если и злостно написанный. Хммм... что-то у меня в этой области слепое пятно.


(Читать комментарии) - (Добавить комментарий)


[info]spamsink@lj
2011-11-01 15:01 (ссылка)
"Даже хуже" не будет, т.к., надо понимать, another process or thread [already] blocked in a sem_wait(3) call will be woken up.

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2011-11-01 15:34 (ссылка)
woken up... and proceed to lock the semaphore :-)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-11-01 15:52 (ссылка)
При правильной реализации это действие атомарное.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-11-01 16:03 (ссылка)
что есть "правильная реализация"?

Есть спек, по спеку это действие не атомарное, да оно и не обязано быть атомарным.

Просто есть разные вариации семафоров - от обеспечивающих жесткую очередность до вот таких. Причем, судя по документации, на linux они именно что "вот такие".

Что, конечно, не мешает реализовать их с более строгим fairness на практике.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-11-01 16:10 (ссылка)
По определению семафора (http://en.wikipedia.org/wiki/Semaphore_(programming)#Semantics_and_implementation) оно атомарное. Если спек это не оговаривает, то это или подразумевается, или - если и реализация не делает P атомарным - то козлы писали.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-11-01 17:28 (ссылка)
Простите, тот псевдокод, что приведен по странице википедии, обладает той же проблемой - тред, делающий операцию P может крутиться в цикле даже если и значение S подскочит выше, чем I. Поскольку другой тред, да даже и тот, кто сигналил, может это значение тут же обнулить, а первый тред ничего не заметит.

Т.е. управление счетчиком тут, конечно, атомарное, но атомарности wake up and gain the semaphore не наблюдается.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-11-01 18:17 (ссылка)
Атомарности wake up and gain the semaphore и не нужно - достаточно очередности входа и выхода в/из sem_wait(), какую порядочный scheduler и должен обеспечивать для процессов с одинаковыми приоритетами.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-11-01 18:35 (ссылка)
неважно как это называть, главное, что ЭТОГО нет в спеке.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-11-01 18:55 (ссылка)
В спеке sim_*() этого и не должно быть. Это quality of implementation операционной системы.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-11-02 10:46 (ссылка)
Почему же обязательно не должно? Степень fairness семафора вполне может быть частью спека.

(Ответить) (Уровень выше)


(Читать комментарии) -