From: m on
While that it is true for spin locks in KM, it is not true of spin locks in
general on a preemptive multi-tasking OS (ie Windows). Maybe I should have
assumed that the OP meant NT KM spinlocks thou ;)

"Daniel Terhell" <daniel(a)resplendence.com> wrote in message
news:emRp7$LdKHA.2188(a)TK2MSFTNGP04.phx.gbl...
> "m" <m(a)b.c> wrote in message news:eP9kilIdKHA.6096(a)TK2MSFTNGP02.phx.gbl...
>> The loop will consume all 100% of a single CPU until the lock is
>> acquired, the thread is interrupted by a higher priority thread or the
>> thread quantum ends (and the OS schedules another thread).
>>
>
> That information is incorrect, on Windows a spinlock raises to
> DISPATCH_LEVEL (or higher) so it is not possible to get interrupted by any
> thread. It's not even possible for the thread to finish its quantum while
> it spins or for the dispatcher to schedule another thread on the same CPU.
> It can get interrupted by an ISR but it will return (to the spinning
> state) as soon as the ISR has executed and returns control.
>
> //Daniel
>
>
From: Hugo gleaves on
The idea of a spinlock is to ensure secure access/updates to some datum,
usually for operations that are very very brief. So although some other
thread/process may have to "spin" for a time, the time is deemed to brief as
to be not a serious performance issue.

The kind of operations that might be suited to a spinlock protection are:

1) Updating several fields atomically in some shared structure.
2) Adding/removing an entry from a shared list.

As Don says a Mutex is much more sophisticated and expensive and although
very uself in Win32 programming is no match for a spinlock when it comes to
raw speed (this is why device drivers use them).

The real question here is why has MS not provided developers with a spinlock
API for user mode code?

I had to hand craft such a beast in C, it has to support:

1) Nested locking (a spinlock can be acquired 'n' times and must then be
released 'n' times).
2) Read/Write locking modes.
3) Not end up dragging its heels because of these needs.

If you do a lot of work with shared/mapped memory as we do, then such an API
is very important, if you rely on Mutexes it will cost dearly, also the
interlock functions alone wont let you easily do the above (but they do
provide the foundation).

I've been interested for some time in seeing open source or public domain
implementations of a user-mode spinlock API (one that is truly tested on
multicore H/W) but there seems to be absolutely nothing, what we have seems
to be pretty good but it is pretty complex and I worry sometimes...

;)


"o0Zz" wrote:

> Thank you very much !
>
> "Daniel Terhell" <daniel(a)resplendence.com> a écrit dans le message de groupe
> de discussion : emRp7$LdKHA.2188(a)TK2MSFTNGP04.phx.gbl...
> > "m" <m(a)b.c> wrote in message news:eP9kilIdKHA.6096(a)TK2MSFTNGP02.phx.gbl...
> >> The loop will consume all 100% of a single CPU until the lock is
> >> acquired, the thread is interrupted by a higher priority thread or the
> >> thread quantum ends (and the OS schedules another thread).
> >>
> >
> > That information is incorrect, on Windows a spinlock raises to
> > DISPATCH_LEVEL (or higher) so it is not possible to get interrupted by any
> > thread. It's not even possible for the thread to finish its quantum while
> > it spins or for the dispatcher to schedule another thread on the same CPU.
> > It can get interrupted by an ISR but it will return (to the spinning
> > state) as soon as the ISR has executed and returns control.
> >
> > //Daniel
> >
> >
> .
>
From: tanix on
In article <574400EE-AFAF-4620-BDDD-7E49608392E0(a)microsoft.com>, =?Utf-8?B?SHVnbw==?= gleaves(a)hotmail.com> <hugh<underbar> wrote:
>The idea of a spinlock is to ensure secure access/updates to some datum,
>usually for operations that are very very brief. So although some other
>thread/process may have to "spin" for a time, the time is deemed to brief as
>to be not a serious performance issue.
>
>The kind of operations that might be suited to a spinlock protection are:
>
>1) Updating several fields atomically in some shared structure.
>2) Adding/removing an entry from a shared list.
>
>As Don says a Mutex is much more sophisticated and expensive and although
>very uself in Win32 programming is no match for a spinlock when it comes to
>raw speed (this is why device drivers use them).
>
>The real question here is why has MS not provided developers with a spinlock
>API for user mode code?

I bet there is a reason. I bet by the time you do a switching from
user mode to kernel mode, the whole performance gain becomes negligible
in comparison.

I thought mutex is already quite an efficient way of doing locking.
Once you are in user mode trying to use a kernel mode spinlock
equivalent somehow does not make much sense.

MS recommends to hold a spin lock for no more than 50 microsecs
if I recall correctly.

