Make a replica of a shared memory block
Web Server forum
Back To The Forum Home!Search!Private Messaging System

Web Server Talk Web Server Talk > Unix and Linux reviews > Free Unix support > Unix Programming > Make a replica of a shared memory block




  Last Thread   Next Thread Next
  Show Printable Version Email this Page Subscribe to this Thread      Post New Thread    Post A Reply      

    Make a replica of a shared memory block  
hozefap@gmail.com


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
05-17-07 12:16 PM

I have created a shared memory  (system V) (using shmget,shmat) of 200
MB. There is one writer process which populates the shared memory
region.

There is another reader process which has to read this data. I need to
read the entire data in minimum time.

In the first approach the reader locks the shared memory and reads the
data from the shared memory, but it takes a lot of time.

So the second approach would be to create a replica of this shared
memory block, and my reader process would then read from the replica.

Please could you suggest some way of making a replica of the existing
shared memory.






[ Post a follow-up to this message ]



    Re: Make a replica of a shared memory block  
David Schwartz


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
05-17-07 06:18 PM

On May 16, 11:35 pm, hoze...@gmail.com wrote:
> I have created a shared memory  (system V) (using shmget,shmat) of 200
> MB. There is one writer process which populates the shared memory
> region.
>
> There is another reader process which has to read this data. I need to
> read the entire data in minimum time.
>
> In the first approach the reader locks the shared memory and reads the
> data from the shared memory, but it takes a lot of time.
>
> So the second approach would be to create a replica of this shared
> memory block, and my reader process would then read from the replica.
>
> Please could you suggest some way of making a replica of the existing
> shared memory.

I can't think of any generic way to do it. I can think of quite a few
tricks that might work depending on the specifics of your situation.

For example, if the writer always writes out the entire data set, you
could just have the writer write to another chunk of memory. That way,
the reader's lock could be omitted and the writer wouldn't have to
wait for the reader to finish.

DS






[ Post a follow-up to this message ]



    Re: Make a replica of a shared memory block  
William Ahern


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
05-18-07 12:18 AM

hozefap@gmail.com wrote:
> I have created a shared memory  (system V) (using shmget,shmat) of 200
> MB. There is one writer process which populates the shared memory
> region.
>
> There is another reader process which has to read this data. I need to
> read the entire data in minimum time.
>
> In the first approach the reader locks the shared memory and reads the
> data from the shared memory, but it takes a lot of time.
>
> So the second approach would be to create a replica of this shared
> memory block, and my reader process would then read from the replica.
>
> Please could you suggest some way of making a replica of the existing
> shared memory.

You're getting ahead of yourself. First thing that this question brings to
mind is some sort of multi-version concurrency control for virtual memory.
Which would be sweet, but not too common, AFAIK, or at least not in any
manner or kind easily leveraged by an application.

You might want to follow up w/ some more specifics, but here's a couple of
suggestions:

1) Setup barriers (i.e. POSIX barriers, or just plain mutexes). You can
setup two barriers, one which coincides with byte #0 and one with byte 100 *
(1 << 20). When the writer finishes writing the first 100 megabytes, it
opens the first barrier, which the reader was waiting on. The reader than
processes the first chunk, and then waits on the second barrier. When the
writer finishes with the second chunk, it again signals on the second
barrier, allowing the reader to finish. You could get more fine-grained than
this, tuning and analyzing as you go. Though, this might be a horrible idea,
and I've never tried it.

2) Don't use shared memory, employ a FIFO construct with mkfifo(3). The
writer simply writes the FIFO, the reader reads, and everything is
implicitly synchronized. On Linux 2.6 you can use splice(2) and vmsplice(2)
to effectively make this zero-copy.

3) What David Schwartz said, which IIRC was something akin to #2, i.e. use
multiple buffers and a queue construct.






[ Post a follow-up to this message ]



    Re: Make a replica of a shared memory block  
David Schwartz


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
05-18-07 12:18 AM

On May 17, 12:17 pm, William Ahern <will...@wilbur.25thandClement.com>
wrote:
> hoze...@gmail.com wrote:

> 3) What David Schwartz said, which IIRC was something akin to #2, i.e. use
> multiple buffers and a queue construct.

Actually, on re-reading my post, it's really hard to understand what I
was saying. But you got it right. The idea is to have the reader read
from one place while the writer writes to the next place. That way,
the reader does not block the writer. I wasn't necessarily speaking
about a queue, but that would certainly be one way to do it, and
probably the easiest to grasp conceptually.

Think of it as two people communicating in writing. I can write on a
piece of paper, then give it to you, but I can't write anything until
you give me back the paper. So I can't write the next thing while you
are reading. Simply using two pieces of paper that can handed back and
forth would solve this. (Assuming that all or most of the data changes
or needs to be rewritten anyway. If just a few bytes do, then queuing
deltas might be better.)

DS






[ Post a follow-up to this message ]



    Re: Make a replica of a shared memory block  
phil-news-nospam@ipal.net


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
05-19-07 12:17 AM

On 17 May 2007 16:29:44 -0700 David Schwartz <davids@webmaster.com> wrote:

| On May 17, 12:17 pm, William Ahern <will...@wilbur.25thandClement.com>
| wrote:
|> hoze...@gmail.com wrote:
|
|> 3) What David Schwartz said, which IIRC was something akin to #2, i.e. us
e
|> multiple buffers and a queue construct.
|
| Actually, on re-reading my post, it's really hard to understand what I
| was saying. But you got it right. The idea is to have the reader read
| from one place while the writer writes to the next place. That way,
| the reader does not block the writer. I wasn't necessarily speaking
| about a queue, but that would certainly be one way to do it, and
| probably the easiest to grasp conceptually.
|
| Think of it as two people communicating in writing. I can write on a
| piece of paper, then give it to you, but I can't write anything until
| you give me back the paper. So I can't write the next thing while you
| are reading. Simply using two pieces of paper that can handed back and
| forth would solve this. (Assuming that all or most of the data changes
| or needs to be rewritten anyway. If just a few bytes do, then queuing
| deltas might be better.)

A little more elaborate is my virtual ring buffer.  Transposing VRB to
the paper analogy would be like two people working on a paper roll that
is cycling between them continuously.  One writes, the other reads.  The
writer erases what is already there, too.

VRB works by having a chunk of memory a multiple of page size, and mapping
it into memory twice adjacently.  It then operates much like a normal ring
buffer that wraps around.  But for pointers near the end, you don't have
to worry about making operations that access the data wrap around as they
just extend into the mirror image.

Libre code at http://vrb.slashusr.org/

--
|---------------------------------------/----------------------------------|
| Phil Howard KA9WGN (ka9wgn.ham.org)  /  Do not send to the address below |
| first name lower case at ipal.net   /  spamtrap-2007-05-18-1614@ipal.net |
|------------------------------------/-------------------------------------|





[ Post a follow-up to this message ]



    Sponsored Links  




 





   All times are GMT. The time now is 03:55 AM.      Post New Thread    Post A Reply      
  Last Thread   Next Thread Next


Most Popular forums 

Forum Jump:
Rate This Thread:

Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is OFF
 
Medical and Health forum | Computer Games Reviews | Graphics design forum

Back To The Top
Home | Usercp | Faq | Register