Tuesday, 20 August 2013

Relinquish Processor Time in C++ (Windows)

Relinquish Processor Time in C++ (Windows)

I've looked around a fair amount and can't seem to find what I'm looking
for, but let me first stress that I'm not looking for a high-precision
sleep function.
Here's the background for the problem I'm trying to solve:
I've made a memory mapping library that operates a lot like a named pipe.
You can put bytes into it, get bytes out of it, and query how many bytes
are available to read/write, all that good stuff.
It's fast (mostly) processes communicating using it will average at 4GB/s
if they're passing chunks of bytes 8KBs or larger. Performance goes down
to around 300MB/s as you approach 512B chunk size.
The problem:
Very occasionally, on heavily loaded servers, very large lag times will
occur (Upwards of 5s). My running theory for the cause of this issue is
that when large transfers are taking place (larger than the size of the
mapped memory), the process that's writing data will tight poll to wait
for more space to be available in the circular buffer that's implemented
on top of the memory map. There are no calls to sleep, so the polling
process could be hogging the CPU for no good reason! The issue is that
even the smallest call to sleep (1ms) would absolutely demolish
performance. The memmap size is 16KB, so if it slept for 1ms every 16KB,
performance would drop to a best-case scenario of 16MB/s.
The solution:
I want a function that I can call that will relinquish the CPU, but makes
no limitations on when it gets rescheduled by the operating system
(Windows 7 in this case).
Has anyone got any bright alternatives?/Does anyone know if such a
function exists?
Thanks.

No comments:

Post a Comment