>I had to hand craft such a beast in C, it has to support:
>
>1) Nested locking (a spinlock can be acquired 'n' times and must then be
>released 'n' times).
>2) Read/Write locking modes.
>3) Not end up dragging its heels because of these needs.
>
>If you do a lot of work with shared/mapped memory as we do, then such an API
>is very important, if you rely on Mutexes it will cost dearly, also the
>interlock functions alone wont let you easily do the above (but they do
>provide the foundation).
>
>I've been interested for some time in seeing open source or public domain
>implementations of a user-mode spinlock API (one that is truly tested on
>multicore H/W) but there seems to be absolutely nothing, what we have seems
>to be pretty good but it is pretty complex and I worry sometimes...

Do you have estimates on performance comparison between your app level
spin lock and a regular mutex?

>;)
>
>
>"o0Zz" wrote:
>
>> Thank you very much !
>>
>> "Daniel Terhell" <daniel(a)resplendence.com> a écrit dans le message de groupe
>
>> de discussion : emRp7$LdKHA.2188(a)TK2MSFTNGP04.phx.gbl...
>> > "m" <m(a)b.c> wrote in message news:eP9kilIdKHA.6096(a)TK2MSFTNGP02.phx.gbl...
>> >> The loop will consume all 100% of a single CPU until the lock is
>> >> acquired, the thread is interrupted by a higher priority thread or the
>> >> thread quantum ends (and the OS schedules another thread).
>> >>
>> >
>> > That information is incorrect, on Windows a spinlock raises to
>> > DISPATCH_LEVEL (or higher) so it is not possible to get interrupted by any
>> > thread. It's not even possible for the thread to finish its quantum while
>> > it spins or for the dispatcher to schedule another thread on the same CPU.
>> > It can get interrupted by an ISR but it will return (to the spinning
>> > state) as soon as the ISR has executed and returns control.
>> >
>> > //Daniel
>> >
>> >
>> .

--
Programmer's Goldmine collections:

http://preciseinfo.org

Tens of thousands of code examples and expert discussions on
C++, MFC, VC, ATL, STL, templates, Java, Python, Javascript,
organized by major topics of language, tools, methods, techniques.

From: Alexander Grigoriev on
By definition, spinlock is a busy loop. It only makes sense to do if the
spinlock owner is guaranteed to never get preempted by another thread. In
kernel mode, this is done by setting IRQL to DISPATCH_LEVEL. In user mode,
this is not possible.

CRITICAL_SECTION provide an option of limited spinning in case of
contention, if you expect that the CS will mostly be held for very short
time.


"Hugo gleaves(a)hotmail.com>" <hugh<underbar> wrote in message
news:574400EE-AFAF-4620-BDDD-7E49608392E0(a)microsoft.com...
> The idea of a spinlock is to ensure secure access/updates to some datum,
> usually for operations that are very very brief. So although some other
> thread/process may have to "spin" for a time, the time is deemed to brief
> as
> to be not a serious performance issue.
>
> The kind of operations that might be suited to a spinlock protection are:
>
> 1) Updating several fields atomically in some shared structure.
> 2) Adding/removing an entry from a shared list.
>
> As Don says a Mutex is much more sophisticated and expensive and although
> very uself in Win32 programming is no match for a spinlock when it comes
> to
> raw speed (this is why device drivers use them).
>
> The real question here is why has MS not provided developers with a
> spinlock
> API for user mode code?
>
> I had to hand craft such a beast in C, it has to support:
>
> 1) Nested locking (a spinlock can be acquired 'n' times and must then be
> released 'n' times).
> 2) Read/Write locking modes.
> 3) Not end up dragging its heels because of these needs.
>
> If you do a lot of work with shared/mapped memory as we do, then such an
> API
> is very important, if you rely on Mutexes it will cost dearly, also the
> interlock functions alone wont let you easily do the above (but they do
> provide the foundation).
>
> I've been interested for some time in seeing open source or public domain
> implementations of a user-mode spinlock API (one that is truly tested on
> multicore H/W) but there seems to be absolutely nothing, what we have
> seems
> to be pretty good but it is pretty complex and I worry sometimes...
>
> ;)
>
>
> "o0Zz" wrote:
>
>> Thank you very much !
>>
>> "Daniel Terhell" <daniel(a)resplendence.com> a ecrit dans le message de
>> groupe
>> de discussion : emRp7$LdKHA.2188(a)TK2MSFTNGP04.phx.gbl...
>> > "m" <m(a)b.c> wrote in message
>> > news:eP9kilIdKHA.6096(a)TK2MSFTNGP02.phx.gbl...
>> >> The loop will consume all 100% of a single CPU until the lock is
>> >> acquired, the thread is interrupted by a higher priority thread or the
>> >> thread quantum ends (and the OS schedules another thread).
>> >>
>> >
>> > That information is incorrect, on Windows a spinlock raises to
>> > DISPATCH_LEVEL (or higher) so it is not possible to get interrupted by
>> > any
>> > thread. It's not even possible for the thread to finish its quantum
>> > while
>> > it spins or for the dispatcher to schedule another thread on the same
>> > CPU.
>> > It can get interrupted by an ISR but it will return (to the spinning
>> > state) as soon as the ISR has executed and returns control.
>> >
>> > //Daniel
>> >
>> >
>> .
>>


