## 1.10. The Kernel and Daemons

If you have arrived at Unix via Windows 2000 or some other personal computer operating system, you will notice some big differences. Unix was, is, and always will be a multiuser operating system. It is a multiuser operating system even when you're the only person using it; it is a multiuser operating system even when it is running on a PC with a single keyboard; and this fact has important ramifications for everything that you do.

Why does this make a difference? Well, for one thing, you're never the only one using the system, even when you think you are. Don't bother to look under your desk to see if there's an extra terminal hidden down there. There isn't. But Unix is always doing things "behind your back," running programs of its own, whether you are aware of it or not. The most important of these programs, the kernel, is the heart of the Unix operating system itself. The kernel assigns memory to each of the programs that are running, partitions time fairly so that each program can get its job done, handles all I/O (input/output) operations, and so on. Another important group of programs, called daemons, are the system's "helpers." They run continuously -- or from time to time -- performing small but important tasks like handling mail, running network communications, feeding data to your printer, keeping track of the time, and so on.

Not only are you sharing the computer with the kernel and some mysterious daemons, you're also sharing it with yourself. You can issue the ps x (Section 24.5) command to get a list of all processes running on your system. For example:

>       PID TTY    STAT  TIME COMMAND
>     18034 tty2   S     0:00 -zsh
>     18059 ?      S     0:01 ssh-agent
>     18088 tty2   S     0:00 sh /usr/X11R6/bin/startx
>     18096 tty2   S     0:00 xinit /etc/X11/xinit/xinitrc -- :0 -auth /home/jpeek/
>     18101 tty2   S     0:00 /usr/bin/gnome-session
>     18123 tty2   S     0:33 enlightenment -clientId default2
>     18127 tty2   S     0:01 magicdev --sm-client-id=default12
>     18141 tty2   S     0:03 panel --sm-client-id default8
>     18145 tty2   S     0:01 gmc --sm-client-id default10
>     18166 ?      S     1:20 gnomepager_applet --activate-goad-server gnomepager_a
>     18172 tty2   S     0:01 gnome-terminal
>     18174 tty2   S     0:00 gnome-pty-helper
>     18175 pts/0  S     0:00 zsh
>     18202 tty2   S     0:49 gnome-terminal
>     18203 tty2   S     0:00 gnome-pty-helper
>     18204 pts/1  S     0:01 zsh
>     18427 pts/1  T     0:00 man zshjp
>     18428 pts/1  T     0:00 sh -c /bin/gunzip -c /home/jpeek/.man/cat1/zshjp.1.gz
>     18430 pts/1  T     0:03 /usr/bin/less -is
>     18914 pts/1  T     0:02 vi upt3_changes.html
>      1263 pts/1  T     0:00 vi urls.html
>      1511 pts/1  T     0:00 less coding
>      3363 pts/1  S     0:00 vi 1007.sgm
>      4844 tty2   S     0:24 /usr/lib/netscape/netscape-communicator -irix-session
>      4860 tty2   S     0:00 (dns helper)
>      5055 pts/1  R     0:00 ps x

This output tells us that the user has only three windows open. You may think that they're only running four or five programs, but the computer is actually doing a lot more. (And, to keep this brief, we aren't showing all the lines of output!) The user logged into his Linux system on virtual console (Section 23.12) 2, which shows as `tty2` in the `TTY` column; a lot of programs are running there, including the X Window System (Section 1.22) (which actually runs itself as another user -- root -- so its process isn't listed here). The user is also running Gnome and Enlightenment, which keep track of the workstation's display. Two of the windows are Gnome terminals, which are windows that act like separate terminals; each has its own tty, `pts/0` and `pts/1`. And the list continues.

If you are running a different window system (or no window system at all) or different utility programs, you will see something different. But we guarantee that you're running at least two programs, and quite likely many more. If you want to see everything that's running, including the daemons, type the command `ps aux` (Berkeley-style ps) or `ps -el` (for many other flavors of ps). You'll be impressed.

Because there is so much going on at once, Unix requires a different way of thinking. The Unix kernel is a traffic cop that mediates different demands for time, memory, disks, and so on. Not only does the kernel need to run your programs, but it also needs to run the daemons, any programs that other users might want to start, or any programs that you may have scheduled to run automatically, as discussed in Chapter 23. When it runs a program, the kernel allocates a small slice of time -- up to a second -- and lets the program run until that slice is used up or until the program decides to take a rest of its own accord (this is called "sleeping"). At this point, regardless of whether the program is finished, the kernel finds some other program to run. The Unix kernel never takes a vacation: it is always watching over the system.

Once you understand that the kernel is a manager that schedules many different kinds of activity, you understand a lot about how Unix works. For example, if you have used any computer system previously, you know that it's a bad idea to turn the computer off while it is writing something to disk. You will probably destroy the disk, and you could conceivably damage the disk drive. The same is true for Unix -- but with an important complication. Any of the programs that are running can start doing something to the disk at any time. One of the daemons makes a point of accessing the disk drive every 30 seconds or so, just to stay in touch. Therefore, you can't just turn a Unix computer off. You might do all sorts of damage to the system's files -- and not just your own, but conceivably files belonging to many other users. To turn a Unix system off, you must first run a program called shutdown, which kicks everyone off the system, makes sure that a daemon won't try to play with a disk drive when you aren't looking, and runs a program named sync to make sure that the disks have the latest version of everything. Only then is it safe to pull the switch. When you start up a Unix system, it automatically runs a program called fsck, which stands for "filesystem check"; its job is to find out if you shut down the system correctly and try to fix any damage that might have happened if you didn't.

--ML and JP

Copyright © 2003 O'Reilly & Associates. All rights reserved.