Потенциально значимой разницей может быть справедливость распределения ресурсов.Я не знаю подробностей реализации семейства semget/semop
, но я подозреваю, что он обычно реализуется как "традиционный" семафор в плане планирования.Как правило, я считаю, что выпущенные потоки обрабатываются на основе FIFO (первый, ожидающий семафор, выпускается первым).Я не думаю, что это произойдет с блокировкой файлов, так как я подозреваю (опять же, просто догадываюсь), что обработка не выполняется на уровне ядра.
У меня был существующий код для тестирования семафоров для целей IPC, поэтому я сравнил две ситуации (одна с использованием semop
, а другая с lockf
).Я сделал тест бедняка и просто побежал к экземплярам приложения.Общий семафор был использован для синхронизации запуска.При выполнении теста semop оба процесса завершили 3 миллиона циклов почти синхронно.Цикл lockf, с другой стороны, был не таким справедливым.Один процесс обычно завершается, в то время как другой завершил только половину циклов.
Цикл для теста semop выглядел следующим образом.Функции semwait
и semsignal
являются просто оболочками для вызовов semop
.
ct = myclock();
for ( i = 0; i < loops; i++ )
{
ret = semwait( "test", semid, 0 );
if ( ret < 0 ) { perror( "semwait" ); break; }
if (( i & 0x7f ) == 0x7f )
printf( "\r%d%%", (int)(i * 100.0 / loops ));
ret = semsignal( semid, 0 );
if ( ret < 0 ) { perror( "semsignal" ); break; }
}
printf( "\nsemop time: %d ms\n", myclock() - ct );
Общее время выполнения для обоих методов было примерно одинаковым, хотя версия lockf фактически иногда была быстрее в целом, потому чтонесправедливости планирования.Как только первый процесс завершится, другой процесс получит неоспоримый доступ в течение около 1,5 миллионов итераций и будет работать очень быстро.
При работе без всяких сомнений (получение и снятие блокировок одним процессом) версия semop работала быстрее.Это заняло около 2 секунд за 1 миллион итераций, в то время как версия lockf заняла около 3 секунд.
Это выполнялось в следующей версии:
[]$ uname -r
2.6.11-1.1369_FC4smp