From: tanix on
In article <OFiPAJ$fKHA.1112(a)TK2MSFTNGP04.phx.gbl>, "Alexander Grigoriev" <alegr(a)earthlink.net> wrote:
>By definition, spinlock is a busy loop. It only makes sense to do if the
>spinlock owner is guaranteed to never get preempted by another thread. In
>kernel mode, this is done by setting IRQL to DISPATCH_LEVEL. In user mode,
>this is not possible.

Good point.

Actually, when I was doing a contract with Intel on a multi-gigabit
network card, there was one guy that was suggesting to do something
totally out of the wall in my view. Pretty much the same idea as in
this thread.

They were trying to squeze out as much performance as possible.
So, this "smart", fat blob, came up with the idea to manipulate
the kernel level synchronization objects from the app level, such
as resetting the count of kernel level semaphores under some contitions.

On a weekly project meeting I told him: you will never prove this
thing is going to work. That is the whole point with semaphores.
They have been mathematically proven to work. Once you start resetting
the counts at will, outside of the normal semaphore mechanics,
you'll be fixing this thing for years to come.

The result?

They fired me. Not him.
I wonder if they were ever able to make that network card to work.

When they gave me this project to create a hack to manipulate the
kernel level structures from the user mode, and gave me a couple
of weeks to do that, I could not believe these smart donkeys.

It takes YEARS to work on things like these. These are some of
the central concepts in O/S design and the very idea of separation
of kernel and user mode. I nearly flipped out when manager told
me my "project".

Some people really need their brains examined.
Where did they get their estimates on "improving performance"
by slaughtering some of the most fundamental concepts in o/s
design and architecture just escapes me.

>CRITICAL_SECTION provide an option of limited spinning in case of
>contention, if you expect that the CS will mostly be held for very short
>time.
>
>
>"Hugo gleaves(a)hotmail.com>" <hugh<underbar> wrote in message
>news:574400EE-AFAF-4620-BDDD-7E49608392E0(a)microsoft.com...
>> The idea of a spinlock is to ensure secure access/updates to some datum,
>> usually for operations that are very very brief. So although some other
>> thread/process may have to "spin" for a time, the time is deemed to brief
>> as
>> to be not a serious performance issue.
>>
>> The kind of operations that might be suited to a spinlock protection are:
>>
>> 1) Updating several fields atomically in some shared structure.
>> 2) Adding/removing an entry from a shared list.
>>
>> As Don says a Mutex is much more sophisticated and expensive and although
>> very uself in Win32 programming is no match for a spinlock when it comes
>> to
>> raw speed (this is why device drivers use them).
>>
>> The real question here is why has MS not provided developers with a
>> spinlock
>> API for user mode code?
>>
>> I had to hand craft such a beast in C, it has to support:
>>
>> 1) Nested locking (a spinlock can be acquired 'n' times and must then be
>> released 'n' times).
>> 2) Read/Write locking modes.
>> 3) Not end up dragging its heels because of these needs.
>>
>> If you do a lot of work with shared/mapped memory as we do, then such an
>> API
>> is very important, if you rely on Mutexes it will cost dearly, also the
>> interlock functions alone wont let you easily do the above (but they do
>> provide the foundation).
>>
>> I've been interested for some time in seeing open source or public domain
>> implementations of a user-mode spinlock API (one that is truly tested on
>> multicore H/W) but there seems to be absolutely nothing, what we have
>> seems
>> to be pretty good but it is pretty complex and I worry sometimes...
>>
>> ;)
>>
>>
>> "o0Zz" wrote:
>>
>>> Thank you very much !
>>>
>>> "Daniel Terhell" <daniel(a)resplendence.com> a ecrit dans le message de
>>> groupe
>>> de discussion : emRp7$LdKHA.2188(a)TK2MSFTNGP04.phx.gbl...
>>> > "m" <m(a)b.c> wrote in message
>>> > news:eP9kilIdKHA.6096(a)TK2MSFTNGP02.phx.gbl...
>>> >> The loop will consume all 100% of a single CPU until the lock is
>>> >> acquired, the thread is interrupted by a higher priority thread or the
>>> >> thread quantum ends (and the OS schedules another thread).
>>> >>
>>> >
>>> > That information is incorrect, on Windows a spinlock raises to
>>> > DISPATCH_LEVEL (or higher) so it is not possible to get interrupted by
>>> > any
>>> > thread. It's not even possible for the thread to finish its quantum
>>> > while
>>> > it spins or for the dispatcher to schedule another thread on the same
>>> > CPU.
>>> > It can get interrupted by an ISR but it will return (to the spinning
>>> > state) as soon as the ISR has executed and returns control.
>>> >
>>> > //Daniel
>>> >
>>> >
>>> .

--
Programmer's Goldmine collections:

http://preciseinfo.org

Tens of thousands of code examples and expert discussions on
C++, MFC, VC, ATL, STL, templates, Java, Python, Javascript,
organized by major topics of language, tools, methods, techniques.