I've had more time to think on this, and have been looking at parallel blocking I/O.  I've changed my mind, I now think that TBB should have some form of blocking I/O handling.  I think the task based approach will work as well (leading to I/O tasks and algorithmic tasks), although I do believe that TBB should aim to expose some low-level details of threads so that it could be a universal threading package, without using current TBB constructs.  I think that "blocking" tasks (algorithmic ones) in the task scheduler would lead to greater complexity for TBB, but could be useful (at least for me :-) ).

So far as implementation, one possibility is to have a worker thread spawned specifically for monitoring I/O.  Such a thread would basically accumulate file descriptors that TBB wants to use for I/O, and use say poll() (on POSIX systems) to monitor for availability (and hence be blocked normally, although it could be done without an additional thread too).  When I/O is possible, perhaps a special type of task will be spawned to deal with that I/O, which can be scheduled like other tasks.  I'm not sure how to ensure that open file descriptors are shared between worker threads on all operating systems.

I'm not a threading expert, so I might be speaking nonsense but I'd be interested to hear what everyone thinks.