Skip site navigation (1)Skip section navigation (2)
Date:      12 May 2000 08:09:02 +0300
From:      Ville-Pertti Keinonen <will@iki.fi>
To:        fengyue@bluerose.windmoon.nu (FengYue)
Cc:        hackers@freebsd.org
Subject:   Re: Why this works?
Message-ID:  <864s84cq35.fsf@not.demophon.com>
In-Reply-To: fengyue@bluerose.windmoon.nu's message of "12 May 2000 05:47:30 %2B0300"
References:  <20000511210915.A38341@Hamilton-ppp44812.sympatico.ca> <Pine.BSF.4.10.10005111955220.29094-100000@bluerose.windmoon.nu>

next in thread | previous in thread | raw e-mail | index | archive | help

fengyue@bluerose.windmoon.nu (FengYue) writes:

> I've 3 small programs.  First one writes 4K of data contains 'A's into a
> file /tmp/pagetest and then lseek() to the begin of the file.
> Second one writes 4K of 'Z' into the same file /tmp/pagetest and
> then lseek() to the begin of the file.  They both do that in a tight
> loop.  Now, the third program reads 4K of data from /tmp/pagetest
> and exit if the 4K data does not contain all 'A's nor 'Z's.  3 programs
> run concurrently on the same machine (3.4).  No lock in the code whatsoever,
> and all 3 programs use pure write() and read().  I thought the third
> program would exit pretty quickly since the data in the file may contain
> mixed of 'A's and 'Z's, but it has been running for hours and nothing
> happened.  Could someone kindly explain this?  I was told that this is
> because the pagesize is 4096 in the kernel, so that read()/write() 4K of
> data will not get context switched until the call is compeleted.  
> Is that right?

Not quite.  If FreeBSD didn't perform locking, operations affecting
single filesystem blocks would probably be atomic (as long as the
userland buffer is in memory).

However, FreeBSD does perform locking in read(2) and write(2) for
local files, so your third program should never fail and exit.

Note that the system call interface does not guarantee reads or writes
to be atomic, this just happens to be how it is implemented at the
moment.


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?864s84cq35.fsf>