Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Apr 2004 20:29:47 -0700
From:      Wes Peters <wes@softweyr.com>
To:        freebsd-current@freebsd.org
Cc:        Robert Downes <nullentropy@lineone.net>
Subject:   Re: Future of FreeBSD
Message-ID:  <200404182029.47873.wes@softweyr.com>
In-Reply-To: <4078F8EA.7090802@lineone.net>
References:  <8501.1081595369@critter.freebsd.dk> <4078F8EA.7090802@lineone.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sunday 11 April 2004 00:51, Robert Downes wrote:
> On your site, you talk about what you hope to achieve if you reach the
> required funding level.
>
> Could you, for those such as myself, explain in
> 'I'm-a-web-dev-and-I-call-myself-a-tech-guy-the-damn-cheek' terms
> (that's one step above layman's terms) what some of the infrastructure
> improvements mean.
>
> Such as: what is the "Giant" lock?

In FreeBSD 3.x and 4.x, the SMP code allows user processes to run, 1 per 
cpu, without contention for resources.  This is only true when they are 
running in "user mode", i.e. NOT making any kernel calls.

Inside the kernel, in order to make sure critical data structures get 
updated atomically (read that as "all at once" if you don't speek geek), we 
put a "lock" around them.  Whoever has the lock is allowed to read and 
write the data structure, and everyone who is waiting for the lock has to 
continue to wait until the lock holder gives up the lock.  This protects us 
against the case where I read a value, do some calculations, and then 
change the value.  Other threads of execution cannot even safely read the 
value if I am going to change it.

The simplified version of SMP in FreeBSD 3-4 has one lock, referred to as 
the Big Giant Lock, or BGL, or just Giant.  This means that any process 
that makes a system call* has to take the Giant lock, or wait for it to be 
released.  This means the SMP goodness is not shared among processes that 
do a lot of I/O -- web and ftp servers, for example -- which are really the 
sweet spot of the FreeBSD server userbase.

The development thrust of FreeBSD 5 is to develop fine-grained SMP.  This 
means instead of one Big Giant Lock, there are more locks, which protect 
individual data structures, or groups of data structures as subsystems.  
This allows multiple processes to be executing kernel code simultaneously, 
so long as they're not trying to execute exactly the same kernel code at 
the same instant.

The advantages of this finer-grained locking is to get more parallelism in 
the kernel as well.  Consider a web server, where the basic job is read a 
request from a socket, then send the contents of one or more files in 
return.  If you have two or more clients attached, and multiple processes 
to serve those clients, each process can be attempting to read from the 
network, write to the network, or read from the disk.  Instead of one 
process reading from a network socket while all the other processes wait 
for it, you have one process that can complete all of the socket read right 
down to the critical data structures, locking only the socket it is reading 
from, while another is doing disk reads, locking only the file descriptor 
it is using.  (Both have to, at some time, lock the global list of sockets 
and file descriptors, but only when creating or freeing these resources, 
see?)

At this point in time, a few major subsystems have been removed completely 
from Giant, with their own subsystem or data structure locks.  Other 
systems, subsystems, or even just drivers are still protected by Giant.

Understanding locking as a concept is not all that difficult.  Any good 
operating system textbook, or basic computer science textbook, will cover 
the concept adequately.  I'll go out on a limb here and recommend the uC/OS 
II book as an excellent reference for both what locks do and a simple, 
embraceable implmentation.

If you want to get started on "lock pushdown" in FreeBSD, a classic "Junior 
Kernel Hacker" task, I'll refer you to John Baldwin <jhb@freebsd.org> for 
marching orders.  There are a large number of such tasks that essentially 
require you to find another similar driver that has already been 
de-Giantified, identify the critical data structures in the driver of 
interest, and lock in a manner similar to the known good driver, then test 
test test.


* This is the simplified explanation.  There are some system calls that 
don't have to be locked.  The details aren't important to anyone who 
doesn't already understand locking.  ;^)


> (I have read the section in your 'really long version', but, well... I'm
> a web-dev. I can write you a nice, standards-compliant website, but I
> don't have a clue what all the serious terms in your document mean. I
> did teach myself C when I was fourteen, but found little use for it at
> school, and it rusted away.)
>
> Just a few paragraphs on the current problems and potential results
> would be very interesting.

-- 

        Where am I, and what am I doing in this handbasket?

Wes Peters                                               wes@softweyr.com



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