DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦fac708cd9⟧ TextFile

    Length: 192640 (0x2f080)
    Types: TextFile
    Names: »D152«

Derivation

└─⟦ae2411776⟧ Bits:30008864 Diskette med tekster der formodes at være 31-D-152…161
    └─⟦this⟧ »D152« 

TextFile

                    
           
           
           
           
           
           
           
           
           
           
           
                          8DESIGN OF A PORTABLE FILE SYSTEM5 
           
                                     8NUCLEUS5 
           
           
                    
           
           
           
                                   Peter Mikkelsen 
                               Datalogisk Institut ved 
                               Københavns Universitet 
                                   September 1980 
           
           
           
           
           
           
           
           
          A_B_S_T_R_A_C_T_: The report argues that the emergence of high-level sys-
 _Æ_æ_å_          tem programming languages makes it an attractive and practicable
 _?_>_å_          task to design a file system suited for use on even very diffe-
          rent computers. Objectives for such a design are presented, and a
 _Æ_æ_å_          file system nucleus is designed. This nucleus offers: hierarchi-
 ___å_          cal naming of files, simple authorization enforcement support,
 _?_>_å_          extendable facilities of resource management and integrity pro-
          tection. Only the most basic functions for retrieval and updating
          of the actual contents of files are offered. 
           
           
          K_E_Y_W_O_R_D_S_: File system, file organization, naming of files, autho-
          rization enforcement. 
           
          This report exists as an A/S Regnecentralen af 1979 report under
