addresses are in use and how it seems kind of useless to me. All the hard
work still lives in the application. This compares poorly to other
nanomsg transports.
only and use shmem for data then just do that. You don't have to do
handle this for you.
As always, KISS.
fault tolerant distributed architectures. Using shared memory flies in
the face of that.
On Sep 6, 2014, at 5:05 AM, Martin Sustrik
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi Garrett,
Post by Garrett D'AmoreIn my experience, people vastly underestimate the performance of bcopy.
Unless you are passing around vast amounts of data (why are you
using something like nanomsg in that case, btw?) it simply doesn't
pay off. You lose the intended performance gains in the extra
complexity and locking.
To make this work well (and this would not be portable outside of
the platform barring unusual measures like RDMA), you'd need a
collaboration layer, a very large shared memory region, and some
kind of ring or consume and produce indices in the buffer.
Probably better to have two separate buffers, one for each
direction, with different MMU settings (cache coherency).
This also becomes really fragile. A bug in one program can now
take out the other, unless you're very careful to treat the shared
memory region with the same kind of care that you do packet data.
(i.e. don't pass around program state, or pointers, etc.) Don't
assume that the other side won't trash the memory.
There may be some extreme cases where this complexity is
worthwhile; you *could* use nanomsg to do that. But again, why?
I'd just map the data up, and use POSIX signaling & mutexes to
coordinate access. My guess is that this will be simpler than
trying to coordinate across a simulated network.
I have a hard time imagining that I'd want to forward data received
from this over some kind of device to other parties in the nanomsg
infrastructure, which is why I don't see much call to make this
work with nanomsg.
Agreed with all the above.
However, given there is a use case where one process allocates a large
chunk of memory (say 1GB) does some work on it, then passes it to
another processes et c. I can see no reason why nanomsg should not be
able to support that.
nn_allocmsg() is already allocator-agnostic and so can be used to
void *p = nn_allocmsg (2000000, NN_IPC);
Also, as you may recall, there is a "type" field in IPC protocol which
can be used to let the other party know that the message is coming
out-of-band, namely in shmem.
All that being said, note that I am not proposing to do ring buffers
et c. Just allocate very large messages as chunks of shmem and you are
done. (Ring buffers are also doable, but hardly worth it IMO.)
Ron, if you are interested in this stuff, feel free to implement it.
What you have to look at is how nn_allocmsg/nn_freemsg works, add
allocation of messages in shmem there, then modify the IPC transport
in such a way that it can transport shmem descriptors in addition to
the standard IPC bytesteam.
Martin
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
iQEcBAEBAgAGBQJUCvhxAAoJENTpVjxCNN9YGe0IAJWeiXA+UgsFJEAexKXKOrO1
GubRU9WbMGtmYHo3IgKGFiEna+SUZVPp7QWKPYbsQzeOalKpEU5bx8Sdif69aYVq
0K+zTg5VAdhXkufXukbs9+x9IN45bUqGlTbMt/bsDwgohk17qRzHcyDhl35sZJxu
KowYIY8ATyVQA3BkjGGiKLRZ+jA1cdQUwYVqlY9hQMvMsZDHoJxNXdktzgi4UhYg
hrcCC6oCqIzs+4T2zYVPAFJyJQCXJIv7gR+cpifLL3lbNug75G651wZt6qaPRoIB
VDhRmOIrZnoC8+8mXK3Fmzle+KNZSBeqZBq7EjPIvgXJu1QY5Ku1AWuBuyzIjo4=
=+fpz
-----END PGP SIGNATURE-----