On Wed, 27 Dec 2000, Rogier Wolff wrote:
> Hi,
>
> We have a typical semaphore application that has a producer and a
> consumer.
>
> Without the semaphores we are limited by the rest of the stuff to
> 10000 times around the loop per second. That's good.
>
> When we put the "push the semaphore" call in there, the rate drops to
> around 8000 per second. I'm not happy about that, but ok. When we add
> the "wait for bufferspace" semaphore wait in there, the rate drops to
> 4000 per second. This is way too low.
This sound weird to me.
I think that linux semaphores ( not SysV IPC ) are quite fast instead.
They're based on fast spinlocks and linux scheduling ( no need of predefined
scheduling points ) code.
>
> Does anybody have an idea why linux semaphores are so slow?
>
> init:
> sem_init (&write_sem, 1, 0);
> sem_init (&write_buffer_sem, 1, 0);
>
>
>
> producer:
>
>
> while (1) {
> sem_wait (&write_buffer_sem);
> ...
>
> sem_post (&write_sem);
> }
>
>
> consumer:
> for (i=0;i<nbufs;i++) {
> Create_buffer (i);
> sem_post (&write_buffer_sem);
> }
>
> while (1) {
> sem_wait (&write_sem);
> ...
>
> sem_post (&write_buffer_sem);
> }
>
Which kind of syncronization have You used to get 10000 loops/sec ?
> (pshared == 0 doesn't work: returns error. The manpage claims that
> thsi would happen for pshared != 0... )
Which glibc version are You using ?
This is the code for sem_init() ( 2.1.3 ) :
int __new_sem_init(sem_t *sem, int pshared, unsigned int value)
{
if (value > SEM_VALUE_MAX) {
errno = EINVAL;
return -1;
}
if (pshared) {
errno = ENOSYS;
return -1;
}
__pthread_init_lock((struct _pthread_fastlock *) &sem->__sem_lock);
sem->__sem_value = value;
sem->__sem_waiting = NULL;
return 0;
}
Are You sure You're not using a pthread emulation of GNU Pth library ?
- Davide
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/