Shared memory and IPC

Steve Langasek vorlon at netexpress.net
Mon Sep 10 08:19:02 GMT 2001


Oh, but I see others have already come to the same conclusion.  Guess I need
to get up earlier in the morning if I want to be on top of things :)

Cheers,
Steve Langasek
postmodern programmer


On Mon, 10 Sep 2001, David Collier-Brown wrote:

> Luke Kenneth Casson Leighton wrote:
> > > My advice is to avoid MAP_FIXED at all costs.
> > absolutely love to.  however, it's a speed improvement of
> > a potential two or maybe even three orders of magnitude,
> > and so cannot be ignored.
>
> 	Ok, the lightbulb over my head just lit up (:-))
>
> 	If you're seeing order of magnitude increases
> 	by going from copy-over-net to mmap(MAP_FIXED),
> 	then you can go to non-fixed, pay a small cost
> 	and still make a tremendous profit.
>
> 	Consider the following code snippit
>
> 	struct {
> 		int	this;
> 		long 	that;
> 		char	*theOther;
> 		...
> 		char	placeTheOtherPoints[MAXBUF];
> 	} thingie;
>
> 	base =  mmap(addr, len, PROT_READ|PROT_WRITE, MAP_SHARED, 42, 0)
> 	...
> 	myThat = base->that;
> 	myOther =  base->theOther + base;
> 	...
> 	base->theOther = newOther - base;
>
> 	The "that" value is just at an offset into the mmap'd
> 	structure, so getting it's value is trivial: most
> 	compilers turn this into a ",base,offset"
>
> 	the Other value is trickier: it's a pointer to an address
> 	in the mmapped area, so you have to add the base before
> 	dereferencing it and subtract the base before updating it.
>
> 	A compiler should be able to turn this into a three-
> 	instruction sequence,
> 		load_immediate R2,base
> 		add R2, R2;
> 		load_long R3,R2,offset
>
> 	A good compiler with a register history (e.g., gcc)
> 	should be able to keep the per-process constant
> 	base*2 around in a register, and do the accesses
> 	in single instructions, or sometims as two
> 	instructions:
>
> 		load_long R3,Rsaved-around,offset
> 	or
> 		load R2,twiceBase
> 		load_long R3,R2,offset
>
> 	(That's in a cisc machine language: RISC may do better!)
>
>       Implementations:
>       1) If you write the acessors for thingie as functions,
> 	tell the compiler to inline them, and declare
> 	a global twiceBase set once, you arguably should get
> 	either one-instruction or worst-case two-instruction
> 	accesses to pointers in the structure....
>
> 	base =  mmap(addr, len, PROT_READ|PROT_WRITE, MAP_SHARED, 42, 0)
> 	twiceBase = base *2;
>
> 	myThat = base->that;
> 	myOther =  theOther(base);
> 	...
> 	setTheOther(base, newOther);
>
>      2) perhaps you can adapt the idl to do this form of
> 	marshalling/unmarshalling, so as to generate the
> 	easily optimizable code sequences... I'm way
> 	too rusty on idl compilers to know if that's
> 	worthwhile or not!
>
>      3) and I'm sure there are other approaches with O(n)
> 	behavior that I haven't thought of!
>
> --dave
>







More information about the samba-technical mailing list