== Why _vfork()_ got created (part 2) Although _fork()_ theoretically copies the address space of the parent process to create the child's address space, Unix normally does not actually make a real copy. Instead it marks everything as [[copy on write http://en.wikipedia.org/wiki/Copy-on-write]] and then waits for either the parent or the child to dirty a page, whereupon it does copies only as much as it has to. This makes forks *much* faster, which is very important since things in Unix fork a lot. (Disclaimer: this is the traditional implementation for paged virtual memory. I don't know what V7 did, since it only had swapping.) At least that is the theory and the ideal, but not in this case the practical. The [[second WhyVforkI]] and probably real reason that _vfork()_ exists is that when UC Berkeley was adding paged virtual memory to Unix, they couldn't get copy on write working on their cheap [[Vax http://en.wikipedia.org/wiki/VAX]] 11/750s (although it did work on the higher end 11/780s). To avoid a fairly bad performance hit on what were already low end machines, they added _vfork()_ (which doesn't require copy on write to run fast) and modified _sh_ and _csh_ to use it. The specific problem was apparently bugs in the 750 microcode that caused writes to read only pages in the stack to not fault correctly. One of the reasons that the 750 was cheaper than the 780 was that it did a number of things in microcode that the 780 did in hardware, which explains why 780s didn't have this problem. (My source for the details is a message from John Levine [[here http://clc.as.wvu.edu:8080/clc/projects/cyhist/Cyhist%201999/Cyhist%20June%201999/cyhist2.txt%201072]].)