linguofreak wrote:The point being, I think one of the big reasons it failed is one of the big reasons a lot of capability systems fail: too fine-grained.
Ah, makes sense. My limited research of it made me decide it was a huge waste of Intel's money.
rdos wrote:Fork is a complete disaster with modern multicore & multitasking systems.
Agreed. Fork is a relic from before the days of multithreading.
rdos wrote:The only use of CoW is to implement fork.
I wouldn't say that. CoW is very useful for some types of shared memory. For example, imagine I pass a pointer to some memory block from process A to process B. Process A can't guarantee that that pointer will point to valid memory for a long time. Hence, it marks it as CoW. When either process attempts to write to the blocks, the memory is no longer shared.
This is very useful in passing large memory blocks between servers in a microkernel.
rdos wrote:
Swapping is a complete disaster too, and nobody that has run a computer with too little memory so swapping was activated would agree that it is useful.
If your consistently running primarily off of swap, than it's not very useful. But if you have one process (e.g,, a linker) that consumes a lot of memory, and you aren't to worried about that process's performance, than swapping can be very useful. Try building LLVM on an 8GB system, watch it crash, and then add 2GB of swap and watch it run great.
Swapping is also very useful to keep costs down in server environments. E.g., if you have VPSs running with 4GB of memory, and then you get a traffic spike that sets it to 4.5GB usage, than instead of crashing, swapping would temporarily kick in to even out the load. True, performance will temporarily suffer, but the system will recover. Else, you'd spend tons of money on memory. Hard disk space is still much cheaper than DRAM.
Swapping is very useful for evening out memory usage spikes.
rdos wrote:Both demand paging and demand segmentation works
Ok, you got me there. You're right on that
.
rdos wrote:but loading the whole executable is preferrable and faster if most of it is used anyway.
That's not exactly true. For an executable that is very large with very large shared libraries, an exec()/CreateProcess() would take a noticeably large amount of time. Demand paging evens out the load on the system, with only the extra cost of #PF's. Of course, #PF's can be partially avoided by using anticipatory paging.
Doing this all at once could potentially cause disk cache wiping, which is never a good situation....