If you attach and detach multiple times, you are potentially risking fragging the address space. This is particularly true if you are attaching and detaching adjacent to a heap allocation area, since we attempt to handle large allocations (if you are making any) by trying "best fit". So if you are going to track somethingg that big, pick a place fairly high up.
Another common issue might be a missing or incorrect detach (an mmap()'ed file does not have this issue, since whatever is already in the region being mapped gets blown away by the call - a two-edged sword). You can use the vm_stat tool to check out your address space for drags or dangling attached memory.
If you are going to use a large shared memory segment, my recommendation would be to attach it and leave it attached, which avoids both possible coding errors and fragmentation. Worst case, all it's going to take is swap space (on disk, just like the mmap()'ed file approach).
Hope this helps.
-- Terry On Jan 3, 2008, at 9:10 PM, Norm Green < email@hidden> wrote:
Thanks, sysctl.conf did the job.
The app is 64-bit and I use 1 large shared
memory segment because it needs to be contiguous.
BTW, I’ve had some trouble when my program
detaches and attaches an existing memory segment several times. After the 3rd
or 4th call to shmat(), it starts to fail using an address that
previously succeeded. I usually need to specify the address because my app
needs it to be 16 KB aligned and shmat() seems to return 4 KB aligned
addresses. To get around this, I keep rolling the address forward by 16 KB
until I find one that works.
Norm Green
From: Terry Lambert [mailto:email@hidden]
Sent: Thursday, January 03, 2008
8:49 PM
To: Norm Green
Cc: email@hidden
Subject: Re: calling sysctl at
startup - how?
You will probably not end up happy setting it to 2G, unless your
application is 64 bit and makes multiple segments adjacent to each other,
rather than 1 big segment, or you refuge the page 0 size to 4K in your 64 bit
app so that allocations can happen below the 4G boundary. 32 bit apps are
only going to find about 1.5G of contiguous address space available to them
because of frame buffers, framewoks, etc..
PS: My usual recommendation at this point is that you mmap() a file
instead to get your shared memory, if you need to avoid these limits. This has
the (usually desirable) side effect of creating persistent backing store for
the segment contents, as well.
-- Terry
On Jan 3, 2008, at 6:31 PM, Norm Green <email@hidden> wrote:
What is the
“right” way to run a sysctl command when the system boots up? I’ve read
that using the /etc/rc.* files is discouraged. I want to run this command
to enable large amounts of shared memory when the system boots:
sysctl -w
kern.sysv.shmmax=0x80000000 kern.sysv.shmseg=8 kern.sysv.shmall=0x80000000
Thanks,
Norm Green
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden
|