How do mining pools distribute work effectively? What does the mining-pool architecture look like? Obviously GPU's can hash data much faster than it can be distributed via the internet, so I assume pools must allocate a range of nonces for miners to work on at any given time?

So if there were 2 miners, would the pool server allocate nonces 1-100,000 to miner 1, 100,101-200,000 to miner 2, then keep allocating the work as each set of nonces are completed? Or do I have it wrong?

I tried digging into the source of Eloipool, but it all seems very cryptic/there is very little (if any?) documentation?
Traditionally, pools gave miners work units covering the entire nonce range 0-4,294,967,295. When the miner finishes work, he requests a new work unit with a different extraNonce (or payout address). Different miners also get work units with different details.

To reduce load, pools are now moving on to a setting where the miner can himself change details of the generation transaction and compute the Merkle root, so he can do as much work as he pleases without needing new assignment from the pool.