(Latest Revision: 
Sept 01, 2014
)  
Chapter Two -- Operating-System Structures -- Lecture Notes
-  2.0 Chapter Objectives
     
     -  Describe OS Services
     
 -  Discuss Design of OS Structure
     
 -  Explain Installation, Customization, and Booting
     
 
 -  2.1 Operating-System Services
     
     -  Services typically provided by an operating system include:
          
          -  user interfaces, 
          
 -  program execution,
          
 -  control of I/O devices, 
          
 -  file-system manipulation, 
          
 -  process communication facilities, 
          
 -  error detection, 
          
 -  resource allocation services, 
          
 -  accounting (for billing or usage research), 
          
 -  protection, and 
          
 -  security.  
          
 
      
 -  2.2 User and Operating-System Interface
     
     
     -  An OS must provide users with an interface for making requests for
          system services - i.e. command interpreter, shell, or GUI.  
     
     
 -  The user-interface process may perform a requested operations
	  directly or may start up a child process to run a separate program
	  which performs the service.  The second approach is more modular.
     
     
 -  The user-interface is not considered fundamental to the study of
	  operating systems.  We study mostly what exists from the system call
	  level and down to the interface with the hardware.
     
 -  To the authors of our text, a user-interface program or other system
	  program that functions above the system-call level is just another
	  user program, and NOT part of the operating system.
     
 
 -  2.3 System Calls
     
	  
     -  A system call is like a function call.  It is a request for an OS
          service.
     
 -  Typically the OS is in charge of controlling I/O, so an application
	  that wants to copy or move data in either direction between the RAM
	  and a peripheral device must call upon the OS by making a system
	  call. 
     
     
 -  Typically a computer executes thousands of system calls per second.
     
 -  The run-time support functions in libraries provide the system-call
          interface for many programming languages - including C and Java.
	  
     
 -  Typically, there is a number associated with each system call.  When
          the trap caused by the system call puts the OS into the CPU, the OS 
          looks up the system call in a table maintained by the OS, 
          using the system call number to index the appropriate entry of the table.  
          The table entry tells the OS which code routine to run.  The OS executes 
          that code routine, and the routine performs the service required 
          by the system call.
     
 -  VERY IMPORTANT DETAIL: A process can pass parameters to a system
	  call by leaving them in CPU registers, by leaving them in a RAM
	  block (pointed to by an address in a register), or by pushing them
	  onto the runtime stack.
     
 
 -  2.4 Types of System Calls
     
     -  There are system calls for:
          
          -   process control, 
          
 -  file manipulation,
          
 -  device manipulation, 
          
 -  information maintenance 
          
 -  communication, and
          
 -  protection.
          
 
	  
      -  Process control: 
          
 
          -  end, abort
          
 -  load, execute 
          
 -  create & terminate process, 
          
 -  get or set process attributes, 
          
 -  wait for a specific amount of time,
          
 -  wait for or signal an event,
          
 -  acquire or release lock on data,
	  
 -  allocate and free memory.
          
 
 
          In the MS-DOS style of process control, processes run 'one at a
	  time' - there is no multiprogramming.  In fact, the command
          interpreter part of the OS overwrites much of itself when it 
          loads a user process to execute.  The remaining part of the 
          command processor reloads the rest of the command processor 
          after the user process exits. 
	  Flavors of unix like Free BSD employ a user shell capable of
	  spawning (via fork and exec system calls) a child
	  process that may excecute concurrently with the parent shell.  There
	  is no overwriting of the OS associated with loading a user process,
	  as is the case with MS-DOS.  Many processes typically execute
	  concurrenlty. 
      -  File Management: 
          
          -  create and delete file, 
          
 -  open and close file,
          
 -  read and write file, 
	  
 -  move and copy file,
	  
 -  reposition file, 
          
 -  get & set file attributes (e.g. name, type, protection codes,
	       accounting info).
          
 
     
      -  Device Management:
          
          -  request device (important for dealing with contention & deadlock), 
          
 -  release device (important for dealing with contention & deadlock), 
          
 -  read from and write to device,
          
 -  reposition device, 
          
 -  get & set device attributes, 
          
 -  logically attach or detach device.
          
 
          The term device may refer to real physical devices such as
	  hard drives, or abstract (virtual) devices such as files.
	  
     
      -  Information Maintenance: 
          
 
          -  get or set time or date, 
          
 -  get system data (e.g. number of current processes or
	       amount of free memory), 
          
 -  dump memory,
          
 -  get or set process, file, or device attributes,
          
 -  process tracing and profiling capabilities.
          
 
     
      -  Communications: 
          
	  -  get host or process identifier,
          
 -  create/open or delete/close communications connection, 
          
 -  accept communications connection, 
          
 -  wait for request for communications connection, 
          
 -  write/send or read/receive message, 
          
 -  transfer status information, 
          
 -  attach or detach remote devices,
	  
 -  shared memory create or attach
          
 
 
          The style of communication may be via message passing or via shared
	  memory.  Message passing is easy to implement but may be slow.  When
	  available, communication via shared memory is fast but requires
	  sophisticated protection and synchronization schemes.  
	  
      -  Protection:
          
          -  get and set permissions, and
          
 -  allow and deny user.
          
 
	  
      
 -  2.5 System Programs
     
     
     -  Typically there are system programs that organize access to system
	  calls for the convenience of users.  There may be system programs
	  for 
 
	  
	  
	  -  file management,
	  
 -  status information,
	  
 -  file modification,
	  
 -  programming-language support,
	  
 -  program loading and execution,
	  
 -  communications and/or
          
 -  background services (daemons).
	  
 
	  
      -  Because of the heavy use of API's, system programs, and higher level
	  applications, most computer users are seldom if ever directly
	  concerned with the system-call interface.
	  
     
 
 -  2.6 Operating-System Design and Implementation
     
     
     -  An OS is software and design of the OS is a problem in software
          engineering.  The principles of good software design certainly apply
	  to OS development.  
     
 -  Designers should try to be guided by the anticipated needs of the
	  intended users of the system.
	  
     
 -  Separation of Policy from Mechanism is a design
          principle important for flexibility.  It allows the system 
          to be configured in different ways according to policy, for
          example a mechanism that supports different CPU scheduling 
          policies.
     
     
 -  Typically a few parts of an OS have to be written in assembly
	  language. 
     
     
 -  However modern operating systems are written almost entirely in a
          high-level programming language such as C.  Actually several 
          different high level languages may be used to implement 
          various parts of an operating system. Advantages: code is
	  developed faster; is smaller, easier to understand, debug and
	  change; and easier to port.
     
     
 -  There are some things that just can't be done with high-level
	  language statements, for example some device-driver code and
	  instructions that save and restore register values.
     
 -  There was a time when writing more of the code in assembly could be
	  justified because assembly programmers could use 'tricks' that made
	  routines run faster by some constant factor compared with compiled
	  high level code.  Modern optimizing compilers have eliminated that
	  advantage almost entirely, although there are still a few
	  bottlenecks in systems that are 'hand-coded' in assembly language in
	  order to achieve 'the absolute maximum' efficiency - e.g. the
	  authors mention memory managers and CPU schedulers in this regard.
     
 -  As the authors say: "As is true in other systems, major performance
	  improvements in operating systems are more likely to be the result
	  of better data structures and algorithms than of excellent
	  assembly-language code."
     
 
 -  2.7 Operating-System Structure
     
     
     -  As with any software project, an OS should be designed with
	  appropriate attention to information hiding and modularity.
     
     
 -  However, well-known operating systems such as MS-DOS and the
	  original unix had monolithic designs -- i.e. they were NOT modular.
     
     
 -  One way to achieve the goals of information hiding and modularity is
	  to create a layered design, in which each layer depends only on the
	  functionality of layers beneath it.  A layered system may be built
	  from the bottom up. If there are problems, one can always be certain
	  that they are in the layer currently under construction.  The main
	  disadvantages of this approach are first the difficulty of
	  conceiving of layers without any circular dependencies, and second
	  the fact that each layer adds overhead which slows down the
	  operation of the system.
     
     
 -  There is a microkernel approach to OS design.  The idea is to remove
	  all functions possible from the kernel and implement them as system
	  and user-level applications.  For example, file systems can be
	  implemented at the user level.
     
 -  Typically the remaining microkernel provides some process control,
          memory management, and process communication facilities.
          
     
 -  Microkernel systems tend to be bug-free, secure, easy to modify and
	  easy to port.
     
 -  The main disadvantage seems to be the overhead created by the need
	  for user-level parts of the system to communicate through the
	  kernel (e.g. message-passing with kernel serving as go-between).
     
 -  The design style that is currently popular is similar to the
          microkernel except that it employs dynamically loadable user-level
	  modules which are not constrained to communicate through the kernel.
     
 -  Actual operating systems are usually structured as some sort of hybrid
          of the structures described above.  For example, Windows is largely 
          monolithic, but supports user-mode subsystems and dynamically loadable
          kernel modules.
     
     
 
     
 -  2.8 Operating-System Debugging
     
     -  When an OS crashes typically the contents of kernel memory are saved
	  in a special file or disk partition.  By studying these 'core
	  (memory) dumps' and log files, system designers can glean
	  information useful for debugging OS code.
     
 -  It is very important to study existing systems in order to learn how
	  to build better systems.  For example, this was one of the 'secrets
	  of success' of the developers of Berkeley Unix.  It is important to
	  build system-monitoring code into the OS.  Such systems produce
	  "traces" of their operation - they write records of all
	  'interesting' system events in log files which can be analyzed
	  later.
     
 -  There are also online monitoring tools - applications that are able
	  to display performance characteristics of a running system - such as
	  the percentage of CPU time used by each process, average length of
	  I/O queues, current amount of free primary memory, and so forth.
     
 
 -  2.9 Operating-System Generation
     
     -  Systems have to be configured for the specific site to which they
	  are targeted.  For example, we perform system genearation when we
	  put a new host online, providing at that time, for example, a
	  hostname, host IP address, router IP address.
     
 -  Other SYSGEN operations possible: disk partitioning, installation of
	  device drivers, choice of CPU-scheduling algorithm, and setting of
	  the maximum number of processes to be supported.
     
 -  The SYSGEN information may be incorporated into the source code for
	  the OS, and a custom version of the OS then compiled.  
     
 -  Another option is for the system to be pre-compiled and the SYSGEN
	  information saved in the form of tabular information in files,
	  accessed and utilized by the pre-compiled OS in order to achieve the
	  desired customization effects.  For example the system can read its
	  hostname and default router from a configuration file.  Scripts
	  written during the SYSGEN can be executed each time the computer
	  boots in order to perform custom setups.
     
 -  Tables can determine which of certain dynamically loadable modules
          are to be loaded at boot time.
     
 -  SYSGEN maybe followed by a linking, but not compiling step, so that
	  certain modules such as drivers are incorporated into a permanent
	  executable image of the kernel.
     
 
 -  2.10 System Boot
     
     
     -  Modern computers have ROM that begins executing automatically at
          system start-up time.
	  
     
 -  The ROM boot program will typically run diagnostics, 
          initialize the hardware, and load the OS from disk 
          (or it might load a secondary boot program from disk, 
          which in turn loads the OS from disk, or there might be both 
          secondary and tertiary boot programs on disk).
     
 -  In some small devices, the entire OS may be in ROM or EPROM.