I'm a senior principal researcher (and one of three founding members) at Microsoft Research New England in Cambridge, Massachusetts and an adjunct professor in the MIT Department of Mathematics.
Previously I was head of the cryptography group at Microsoft Research Redmond, and before that, I was in the theory group.
Your "large amount of cached data" could have been stored in memory allocated with mmap(MAP_PRIVATE | MAP_ANON), instead of regular malloc(), and then it wouldn't show up in the child after fork(). Typically you have a server that runs some kind of service.
There doesn't need to be any RPC involved, the data-cruncher can & should be a child process forked from the driver. It's a single process - it makes sharing data between requests very easy.
Fun fact: you can share memory between distinct processes, by any of several means. Which is but one of the many reasons you shouldn't build a gigantic monolithic application server in the first place.
Also, I'm not suggesting spinning off a separate process to handle each request (the xinetd model); just splitting up the workload into separate processes doing different aspects of the job. The Unix system philosophy is like the Westminster system of government.More broadly, my mathematical interests include discrete geometry, coding theory, cryptography, combinatorics, computational number theory, and theoretical computer science.One conceptual issue that fascinates me is the role of symmetry in mathematics and physics, particularly for exceptional structures such as E (or more familiar but still remarkable relatives, such as the regular icosahedron).Arguably, performant fork() doesn't need overcommit either.If you have enough RAM, you can reserve pages at fork() and release them at exec(), without having to actually populate those pages except as-needed for COW.For example, Git rather suffers in performance on Window because of the lack of that call (amongst other things). (Nt Create Process can be given a source address space.) These researchers happen to be right.fork requires overcommit, and overcommit is the enemy of guaranteed forward progress.You could even stall fork() calls elsewhere in the system, rather than immediately returning -ENOMEM, if the system thinks its memory pressure is due only to such short-term reservations.This only leads to problems in the case where you have a single-process behemoth with huge amounts of writable anonymous pages; also known as a badly-designed program.Take any one part of it in isolation, and it looks obviously silly; incautiously import ideas from another system and everything falls apart.But the whole thing, when put together and kept intact, thrums along beautifully and achieves world domination.