Sub-optimal libc's read-ahead buffering behaviour
Andrey Chernov
ache at FreeBSD.ORG
Fri Aug 5 09:38:52 GMT 2005
On Fri, Aug 05, 2005 at 05:38:48AM +1000, Peter Jeremy wrote:
> Consider buffered stdio to a disk device. The underlying device
> requires I/O to be in multiples of 512 bytes with an offset at
> multiples of 512 bytes. IMHO, these alignment requirements should
> be hidden from the user - I should be able to write code like:
> c = getc(disk);
> fseek(disk, 3, SEEK_CUR);
> w = getw(disk);
> fseek(disk, 1, SEEK_CUR);
> c1 = getc(disk);
> fseek(disk, c1, SEEK_CUR);
> to work my way through data on the disk. Currently, I can't do that
> because the fseek() is transparent and the underlying lseek() will
> fail. Instead, I need to write code like:
If the underlying lseek() fails, it sounds like _driver_ problem. Ideally
it should hide all internal I/O granulation from the user and allow seek
to any position. If the position is in the middle, the driver can transfer
only needed part of block. So, don't blame _stdio_ for not nice driver
behaviour.
Looking more practical, aligned seeks and blocked read are enough in most
situations, so there is no urgent demand to complicate drivers to do nice
things.
--
http://ache.pp.ru/
More information about the freebsd-current
mailing list