the registration RCSL No 31-D 608. 
           \f

                                                 i 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          1.  INTRODUCTION ..........................................   1 
              1.1  Background .......................................   1 
              1.2  Scope of the Project .............................   2 
                1.3  This Report ......................................   4 
           
          2.  MODELS FOR STORAGE AND RETRIEVAL OF BACKING STORAGE 
              DATA ..................................................   5 
              2.1  A Model for a Hierarchical File System ...........   6 
                   2.1.1  Access Methods (AM) .......................   8 
                   2.1.2  Logical File System (LFS) .................   8 
                   2.1.3  Basic File System (BFS) ...................   8 
                   2.1.4  File Organization Strategy Modules (FOSM) .   9 
                   2.1.5  Device Strategy Modules (DSM) .............   9 
                   2.1.6  Input/Output Control System (IOCS) ........   9 
              2.2  Functions of the File System: an Illustration ....  10 
           
          3.  ENVIRONMENTAL CONSTRAINTS ON THE FILE SYSTEM ..........  12 
              3.1  Characteristics of Processor .....................  12 
                   3.1.1  Objectives ................................  13 
              3.2  Characteristics of Backing Storage ...............  13 
                   3.2.1  Objectives ................................  14 
              3.3  Characteristics of Data ..........................  14 
                   3.3.1  Objectives ................................  18 
              3.4  Characteristics of Users .........................  18 
                   3.4.1  Objectives ................................  19 
              3.5  Protection Against Errors ........................  20 
                   3.5.1  Objectives ................................  21 
           
          4.  DESIGN OF THE INDIVIDUAL LEVELS .......................  22 
           
          5.  BASIC FILE SYSTEM (BFS) ...............................  23 
              5.1  Objectives .......................................  23 
              5.2  Design ...........................................  23 
                   5.2.1  Organization of the Descriptors ...........  23 \f

                                                 ii 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _(_c_o_n_t_i_n_u_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
                        5.2.2  Redundancy Concerning Location of 
                          Descriptors ...............................  27 
                   5.2.3  Contents of Descriptors ...................  30 
              5.3  Functions of the BFS-Level .......................  31 
              5.4  Concluding Remarks ...............................  32 
           
          6.  FILE ORGANIZATION STRATEGY MODULE (FOSM) ..............  33 
              6.1  Objectives .......................................  33 
              6.2  Design ...........................................  34 
                   6.2.1  Page Organization of Files ................  34 
                   6.2.2  Organization of Index Tables ..............  37 
                          6.2.2.1  Structure of the Individual 
                                   Indices ..........................  38 
                          6.2.2.2  The Address Space of the            
                                   Individual Indices ...............  39 
                          6.2.2.3  Representation of Index Tables in 
                                   Core .............................  40 
                          6.2.2.4  Single-Level or Multi-Level 
                                   Indices ..........................  43 
                   6.2.3  Dynamics of Files .........................  43 
                   6.2.4  Unreadability of Deallocated Pages ........  45 
              6.3  Functions of the FOSM-Level ......................  46 
              6.4  Concluding Remarks ...............................  47 
           
          7.  DEVICE STRATEGY MODULES (DSM) .........................  48 
              7.1  Objectives .......................................  48 
              7.2  Design ...........................................  49 
                   7.2.1  Sequencing Strategies .....................  49 
                   7.2.2  Allocation/Deallocation of Pages, 
                          Administration ............................  49 
                   7.2.3  Allocation/Deallocation of Pages,  
                          Strategies ................................  52 
                   7.2.4  Marking of Malfunctioning Pages ...........  54 
              7.3  Functions of the DSM-Level .......................  56 
              7.4  Concluding Remarks ...............................  56 \f

                                                 iii 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _(_c_o_n_t_i_n_u_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          8.  INPUT OUTPUT CONTROL SYSTEM (IOCS) ....................  57 
              8.1  Objectives .......................................  57 
              8.2  Design ...........................................  57 
              8.3  Functions of the IOCS-Level ......................  59 
              8.4  Concluding Remarks ...............................  59 
           
          9.  ACCESS METHODS (AM) ...................................  60 
           
          10. LOGICAL FILE SYSTEM (LFS) .............................  61 
              10.1 Objectives .......................................  61 
              10.2 Design ...........................................  62 
                   10.2.1 A Model for Naming ........................  62 
                          10.2.1.1 Special Objectives of Naming .....  63 
                          10.2.1.2 Names: An Abstract Model .........  63 
                   10.2.2 How Should Files be Named? ................  66 
                          10.2.2.1 Restrictions on the Digraph 
                                   Structure ........................  66 
                          10.2.2.2 The Function NAME ................  69 
                          10.2.2.3 The Function DEFINECONTEXT .......  70 
                          10.2.2.4 Summary of Naming Restrictions ...  70 
                   10.2.3 Structure of the Catalogs .................  70 
                   10.2.4 Authorization Enforcement .................  72 
                   10.2.5 Deleting of Files .........................  75 
              10.3 Basic Functions of the LFS .......................  79 
              10.4 Concluding Remarks ...............................  81 
           
          11. REMARKS ON IMPLEMENTATION .............................  82 
              11.1 Structuring the File System ......................  82 
              11.2 Transparancy of Hierarchical Levels ..............  83 
           
          12. A PRELIMINARY REFERENCE MANUAL ........................  86 
              12.1 Introduction .....................................  86 
              12.2 Components of the Backing Storage ................  86 
                   12.2.1 Volumes ...................................  86 
                   12.2.2 Pages .....................................  87 \f

                                                 iv 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _(_c_o_n_t_i_n_u_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
                   12.2.3 Files .....................................  87 
                   12.2.4 Catalogs ..................................  89 
                   12.2.5 Volumedescriptions ........................  90 
              12.3 Functions of the File System .....................  91 
                   12.3.1 Volume Handling ...........................  91 
                   12.3.2 Catalog Handling ..........................  91 
                   12.3.3 File Handling .............................  92 
                   12.3.4 Authorization Enforcement .................  94 
           
          13. CONCLUSION ............................................  97 
           
          A_P_P_E_N_D_I_X_: 
           
          A.  REFERENCES ............................................  99 
           
           \f

F_       1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_ 1.
           
          The file system is an essential part of the operating system of
          any modern computer system. 
           
          The importance of a well-suited file system has been growing --
          and will no doubt continue to do so in the future -- concurrently
          with the need for, and development of still more sophisticated
          and potent backing storage devices. 
           
          Distributed systems with configurations of several -- possibly
          very different-sized -- computers, have become increasingly
          prevalent. This has accentuated the need for compatible file
          systems, allowing easy communication of data between installa-
          tions -- for instance via exchange of backing storage media. 
           
          The emergence of high-level system programming languages like
          Pascal (Jensen and Wirth 1975), Concurrent Pascal (Brinch Hansen
          1977), Platon (Staunstrup et al. 1975), Beta (Kristensen et al.
          1979), Modula (Wirth 1977), Ada (Wegner 1979), etc. has made it
          an attractive and practicable task to design a file system suited
          for use on even very different computer systems (yet with at
          least one thing in common: access to a compiler for the high
          level language in question). 
           
          Such a portable file system has the additional advantage of
          reducing implementation expenses: it is less expensive to imple-
          ment o_n_e_ file system which can be used on a number of computer
          configurations, than implementing s_e_v_e_r_a_l_ individual file systems
          for the different configurations. 
           
          To design such a file system (or at least the nucleus of such) is
          the goal of this project. 
           
           
1_._1_ _ _ _ _ _ _ _B_a_c_k_g_r_o_u_n_d_ 1.1
           
          The work of the present report was initiated in april 1980 in
          connection with a project at A/S Regnecentralen af 1979. 
           \f

                   The aim of that project was to design a file system for the RC700
          microcomputer (based on the Zilog Z80 8-bit micro-processor). The
          file system were to be implemented in the high-level language
          Pascal80 (Staunstrup 1980), which is developed on basis of the
          language Platon (Staunstrup et al. 1975). 
           
          It was soon decided that the use of Pascal80 for implementation
          could be utilized, allowing the file system to be used on other
          computer systems. 
           
          It was therefore necessary to reconsider the design of the file
          system, as the premises were changed. The result of these re-con-
          siderations is presented in this report. 
           
           
1_._2_ _ _ _ _ _ _ _S_c_o_p_e_ _o_f_ _t_h_e_ _P_r_o_j_e_c_t_ 1.2
           
          Design of a file system for a range of computers might seem an
          impossible task to undertake. How could a single file system
          possibly encompass environments, ranging from single-user
          micro-computers with less than 64 Kb of core storage -- to a
          large-scale multi-user, multi-processor computer equipped with
          several kinds of backing storage devices? 
           
          Well, it might be infeasible to create a g_e_n_e_r_a_l_ _p_u_r_p_o_s_e_ file
          system offering an assorted range of facilities, which would
          encompass the full range of configuration possibilities. 
           
          That is the reason why the philosophy of this project is to con-
          struct a n_u_c_l_e_u_s_ for such a file system. 
           
          That nucleus must offer a restricted -- but hopefully versatile
          -- f_u_n_d_a_m_e_n_t_ for superstructuring levels of higher abstraction
          and further facilities. The facilities may be elaborated diffe-
          rently to any extent, on the various computers. 
           
              On the other hand, the nucleus must be able to perform as a file
          system in itself -- without built-on extra facilities. 
           \f

          The notable point is that the proposed hierarchical philosophy
          ensures exchange of data between considerably differenced com-
          puter systems, since the lowest levels -- the nucleus -- are the
          same on any of the systems. 
           
                   With the above described design philosophy in mind, the defini-
          tions and scope of the file system presented in this report,
          could be stated as follows: 
           
             - the file system should give access to the backing storage of
               a computer on an abstract level of f_i_l_e_s_. 
           
                 - a file is a named sequence of b_y_t_e_s_ presumably containing
               d_a_t_a_. The file is split into a number of fixed size p_a_g_e_s_. A
               file is described by, and identified through, various admin-
               istrative datastructures, a.o. the file d_e_s_c_r_i_p_t_o_r_ and one
               or more file n_a_m_e_s_ (the terms will be defined more precisely
               at a later point). 
                    
                 - the file system offers only the most r_u_d_i_m_e_n_t_a_r_y_ _o_p_e_r_a_t_i_o_n_s_
                   to access and maintain the files. That is: it is not consi-
                   dered part of the file system nucleus to offer acces to var-
                   iable size records, as well as multibuffered i/o and simi-
                   lars are considered extensions which higher levels of an ac-
               tual system should offer. 
                    
                 - s_p_e_c_i_a_l_i_z_e_d_ _a_c_c_e_s_s_ _m_e_t_h_o_d_s_ (e.g. sequential access, indexed
                   sequential access, hashed access, list-structured access
                   etc.) -- are not considered part of the file system nucleus.
                    
                  
             - only r_a_n_d_o_m_ _a_c_c_e_s_s_ backing storage is considered. That is to
               say that devices like magnetic tape, paper tape, punched
               cards etc. is not considered in this report -- it is up to
               higher levels to implement uniform access ("generalized file
               system") even to such devices. 
                    \f

                 - multi-user r_e_s_o_u_r_c_e_ _a_l_l_o_c_a_t_i_o_n_ _p_r_o_b_l_e_m_s_ and consequent
               scheduling problems are not considered part of the file
               system nucleus. 
                    
           
         1_._3_ _ _ _ _ _ _ _T_h_i_s_ _R_e_p_o_r_t_         1.3
           
          The present report is written for persons who want a detailed
          knowledge of the considerations which led to the proposed file
          system design. 
           
          The reader is supposed to be familiar with ordinary system pro-
          gramming techniques, and have a general knowledge of file systems
          -- at least from the application programmer>s point of view. 
           
          Chapter 2 introduces a hierarchical model, modularizing the
          structure of file systems. The model offers the conceptual basis
          for the rest of the text. 
           
          Chapter 3 investigates the environmental constraints on the want-
          ed file system; that is: it defines the demanded specifications
          of the system. The specifications are formulated as a set of
          objectives for the file system design. 
           
          The individual modules/levels -- as demarcated in chapter 2 --
          are discussed and designed in the chapters 4 to 10. Chapter 10 --
          the Logical File System -- will probably draw most attention,
          since it is the decisions of this level that are of the most
          immediate interest to users of the file system. The functions of
          the Logical File System include the strategy for symbolic naming
          of files, and authorization enforcement procedures. 
           
          Some remarks and recommendations for the actual implementation of
          the proposed file system are given in chapter 11. 
           
          Finally -- before the concluding chapter 13 -- chapter 12 gives a
          "Preliminary Reference Manual" for the file system. The chapter
          presents an overview of the proposed file system. 
           
           \f

F_       2_._ _ _ _ _ _ _ _ _M_O_D_E_L_S_ _F_O_R_ _S_T_O_R_A_G_E_ _A_N_D_ _R_E_T_R_I_E_V_A_L_ _O_F_ _B_A_C_K_I_N_G_ _S_T_O_R_A_G_E_ _D_A_T_A_    2.
           
          A computer system consists of a number of hardware components
          with associated software. The components may conveniently be
          divided into two groups: 
           
               - central processing unit and core storage 
               - peripheral devices. 
           
          The first group -- together with its associated software -- is
          supposed to manipulate data already present in the core storage. 
           
          To introduce (input) new data in the core storage, or communicate
          data from the core storage to the external world (output), the
          second group -- peripheral devices -- is used. 
           
          The software handling the transfer of data between the central
          and peripheral devices is called the i_n_p_u_t_/_o_u_t_p_u_t_ _s_y_s_t_e_m_ (I/O
          system). 
           
          As stated in section 1.2 we will focus on the special class of
          peripheral devices known as "random access backing storage" de-
          vices, in this report. The subsystem of an I/O system, handling
          such devices is usually called the f_i_l_e_ _s_y_s_t_e_m_. 
           
          The backing storage may be of considerable dimensions, not pos-
          sible to be encompassed in detail by the human mind. Therefore,
          to facilitate transfer of data to and from backing storage, it is
          necessary for the file system to maintain the administration of
          an abstract model of the backing storage. This model must order,
          group, relate, etc. the collection of data residing on backing
          storage, so that it enables storage and retrieval of any data-
          structure a given user may want to manipulate. 
           
          Different models to this end may be considered. 
           
          The classical approach is the notion of a file, consisting of a
          number of consecutive records (possibly of variable length). 
           \f

          But other models have been proposed and implemented (IBM 1978).
          These models often have a close relationship to certain database
          designs, or the like. 
           
          In this chapter we will look into only the classical approach. In
          section 2.1 a hierarchical file system model is described. This
          -- due to Madnick and Alsop (Madnick et al. 1969) -- has come to
          be considered the standard of the field. 
           
                   It would be an interesting point of further investigation to look
          into alternative and more exotic models for the storage and re-
          trieval of data on backing storage. However, it is not considered
          within the scope of the present project to elaborate further on
          this issue. 
           
           
2_._1_ _ _ _ _ _ _ _A_ _M_o_d_e_l_ _f_o_r_ _a_ _H_i_e_r_a_r_c_h_i_c_a_l_ _F_i_l_e_ _S_y_s_t_e_m_ 2.1
           
          The model presented in this section is primarily extracted from
          the papers of Madnick (Madnick 1969a, Madnick et al. 1969b). 
           
          The reason for presenting the model is that it will furnish an
          excellent framework for discussion and analysis of the different
          parts of a file system. Furthermore, it will hopefully be a
          guide-line for the implementor of the file system, since it sug-
          gests a neatly structured and flexible implementation. 
           
                   The above mentioned papers describe a file system design model
          consisting of a hierarchy of six levels. Actual implementations
          of file systems may not necessarily conform exactly with these
          levels: levels may be combined, further subdivided, or even
          absent (or at least reduced to a trivial form). 
           \f

                   The six hierarchical levels to be described below are: 
           
               - Access Methods (AM) 
               - Logical File System (LFS) 
               - Basic File System (BFS) 
               - File Organization Strategy Modules (FOSM) 
               - Device Strategy Modules (DSM) 
               - Input/Output Control System (IOCS) 
                
                
                
                            (figur) 
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
          Figure 2.1: Hierarchical file system. 
           
           \f

  2_._1_._1_ _ _ _ _ _A_c_c_e_s_s_ _M_e_t_h_o_d_s_ _(_A_M_)_ 2.1.1
           
          This level offers an interface to the file system. The interface
          may include different file formatting functions: sequential
          files, random access files, fixed-length record files, variable-
          length record files, etc. It may include multiple-buffer facili-
          ties. It may hide differing physical characteristics of different
          backing storage devices. 
           
          Obviously, a user may supply his own access method functions aug-
          menting the functions of this level. 
           
           
    2_._1_._2_ _ _ _ _ _L_o_g_i_c_a_l_ _F_i_l_e_ _S_y_s_t_e_m_ _(_L_F_S_)_ 2.1.2
           
          This level transforms a user-supplied symbolic file name to an
          internal unique "f_i_l_e_ _i_d_e_n_t_i_f_i_e_r_". The tables of transformation
          data are usually called the c_a_t_a_l_o_g_(s). The symbolic filename
          will never enter any of the levels below this level. 
           
           
         2_._1_._3_ _ _ _ _ _B_a_s_i_c_ _F_i_l_e_ _S_y_s_t_e_m_ _(_B_F_S_)_ 2.1.3
           
          The Basic File System finds and maintains -- for a given file
          identifier -- the corresponding "f_i_l_e_ _d_e_s_c_r_i_p_t_o_r_". The file de-
          scriptor contains the "system-associated" data, such as "length",
          "location", "reservation locks", etc. 
           
          The essential functions of "opening" and "closing" a file are
          primarily performed in the BFS: when a file is opened, the BFS
          selects a free FOSM (File Organization Strategy Module), which it
          intializes with data from the file descriptor. Read and write
          operations can hereafter be directed immediately to the FOSM.
          "Close" releases the FOSM of the file. 
           
          The maintenance of file descriptors is the responsibility of the
          BFS-level, too. 
           
           \f

2_._1_._4_ _ _ _ _ _F_i_l_e_ _O_r_g_a_n_i_z_a_t_i_o_n_ _S_t_r_a_t_e_g_y_ _M_o_d_u_l_e_s_ _(_F_O_S_M_)_ 2.1.4
           
          The user views a file as a collection of contiguous records. To
          optimize storage device performances, this may not be true in
          reality: the physical records of data may be scattered arbitrari-
          ly on the backing storage. 
           
          When a FOSM receives an I/O-request concerning a given record
          with an associated logical address (i.e. the logical position
          within the file), it translates the logical address to an address
          of a physical record, and forwards the request to the appropriate
          Device Strategy Module. 
           
           
         2_._1_._5_ _ _ _ _ _D_e_v_i_c_e_ _S_t_r_a_t_e_g_y_ _M_o_d_u_l_e_s_ _(_D_S_M_)_ 2.1.5
           
          Characteristics of access to records of different backing storage
          devices vary much. 
           
          When several requests for access to records of a given device are
          queued up, it is the responsibility of the Device Strategy Module
          connected to the device, to produce an optimal sequence of re-
          quests. The strategy of sequencing obviously depends on charac-
          teristics such as latency and access time. 
           
          Furthermore, the DSM administers the allocation and deallocation
          of records on the device. When a FOSM requests allocation of a
          number of records, the DSM will select these. 
           
           
2_._1_._6_ _ _ _ _ _I_n_p_u_t_/_O_u_t_p_u_t_ _C_o_n_t_r_o_l_ _S_y_s_t_e_m_ _(_I_O_C_S_)_ 2.1.6
           
          The IOCS consists of the collection of basic drivers to the back-
          ing storage devices. It is assumed that these drivers perform
          functions such as: queuing of i/o-requests, automatic error reco-
          very attempts in case of spurious errors, reasonable standard
          actions in case of irrepairable errors etc. 
           
           \f

2_._2_ _ _ _ _ _ _ _F_u_n_c_t_i_o_n_s_ _o_f_ _t_h_e_ _F_i_l_e_ _S_y_s_t_e_m_:_ _a_n_ _I_l_l_u_s_t_r_a_t_i_o_n_ 2.2
           
          The hierarchy of the file system design model described above,
          may be i_l_l_u_s_t_r_a_t_e_d_ by means of functions: each level corresponds
          to a function defining the operations of the level. 
           
          If we disregard the AM-level -- which is irrelevant or trivial in
          this connection -- we may define following abstract functions: 
           
                        LFS:  Name    File-id 
               BFS:  File-id    Descriptor 
               FOSM: Descriptor   Logical-pageno    Logical-address
                                                             Device-id 
               DSM:  Logical-address   Device-id    Physical-address 
               IOCS: Physical-address    Data 
                
          The meaning of the defining sets are hopefully self-evident. 
           
          The basic functions of a file system are naturally "read" and
          "write". 
           
          As an example we will use the function READ, defined as follows: 
           
               READ: Name   Logical-pageno    Data 
           
          or 
           
               buffer = READ (file, page) 
                      buffer   Data, 
                      file     Name, 
                      page     Logical-pageno 
           \f

          In fact -- as one naturally must expect -- READ may be defined by
          means of the functions of the file system: 
           
               READ = LFS   BFS   FOSM   DSM   IOCS 
          or 
           
          (1)  READ (file, page) 
                         = IOCS (DSM (FOSM (BFS (LFS (file)), page))) 
           
           
          This formula illustrates the usefulness of a function OPEN: 
           
          If a sequence of READ>s is performed on the one and same file,
                   the variable "file" will be constant. From formula (1) we get: 
           
          (2)  READ (file, page) = IOCS (DSM (FOSM (k, page))) 
           
          where 
           
               k = BFS (LFS (file)), 
           
          The function (2) obviously involves less computation than (1), as
          the two functions BFS and LFS are eliminated. 
           
          Consequently, we may define a function OPEN: 
           
               OPEN: Name    Descriptor 
               OPEN = LFS   BFS 
           
          which for a sequence of READ-operations is constant, and thus
          only needs computation once. 
           
           \f

F_       3_._ _ _ _ _ _ _ _ _E_N_V_I_R_O_N_M_E_N_T_A_L_ _C_O_N_S_T_R_A_I_N_T_S_ _O_N_ _T_H_E_ _F_I_L_E_ _S_Y_S_T_E_M_ 3.
           
                   In this chapter the environmental constraints on the file system
          will be investigated. The environment will be treated in four: 
           
             characteristics of 
                - processor (section 3.1) 
                - backing storage (section 3.2) 
                - data -- contents of files (section 3.3) 
                - users (section 3.4) 
           
          As the survival of stored data is of vital importance in a com-
          puter system, it is necessary to consider the protection of these
          data. This will be done in section 3.5. 
               
          In each of these five subsections, the considerations of
          constraints will be expressed in a set of objectives for the
          design of the file system. 
           
          These objectives -- and deduced further points -- are the basis
          for the detailed discussion of file system design in chapters 5
          to 10. 
           
           
3_._1_ _ _ _ _ _ _ _C_h_a_r_a_c_t_e_r_i_s_t_i_c_s_ _o_f_ _P_r_o_c_e_s_s_o_r_ 3.1
           
          The file system is to be used on microcomputers as well as large-
          scale mainframe computers. This leads to considerations on core-
          size, speed of processing and so on. It is a necessity that the
          file system is able to perform well, both on a small (core-) size
          and slow microcomputer as well as on a larger and faster com-
          puter. To perform well -- relative to the overall performance of
          the computer -- this probably means that the core resident part
          of the file system should be able to vary in size (controlled by
          initialization and configuration parameters). 
           
               \f

    3_._1_._1_ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 3.1.1
           
          - The file system (implementation) should be structured so that
            its core storage demands are controlled by initialization/con-
            figuration parameters. 
             
             
3_._2_ _ _ _ _ _ _ _C_h_a_r_a_c_t_e_r_i_s_t_i_c_s_ _o_f_ _B_a_c_k_i_n_g_ _S_t_o_r_a_g_e_ 3.2
           
          The file system should -- ideally -- be for use on both slow
          (floppy-disks), medium fast (hard discs, drums, magnetic bubble
          memories), and very fast (semiconductor or core memory) media. 
           
          In practice, this is hard to accomplish. Therefore some trade-
          offs must be made. In keeping with the current trends we will
          want to focus our attention on the disktype devices, primarily
          hard disk types. 
               
          Magnetic bubble memory is not yet a serious alternative to hard
          disks. But prices will decrease dramatically within the next few
          years. Fortunately -- from the viewpoint of this design -- the
          access time characteristics of magnetic bubble memory resemble
          those of ordinary hard disks -- at least in principle: access
          time is divided in seek and latency time. Hence, hard disk access
          strategies are not necessarily irrelevant in connection with mag-
          netic bubble memory. It might be said that the fact that magnetic
          bubble memories are an order of magnitude faster than hard disks
          is just an added convenience. 
           
           
           
           
           
           
           
           
           
           
          Figure 3.1: Backing storage characteristics, from (Hnatek 1979). 
           \f

          Thus the prime problem is to balance the factors of slow floppy-
          disk-like devices against those of medium-fast devices. 
           
           
3_._2_._1_ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 3.2.1
           
             - the number of (random) accesses to the backing storage must
               be minimal for often used facilities of the file system. 
              
             - organization of logically connected parts of backing storage
               (e.g. sequential files) should be optimized relative to the
               physical characteristics of different media. The file system
               must consequently be able to encompass resulting d_i_f_f_e_r_e_n_t_
               strategies of allocation and device handling. 
           
               
3_._3_ _ _ _ _ _ _ _C_h_a_r_a_c_t_e_r_i_s_t_i_c_s_ _o_f_ _D_a_t_a_ 3.3
           
          The file system must be able to handle few as well as a great
          number of files. Also it must be able to handle small as well as
          huge files. 
           
          Actual computer installations have been investigated with respect
          to the size of files. 
           
          The tables of fig. 3.2, 3.3, and 3.4 show the distribution of
          file sizes in some typical computer-environments. It is clearly
          shown that the majority of files are relative small (less than 10
          Kb). 
           
            Data may be accessed in a wide varity of ways. Therefore diffe-
          rent overlays of internal structures on the files (random access
          organizations, list- and chain organizations etc.) should be well
          supported by the file system. 
           \f

F_                  
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 3.2: File sizes. 
                      The installation is a rather big minicomputer used
                      for system development at A/S Regnecentralen af 1979.
                           \f

F_                  
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 3.3: File sizes. 
                      The installation is a medium-sized minicomputer used
                      for system development at A/S Regnecentralen af 1979.
                       \f

F_                  
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 3.4: File sizes. 
                      The installation is a very big minicomputer system
                      used for both batch and on-line applications. The
                      system is situated at a customer of A/S Regnecentra-
                      len af 1979. 
                       \f

          Many computer installations comprise a limited number of devices
          for backing storage. Typically there may be a few disk drives,
          but a lot of volumes (kits) which may be mounted on these drives.
          This situation is obviously caused by the relative high expence
          of backing storage devices (compared to the expence of the rest
          of the computer system). 
           
            Consequently, the files may be situated on a lot of volumes, and
          all the volumes of the system is not necessarily mounted at the
          same time. 
           
                    
3_._3_._1_ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 3.3.1
           
             - The file system must be able to handle few as well as a
               great number of files. 
              
             - must be able to handle small as well as huge files.
               Especially small files must be handled efficiently. 
               
             - the files may be located on a lot of volumes, not necessa-
               rily mounted concurrently (at the same time). 
              
             - the files must be fully dynamic. Single files must be able
               to grow or shrink (at least at the tail of the file, but
               preferably anywhere: beginning, midst, or tail of the file).
           
           
3_._4_ _ _ _ _ _ _ _C_h_a_r_a_c_t_e_r_i_s_t_i_c_s_ _o_f_ _U_s_e_r_s_ 3.4
           
          The file system may be situated in the context of single-user as
          well as multi-user systems. The file system must therefore be
          able to handle situations where a number of users access files on
          shared volumes of backing storage. This demands certain facili-
          ties of synchronization (exclusive and shared access etc.) and
          resource management. 
           \f

          The multi-user situation also calls for more sophisticated naming
          facilities: users should be able to use filenames independent on
          other users choise of names, and files should be protected
          against accidental or malicious misuse by other users. 
           
          Whatever protection rules are enforced, the environment is prone
          to update already existing data with false new data from time to
          time. Therefore it may be a facility of the file system automati-
          cally to dump (updated) data (backup). Admittedly, such facili-
          ties are on the borderline of what a file system -- in itself --
          should be able to cope with. 
           
               
3_._4_._1_ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 3.4.1
           
             - Users must be able to choose filenames independently, with-
               out concern for duplicate filenames (otherwise they will
               have to guess at names not previously chosen). 
                
             - it must be possible to specify accessrights allowing private
               as well as public use, so that a number of users may share
               the same file. 
              
             - synchronization of concurrent use of single files must be
               implemented. 
           
             - the file system must deliver such relevant data, that
               implementation of an augmenting resource management system
               is possible. 
           
          S_e_c_o_n_d_a_r_y_ _o_b_j_e_c_t_i_v_e_s_: 
              
             - automatic backup procedures should be supported by the file
               system. 
           
                \f

3_._5_ _ _ _ _ _ _ _P_r_o_t_e_c_t_i_o_n_ 3.5
           
          In any computer system, data are in danger of being improperly
          e_x_p_o_s_e_d_ or d_a_m_a_g_e_d_ (Lampson 1974). Protections are a defense
          against such threats. 
           
          Threats may be caused by a_c_c_i_d_e_n_t_ or m_a_l_i_c_e_. 
           
          Malice tries to make use of any weakness in a protection system.
          Malice may have much more far-reaching consequences than acci-
          dents (unobtrusive modification is much worse than outright de-
          struction). Thus, protection against malice is harder to estab-
          lish and at the same time more important. 
           
          Accidents may damage data. Of course it may expose data as well,
          but this is presumably less harmful if no malice is present. Ac-
          cidents may be caused by user mistakes, software errors in system
          programs (bugs) or hardware malfunctioning. 
           
          Considering tolerancy against faults, there are two important
          factors: 
           
             - r_e_d_u_n_d_a_n_c_y_: Errors are only detected through the presense of
               redundancy. If enough redundancy, faults may even be re-
               paired. So the amount of redundancy in the different organ-
               izations of the file system is an important design parame-
               ter. 
                
             - p_h_y_s_i_c_a_l_ _l_o_c_a_t_i_o_n_ _o_f_ _f_a_u_l_t_ _s_e_n_s_i_t_i_v_e_ _d_a_t_a_: Errors are prone
               to hit backing storage "clustered" around a single physical
               location (e.g. disrupting one or a few adjacent sectors of a
               disk). Therefore sensitive data should be d_i_s_t_r_i_b_u_t_e_d_, li-
               miting the effect of local errors: one disrupted sector of a
               disk should not cause total disruption of the disk ("casca-
               ding" of errors). 
                 
                \f

 3_._5_._1_ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 3.5.1
           
             - The administrative data of the file system are sensitive
               data, and should consequently be fault tolerant. This
               includes: 
                 1) least possible "cascading" of minor errors. 
                 2) regeneration of disrupted areas on basis of intact
                    areas ("scavenging"). 
              
             - authorization enforcement should be supported. 
              
                      - reservation and marking of malfunctioning areas (e.g. areas
               with persistent parity errors). 
           
           \f

F_       4_._ _ _ _ _ _ _ _ _D_E_S_I_G_N_ _O_F_ _T_H_E_ _I_N_D_I_V_I_D_U_A_L_ _L_E_V_E_L_S_ 4.
           
          In the following chapters 5 to 10, the design of the individual
          levels of the model introduced in chapter 2 will be discussed. 
           
              The discussion of the Access Methods (AM) level and the Logical
          File System (LFS) level will be postponed until after discussion
          of Basic File System (BFS) and lower levels. The latter levels
          must -- to a certain degree -- be independent of the type of en-
          vironment, since files generated in one milieu must be compatible
          with versions of the file system in another milieu. 
           
          Each of the chapters 5 to 10 is divided in five: 
           
               - short general description of the level in question 
               - objectives 
               - design 
               - interface functions to the level 
               - concluding remarks. 
                  
          The d_e_s_i_g_n_-sections consist of an iterative sequence of p_r_o_p_o_s_a_l_s_
          for solution of a stated subproblem. Each proposal is clearly
          emphasized in the text. 
           
          Examples of actual systems employing the proposal in question, is
          given immediately below each proposal. Following references to
          actual systems are used: 
           
               Burroughs B5500 MCS (Ravn 1979) 
               IBM OS/360          (Kristensen 1979) 
               OS6                 (Stoy and Strachey 1972) 
               PDP SOLO            (Brinch Hansen 1977) 
               RC3600              (Olsen 1978) 
               RC System 2         (Brinch Hansen 1971) 
               RC System 3         (Aris et al. 1978) 
               TITAN               (Kristensen 1979). 
                
                \f

F_5_._ _ _ _ _ _ _ _ _B_A_S_I_C_ _F_I_L_E_ _S_Y_S_T_E_M_ _(_B_F_S_)_ 5.
           
          This module is concerned with maintenance of the file d_e_s_c_r_i_p_t_-
          o_r_s_. The desriptor provides the overall information about the
          file, such as "length" and "location". 
           
          Data needed for controlling multiaccess to the file (shared and
          exclusive accessing - prevention of deadlocks, etc.) is also
          located in the file descriptor. 
           
           
5_._1_ _ _ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 5.1
           
          - Must give all relevant information on the overall status of the
            files 
           
          - the descriptors are essential for accessing of files. They must
            be fault tolerant. 
             
             
         5_._2_ _ _ _ _ _ _ _D_e_s_i_g_n_ 5.2
           
          The main problems of the BFS-level are: (1) the organization of
          descriptors, (2) redundancy in locating descriptors, and (3) the
          actual contents of a descriptor. 
           
           
5_._2_._1_ _ _ _ _ _O_r_g_a_n_i_z_a_t_i_o_n_ _o_f_ _t_h_e_ _D_e_s_c_r_i_p_t_o_r_s_ 5.2.1
           
          The simplest scheme for organization of the file descriptors is
          to associate them directly with the symbolic file names. 
           
          P_r_o_p_o_s_a_l_: File descriptors are put in the catalog(s) together
                    with the symbolic filenames. Thus there are one de-
                    scriptor for each name. 
                    (RC system 3, PDP SOLO, IBM OS/360). 
                     \f

          This organization scheme -- coupled with a reasonable organiza-
          tion of the catalog(s) (e.g. hashed) -- ensures relative quick
          retrieval of all relevant information on a single file. On the
          other hand search lengths may grow fast, as the size of single
          entries are rather big (there can only be few entries per page),
          so the fillgrade must be kept low. 
           
          A more serious problem is that of multiple naming of single phy-
          sical files. If users are to have individual and different names
          for a file, this implies that they have individual descriptors
          for the file. This leads to inconsistency problems among the de-
          scriptors, as the information contained in a descriptor, are at-
          tributes to the d_a_t_a_ of the file (and not to the n_a_m_e_s_ of the
          file), and consequently should be the same for every name-entry. 
           
          P_r_o_p_o_s_a_l_: There is a unique file descriptor for every file. The
                    descriptors are put in a special system file. Conse-
                    quently a file has a unique internal name (called the
                    f_i_l_e_ _i_d_e_n_t_i_f_i_e_r_) which is defined by the index of the
                    descriptor in the file of descriptors. 
                    (OS6, Burroughs B5500 MCS) 
                    
          In this case the catalog system maps the symbolic names into
          identifiers. 
           
          No inconsistency problem exists, as descriptors are unique. 
           
          Searching for a given name in a catalog can be fast, because many
          entries may be found on the same page (size of entries is small,
          consisting only of a symbolic name and an identifier). 
           
          On the other hand it is slower to access the data of a given
          file, because it is necessary to access the catalog as well as
          the descriptor to find the physical address of the first file-
          page. 
           \f

          Of course the slowdown would not be significant if the whole de-
          scriptorfile was held in core. This is not realistic as it would
          mean that filedescriptors for every accessible file in the system
          should exist in core, introducing severe restrictions on the
          number of files. Such a limitation would be antagonistic to the
          stated objectives of the file system. 
           
          Another problem is the vulnerability of a descriptorfile: if the
          file is erroneously deleted or disrupted the whole associated
          volume of backing storage will become inaccessible. If the pages
          of the file are clustered physically on the backing storage
          (which normally is optimal for allocation of files) a hardware
          error disrupting even a minor part of the backing storage (e.g. a
          few sectors of a disk) may render the access to several files
          impossible. 
           
                   P_r_o_p_o_s_a_l_: File descriptors are part of the individual files (e.g.
                    placed on the first page of any file). A file is unam-
                    biguously identified (within a volume) by the address
                    of its first page. 
                     
                   This proposal combines the best features of the two former pro-
          posals: 
           
          - the catalog system is totally independent on the Basic File
            System, because files can be identified uniquely by internal
            names (it is assumed that the address of a given file>s first
            page is fixed through the whole lifetime of the file). Alas, no
            inconsistency problem! 
             
          - no superfluous backing storage accesses in connection with
            "opening" of a file are needed, as the first page of the file
            has to be read anyway (this page contains information about the
            location of the single pages of the file, as shall be seen in a
            following chapter. 
             
          - descriptors are automatically distributed on the volume, there-
            by diminishing the risk of catastrophes when single pages de-
            velop hardware faults. 
             \f

          Unfortunately, the assumption of fixed first pages of all files,
          is very inconvenient when one considers reorganization. Reorgani-
          zation obviously involves moving of files, and it is difficult --
          if not impossible -- to find a reasonable procedure for reorga-
          nizing the files of a volume, and at the same time updating the
          references to first pages (file identifiers) in all  of the cata-
          logs (no backward references from files to catalogs exist). 
           
          P_r_o_p_o_s_a_l_: File descriptors are placed at the first page of any
                    file. Addresses of such first pages ("descriptor
                    pages") are put in a table, the "File Location Table",
                    contained in a special system file. A file is identifi-
                    ed unambiguously (within a volume), by an index to the
                    table-entry referencing the first page of the file. 
                     
                   This proposal resembles the last-but-one proposal. It ensures the
          independence of file identifiers and file location thus enabling
          efficient reorganization. 
           
          Unfortunately it suffers from some of the same shortcomings as
          the last but one proposal: 
           
                        - opening of a file requires one extra access to find the
                 address of the descriptor page in the proposed File
                 Location Table. 
                  
               - the File Location Table is very vulnerable, since the
                 data are clustered. 
           
          As regards the first shortcoming: this is the obvious effect of
          creating independence between file identifiers and file locations
          (in conjunction with the demand of no backward references from
          files to their file names). Therefore this must regrettedly be
          accepted, in the good cause of flexibility and reorganization. 
           
          Remark: Unlike the previous proposal a lot of table entries may
          be placed on a single table page (the entries contain only an
          address). If time used for opening of files is critical, it may
          be practicable, to let the whole (or a large part of the) table\f

          be resident in core. This should naturally be controlled by an
          initialization parameter to the file system. 
           
          As regards the second shortcoming (vulnerability of table), this
          may be eliminated by the following scheme: 
           
               - the File Location Table index of a file is stored in the
                 descriptor when created (i.e. "pushed down" into the
                 descriptor). Descriptors are distributed and therefore
                 fault tolerant, seen as a whole. 
                  
               - the recovery program finds all the descriptors of the
                 volume, thereby reconstructing the File Location Table. 
                  
                   This leaves the problem of finding every descriptor on a volume
          without use of the File Location Table. That is the subject of
          the next subsection. 
           
           
     5_._2_._2_ _ _ _ _ _R_e_d_u_n_d_a_n_c_y_ _C_o_n_c_e_r_n_i_n_g_ _L_o_c_a_t_i_o_n_ _o_f_ _D_e_s_c_r_i_p_t_o_r_s_ 5.2.2
           
          As pointed out in the previous subsection, it is essential for
          recovery after faults on the File Location Table, that the loca-
          tion of all file descriptors may be found, without use of the
          File Location Table. 
           
          There are two different approaches to this: 
           
          (1)  A separate table, referencing all descriptors, exists. 
                
               This could for instance be a bit table, referencing all the
               pages on which descriptors reside. Or it could simply be a
               copy of the File Location Table. 
               Use of this method implies that the table must be maintained
               in parallel with the File Location Table. 
                
          (2)  The descriptor pages are marked in such a way that they can
               be identified by a recovery program ("scavenger"), scanning
               all the pages of the volume (e.g. Redell 1980). 
                \f

               It does seem impractical to mark every page of a volume,
               this requiring a little of the data area of every page. The
               problem must be solved otherwise: The descriptor pages con-
               tain a special identification in the first few words. The
               chances of duplicating such an identification -- by acci-
               dent, or by maliciousness -- on a non-descriptor page, could
               be kept extremely low, by using a well-chosen and suffici-
               ently long identification. 
           
          Since method (1) adds overhead to normal system operation, method
          (2) will be adapted in the final design. 
           
                   The problem of choosing a reasonable identification for
          descriptor pages is rather dependent on the actual implementation
          of the file system. The subject will therefore not be elaborated
          in detail here, but a few hints will be given: 
           
               - the identification should not contain ASCII-characters
                 (i.e. no low-valued bytes), since they are common in
                 datafiles. 
                  
               - there must be no valid identification on unallocated
                 pages: when a file is deleted, the identification on its
                 descriptor page must be marked or destroyed. 
                  
               - the length must be chosen so that the probability of
                 interpreting a wrong page as a descriptor page is
                 extremely low. An example: 
                  
                         Define p(xDd1Uu xDd2Uu ... xDdnUu) as the probability of meeting the
                 byte-pattern xDd1Uu, xDd2Uu, ... xDdnUu (xDdiUu is a byte-value) in the
                 first n bytes of any page on a given volume. 
                  
                 The problem is to define an identification xDd1Uu, xDd2Uu ... xDdnUu,
                 ensuring a sufficiently low p(xDd1UuxDd2Uu ... xDdnUu). 
                  \f

                 If we -- for the sake of simplicity -- assume that all  
                 values of any byte on a data-page are equally probable we  
                 obtain following: 
                  
                   (1) all byte values are independent, i.e.: 
                         p(xDd1UuxDd2Uu ... xDdnUu) = p(xDd1Uu) p(xDd2Uu) ... p(xDdnUu) 
                    
                   (2) for any two byte-values xDd1Uu and xDd2Uu 
M_M_                                                   _1_ _ 
                         p(xDd1Uu) = p(x) = 2Uu-8Dd = 
P_P_                                                  256 
                    
                   (3) p(xDd1UuxDd2Uu ... xDdnUu) = p(xDd1Uu) p(xDd2Uu) ... p(xDdnUu) 
                                      = (p(xDd1Uu))UunDd 
                                      = 2Uu-8nDd 
                    
                          If we choose n = 4, then  
                  
M_M_                                                       _1_ _ 
                       p(idDd1Uu idDd2Uu idDd3Uu idDd4Uu) = 2Uu-32Dd = 
P_P_                                                    2 G. 


                     
                 This means that the probability of misinterpreting one or
                 more pages of a 250 Mb-disk (which contains approximately
                 500 K pages), is: 
                  
M_M_

P_P_

                 If we choose n = 6 we obtain analogously: 
                       
M_M_                      P =  2Uu-48Dd   500K = 0.2   10Uu-6Dd% 
P_P_                       6
                  
                 The above considerations serve to show that it is feasible
                 to reconstruct the File Location Table by scanning all the
                 pages of a backing storage volume -- if the descriptor
                 page identification is carefully chosen. 
                  
                  \f

     5_._2_._3_ _ _ _ _ _C_o_n_t_e_n_t_s_ _o_f_ _D_e_s_c_r_i_p_t_o_r_s_ 5.2.3
           
          The descriptor contains attributes to the d_a_t_a_ of the file, such
          as l_e_n_g_t_h_ and l_o_c_a_t_i_o_n_ of the file. Please note, that another set
          of attributes must be associated with the n_a_m_e_s_ of the file,
          defining use- and access-rights (for authorization enforcement). 
           
          Superimposing levels to the file system may want to insert their
          own attributes in the descriptor. This may be done in a special
          user-accessible area of the descriptor -- the t_a_i_l_. 
           
          The descriptor could furthermore contain information for con-
          trolling of multiaccess, such as: 
           
               - open _count (number of times the file has been "opened"
                      without later "closing") 
                  
               - update _count (number of current open connections in
                 update-mode) 
                    
                   - retrieve _count (number of current open connections in
                 retrieve _mode) 
                  
               - exclusive _reserved (a flag: if set by a user opening the
                 file, all other users are excluded from access to the file
                 -- this may for instance be used in connection with
                 writeaccess),  
                  
          and some sort of information concerning the last updating of the
          file (for backup purposes), e.g.:  
                      
               - time and date of last update. 
                  
                  \f

         5_._3_ _ _ _ _ _ _ _F_u_n_c_t_i_o_n_s_ _o_f_ _t_h_e_ _B_F_S_-_L_e_v_e_l_ 5.3
           
          A reasonable set of functions, accessing the actual contents of
          files and manipulating descriptors, is: 
           
               open (file _identifier, mode) 
               close (file _identifier) 
                
               get (file _identifier, buffer, page _no, page _count) 
               put (file _identifier, buffer, page _no, page _count) 
                
               create (descriptor _mask, file _identifier) 
               delete (file _identifier); 
                
               extend (file identifier, amount) 
               truncate (file _identifier, amount) 
                
               settail(file _identifier, tail) 
                
               mount (volumename, device) 
               dismount (device) 
                
          The f_i_l_e_ _i_d_e_n_t_i_f_i_e_r_ is the internal name of the file as given by
          the catalog system. M_o_d_e_ indicates write- or read-access or both.
          Furthermore it specifies private (exclusive) or shared access.
          P_a_g_e_ _n_o_ is the logical number of the first page to be read/writ-
          ten. P_a_g_e_ _c_o_u_n_t_ denotes the number of pages from (or to) b_u_f_f_e_r_,
          to be transferred. D_e_s_c_r_i_p_t_o_r_ _m_a_s_k_ contains relevant data (attri-
          butes) for creation of a new file. A_m_o_u_n_t_ is the number of pages
          to allocate/deallocate. T_a_i_l_ contains the data to be put in the
          tail of the descriptor. 
           
          It should be noted that the format of get- and put- functions
          facilitates multiple page transfers to and from backing storage.
          The interface would obviously be simpler if only offering single-
          page transfers: get/put (file _identifier, buffer, page _no). How-
          ever, multiple-page transfer is, in many cases, much more
          efficient: All the pages of a program may be loaded by issue of a
          single read-command to the controller of the backing storage (on\f

          a disk all the pages of a single surface of a cylinder may read
          in one revolution). This will be discussed in detail later. 
           
          Mount and dismount are functions to manage the including and
          removal of backing storage volumes. V_o_l_u_m_e_n_a_m_e_ is a userdefined
          symbolic name of the volume to be mounted. A simple check is
          performed to ensure the correct identity of the mounted volume.
          D_e_v_i_c_e_ is an identification of the device on which the volume
          is, or shall be, mounted. 
           
           
    5_._4_ _ _ _ _ _ _ _C_o_n_c_l_u_d_i_n_g_ _R_e_m_a_r_k_s_ 5.4
           
          All the stated objectives of section 5.1 are reasonably met.  
           
                \f

F_6_._ _ _ _ _ _ _ _ _F_I_L_E_ _O_R_G_A_N_I_Z_A_T_I_O_N_ _S_T_R_A_T_E_G_Y_ _M_O_D_U_L_E_ _(_F_O_S_M_)_ 6.
           
          This level defines the internal organization of a single file. It
          maintains this information in case of creation, deletion,
          extension, or "shrinking" of a file. 
           
           
6_._1_ _ _ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 6.1
           
          Prime objectives: 
           
          - dynamics: a file should be able to grow or shrink arbitrarily,
            at least at the tail of the file 
               
          - the amount of allocated or deallocated pages must be a figure
            available to the user (for resource management purposes) 
             
          - the time for access of single pages of the file must be pre-
            dictable within reasonable limits 
               
          - sequential access (e.g. loading of programs) must be fast 
              
          - random access must be reasonably fast 
               
          - file allocation (and deletion) must be reasonably fast 
               
          - when a page is deallocated (e.g. by deletion of a file), the
            data contained herein should never be seen by another user
            incidently allocating the same page later. 
                Admittedly such recreation of -- possibly sensitive -- data is
            very random and data can furthermore always be effectively
            deleted by the user -- if so wanted -- by overwriting them
            before deallocation of the corresponding pages. 
            However, in keeping with Murphy>s laws: if not forced by the
            system, users will not act reasonable! 
                \f

          Secondary objectives: 
               
          - a file should be able to grow or shrink anywhere: beginning,
            midst, or tail 
               
          - files may be arbitrarily big, encompassing more volumes of
            backing storage. 
               
               
     6_._2_ _ _ _ _ _ _ _D_e_s_i_g_n_ 6.2
           
          The design of the FOSM-level is treated in four subsections: 
           
             - page organization of files 
             - organization of index tables 
             - dynamics of files 
             - unreadability of deallocated pages 
           
           
6_._2_._1_ _ _ _ _ _P_a_g_e_ _O_r_g_a_n_i_z_a_t_i_o_n_ _o_f_ _F_i_l_e_s_ 6.2.1
           
          The three wellknown techniques of file organization are: 
           
            - contiguous organization 
            - chained organization 
            - index table organization. 
           
          P_r_o_p_o_s_a_l_: Files are organized contiguously. 
                    (RC System 2). 
           
          This is a simple strategy: the file is identified by the address
          of its first page. The address of any page in the file is easily
          found by a simple computation. Many files can be open at the same
          time, as organization overhead in terms of core storage is low.
          Sequential accessing time is minimal (for the sake of simplicity
          it will be assumed in the following that latency time will be
          minimal when accessing sequential pages of the backing storage.
          This assumption may in fact not be true for all devices, but a
          cunning mapping from the logical pagenumbers of the device, into\f

          actual physical locations, may prove sufficient to fulfil the
          assumption as shall be seen later -- cf. subsection 7.2.3). 
           
          Remark: The postulate that contiguous files minimize sequential
          access time is true only for single-user systems. As Madnick
          (Madnick 1969a) points out, the question is open to dispute when
          two sequential files are scanned concurrently on the same volume,
          since this will defeat the assumed sequential accessing! 
           
          The notable drawback of the proposal is that file allocation (or
          deletion) is unacceptably slow: files must be compacted by copy-
          ing from time to time. Otherwise waste of space will be excessi-
          ve, since deleted files will create large holes of potentially
          unusable space. 
           
          The solution to the problem is to scatter the individual pages of
          the file: 
           
          P_r_o_p_o_s_a_l_: Files are organized by chaining of pages. Every page of
                    a file contains a pointer to the next page. 
                     
          Again a relative simple strategy: the file is identified by the
          address of its first page, organization overhead is small in
          terms of core storage and file allocation, deletion, extension,
          and shrinking may be fast. 
           
          The chief deficiency of the method is the use of variable time
          for accessing of random pages. 
           
          This could be solved by holding the chain fields of the file in
          core storage, instead of distibuting them on the individual
          pages. 
           
          P_r_o_p_o_s_a_l_: Files are organized by chaining of pages. 
                    Chains are held in core storage. 
                    (RC System 3) 
                     
          Access time is still variable but tolerably so (at least for
          files not excessively huge). However, organization overhead in\f

          terms of core storage is considerable. The only realistic way to
          employ the method is to hold a s_i_n_g_l_e_ chain table (perhaps per
          volume) in core, describing all files as well as free pages. If
          such a scheme is used many files may be open at the same time,
          since opening of yet another file will not add notably to the
          required  core size. 
           
                   On the other hand the total number of backing storage pages con-
          nected to the system will be severely limited by the core size.
           
          This may be partially overcome by making the pagesize very  big
          -- or better: address pages in "chunks" (called slices), making
          files consist of a number of slices, each referencing a fixed
          number of contiguous pages. This allows the chain table to span a
          greater number of pages using the same amount of core. Unfortuna-
          tely this method introduces an unpleasant dependence between the
          size of available core storage and organization of backing sto-
          rage (i.e. the size of the slices). Restricted core size implies
          big slices with consequent wasting of backing storage (in mean
                   half a slice is wasted per file). Furthermore the choise of slice
          size may be difficult, because volumes could be exchanged between
          computer systems of different available core size.  
           
          Another drawback is the sensitivity of the chaintable (which of
          course must be stored on backing storage as well) towards errors
          disrupting small parts of it. A ruined chaintable of a few pages,
          makes the whole volume of possibly several hundred thousand pages
          inaccessible.  
           
                   Finally, the total number of files is limited (at least by the
          number of chain fields in the chain table). This may be tolerable
          on many computer installations, but it is not tolerable in gen-
          eral, since the file system should be applicable on an assorted
          range of configurations. 
           
          P_r_o_p_o_s_a_l_: Files are organized by index tables. Each file contains
                    such a table on its first page. 
                    (PDP SOLO, RC3600, OS6) 
           \f

          This method makes the core size overhead for file organization
          proportional to the number of opened files. Naturally it limits
          the number of opened files on a given installation, but the pro-
          blem is tolerable, since the number of concurrently opened files
          is prone to grow with the size of available core on different
          computer configurations (demands to the degree of "multi-using"
          naturally tends to grow with the available core size: small core-
          size micro-computers are usually expected to be single-user sys-
          tems, for instance).  
           
          Extension and shortening of files is simple, assuming the needed
          free space is available in the index table. 
           
                   Allocation and deletion of files does not involve time consuming
          activities, as far as the FOSM-level is concerned. 
           
          Sequential access time is a function of the allocation strategy
          employed when the file was created (and perhaps extended). The
          actual allocation of pages might very well be contiguous in many
          cases. 
           
          Yet, the method i_s_ rather inefficient in terms of core storage.
          This means that the index tables should be as compressed as pos-
          sible. This is not naturally compatible with the objective of ar-
          bitrarily big file sizes. So, let us turn the problem of organi-
          zation of index tables. 
           
           
     6_._2_._2_ _ _ _ _ _O_r_g_a_n_i_z_a_t_i_o_n_ _o_f_ _I_n_d_e_x_ _T_a_b_l_e_s_ 6.2.2
           
          The organization of an index table has several degrees of
          freedom: 
           
             - structure of the individual indices, 
             - the address space of the individual indices, 
             - representation of index tables in core, 
             - single-level or multi-level indices. 
           
           \f

6_._2_._2_._1_ _ _ _S_t_r_u_c_t_u_r_e_ _o_f_ _t_h_e_ _I_n_d_i_v_i_d_u_a_l_ _I_n_d_i_c_e_s_ 6.2.2.1
           
          P_r_o_p_o_s_a_l_: The individual indices reference chunks of pages. The
                    chunks are of fixed size (e.g. one page). 
                    (PDP SOLO, OS6) 
                     
          Gives easy and fast indexing of a given page. Extension or shor-
          tening is simple (if there is room enough in the indextable)
          although it might involve moving of indices within the table. 
           
          Unfortunately the method is grossly core-consuming, as the index-
          table of a file will grow proportionally to the file size. This
          core-consumption may be reduced by employing following method: 
           
          P_r_o_p_o_s_a_l_: The individual indices reference chunks of pages. The
                    chunks are of variable size (multiplum of slice size). 
                    (RC3600) 
                     
                   In this case the number of indices is proportional to the degree
          of scattering of files: if a file is contiguously allocated, only
          one index is needed. In the worst case a file will be totally
          scattered, requiring double as much space as in the previous pro-
          posal (an index contains two words: address and length). However,
          if a huge file is so scattered that the latter proposal requires
          more space than the former, it might be advisable to reorganize
          the volume anyway. Reorganization should compress files (i.e.
          allocate them contiguously). 
           
          Finding the address of a given page may involve some searching
          in the index table, but if the searching is conducted in core
          this is absolutely tolerable. 
           
          The only notable drawback is that this organization does not al-
          low refinement in connection with the concept of "sparsely fil-
          led" files. Such files (e.g. large random accessed hash coded
          files where only a few of its pages actually contain data) could
          easily be implemented by the previous proposal (just placing
          zeroes (say) in the indices referring to empty pages not yet
          allocated). However, this is not considered a serious problem,\f

          since such file organizations also could be implemented on top of
          the latest proposed organization. This would just require a table
          (contained in the file) mapping the hashcoded page numbers into
          the actual (internal) page numbers. Since the problem was that of
          s_p_a_r_s_e_l_y_ filled files, this method would not introduce much
          overhead compared to the first one. 
           
          All in all the method is preferable to the first proposed. 
           
           
         6_._2_._2_._2_ _ _ _T_h_e_ _A_d_d_r_e_s_s_ _S_p_a_c_e_ _o_f_ _t_h_e_ _I_n_d_i_v_i_d_u_a_l_ _I_n_d_i_c_e_s_ 6.2.2.2
           
          When using computers with a word-length of 16 bits, there is a
          problem of obtaining sufficient address space for large devices. 
           
          A large device may easily comprise several hundred thousand
          pages. One 16-bit word will only address up to 64 K pages. What
          to do? 
           
          P_r_o_p_o_s_a_l_: A new abstract level is introduced: a u_n_i_t_. 
                    A unit comprises up to 64 K pages. A device may
                    comprise one or several units. Each unit is an
                    independent address space. 
                     
          This ensures the address space to be maximally 64 K. The trade-
          off is the added complexity in the interface to devices (you
          should not only distinguish devices but units too). Furthermore
          files are restricted to the size of 64 K pages. 
           
          P_r_o_p_o_s_a_l_: A pageaddress consists of 32 bits. Thus the address
                    space is 4 G pages. 
                     
          A 4 G range for pages is certainly large enough (if there are 512 
          bytes per page the maximum address space comprises 2 Tb = 2 x 10Uu12Dd
          bits), and that is larger than any currently available storage  
          device). 
           \f

          This method may work well with processors offering 32-bit arith-
          metic -- which will be the case of many of the coming micro-pro-
          cessors: Motorola MC68000, Zilog Z8000, Intel 8086, etc. Unfortu-
          nately it is not the case of many current computers. If no "more-
          word arithmetic" is supported, it will be very tedious to use
          32-bit arithmetic. 
           
          Considering the fast development of computers, it is chosen to
          solve the problems by brute force: All page-addresses consist of
          32 bit, but no double-word arithmetic is applied in computers
          where this is not absolutely needed. In most cases an address
          space of 64 K pages i_s_ enough (at least for microcomputers) and
          if a larger address space is needed this will often be connected
          with larger computers (offering 32-bit arithmetic)... 
           
           
  6_._2_._2_._3_ _ _ _R_e_p_r_e_s_e_n_t_a_t_i_o_n_ _o_f_ _I_n_d_e_x_ _T_a_b_l_e_s_ _i_n_ _C_o_r_e_ 6.2.2.3
           
          When a file has been opened it is natural to place some
          administrative data in core storage, easing access to the file.
          Amongst such data is the index table for the file. If this is n_o_t_
          placed in core, an access to an arbitrary page of the file will
          involve two backing storage accesses -- first to retrieve
          information from the indextable concerning the location of the
          requested page, followed by the actual access. 
           
          P_r_o_p_o_s_a_l_: The indextable of a file is placed in core storage
                    whenever the file is opened (it is of course removed
                    when the file is closed). 
                    (PDP SOLO) 
                     
          This is the natural thing to do. Access times for arbitrary pages
          of the file are kept minimal. Furthermore it fulfils the ever im-
          portant property of access time predictability. 
           
          On the other hand a lot of files may be open at the same time,
          consuming a lot of core storage for their indextables. 
           \f

                   In matter of efficiency this may be acceptable on large com-
          puters. But it is certainly not attractive in connection with
          small microcomputers and the like. Again, as the prime objective
          of the file system is to span the whole range of computers, the
          consumption of core for indextables must be restricted.  
           
          P_r_o_p_o_s_a_l_: Only part of an open file>s indextable is put in core.
                    When a page not referenced in this part is requested,
                    the whole indextable will be read from backing storage
                    and a new part (according to some clever strategy) is
                    put in core. 
                    (RC3600) 
                     
          This is in fact a method of "paging" the indextables. The nice
          thing about the method is that arbitrarily big and complex
          indextables (e.g. in several levels) could be allowed easily. 
           
          Unfortunately the trade-offs are obvious: 
           
          If the size of the core part of an indextable is smaller than the
          whole indextable for a given file, chances are - naturally - that
          an arbitrary access to the file, will reference a page "outside"
          this part (give a "page fault"). Thus the mean access time for
          the file will increase -- in fact proportional to the degree of
          fragmentation of the file. Furthermore predictability of access
          times will be lost (for the user, whom the actual organization of
          files is irrelevant). 
           
          One could design various crafty strategies for the continous re-
          newal of the core part of index tables. Many such strategies are
          known from the litterature on program-execution involving paging-
          methods. It is also well-known that these techniques work relati-
          ve well as long as programs are executed sequentially. However,
          when execution involves jumps to arbitrary points in the program,
          there is a danger of severe decrease in execution speed  -- so-
          called "trashing". 
           \f

          The problem of "paging" the indextable of an open file are ana-
          logous. As long as accessing is sequential, everything may work
          relative well. But if access is random (which is often the case
          for datafiles) trashing may occur no matter how clever the paging
          strategy. 
           
          This is obviously a dilemma between antagonistic objectives: in-
          dextables must be used (allowing scattering of files) -- and:
          the importance of fast access to the individual pages of an open
          file. 
           
          The compromise may lie in the possibility of "compressing" files
          to a reasonable degree of scattering (i.e. organize the files in
          a limited number of chunks, thereby diminishing the number of in-
          dices in index tables). 
           
          P_r_o_p_o_s_a_l_: Indextables are restricted to a limited number of
                    chunks. Indextables of open files are core resident. 
           
          When the size of indextables is restricted, they will -- occasio-
          nally -- show full, but this is not an irrepairable situation, as
          the backing storage could be reorganized. Admittedly it may cause
          some disadvantage to user, but this should be balanced by the
          ever minimal and always predictable access times. 
           
          One may consider implementing automatic reorganization, initiated
          by the file system whenever needed. However, this will add unac-
          ceptably to the complexity of the file system nucleus. If it is
          essential to have a given volume reorganized continuously, a
          reasonable way would be to put the reorganization utility program
          in an individual low-priority process of its own. Of course this
          will require some careful synchronization between file system and
          reorganization process. 
           
          The maximum number of indices in the index-table is hard to de-
          fine. The number 25 has rather arbitrarily been chosen, hopefully
          balancing the need for low consumption versus the realistic
          degree of fragmentation. 
           \f

          Judging from the empirical figures of section 3.3, the choise is
          not too bad: If a slice size (i.e. minimal allocation unit) of 3
          is chosen, 25 chunks will be able to reference at least 75 pages
          in the very w_o_r_s_t_ of cases (that is to say: no two chunks can be
          placed contiguously). The tables show that more than 80 percent
          of all files were of less size. 
           
               
         6_._2_._2_._4_ _ _ _S_i_n_g_l_e_-_L_e_v_e_l_ _o_r_ _M_u_l_t_i_-_L_e_v_e_l_ _I_n_d_i_c_e_s_ 6.2.2.4
           
          The above chosen method for core representation of index tables
          inhibits any practical use of multilevel indexing. It should be
          noted however, that a sort of multilevel indexing system could be
          implemented o_n_ _t_o_p_ of the here described file system. The higher
          levels of indices might be represented by individual files con-
          taining references to other files. 
           
          Since a high-level interface to the file system obviously may
          utilize such techniques, there is no urgent need for multi-level
          techniques in the file system "nucleus". 
           
               
6_._2_._3_ _ _ _ _ _D_y_n_a_m_i_c_s_ _o_f_ _F_i_l_e_s_ 6.2.3
           
          It was stated as an objective of this level that files should be
          able to grow or shrink -- at least at the tail -- but preferably
          anywhere in the file. 
           
                   Why demand this of a file system? 
           
          Well, of course any possible problem of this nature might be sol-
          ved by simply copying the file into a new file with the wanted
          format. But copying of huge files is a time-consuming activity.
          Since appending new portions of data to a file is a frequent
          operation, it is not feasible to copy every time. Alas, e_x_t_e_n_d_i_n_g_
          of files (at the tail) must be a facility of the file system. 
           \f

          When a file is extended, we want to allocate the pages of the
          extension in as few chunks as possible -- all in line with the
          general philosophy of allocation. If a file is extended one page
          at a time, there will be no possible way to determine a reason-
          able strategy, as to which free pages to allocate.  
           
          The alternative is to allocate all the needed pages at once. If
          the number of needed pages is not known at the time of extending,
          it may be profitable to allocate the maximum-number of pages
          possibly needed. This implies that it must be a facility of the
          file system to t_r_u_n_c_a_t_e_ a file (getting rid of the unwanted pages
          after an extension). 
           
          These are the arguments for dynamics in the tail of a file. Of
          course they may be applied to the corresponding problem of dyna-
          mics anywhere in a file. 
           
          However, one should balance the need for general dynamics against
          the added complexity to the system. 
           
          It occurs that examples of natural applications using general dy-
          namics are: (1) text editors and (2) random access file organi-
          zations. 
           
          As regards the text editors, arbitrary dynamics might make fast
          insertion of pieces of text possible. On the other hand it is
          hard to imagine a text editor system not preserving a copy of the
          old text for security reasons. So it seems that text editors are
          not really a strong argument for the general dynamics. 
           
          Random access file organizations are probably a much better ar-
          gument. General dynamics may facilitate to make "cleaner" designs
          of such organizations, for instance hiding overflow problems. 
           
          However, the present design will argue that problems c_a_n_ be sol-
          ved within the framework of tail dynamics, and the file system
          will consequently be restricted on this point. 
           \f

          If the need for general dynamics becomes prevalent, the file sys-
          tem could be expanded with moderate effort to meet such demands. 
           
           
         6_._2_._4_ _ _ _ _ _U_n_r_e_a_d_a_b_i_l_i_t_y_ _o_f_ _D_e_a_l_l_o_c_a_t_e_d_ _P_a_g_e_s_ 6.2.4
           
          One of the stated objectives is to protect deallocated pages from
          being read by arbitrary users, allocating the same page later. 
           
          There are two possible solutions to this: (1) overwriting deallo-
          cated pages (e.g. by zeroes) or (2) administratively prohibiting
          any possible reading of such pages. 
           
          The former solution is obviously the safer one: data of
          deallocated pages is p_h_y_s_i_c_a_l_l_y_ deleted, never to be accessed
          again. On the other hand it will be rather time consuming. 
           
          Since the latter solution may be applied safely -- as shown below
          -- this will be used in the final design. 
           
          P_r_o_p_o_s_a_l_: Reading of pages not yet written (in the context of the
                    actual file) is prohibited. 
                     
          To fulfil this proposal we need two length-variables in the file
          descriptor: (1) the total number of pages allocated to the file
          and (2) the number of pages actually written onto the file. 
           
          Let us first consider sequential reading and writing. In this
          case reading past the number of written pages should simply be
          prohibited. This allows the user to see his own written data, and
          nothing else. 
           
          Admittedly things look a little different for random access
          files: When a random access file is created it must contain a
          given number of pages regardless of whether there are any data on
          these pages or not. However, this objection may be discarded,
          observing that a random access file of arbitrary size may be
          created by first creating and opening it for sequential writing,
          secondly write the wanted number of pages (e.g. writing zeroes),\f

                   and finally -- after closing -- regard it as (and possible change
          its attributes to) a random access file. 
           
          Thus unreadability of pages not yet written could be ensured by
          obeying these simple rules: 
                    
               - two length-variables are associated with each file: 
                 ALLOCATED-LENGTH and WRITTEN-LENGTH. 
                  
               - following assertions must hold: 
                 (1) WRITTEN-LENGTH <_ ALLOCATED-LENGTH 
                 (2) If page number R is read from the file: 
                          R <_ WRITTEN-LENGTH 
                 (3) If page number W is written onto the file: 
                          W <_ WRITTEN-LENGTH + 1. 
           
           
     6_._3_ _ _ _ _ _ _ _F_u_n_c_t_i_o_n_s_ _o_f_ _t_h_e_ _F_O_S_M_-_L_e_v_e_l_ 6.3
           
          Functions on the level of FOSM are: 
           
               open (descriptor, mode) 
               close 
                
               get (buffer, page _no, page _count) 
               put (buffer, page _no, page _count) 
                
               extend (amount) 
               truncate (amount). 
           
          The only function that requires explicit identification of the
          target file is "open". Reason is: it is assumed that open initia-
          lizes a (not-in-use) "FOS-Module" which then will represent the
          file. The rest of the functions will accordingly, in some way --
          dependent on the implementation language -- refer to such a spec-
          ific module. The functions are thus "entries" (in the Concurrent
          Pascal (Brinch Hansen 1977) sense of the word) to any of the
          individual modules. 
           \f

          D_e_s_c_r_i_p_t_o_r_ is the file descriptor found by the Basic File System.
          It is used for initialization of the "FOS-Module". M_o_d_e_, b_u_f_f_e_r_,
          p_a_g_e_ _n_o_, a_m_o_u_n_t_, and p_a_g_e_ _c_o_u_n_t_ is described in section 5.3. 
           
           
         6_._4_ _ _ _ _ _ _ _C_o_n_c_l_u_d_i_n_g_ _R_e_m_a_r_k_s_ 6.4
 
          The design of the FOSM-level is essential to the performance of
          the whole file system. 
           
          None of the p_r_i_m_a_r_y_ objectives of section 6.1 are neglected. 
           
          However, both of the s_e_c_o_n_d_a_r_y_ objectives are chosen n_o_t_ to be
          met in this design: Files are n_o_t_ allowed to grow or shrink any-
          where, and files are n_o_t_ allowed to encompass more volumes of
          backing storage: 
           
          As regards the reasons for the limited dynamics of files, this is
          extensively discussed in subsection 6.2.3. 
           
          The limitation of files to single volumes is not considered
          really serious. Backing storage devices must be chosen to fulfil
          the demands of the applications using them! 
           
           \f

F_       7_._ _ _ _ _ _ _ _ _D_E_V_I_C_E_ _S_T_R_A_T_E_G_Y_ _M_O_D_U_L_E_S_ _(_D_S_M_)_ 7.
           
          The modules on this level define and describe the (possibly
          different sorts of) devices on which backing storage is mounted. 
           
          Since the physical characteristics of the various known devices
          may differ a lot, miscellaneous optimizing access strategies m_a_y_
          be embedded in the modules. 
           
          The possible strategies for a given device are split in two
          groups: (1) sequencing of i/o-requests and (2) allocation/deallo-
          cation of pages on the device. 
           
           
7_._1_ _ _ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 7.1
           
          Prime Objectives: 
           
          - when a file is created or extended with a number of pages,
            these pages should be allocated in as few chunks as possible
            (i.e. preferably contiguous). Reasons are: minimizes size of
            indextable; makes loading of programfiles fast. 
             
          - allocation/deallocation should be reasonably fast. 
             
          - pages developing faults must be marked, so that they are
            unallocatable. 
           
          Secondary objectives: 
             
          - it must be easy to embed new sequencing strategies (for i/o-
            requests) in the modules. This is primarily a requirement to
            the implementation structure of the file system. 
            Reason is: it is not considered part of the file system nucleus
            to employ sequencing strategies, since these are not imperative
            to the function of the file system (a given device may be ac-
            cessed with or without sequencing strategies with equal results
            -- but presumably with differing efficiency). On the other
            hand, sequencing may improve efficiency considerably on some
            computer installations (e.g. in multiprogramming, multi-user
            environments), and should therefore be readily supported by the
            file system. 
             
           \f

         7_._2_ _ _ _ _ _ _ _D_e_s_i_g_n_ 7.2
           
7_._2_._1_ _ _ _ _ _S_e_q_u_e_n_c_i_n_g_ _S_t_r_a_t_e_g_i_e_s_ 7.2.1
           
          Strategies for sequencing i/o-requests are -- as said above --
          highly device dependent and are not an immediate part of the de-
          sign to be discussed. Please refer to the litterature, e.g.
          (Teorey et al. 1972) or (Wong 1980), for further discussion on
          different algorithms. 
           
           
7_._2_._2_ _ _ _ _ _A_l_l_o_c_a_t_i_o_n_/_D_e_a_l_l_o_c_a_t_i_o_n_ _o_f_ _P_a_g_e_s_,_ _A_d_m_i_n_i_s_t_r_a_t_i_o_n_ 7.2.2
           
          The DSM must contain datastructures and algorithms to administer
          the allocation and subsequent deallocation of backing storage
          pages. 
           
          Various well-known techniques to do this job, exist. 
          These will be presented below: 
           
          P_r_o_p_o_s_a_l_: Free pages are c_h_a_i_n_e_d_ together. 
                    (RC System 3) 
           
          This method has very little overhead in terms of core consump-
          tion. The only thing to store is the address of the next page to
          allocate (deallocated pages may be inserted before this, or they
          may be inserted elsewhere in the chain). The chainfields could be
          located on the individual pages, as the pages are not used for
          data. 
           
                   However, when allocation strategies are employed, trying to find
          a suitable c_h_u_n_k_ of contiguous pages, the method is not attrac-
          tive. Search times will be excessive. 
           
          If the chainfields were to be placed in a chaintable in core sto-
          rage, the method would show distinct similarities with the method
          of chaining file pages. This method was not adopted. For analo-
          gous reasons the corresponding method will not be applied here
          either. 
           \f

                  P_r_o_p_o_s_a_l_: The free pages are organized as a f_i_l_e_, which grows or
                    shrinks as pages are deallocated or allocated. 
                     
          This method might work very well if indextables were big enough
          allowing arbitrarily fragmentated files. The notable point of the
          method is that the tools (i.e. file system procedures) needed to
          maintain such a datastructure are already present; why, they are
          needed in the user interface to manipulate ordinary files. The
          method might be a little inefficient in terms of execution time. 
           
          The indextable organization chosen in subsection 6.2.2.3 is not
          sufficient for this method. 
           
          P_r_o_p_o_s_a_l_: The free pages are administered by a "bit table". In
                    this table every bit represents a page. If the bit is
                    set (to "1") this means that the corresponding page
                    is free; if not set (set to "0") it is allocated. 
                    (PDP SOLO, RC3600) 
                     
               This gives an excellent survey of the free pages. It is easy to
          compute the size of individual "holes" of free pages, allowing
          efficient searching. 
           
          The method may be rather core consuming. A typical-sized volume
          currently holds from 100.000 to 1.000.000 pages (if page size is
          512 bytes). This will require a bit table of 6 to 63 kilobytes.
          This is of course not realistic. 
           
                   P_r_o_p_o_s_a_l_: The free pages are administered by a bit table. The bit
                    table is a file itself and as such "p_a_g_e_a_b_l_e_". 
                     
          This gives a relative uniform approach to the handling of bit
          tables on different sorts of devices, large as small. On the
          other hand, allocation -- and especially deallocation -- may
          involve several "page faults" decreasing efficiency. 
           \f

          P_r_o_p_o_s_a_l_: The free pages are administered by a bit table. Every
                    bit references a fixed number of pages. This number
                    constitutes the minimal unit of allocation (called a
                    "s_l_i_c_e_"). 
                    (RC3600) 
                     
          This method utilizes the idea that pages may be allocated profit-
          ably in units of several pages. Reasons are:  
           
          - most files are of size greater than one page. 
             
          - files should as far as possible be allocated contiguously. 
            Allocation in slices tends to help to this purpose. 
             
          - extending of files involving allocation of pages will tend to
            be less frequent. Often there will be space enough in the last
            allocated slice for minor extensions. 
             
          - "holes" of free space on the backing storage tend to be larger
            (measured in number of pages), because pages are deallocated in
            units of slice length too. Large holes are more useful for al-
            location purposes. 
             
          The main draw-back of the method is the amount of wasted space on
          backing storage. This is proportional to the slice size, since
          the theoretical mean size of wasted space per file is half the
          slice length. 
           
          The actual slice size should therefore be balanced according to
          the above pro et contras. 
           
                   The slice size need not be a universal constant, it could very
          well vary from volume to volume. In fact it might be feasible to
          let the slice size on large volumes tend to be large (as the
          waste of space here might be of relative little importance), and
          oppositely, let the slicesize of small volumes be small. Other
          factors may influence the choise of slice size, such as the ex-
          pected mean size of the files to be placed on the volume: the
          space wasted is relative little when files are huge -- a file of\f

           1000 pages with a 10-page slicelength wastes a maximum of one
          percent of the occupied space; not so a file of 1 page (up to 90
          percent waste). 
           
          Even though this technique may be employed, it is not reasonable
          to restrict the size of the bittable to one page (or any other
          universally fixed size), because this will introduce an unwanted
          restriction on the number of files possible on any volume (the
          number of files would be limited by -- at least -- the number of
          bits in the bittable). 
           
          The compromise is to apply both of the two last methods proposed,
          thereby getting a "pageable" table of free slices. 
           
          P_r_o_p_o_s_a_l_: The free slices are administered by a "pageable" bit-
                    table.  
           
          If time consumption by allocation and deallocation is critical,
          one should choose a slice-size producing a bit table of size less
          than a page (eliminating "page faults") remembering the trade-off
          in terms of wasted space on backing storage. 
           
           
         7_._2_._3_ _ _ _ _ _A_l_l_o_c_a_t_i_o_n_/_D_e_a_l_l_o_c_a_t_i_o_n_ _o_f_ _P_a_g_e_s_,_ _S_t_r_a_t_e_g_i_e_s_ 7.2.3
           
          The stated objective of allocation strategies (cf. section 7.1)
          was to allocate the requested number of pages in as few chunks as
          possible. 
           
          This objective was under the assumption that contiguously located
          pages minimize access time when access is sequential. 
           
          The postulate is not true for all devices. It is not all device-
          controllers that allow access to an arbitrary number of conti-
          guous pages (sectors, segments, etc.). Some demand every block
          accessed individually. This will defeat the postulated minimal
          access time. 
           \f

          Take as an example a hard disk device: the rotational gap between
          two neighbouring pages may be too short to allow the system to
          start another access. If pages were placed contiguously in such a
          situation, a lot of disk revolutions would be lost when accessing
          sequentially. Therefore the pages should be interleaved in such a
          way that two consecutive pages on the same cylinder always are
          placed with another page parting them. This implies that all
          pages on (one side of) a cylinder could be accessed in two revo-
          lutions. 
           
          The location of logically contiguous pages on two neighbouring
          cylinders may also be optimized (i.e. considering the rotational
          gap for cylinder shifts). 
           
          The technique is refered to as "s_c_r_e_w_i_n_g_" of pages. 
           
          The mapping between physical locations and logically contiguous
          locations could be placed in software as well as hardware ("soft
          screw" respectively "hard screw"). 
           
          When placed in software this should preferably be a facility of
          the driver for the device. Pages written with the use of a "soft
          screw" will be practically impossible to read if not accessed via
          the same "soft screw" technique. If the "soft screw" is not pro-
          perly standardized, this may cause problems in connection with
          exchanging of media between different installations. 
           
          It is simpler to use "hard screw" (if the physical charachteris-
          tics of the device permit it). This is done by the "formatting"
          the media, writing appropriate headers on the sectors of each
          cylinder. This technique makes the software invariant to the used
          screwing strategy. 
           
          Other devices may use other and more refined optimization stra-
          tegies. We shall not elaborate further on this here, but it will
          be assumed that such techniques may be incorporated in the file
          system easily. 
           \f

          All in all we may stick to the objective of allocation in as few
          chunks as possible, since this -- under reasonable conditions --
          will tend to minimize access time for sequential accessing. 
           
          The problem of allocation of pages -- by the means of a bit table
          -- is therefore reduced to the well-known problem of dynamic sto-
          rage allocation. Please refer to e.g. Knuth (Knuth 1969), Vol. 1,
          page 435 ff. for a more detailed discussion of strategies. In
          accordance with the conclusions of Knuth we will choose the
          "f_i_r_s_t_-_f_i_t_" method as the basis of allocation strategy. If no fit
          is found, the requested number of pages will be split into  two
          approximately equal parts, and the algorithm will be used (recur-
          sively) on both of these parts. This modification to the first
          fit method is totally heuristic. It would be nice to try alterna-
          tive techniques in a simulation model before application. 
           
          However, it is important to notice, that the allocation strategy
          may be changed at any time, since it has no effect whatsoever on
          the system>s ability to access already allocated pages. Thus, if
          a better strategy is found, this will be applied (different stra-
          tegies may even be used in different environments). 
           
           
         7_._2_._4_ _ _ _ _ _M_a_r_k_i_n_g_ _o_f_ _M_a_l_f_u_n_c_t_i_o_n_i_n_g_ _P_a_g_e_s_         7.2.4
           
          Pages, which develop persistent errors, should be marked in some
          way to ensure future unaccessibility. 
           
          It is natural to use the Bit Map for this. Slices containing
          malfunctioning pages are considered "allocated", though not to
          any specific file. 
           
          This is, however, more easily said than done. 
           
          A malfunctioning page can only be detected during r_e_a_d_i_n_g_ of the
          page (if a write-operation is specified to an ordinary disk-con-
          troller, it will write the data unconditionally - no matter how
          defect the page may be). 
           \f

          This means that malfunctioning pages typically are detected
          during reading of a file. In this situation we cannot just mark
          the relevant slice as "allocated" in the Bit Map, since this is
          the case already (it is allocated to the file we are reading)!
          What to do? 
           
          P_r_o_p_o_s_a_l_: Whenever a file is d_e_l_e_t_e_d_, it will be check-read to
                    discover any malfunctioning pages. All pages, but the
                    malfunctioning ones, will be deallocated. 
                     
          Simple to implement, but it is unacceptable in terms of time-con-
          sumption. Consider deleting a file of 40.000 (say) pages --
          patience will be required! 
           
                   P_r_o_p_o_s_a_l_: A separate bit table -- the Malfunctions Bit Table
                    (MBT) -- is maintained. The table references all mal-
                    functioning slices. Whenever a malfunctioning page is
                    discovered the associated slice will be marked in MBT.
                    Whenever a slice is deallocated, it is checked in the
                    MBT that this slice is ok. If it is not ok, no bit will
                    be set in the ordinary Bit Table of free slices. 
                     
          This method does not add notably to system overhead. Furthermore,
          it has the additional advantage of maintaining a complete table
          of the malfunctioning areas of the backing storage. Such a table
          may prove useful in a number of situations. Thus, this last
          method will be chosen. 
           
           \f

     7_._3_ _ _ _ _ _ _ _F_u_n_c_t_i_o_n_s_ _o_f_ _t_h_e_ _D_S_M_-_L_e_v_e_l_ 7.3
           
          The set of functions of a single Device Strategy Module will look
          something like: 
           
               get (buffer, page _addr, page _count) 
               put (buffer, page _addr, page _count) 
                
               mount (volume _description) 
               dismount 
                
               allocate (amount, chunk) 
               deallocate (chunk) 
                
          B_u_f_f_e_r_ and p_a_g_e_ _c_o_u_n_t_ are described in section 5.3. P_a_g_e_ _a_d_d_r_ is
          the address -- within the given volume -- of the first page to be
          transferred, or marked defect. V_o_l_u_m_e_ _d_e_s_c_r_i_p_t_i_o_n_ contains in-
          formation concerning the characteristics of the volume to be
          mounted; used for initialization of the module. A_m_o_u_n_t_ is the
          number of slices to be allocated by the "first-fit" method. C_h_u_n_k_
          indicates location and length of the chunk allocated or (to be)
          allocated.  
           
           
 7_._4_ _ _ _ _ _ _ _C_o_n_c_l_u_d_i_n_g_ _R_e_m_a_r_k_s_ 7.4
           
          The design of the DSM-level as described above, meets all of the
          stated objectives of section 7.1. 
           
          One should notice that the DSM-level must be implemented with
          care, since several demands to the flexibility and modularity of
          the implementation have been stated. 
           
           \f

F_       8_._ _ _ _ _ _ _ _ _I_N_P_U_T_ _O_U_T_P_U_T_ _C_O_N_T_R_O_L_ _S_Y_S_T_E_M_ _(_I_O_C_S_)_ 8.
           
          This level defines the actual software interface to the hardware
          of external devices. 
           
          Furthermore it performs functions such as: error retrial,
          exeption handling, etc. 
           
          Since the level is highly implementation and configuration de-
          pendent, it will not be elaborated in detail here. In fact only
          one single aspect will be treated: the size of pages (a page
          being the minimal quantum of bytes accessed from an arbitrary
          backing storage device, in one operation of the IOCS). 
           
          The objectives and discussion is accordingly restricted to this
          single issue. 
           
           
    8_._1_ _ _ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 8.1
           
          Prime objectives: 
           
          - the fixed page size should balance the factors of buffer claim
            (on core storage), and the transfer rate of data. 
             
          Secondary objectives: 
             
          - the page size should support all common formatting standards of
            backing storage devices (allowing use of pre-formatted media). 
           
           
    8_._2_ _ _ _ _ _ _ _D_e_s_i_g_n_ 8.2
           
          The effective transfer rate (in bps) is higher for large p_a_g_e_
          s_i_z_e_s_ than for small (as the administration overhead is approxi-
          mately constant). This fact points to large page sizes. 
           
          Core storage is a critical resource. Large page sizes consume a
          lot of core for buffers. This points to small page sizes. 
           \f

          Balancing these factors is hard because circumstances may be so
          different from installation to installation (core storage is cer-
          tainly a critical resource on a 8-bit microcomputer with a maxi-
          mum address-space of 64 Kb, as well as high transfer rates may be
          essential in a large multi-user system). 
           
          We have -- rather arbitrarily, but hopefully balancing the above
          mentioned factors -- chosen a page size of 512 bytes. 
           
          This page size supports the most common sector size standards for
          floppy disks. As "standard" for floppy disks (diskettes), the IBM
          formats are generally prevailing. The clasical IBM standards are:
          128, 256, and 512 bytes per sector (ref.: IBM not dated). 
           
          These may all be supported by the chosen page length of 512
          bytes/sector, since more than one sector may constitute a page
                   (e.g. 4 sectors of 128 bytes may be read into a 512 byte page-
          buffer). 
           
          IBM has introduced another format of 1024 bytes/sector lately.
          This cannot -- without considerable difficulties -- be supported
          by a 512 byte page size! However, the format does not -- as of
          this time -- seem to be generally accepted, and predictions are,
          that it will be dropped or at least limited in use. Since the
          expences of a 1024 bytes pagesize format are considerable in
          respect to core consumption of pagebuffers, we choose not to be
          impeded by the small chances of a 1024 bytes/sector standard
          being accepted. 
           
           \f

     8_._3_ _ _ _ _ _ _ _F_u_n_c_t_i_o_n_s_ _o_f_ _t_h_e_ _I_O_C_S_-_L_e_v_e_l_ 8.3
           
          As stated above the actual interface to the IOCS may be rather
          environment-dependent. A general outline for the functions may
          look like this: 
           
               get (buffer, page _addr, page _count) 
               put (buffer, page _addr, page _count) 
                
               control (request) 
           
          B_u_f_f_e_r_, p_a_g_e_ _a_d_d_r_ and p_a_g_e_ _c_o_u_n_t_ are described in section 7.3.
          R_e_q_u_e_s_t_ denotes the wanted control-function of the driver. 
           
           
8_._4_ _ _ _ _ _ _ _C_o_n_c_l_u_d_i_n_g_ _R_e_m_a_r_k_s_ 8.4
           
          The stated objectives of section 8.1 are met. 
           
           \f

F_9_._ _ _ _ _ _ _ _ _A_C_C_E_S_S_ _M_E_T_H_O_D_S_ _(_A_M_)_ 9.
           
          The Access Methods is the user>s interface to the file system. 
           
          The facilities of this interface is highly dependent on applica-
          tions, environments, etc. It may comprise techniques such as:
          fixed or variable length record accessing, single or multibuf-
          fered accessing, random or sequential accessing, specialized
          database record accessing, etc. 
           
          As stated in chapter 3, it is not considered part of this file
          system design to define or discuss facilities of the AM-level. 
           
          It should be noted, however, that the file system has been de-
          signed to support developments of different problem-oriented
          access methods. If the AM-level had been incorporated into the
          file system nucleus, the user would have been constrained by a
          small set of limited access methods. 
           
                    \f

F_       1_0_._ _ _ _ _ _ _ _L_O_G_I_C_A_L_ _F_I_L_E_ _S_Y_S_T_E_M_ _(_L_F_S_)_ 10.
           
          The primary component of this module is the c_a_t_a_l_o_g_ _s_y_s_t_e_m_. This
          is responsible for the mapping of (userdefined) symbolic n_a_m_e_s_ on
          to the internal and unique file i_d_e_n_t_i_f_i_e_r_s_. Furthermore the mo-
          dule offers authorization enforcement facilities. 
           
          In fact, the services and facilities of the LFS may be numerous.
          Since one of our main goals for the file system nucleus is to
          keep the size within limits, the actual LFS of this design will
          be kept at a minimum, only offering basic functions. These func-
          tions must be chosen with care, so that augmenting levels, imple-
          menting more refined and potent naming systems, are well suppor-
          ted. 
           
          The following subsections investigate the properties of naming,
          and based on this analysis, decide on (1) the structure of cata-
          logs, (2) a simple authorization enforcement scheme, and (3)
          which basic functions the LFS should offer. 
           
          Search-techniques in catalogs are not discussed in this report. 
           
           
1_0_._1_ _ _ _ _ _ _O_b_j_e_c_t_i_v_e_s_ 10.1
           
          Prime objectives:  
           
          - the catalogs must be able to hold a very large amount of names
            (preferably no fixed limits on the number of names in a cata-
            log). 
           
          - flexible, but easy-to-understand rules for protection of other
            user>s names. 
           
          - sharing of files between users must be allowed (if so specified
            by the "owner" of the file). 
           
          - a set of access-rights must be associated with each name, so
            that a simple authorization scheme can be enforced. 
             \f

          - catalogs should be distributed on volumes (no single volume
            should hold the names of files on every other volume, since
            such a catalog could grow to enormous dimensions - and would be
            a very vulnerable point in case of errors - "if the mastercata-
            log goes, the whole system goes ..."). 
             
          Secondary objectives: 
             
          - catalogs on different volumes of backing storage (for instance
            disc-packs) should not be totally independent: inter-volume
            references are a practical tool. The danger of such references
                are that they may lead to repeated mounting of volumes just to
            continue a path in a chain of references. 
           
           
         1_0_._2_ _ _ _ _ _ _D_e_s_i_g_n_ 10.2
           
          The discussion of the Logical File System is divided into follow-
          ing main items: 
           
          - a model for naming 
          - how should files be named? 
          - how should the catalog system be structured? 
          - how should a simple authorization enforcement scheme be
            implemented? 
          - deleting of files 
           
           
1_0_._2_._1_ _ _ _ _A_ _M_o_d_e_l_ _f_o_r_ _N_a_m_i_n_g_ 10.2.1
           
          In this subsection we will consider filenames as such, i.e. the
          string of characters representing a symbolic reference to the
          data structure: a "file". We will not be bothered with reflecti-
          ons on how to organize the underlying data which represents the
          names. 
           
           \f

         1_0_._2_._1_._1_ _ _S_p_e_c_i_a_l_ _O_b_j_e_c_t_i_v_e_s_ _o_f_ _N_a_m_i_n_g_ 10.2.1.1
           
          Following special objectives concerning the naming of files could
          be drawn (in accordance with the general objectives of the Logi-
          cal File System): 
                    
               - File names are chosen and used by humans: naming rules
                 must allow names which are easily recognized and remembe-
                 red by humans. 
                  
               - In a file system a file is considered an o_b_j_e_c_t_ of the
                 class of files. It is natural to divide the class into
                 groups of objects in different ways. A mechanism of divi-
                 ding often used, is the hierarchical structuring (since it
                 mirrors the common structure of labour-organization --
                 amongst human workers as well as tasks/projects). However,
                 other structures of division may be used too. 
                  
               - The set of accessible filenames should not be static. Dif-
                 ferent users may see different subsets (maybe even totally
                 independent subsets). 
                  
               - Users seeing separate subsets of filenames must be able to
                 name distinct files with the one and same name. User A may
                 see a file "PIP" which has nothing to do with the file
                 "PIP" of user B. 
                  
               - Different users with shared access to a single file must
                 be able to name this file individually, i.e. a file may
                 have several names. 
                  
                  
1_0_._2_._1_._2_ _ _N_a_m_e_s_:_ _A_n_ _A_b_s_t_r_a_c_t_ _M_o_d_e_l_ 10.2.1.2
           
          Now, let us try to express the notions of "naming" abstractly.
          First of all we define the words: "context", "partial filename",
          and "complete filename". 
           \f

          The objective of allowing one name to represent several separate
          files means that the interpretation of a filename depends on the
          c_o_n_t_e_x_t_ in which it is used. 
           
          This leads to the notion of "c_o_m_p_l_e_t_e_" and "p_a_r_t_i_a_l_" filenames. A
          complete filename is -- by definition -- unambiguous. Partial
          filenames may very well be ambiguous, but the context in which
          they are used will determine their corresponding complete file-
          names -- thereby giving them exact and unambiguous interpretati-
          ons. 
           
          The construction of complete filenames may be a facility of the
          AM-level. It will automatically append some sort of context
          identification (prefix) to any user specified filename. This
          implies that a filename always is unambiguous (complete) in the
          interface between AM and LFS. 
           
          The context of a user is defined and perhaps changed by some sort
          of supervisory system (possibly embedded in the AM-level). 
           
                   The properties of a naming system could be represented as a
          directed graph G. The context of any user is represented by a
          unique vertex of the graph G, called his "context-vertex". A user
          is said to have "access to" a vertex V if and only if there is an
          (not necessarily unique) oriented path (eDd1Uu, eDd2Uu, ---, eDdnUu)
          from V to his context-vertex CV (eDdiUu is the name of edge i in the 
          digraph). The tuple (eDd1Uu, eDd2Uu, ---, eDdnUu) is called the "partial name"  
          of vertex V as seen from CV. Vertices with in-degree equal to
          zero are called "files", all others are called "catalogs". This
          implies that a user with context-vertex of type "file" has access
          to n_o_ other vertices, whereas a user with context-vertex of type
          catalog may have access to a number of vertices -- in fact to the
          sub-digraph of which the context-vertex is a root. 
                    \f

T_           
           
           
           
          (tegning) 
           
           
           
           
           
           
           
          Figure 10.1: Example of a digraph structure. 
           
           
          E_x_a_m_p_l_e_: User A with context-vertex C1 has a_c_c_e_s_s_ _t_o_ C1, F1, C3,
                   F2, F3, and F4. 
                   User B with context-vertex C2 has access to C2, F4, F5,
&_                   and F6. 
                  
M_M_m_                   P_a_r_t_i_a_l_ _n_a_m_e_s_ of F1 as seen from C1 could be (e ), (e , 
P_P_p_                                                                  2     1 
M_M_m_                   e ), (e , e , e ), etc. 
P_P_p_                    2     1   1   2 
           
                   As F4 are accessible from both C1, and C2, partial names
M_M_m_                   of F4 could be e.g. (e ), (e ), (e , e ), etc. 
P_P_p_                                         3     4     5   4 
           
          To interpret this abstract model in terms of the well-known noti-
          ons of filenames (as a string of characters) and context (as the
          state in which a user finds the file system, defining the subset
          of filenames accessible), we define two f_u_n_c_t_i_o_n_s_ on an arbitrary
          digraph D. 
           
                   First, define following sets: 
           
            E =   e   e is an edge of D 
M_M_m_                                    n 
                P =   (e ,e ,...,e )   E   (e ,e ,...e ) is an oriented path in D
P_P_p_                    1  2      n          1  1     n 
            V =   v   v is a vertex in D 
            C =   c   c defines a "context" 
            S =   s   s is a string of characters 
           \f

          Then define the two functions: 
           
            NAME : P   S 
            DEFINECONTEXT: C   V 
           
                   The situation of this point is: 
           
          Associated with every user of the file system is a context c
          (this context may be defined in various ways: by a user-password,
          by explicit command of the user, etc.). If we interpret the ver-
          tices of file-type as file i_d_e_n_t_i_f_i_e_r_s_ (i.e. for every file in
          the file system there exists one unique file-type vertex), we may
          consequently interpret the oriented paths finishing in the vertex
          defined by the value of D_E_F_I_N_E_C_O_N_T_E_X_T_(c) (and originating in a
          file-type vertex), as representations of the accessible file-
          names. The function N_A_M_E_ maps these paths into ordinary string
          filenames. 
           
           
1_0_._2_._2_ _ _ _ _H_o_w_ _S_h_o_u_l_d_ _F_i_l_e_s_ _b_e_ _N_a_m_e_d_?_ 10.2.2
           
          Now the problem of choosing a reasonable naming method corres-
          ponds to solving the following sub-problems. 
           
          - definition of restrictions on the digraph structure 
          - definition of the function NAME 
          - definition of the function DEFINECONTEXT. 
           
           
1_0_._2_._2_._1_ _ _R_e_s_t_r_i_c_t_i_o_n_s_ _o_n_ _t_h_e_ _D_i_g_r_a_p_h_ _S_t_r_u_c_t_u_r_e_ 10.2.2.1
           
          P_r_o_p_o_s_a_l_: Only one vertex of catalog type exists. The rest of the
                    vertices in the digraph are all of file-type. The di-
                    graph forms an oriented tree.  
                    (RC system 2, PDP SOLO) 
                     \f

T_           
           
           
           
             
           
           
           
            Figure 10.2: Global catalog. 
&_           
           
          This is the simplest imaginable naming system. Only a single non-
          trivial context-vertex exists, namely the catalog-type vertex.
          All users have shared access (at least at the level of naming) to
          all files. 
           
          Of course this does not meet the objectives of the naming system.
           
          P_r_o_p_o_s_a_l_: The digraph forms an oriented tree with three levels.
                    The root may be called the "Master File Directory"
                    (MFD); rest of the catalog-type vertices may be called
                    "User File Directories" or (UFD) "subcatalogs".  
                    (TITAN, RC3600). 
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
          Figure 10.3: Two-level catalog structure. 
                    
           \f

                   Different users may have different context-vertices (correspond-
          ing to the UFD>s) in this proposal. Naming is still very simple,
          but it does not allow multiple naming of a file. 
           
          P_r_o_p_o_s_a_l_: The digraph forms an oriented tree with an arbitrary
                    number of levels. 
                    (RC system 3) 
                     
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 10.4: Tree-structure. 
           
          As an example of this proposal we may take the RC system 3 naming
          system (used on RC4000 and RC8000): 
           
            Slightly s_i_m_p_l_i_f_i_e_d_ we can describe the rules of accessibility
            and protection as follows: 
             
            Every filename in the file system is connected with two
            integers, forming an interval (called the baseinterval of the
            filename). 
             
            Every process accessing the file system is connected with a
            base-interval defining the accessible and protected filenames. 
             
            A filename can be used unrestrictedly from a given process, if
            (and only if) the base-interval of the filename is completely
            covered by the base-interval of the process. 
             \f

            Furthermore a filename can be accessed (for reading) if the
            base-interval of the filename completely covers the base-inter-
            val of the process. 
             
                     These two access rules obviously corresponds to t_w_o_ independent
            oriented trees of the sort proposed:  an "update-tree" and a
            "read-only-tree". 
             
          The notable drawback of the proposal is that it does not allow
          multiple naming of a file. This was a primary objective of the
          LFS. 
           
          The problem may be overcome by slackening the restrictions, al-
          lowing the file-type vertices to have out-degree greater than one
          (this means that the digraph is not restricted to the oriented
          t_r_e_e_ organization). 
           
          P_r_o_p_o_s_a_l_: The digraph is r_o_o_t_e_d_, but otherwise unrestricted. 
                    (OS6) 
                     
          This is the most liberal proposal possible. It offers completely
          optional choise of naming system for any augmenting level. 
           
          The proposal will be adapted in the final design. 
           
           
1_0_._2_._2_._2_ _ _T_h_e_ _F_u_n_c_t_i_o_n_ _N_A_M_E_ 10.2.2.2
           
          We will make two restrictions on the function NAME: 
           
M_M_m_               - two a_l_m_o_s_t_ identical paths (e , e , e , x) and (e , e , e , y)
P_P_p_                                           1   2   3           1   2   3 
              should be named a_l_m_o_s_t_ identically (to be easily recognized
              by the humans). 
               
              This could be fulfilled if: 
                NAME (eDd1Uu, eDd2Uu) = NAME(eDd1Uu) d NAME(eDd2Uu) 
                 where d is some sort of character delimiter. 
              Reasonable and often used choises for d are ".", "/",  or
              ":".  
               \f

            - to ensure unambiguiety in connection with the above restric-
              tion, we must define: 
                NAME(eDd1Uu) 0=/5  NAME (eDd2Uu) 
              if eDd1Uu and eDd2Uu both are edges initiating in the same vertex
              (no two names in a catalog may be identical). 
               
               
1_0_._2_._2_._3_ _ _T_h_e_ _F_u_n_c_t_i_o_n_ _D_E_F_I_N_E_C_O_N_T_E_X_T_ 10.2.2.3
           
          The function DEFINECONTEXT maps the abstract notion of a "user-
          context" into an actual vertex of the naming-digraph. 
           
                   The user-context may be defined by means of passwords, explicit
          command, jobnames, etc. This is definitely not a problem which
          the file system nucleus should deal with. It will be left to aug-
          menting levels. 
           
           
1_0_._2_._2_._4_ _ _S_u_m_m_a_r_y_ _o_f_ _N_a_m_i_n_g_ _R_e_s_t_r_i_c_t_i_o_n_s_ 10.2.2.4
           
          The naming of files may be represented by a d_i_g_r_a_p_h_. The vertices
          of the digraph are of f_i_l_e_ type if their in-degree equals zero,
          otherwise these are of c_a_t_a_l_o_g_ type. The digraph must be r_o_o_t_e_d_
          and a_c_y_c_l_i_c_. Every edge of the digraph has a name (string of
          ASCII-characters). The names of the edges ending in a catalog-
          type vertex are the names c_o_n_t_a_i_n_e_d_ in this catalog. No two
          identical names may be contained in the same catalog. The c_o_m_-
          p_l_e_t_e_ name of a vertex (file or catalog), is the concatenated
          string of edge-names (delimited by a special character such as
          "."), so that the edges form a path from the vertex to the root. 
           
           
1_0_._2_._3_ _ _ _ _S_t_r_u_c_t_u_r_e_ _o_f_ _t_h_e_ _C_a_t_a_l_o_g_s_ 10.2.3
           
          This subsection deals with the actual implementation of the di-
          graph structure described in subsection 10.2.2.1. 
           
          There are two types of vertices: files and catalogs. The imple-
          mentation of file-type vertices has been discussed in great\f

          detail in previous chapters. So it is the implementation of
          catalog-type vertices that remains. 
           
          The problem is: how to represent catalog-type vertices by actual
          data-structures? 
           
              P_r_o_p_o_s_a_l_: All catalog-information is collected in o_n_e_ file, a
                    "Master-catalog". 
                     
          This proposal is obviously relative simple to implement. The file
          should be organized allowing random access. Searching may
          therefore be fast, since the organization scheme could be made to
          fit the usage precisely. 
           
          The notable disadvantage of the proposal is, that the catalog
          information is not distributed on the individual volumes: The
          volume holding the Master-catalog must always be mounted! If
          there is a lot of files on the backing storage, the catalog could
          grow to enormous dimensions. This is naturally in conflict with
          the objectives of the LFS. 
           
          P_r_o_p_o_s_a_l_: There is a single "volume-directory" file on each
                    volume, containing the collection of all the catalogs
                    of the volume. 
                    (RC System 3) 
                     
              This proposal fulfils the stated objectives. Still, the volume-
              catalog may grow, containing numerous entries, if the volume is
                   big. It may be difficult to dimension the catalog optimally,
          because it is practically impossible to predict the actual number
          and distibution of entries. This may cause some degradation of
          performance (overflow problems etc.). 
           
          P_r_o_p_o_s_a_l_: Every catalog-type vertex corresponds to an individual
                    catalog file. 
                    (OS6) 
                     \f

          This is probably the "cleanest" design. Catalog files may be
          dimensioned and organized individually, according to the typicals
          of the files they reference. 
           
          The danger of the method is that "long" filenames containing
          several concatenated simple names, may be rather time-consuming
          to interpret, since every individual catalog in the "path" of the
          filename must be (1) opened, (2) searched, and possibly (3)
          closed. 
           
          However, this problem may be more or less remedied by opening
          frequently used catalogs permanently. 
           
          The last proposal will be chosen for the final design. 
           
           
    1_0_._2_._4_ _ _ _ _A_u_t_h_o_r_i_z_a_t_i_o_n_ _E_n_f_o_r_c_e_m_e_n_t_ 10.2.4
           
          Authorization enforcement is of great importance both in a
          multi-user environment and in a single-user environment, since it
          not only protects against maliciousness -- but also against
          accidental errors. 
           
          Therefore it is a necessary and essential part of the LFS. 
           
          On the other hand it should certainly not be sophisticated,
          adding too much complexity to the file system nucleus: 
          Sophistication should be left to augmenting systems. 
           
                   The naming system described in the previous subsections partly
          controls the users access to files (a user can only access files
          which he can name). But this is not sufficient because it is an
          "all-or-nothing" sort of enforcement. It is necessary to control
          access to files in a more minute way. 
           \f

          A reasonable set of possible authorizations for a user of a file
          (catalog or data-file) are: 
           
              authorization to: 
              - RETRIEVE data 
              - UPDATE data 
              - ADJUST length of file 
              - DELETE file. 
           
          The main problem of authorization enforcement is: how are author-
          izations granted to separate users of the same file? 
           
          It would involve substantial additional administration overhead
          to the file system, if it were to maintain separate descriptions
          of the individual users (so-called user-profiles), defining the
          authority of each one. Such natural extensions will be left to
          augmenting systems. 
           
                   Instead we will use the naming system exclusively, for defining
          "users". If two users are to have different authority relative to
          a file, they must name the file individually, thus allowing dif-
          ferent authorization attributes to be associated with each names.
           
          In keeping with this convention, it is natural to define the
          o_w_n_e_r_-name of a file, as the name under which the file were ori-
          ginally created. If other names are linked to this name (i.e. re-
          ferencing the same file) they must be g_r_a_n_t_e_d_ authority by the
          owner-name. 
           
          A very simple -- but effective -- scheme for granting of author-
          ities is: whenever a name A is linked to a name B, B will be
          granted authorities which are a subset of A>s. The authorities
                   of a name may be changed if and only if the (not mentioned
          earlier) authority AUTHORIZE is contained within the authoriza-
          tion attributes of the name. 
           \f

          E_x_a_m_p_l_e_: 
           
            A file is created under the name of A with following
            authorities: 
             
              A: RETRIEVE, UPDATE, ADJUST, DELETE, AUTHORIZE. 
             
            That is: all authorities. 
             
            Since the user of A wants to protect his file against deleting,
            he defines that only the authorities RETRIEVE, UPDATE, and
            ADJUST may be granted to linked names: 
             
              A: R_E_T_R_I_E_V_E_ , U_P_D_A_T_E_, A_D_J_U_S_T_, DELETE, AUTHORIZE 
             
            If a name B is linked to A, it inherits following authorities: 
             
              B: RETRIEVE, UPDATE, ADJUST 
             
            The user of B -- in his place -- wants to protect the file
            against any updating from subsequently linked names, and defi-
            nes only RETRIEVE as inheritable: 
             
              B: R_E_T_R_I_E_V_E_, UPDATE, ADJUST 
             
            A name C linked to B, inherits: 
             
              C: RETRIEVE 
           
          In case of compound filenames (i.e. concatenated names, e.g.
          "CAT1.CAT2.PIP") the set of authorities in effect is the
          i_n_t_e_r_s_e_c_t_i_o_n_ of the sets for each of the individual simple names.
           
          Thus, all the files of a catalog may be protected against upda-
          ting, if the UPDATE authorization is absent from the authority of
          the catalog name. In fact it will not even be possible to insert
          new, nor delete existing names in the catalog. 
           \f

          E_x_a_m_p_l_e_: 
           
             Consider a multi-user system in which every user has his own
             private subtree catalog structure. The authorizations associated
          with the root of this subtree are presumably unrestricted. To
          prevent interference between users, no user subtree may contain
          backward references to catalog levels beyond that of the subtree
          root. 
           
          On the other hand, a number of files must be sharable between the
          users: utility programs, system programs, compilers, etc. This
          may easily be accomplished by the scheme outlined in figure 10.5:
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 10.5: Example of multi-user directory structure.
                       Authorizations are showed at the edges. 
           
          It will not be possible for any user (who has not access to the
          system root) to update any file in the subtree of utilities. 
           \f

                   This scheme offers basic facilities for propagating authorities
          in the naming system. However, it lacks the ability to protect a
          user against own accidental misuse (d_e_f_e_n_s_i_v_e_ protection). If a
          user temporarily wants to write-protect (say) a file, he can only
          do so by removing some of his own authorities, possibly never to
          regain them. This is unacceptable, so we define another set of
          attributes, p_r_o_t_e_c_t_i_o_n_s_, exactly equal to the -- not to mistake
          for -- authorizations (viz. RETRIEVE, UPDATE, ADJUST, DELETE,
          AUTHORIZE). 
           
          Protections may be altered at any time and are local to each
          name. 
           
           
     1_0_._2_._5_ _ _ _ _D_e_l_e_t_i_n_g_ _o_f_ _F_i_l_e_s_     10.2.5
           
          Deleting of files is a non-trivial problem in the chosen catalog-
          structure. The point is: A given file may be referenced by sev-
          eral names. If the file is requested to be deleted through one of
          the names, what should happen with the other names, referencing
          the same file. 
           
          P_r_o_p_o_s_a_l_: The entry in question in the File Location Table is
                    marked "deleted", and the actual file is deleted ef-
                    fectively. Later references to the file will be stopped
                    (and notified) by the deleted FLT-entry. 
                     
          The proposal solves the problem, but unfortunately the File Loca-
          tion Table will grow indefinitely, since no entry may ever be ef-
          fectively deleted and re-used. 
           
          P_r_o_p_o_s_a_l_: A counter is inserted into every FLT-entry. The counter
                    gives the number of undeleted names pointing at the en-
                    try. When the counter is zero, the entry may be re-used
                    for another file. 
                     
          This proposal seems allright at first look, but it does have a
          well-known, classical drawback (Knuth 1969). 
           \f

          Deleting of a name is the same as deleting (at least) one edge in
          the corresponding digraph. If -- after deletion -- one or more
          vertices become isolated from the root of the original digraph,
          they are unaccessible, and should therefore be effectively dele-
          ted. Counting of references to a FLT-entry corresponds to count-
           ing of the o_u_t_-degree of the referenced file -- in terms of the
          digraph model of subsection 10.2.1.2. When the out-degree is
          zero, the vertex is unaccessible, and must be deleted together
          with all the edges that end in the vertex. One should think that
          by recursive application of the method, the unaccessible parts of
          the digraph will be deleted. Unfortunately that is not so in all
          cases. 
           
                   Consider the following example: 
           
           
           
           
           
           
           
           
           
           
          Figure 10.6: Example of cyclic digraph. 
           
          where C1 is the root. 
           
          If the edge eDd1Uu is deleted C2 and C3 will become unaccessible,
          and should consequently be deleted. However, the above proposed
          "garbage collection" algorithm cannot do the job: both C2 and C3
          have outdegree equal to one. 
           
          The reason for this trouble is, that the algorithm does not work,
          if the "garbage" contains c_y_c_l_i_c_ references! 
           
          It is extremely difficult to prohibit cyclic references without
          at the same time restricting the digraph structure unnecessarily
          (the digraph could for instance be restricted to a t_r_e_e_, ensuring
                    \f

          acyclicity), since it is difficult to check a structure for
          cyclic references. 
           
          The problem may be solved by either (1) restrictions on the
          digraph structure, (2) check of acyclicity on file-creation time,
          (3) check for cyclic references at file-deletion time, or (4) use
          of an individual garbage collection utility program checking the
          whole digraph structure. 
           
          A_n_ _e_x_a_m_p_l_e_ of a possible method for acyclicity enforcement: 
           
               A status variable called LEVEL is retained in every file of
                    type catalog. This variable denotes the level (i.e. the
                    l_o_n_g_e_s_t_ path of references from the root). 
                                                  
                     
                                                         LEVEL for 
                                                              MAINCAT:  0 
                                                              CAT1:     1 
                                                              CAT2:     2 
                                                              CAT3:     3 
                                                  
                     
                     
                     
                     
                    Figure 10.7: Example 
                     
                    The LEVEL variable is easily computed when a catalog is
                    created (add one to the level of the mother-catalog). 
                     
                    When a new reference between two existing catalogs is
               inserted (an entry "CATB" (say) -- referencing the catalog B
               -- is inserted in catalog A (say)), it should be checked
               that the LEVEL of the referenced catalog (catalog B) is
               greater than (and not equal to) the LEVEL of the "mother"-
               catalog (catalog A). If this condition is met no cyclic re-
               ferences can be introduced. 
                \f

                   This example suffers from adding unnecessary restrictions to the
          acyclicity restriction, too. Admittedly, every acyclic digraph
          may be constructed under the restrictions of the example, but it
          is very critical how the creations of inter-catalog references
          are sequenced. Consider Fig. 10.7: the reference eDd3Uu m_u_s_t_ be
          created before eDd4Uu. 
           
          Instead of implementing either a simple, but unnecessary restric-
          tive, or a very complex acyclicity enforcement system, it is the
          decision of the present design to leave such to augmenting levels
          of software. That is, no acyclicity enforcement scheme is
          implemented in the design. 
           
          This decision seems reasonable, remembering that the possible
          amount of garbage is restricted to a number of File Location
          Table entries. 
           
           
     1_0_._3_ _ _ _ _ _ _B_a_s_i_c_ _F_u_n_c_t_i_o_n_s_ _o_f_ _t_h_e_ _L_F_S_     10.3
           
                   Since the LFS is augmenting the BFS-level in the hierarchical
          structure of the file system, the LFS-functions handling files
          resembles the corresponding functions of the BFS (cf. section
          5.3). 
           
          The difference is that the file identifier supplied in the func-
          tions of the BFS should be substituted by a symbolic filename in
          the functions of the LFS. 
           
          The syntactical rules for naming of files -- as defined by the
          restrictions on the function NAME (cf. section 10.2 -- could be
          expressed like this in Backus-Naur notation: 
           
            <name'::= <catalogname' <d' <simple name' 
            <catalogname'::= <catalogname' <d' <simple name' 
            <simple name'::= "algol-like identifier" 
            <d'::= >.>  >:>  >/> 
           \f

          However, it is not necessarily fortunate to express filenames as
                   a string of concatenated catalog- and file-names, in the a_r_g_u_-
          m_e_n_t_s_ of LFS-functions. 
           
          The recursive definition above suggests a way to express a
          filename in the functions of the LFS, namely:
          (catalog _identifier, simple _name). Instead of using the complete
          filename (and consequently interpreting it) every time a function
          is called (e.g. OPEN ("cat1.cat2.cat3.pip", ...)), one may find
          the file _identifier (the unique internal name, cf. subsection
          5.2.1) for the "catalog-part" of the name string (that is
          "cat1.cat2.cat3" in the above example), and just stating the
          simple name ("pip") after this (OPEN (catid, "pip", ...)). 
           
          This way to name files on the LFS-level offers potent facilities
          to augmenting levels. An augmenting naming system may for instan-
          ce maintain a table of catalog _identifiers with an entry for each
          user. Now the user only has to specify a simple name to reference
          a file -- the naming system automatically supplies the
          catalog _identifier of the user. The catalog _identifiers may be
          initialized by means of user-supplied passwords, thereby imple-
          menting a simple authorization enforcement scheme on u_s_e_r_s_. 
           
          A reasonable set of functions on the LFS-level is: 
                    
               mount(volumename, device, cat _id) 
                   dismount(device) 
                    
                   connect(cat _id, name, new _cat _id) 
                   disconnect(cat _id) 
                    
                   lookup(cat _id, name, attributes, descriptor) 
                    
                   open(cat _id, name, mode, file _id) 
                   close(file _id) 
                    
                   get(file _id, buffer, first _page, count) 
                   put(file _id, buffer, first _page, count) 
                    \f

                   create(cat _id, name, init _data) 
                   delete(cat _id, name) 
                    
                   linkname(cat _id _1, newname, cat _id _2, oldname) 
                   rename(cat _id, oldname, newname) 
                    
                   extend(cat _id, name, amount) 
                   truncate (cat _id, name, amount) 
                    
                   set _tail(cat _id, name, tail) 
                    
                   set _authority(cat _id, name, authorizations) 
                   set _inheritance(cat _id, name, inheritable _authorizations) 
                   set _protection(cat _id, name, protections) 
           
                   Please refer to chapter 6 for description of the functions. 
           
           
         1_0_._4_ _ _ _ _ _ _C_o_n_c_l_u_d_i_n_g_ _R_e_m_a_r_k_s_         10.4
           
          None of the objectives of section 10.1 are neglected. 
           
                   The chosen catalog structure is compatible with the file system
          of UNIX (Richie et al. 1974), in the sense that the interface of
          UNIX may be simulated, provided that a proper set of restrictions
          and supporting facilities are built on, in a superimposing level
          to the LFS. Owing to the increasing popularity of UNIX and
          related systems (Hanson 1980) this seems worthwhile to note if
          considering standardization on the level of access interface. 
           \f

F_1_1_._ _ _ _ _ _ _ _R_E_M_A_R_K_S_ _O_N_ _I_M_P_L_E_M_E_N_T_A_T_I_O_N_ 11.
           
          As stated in the introduction (section 1.1) the present report is
          part of a development-project at A/S Regnecentralen af 1979. The
          outcome of this project must be an actual implementation of the
          designed file system. 
             
          However, it is not within the scope of this report to describe
          implementation in detail, but a general outline of the ideas and
          structure of a possible implementation will be given in this
          chapter. 
            
          The intended implementation language is PASCAL80 (Staunstrup
          1980). 
           
           
1_1_._1_ _ _ _ _ _ _S_t_r_u_c_t_u_r_i_n_g_ _t_h_e_ _F_i_l_e_ _S_y_s_t_e_m_ 11.1
           
          The individual levels of the design presented in chapter 4
          are conseived as p_r_o_c_e_s_s_e_s_ (or incarnations of processes). 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 11.1: Processes of the file system, nested. 
           \f

            Figure 11.1 shows the processes of the system. The processes are
          -- in keeping with ordinary PASCAL80 principles -- conceived as
          n_e_s_t_e_d_ processes. 
           
          However, it may be opportune -- in a not-so-distant future -- to
          distribute the file system over a number of loosely connected
          computers, each with its own private memory. 
           
          Fortunately such possibilities are inherent in the structure of
          the implementation language PASCAL80, because all modularization
          of programs is done by dividing the code into separate processes
          (processes contain completely closed address spaces; the only
          information that can be imported or exported from a process must
          go through process p_a_r_a_m_e_t_e_r_s_ or through message s_e_m_a_p_h_o_r_e_s_). 
           
          Consequently the organization of fig. 11.1 is preferably restruc-
          tured -- from the n_e_s_t_e_d_ organization to a "h_o_r_i_z_o_n_t_a_l_" organi-
          zation of processes. 
           
          The horizontal organization of fig. 11.2 allows distribution of
          the individual processes over a number of connected computers.  
           
           
           
           
           
           
           
           
           
           
          Figure 11.2: Processes of the file system, "horizontal" design. 
           
           
         1_1_._2_ _ _ _ _ _ _T_r_a_n_s_p_a_r_a_n_c_y_ _o_f_ _H_i_e_r_a_r_c_h_i_c_a_l_ _L_e_v_e_l_s_ 11.2
           
          The hierarchical model of chapter 2 proved very convenient for
          the design of the file system. 
           \f

          However, in the actual implementation the structure need not be
          too rigoristic. 
           
          It is not at all efficient if a procedural call to one level
          simply results in an exactly identical call to the next level
          (i.e. the level is transparent with respect to the requested
          operation). 
           
          An example of such unwanted overhead is the call of "get". As
          illustrated in section 2.2 this does not involve LFS or BFS (be-
          cause open performs the operations of these levels). It would
          indeed be ineffective if "get" were to be called through both LFS
          and BFS. 
           
          The actual entry-points of the levels are illustrated in fig.
          11.3. 
           \f

           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
                                        Figure 11.3: Interconnections in
                                                     the file system. 
                    
           \f

F_       1_2_._ _ _ _ _ _ _ _A_ _P_R_E_L_I_M_I_N_A_R_Y_ _R_E_F_E_R_E_N_C_E_ _M_A_N_U_A_L_    12.
           
1_2_._1_ _ _ _ _ _ _I_n_t_r_o_d_u_c_t_i_o_n_ 12.1
           
          The present text describes a PASCAL80-implemented File System. 
           
          The File System is intended to administer the backing storage of
          a computer system. This backing storage may consist of several --
          possibly different -- backing storage devices, e.g. hard disks
          and floppy disks. 
           
          It is the scope of this manual to give the reader an introductory
          overview of the components and functions of the file system. Con-
          sequently, descriptions of functions etc. are sketchy and by no
          means sufficient. 
           
          The reader should refer to the future "System Programmes Referen-
          ce Manual" for detailed description of the File System. 
           
           
1_2_._2_ _ _ _ _ _ _C_o_m_p_o_n_e_n_t_s_ _o_f_ _t_h_e_ _B_a_c_k_i_n_g_ _S_t_o_r_a_g_e_                                   12.2
           
1_2_._2_._1_ _ _ _ _V_o_l_u_m_e_s_ 12.2.1
           
          The backing storage of a computer system consists of one or more
          v_o_l_u_m_e_s_. Each volume resides on a d_e_v_i_c_e_. A given volume is not
          necessarily tied to one particular device: volumes may be ex-
          changed or replaced. 
           
          Each volume has a v_o_l_u_m_e_n_a_m_e_, given to it by the initialization
          program formatting the volume. It is the responsibility of the
          user to ensure that volumenames are unique. 
           
              A volume may comprise a maximum of 4 G (billion) pages. 
           \f

           
           
           
           
           
           
               
           
           
           
           
           
           
          Figure 12.1: Example. 
                       Volume 2, 3, and 4 are mounted on the devices 2, 3,
                       and 1 respectively. The volumes 1 and 5 are not
                       mounted (dismounted). 
           
           
     1_2_._2_._2_ _ _ _ _P_a_g_e_s_     12.2.2
           
          A volume consists of a number of pages. One page contains 512
          bytes (octets). Pages may be a_l_l_o_c_a_t_e_d_ or f_r_e_e_ (i.e. not-in-use).
           
          Free pages are not allocated individually: the smallest unit of
          allocation is a s_l_i_c_e_ (consisting of a number of pages). The
          slice-size may vary from volume to volume. 
           
          The free slices of a volume are administered by the B_i_t_ _T_a_b_l_e_, in
          which every slice of the volume is represented by one bit (a
          slice is free if the corresponding bit is set). 
           
           
1_2_._2_._3_ _ _ _ _F_i_l_e_s_ 12.2.3
           
          Each volume contains a number of f_i_l_e_s_. 
               
          A file is the basic facility for permanent storage of data. 
           \f

          A file consists of a (logical) sequence of p_a_g_e_s_. The individual
                   pages (or rather: slices) of a file need not necessarily be
          placed contiguously on the volume; they may be scattered in
          c_h_u_n_k_s_ of slices. 
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 12.2: Example 
           
          The administrative data concerning the whereabouts of the chunks
          of a file are placed on the first page of the file. A file may
          comprise a maximum of 25 chunks of arbitrary size. A file may
          hold all the pages of a volume. 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 12.3: File organization. 
           \f

          The first page moreover contains the d_e_s_c_r_i_p_t_o_r_ of the file. The
          descriptor describes the status of the file in terms of length,
          reservation locks, etc. 
           
          The first page of a file is called the d_e_s_c_r_i_p_t_o_r_ _p_a_g_e_ of the
          file. 
           
          The locations of files are administered by the F_i_l_e_ _L_o_c_a_t_i_o_n_
          T_a_b_l_e_ (FLT). This table contains the address of every file (i.e.
          the address of its first page). No two table entries point to the
          same file; that is: the table index of a given file is unambi-
          guous within the volume. Therefore the FLT-index of a file to-
          gether with the corresponding volumename is used as a unique in-
          ternal name for that file. 
           
                   The pair of data (volumename, FLT-index) is called a f_i_l_e_ _i_d_e_n_t_-
          i_f_i_e_r_. 
           
           
         1_2_._2_._4_ _ _ _ _C_a_t_a_l_o_g_s_         12.2.4
           
          Users must be able to associate symbolic n_a_m_e_s_ with files. 
           
          Symbolic names -- together with the corresponding file
          identifiers -- are stored in special files: c_a_t_a_l_o_g_s_. 
           
          There may be several catalogs on a single volume. 
           
          A symbolic name may reference a catalog, since symbolic names
          represent file identifiers and catalogs are files themselves.
          This facilitates hierarchical (or rather graph-represented)
          naming systems. 
           
          A single file identifier may be designated by several different
          names. A name may designate a file identifier on another volume. 
           
          A special catalog exists on each volume: the Rootcatalog. This
          catalog is the "root" of the hierarchy of catalogs on that volume
          (i.e. every catalog may be reached, starting at the Rootcatalog).\f

          Whenever a new volume is mounted, the File System delivers a re-
          ference to the corresponding Rootcatalog. 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 12.4: Catalog organization. 
           
           
1_2_._2_._5_ _ _ _ _V_o_l_u_m_e_d_e_s_c_r_i_p_t_i_o_n_s_ 12.2.5
           
          Every volume contains a special system file: the V_o_l_u_m_e_d_e_s_c_r_i_p_-
          t_i_o_n_. This file holds data concerning the status of the volume
          (slice size, volumename) etc. 
           
          Furthermore it contains the Bit Table and the File Location
          Table. 
           
          To be able to interpret the datastructures of an arbitrary vol-
          ume, the following convention regarding the Volumedescription
          file is made: the descriptor page of the Volumedescription file
          is always placed as the first page of the volume. 
           \f

                   This means that the Volumedescription file always can be read
          without knowledge of the exact locations of File Location Table,
          Rootcatalog, etc. It is the responsibility of the data in the
          Volume-description file to point such datastructures out. 
           
          The volumedescription file contains an extra bit table -- besides
          the Bit Table described in subsection 12.2.2. This bit table is
          called the "Malfunctions Bit Table" (MBT), and it specifies all
          slices in which persistent errors have been detected. 
           
                
1_2_._3_ _ _ _ _ _ _F_u_n_c_t_i_o_n_s_ _o_f_ _t_h_e_ _F_i_l_e_ _S_y_s_t_e_m_ 12.3
           
          Below is listed the functions of the File System nucleus. The
          notation is casual but hopefully self-explanatory. Each of the
          calls to the file system may result in an error condition. The
          return from such a situation is for simplicity not represented. 
           
           
1_2_._3_._1_ _ _ _ _V_o_l_u_m_e_ _H_a_n_d_l_i_n_g_ 12.3.1
           
          Volumes may be mounted or dismounted: 
               
              MOUNT (VOLUMENAME, DEVICE, CAT-ID) 
              DISMOUNT (DEVICE) 
               
          DEVICE specifies the device on which the volume should be
          mounted/dismounted. When a volume is mounted its name will be
          checked against VOLUMENAME. The Rootcatalog of the mounted volume
          will be referenced by CAT-ID upon return of MOUNT. 
           
           
1_2_._3_._2_ _ _ _ _C_a_t_a_l_o_g_ _H_a_n_d_l_i_n_g_ 12.3.2
           
          A catalog must be c_o_n_n_e_c_t_e_d_ ("opened") before it can be proces-
          sed. When a user connects a catalog, he will be supplied with a
          shorthand reference to this catalog. In fact this is what hap-
          pens in the function MOUNT of the previous subsection: when a
          volume is MOUNTed the Rootcatalog will automatically be connect-
          ed, and its shorthand-reference delivered in CAT-ID. 
           \f

                   A user only knows catalogs through symbolic names (which in their
          place are found in another catalog). Whenever a (simple) name is
          specified, it must be accompanied by a reference to the catalog
          in which to find the name. 
           
               CONNECT(CAT-ID, NAME, NEW-CAT-ID) 
           
          connects a new catalog. The user describes the catalog by a sym-
          bolic name in NAME and a catalog reference CAT-ID in which to
          find the name NAME. Upon return the catalog will be opened and
          referenced by NEW-CAT-ID. 
           
          When the catalog has been processed it may be "closed" by means
          of: 
           
               DISCONNECT(CAT-ID) 
           
          A specific name NAME contained in the catalog referenced by CAT-
          ID may be found by means of: 
           
               LOOKUP(CAT-ID, NAME, ATTRIBUTES, DESCRIPTOR) 
           
          This function returns the attributes of the found name, and the
          descriptor of the file 
           
           
         1_2_._3_._3_ _ _ _ _F_i_l_e_ _H_a_n_d_l_i_n_g_         12.3.3
           
          When a file is to be processed it must be opened. After proces-
          sing it may be closed (to release tied-up resources). 
           
               OPEN(CAT-ID, NAME, MODE, FILE-ID) 
               CLOSE(FILE-ID) 
           
          MODE denotes the wanted use of the file. It may be either RETRIE-
          VE, UPDATE, or both. Furthermore it must be specified whether
          PRIVATE or SHARED access is wanted. The file is designated by
          (CAT-ID, NAME). A shorthand reference to the file is returned in
          FILE-ID. 
           \f

                   The contents of the file referenced by FILE-ID may be processed
          by: 
           
               GET(FILE-ID, BUFFER, FIRST-PAGE, COUNT) 
               PUT(FILE-ID, BUFFER, FIRST-PAGE, COUNT) 
           
          which transfer a number of pages. FIRST-PAGE denotes the first
          page to be transferred to or from the file, and COUNT the number
          of subsequent pages. Pages are put or taken from BUFFER. 
           
          New files may be created: 
           
               CREATE(CAT-ID, NAME, INIT-DATA) 
           
          A file with the simple name NAME -- which is inserted into the
          catalog referenced by CAT-ID -- is created with initialization
          data (for attributes and descriptor) as in INIT-DATA. The file
          may be a catalog. 
           
          A file is deleted by 
           
               DELETE(CAT-ID, NAME) 
           
          When DELETE is called, the designated file is marked for
          deletion. The file is not actually deleted, however, until all
          connections to the file has been CLOSEd. 
           
          A catalog-file cannot be deleted, unless it is empty. 
           
          All other names referencing the same file will -- after deletion
          of the file -- be referencing an e_m_p_t_y_ entry in the File Location
          Table. 
           
          A new name may be linked to an already existing name by means of:
           
               LINKNAME(CAT-ID-1, NEWNAME, CAT-ID-2, OLDNAME) 
           \f

          A new simple NEWNAME is inserted into the catalog designated by
          CAT-ID-1. The name will reference the same file as OLDNAME of the
          catalog designated by CAT-ID-2. 
           
          A name may be changed (within a catalog) by means of: 
           
               RENAME(CAT-ID, OLDNAME, NEWNAME) 
           
          Finally a file may be extended or truncated: 
           
               EXTEND(CAT-ID, NAME, AMOUNT) 
               TRUNCATE(CAT-ID, NAME, AMOUNT) 
           
          AMOUNT is the number of s_l_i_c_e_s_ to allocate/deallocate. 
           
          Finally -- as a service function to augmenting file system levels
          -- following function allows arbitrary data to be written into
          the descriptor of a file: 
           
               SET-TAIL(CAT-ID, NAME, TAIL) 
                    
          where TAIL contains the data to be inserted into the descriptor.
          The actual format and length of TAIL is implementation dependent.
           
           
     1_2_._3_._4_ _ _ _ _A_u_t_h_o_r_i_z_a_t_i_o_n_ _E_n_f_o_r_c_e_m_e_n_t_     12.3.4
           
          The f_i_r_s_t_ _l_e_v_e_l_ of authorization enforcement is the naming sys-
          tem: users can only access the files they can name (if a user
          only knows one catalog reference, he can only access the subtree
          (or rather: subgraph) of files of which this catalog is a root). 
           
          The s_e_c_o_n_d_ _l_e_v_e_l_ of authorization enforcement concerns the
          individual symbolic names of files: associated with each simple\f

          name is a set of authorization-attributes. The total set
          comprises: 
           
               Authorization to: 
               - RETRIEVE (data) 
               - UPDATE (data) 
               - ADJUST (length of file) 
               - DELETE (file) 
               - AUTHORIZE (i.e. redefine the set of authorizations) 
           
          The set of authorizations for a given name defines the allowed
          use of the corresponding file. 
           
          When a file (possibly catalog) "FILE" (say) is OPENed
          (CONNECTED), the set of authorizations associated with the file,
          is computed as the i_n_t_e_r_s_e_c_t_i_o_n_ of the two sets associated with
          (1) the name "FILE" and (2) the catalog in which "FILE" was
          found. 
           
          If AUTHORIZE is contained in the set of authorizations for a
          name, the authorizations may be redefined by: 
           
               SET-AUTHORITY(CAT-ID, NAME, AUTHORIZATIONS) 
           
          When a new name is linked (by LINKNAME) to an existing name, it
          will inherit a s_u_b_s_e_t_ of the authorizations of the existing name.
          This subset of "inheritable" authorizations may for a given name
          be defined by: 
           
               SET-INHERITANCE(CAT-ID, NAME, INHERITABLE-AUTHORIZATIONS) 
           
          The t_h_i_r_d_ _l_e_v_e_l_ of authorization enforcement is totally local to
          each name. As a means to protect a name against accidental mis-
          use, a set of p_r_o_t_e_c_t_i_o_n_s_ is associated with each name. The set
          of protections comprises exactly the same elements as the total
          set of authorizations (viz. RETRIEVE, UPDATE, ADJUST, DELETE,
          AUTHORIZE). Whenever a function is performed via a given name, it
          is not only tested against the authorization of the name, but
          against the intersection of both authorizations and protections. 
           \f

          The difference between authorizations and protections is twofold:
           
               - protections have no influence whatsoever on inheritance of
                 authorizations. 
               - protections may be redefined unconditionally at any time. 
                
          Thus, protections are a t_e_m_p_o_r_a_r_y_ guard against a_c_c_i_d_e_n_t_s_. 
           
          The protections of a given name is redefined by: 
           
               SET-PROTECTION(CAT-ID, NAME, PROTECTIONS) 
           
           \f

F_       1_3_._ _ _ _ _ _ _ _C_O_N_C_L_U_S_I_O_N_         13.
           
          The report has shown a design of a file system nucleus offering
          basic (extendable) but potent facilities. 
           
          The emergence of high-level system programming languages makes it
          an attractive and practicable task to design a file system suited
          for use on even very different computers. The advantages are two-
          fold: portability of files between different computer systems,
          and rationalization of implementation. 
           
          It is the intention that the facilities of the file system nu-
          cleus should be extended by augmenting systems. Differing compu-
          ter systems may thus extend in different directions, but still
          preserve compatibility. 
           
          The objectives of the presented file system are chosen according-
          ly. 
           
          Special emphasis has been placed on the subjects of naming and
          support for authorization enforcement (i.e. the Logical File Sys-
          tem), providing the file system nucleus with such basic facili-
          ties, which augmenting systems may extend to a potent interface
          in a multi-user environment. 
           
          It is worth noting that the (Logical) file system interface may
                   be restricted (all within the general philosophy of the design)
          to simulate the interface of the UNIX file system (Ritchie et al.
          1974). 
           
          It is the opinion of some that UNIX -- or something closely
          resembling UNIX -- will be chosen as a standard for the environ-
          mental file system interface of the currently developed system
          programming language ADA. Since this language may come to be the
          general standard of the field, it seems reassuring that the pre-
          sent file system may be modelled to adhere to such standards. 
           
           \f

\f

F_       A_._ _ _ _ _ _ _ _ _R_E_F_E_R_E_N_C_E_S_ A.
           
          Aris, T.A. and B. Tveden-Jørgensen: RC8000 Monitor, part 2.
               Reference Manual, RCSL No 31-D 477, A/S Regnecentralen,
               Copenhagen 1978 
           
                  Brinch Hansen, P.: RC4000 Software Multiprogramming System, A/S
               Regnecentralen, RCSL No 55-D 140, Copenhagen, February 1971. 
                
          Brinch Hansen, P.: The Architecture of Concurrent Programs,
               Englewood Cliffs NJ, Prentice-Hall, 1977 
                      
          Hnatek, E. R.: Semiconductor Memory Update - Part 1, Computer
               Design p. 67, Dec. 1979 
                      
          IBM Diskette, The. General Information Manual. GA 21-9182-2, not
               dated. 
                       
                  IBM System/38. Technical Developments, IBM 1978 
           
          Jensen, K. and Niklaus Wirth: PASCAL, User Manual and Report,
                        Springer-Verlag, New York 1975 
                
          Knuth, D. E.: The Art of Computer Programming, Addison-Wesley,
               1969 
                      
          Kristensen, B. B. et al.: BETA Language Proposal. DAIMI PB-98,
               June 1979 
           
          Kristensen, Karl Aage: Filsystemer. Speciale nr. 59 ved DIKU,
               1979 
                      
                  Lampson, B.W.: Redundancy and Robustness in Memory Protection IFIP
               74, p. 128-132, 1974 
           
          Madnick, S. E. and Alsop, J. W.: A Modular Approach to File
               System Design, SJCC 1969b 
                      \f

          Madnick, S. E.: Design Strategies for File Systems: A Working
               Model. Selected Papers from FILE 68, p. 117 
               Amsterdam 1969a 
                      
                  Olsen, J.C.: RC3600 Catalog System, System Programmer>s Guide, RCSL
               No 43-GL 7915, A/S Regnecentralen, Copenhagen 1978 
           
          Ravn, A. P.: I/O in Operating Systems - Principles and
               Implementation (draft). DIKU 1980 
                      
          Ravn, A. P.: Noter til kursus: Ind- og Udlæsning på
               Operativsystemniveau, DIKU 1979 
                      
                  Redell, D.D. et al.: Pilot: An Operating System for a Personal
               Computer. CACM, vol. 23, No 2, February 1980 
           
                  Ritchie, D.M. et al.: The UNIX Time-Sharing System, vol. 17, 
               No 7, July 1974 
           
          Staunstrup, Jørgen: Pascal80 Report. A/S Regnecentralen af 1979,
               RCSL No 52-AA 964, 1980 
           
          Staunstrup, J. og S. M. Sørensen: PLATON, A High Level Language
               for System Programming, RECAU, R-75-59, May 1975 
           
                  Stoy, J.E. and C. Strachey: OS6 - An Experimental Operating System
               for a Small Computer, part 1: CACM, vol. 15, No 2, part 2:
               CACM, vol. 15, No 3, June 1972 
           
                  Teorey, T.J. and T.B. Pinkerton: A Comparative Analysis of Disk
               Scheduling Policies. CACM, Vol. 15, No 3, pp. 177-184, March
               1972 
                    
          Wegner, P.: Programming with ADA: An Introduction by Means of
               Graduated Examples. SIGPLAN Notices vol. 14, No 12, December
               1979  
           
          Wirth, N.: MODULA: a Language for Modular Multiprogramming,
               Software Practice and Experience 7, 1, pp. 3-55, 1977 
           
                  Wong, C.K.: Minimizing Expected Head Movement in One-Dimensional
               and Two-Dimensional Mass Storage Systems. Computing Surveys,
               vol. 12, No 2, June 1980 
           \f

                    
           \f

«eof»