Contents

  1. Preface xxiii

  1. 1 Introduction 1

    1. 1.1 What is an Operating System? 4

      1. 1.1.1 The Operating System as an Extended Machine 4

      2. 1.1.2 The Operating System as a Resource Manager 6

    2. 1.2 History of Operating Systems 7

      1. 1.2.1 The First Generation (1945–1955): Vacuum Tubes 8

      2. 1.2.2 The Second Generation (1955–1965): Transistors and Batch Systems 8

      3. 1.2.3 The Third Generation (1965–1980): ICs and Multiprogramming 10

      4. 1.2.4 The Fourth Generation (1980–Present): Personal Computers 15

      5. 1.2.5 The Fifth Generation (1990–Present): Mobile Computers 19

    3. 1.3 Computer Hardware Review 20

      1. 1.3.1 Processors 20

      2. 1.3.2 Memory 24

      3. 1.3.3 Nonvolatile Storage 28

      4. 1.3.4 I/O Devices 29

      5. 1.3.5 Buses 33

      6. 1.3.6 Booting the Computer 34

    4. 1.4 The Operating System Zoo 36

      1. 1.4.1 Mainframe Operating Systems 36

      2. 1.4.2 Server Operating Systems 37

      3. 1.4.3 Personal Computer Operating Systems 37

      4. 1.4.4 Smartphone and Handheld Computer Operating Systems 37

      5. 1.4.5 The Internet of Things and Embedded Operating Systems 37

      6. 1.4.6 Real-Time Operating Systems 38

      7. 1.4.7 Smart Card Operating Systems 39

    5. 1.5 Operating System Concepts 39

      1. 1.5.1 Processes 39

      2. 1.5.2 Address Spaces 41

      3. 1.5.3 Files 42

      4. 1.5.4 Input/Output 45

      5. 1.5.5 Protection 46

      6. 1.5.6 The Shell 46

      7. 1.5.7 Ontogeny Recapitulates Phylogeny 47

    6. 1.6 System Calls 50

      1. 1.6.1 System Calls for Process Management 53

      2. 1.6.2 System Calls for File Management 57

      3. 1.6.3 System Calls for Directory Management 58

      4. 1.6.4 Miscellaneous System Calls 60

      5. 1.6.5 The Windows API 60

    7. 1.7 Operating System Structure 63

      1. 1.7.1 Monolithic Systems 63

      2. 1.7.2 Layered Systems 64

      3. 1.7.3 Microkernels 66

      4. 1.7.4 Client-Server Model 68

      5. 1.7.5 Virtual Machines 69

      6. 1.7.6 Exokernels and Unikernels 73

    8. 1.8 The World According to C 74

      1. 1.8.1 The C Language 74

      2. 1.8.2 Header Files 75

      3. 1.8.3 Large Programming Projects 76

      4. 1.8.4 The Model of Run Time 78

    9. 1.9 Research on Operating Systems 78

    10. 1.10 Outline of the Rest of this Book 79

    11. 1.11 Metric Units 80

    1. 1.12 Summary 81

  2. 2 Processes and Threads 85

    1. 2.1 Processes 85

      1. 2.1.1 The Process Model 86

      2. 2.1.2 Process Creation 88

      3. 2.1.3 Process Termination 90

      4. 2.1.4 Process Hierarchies 91

      5. 2.1.5 Process States 92

      6. 2.1.6 Implementation of Processes 94

      7. 2.1.7 Modeling Multiprogramming 95

    2. 2.2 Threads 97

      1. 2.2.1 Thread Usage 97

      2. 2.2.2 The Classical Thread Model 102

      3. 2.2.3 POSIX Threads 106

      4. 2.2.4 Implementing Threads in User Space 107

      5. 2.2.5 Implementing Threads in the Kernel 111

      6. 2.2.6 Hybrid Implementations 112

      7. 2.2.7 Making Single-Threaded Code Multithreaded 113

    3. 2.3 Event-Driven Servers 116

    4. 2.4 Synchronization and Interprocess Communication 119

      1. 2.4.1 Race Conditions 119

      2. 2.4.2 Critical Regions 120

      3. 2.4.3 Mutual Exclusion with Busy Waiting 121

      4. 2.4.4 Sleep and Wakeup 127

      5. 2.4.5 Semaphores 129

      6. 2.4.6 Mutexes 134

      7. 2.4.7 Monitors 138

      8. 2.4.8 Message Passing 145

      9. 2.4.9 Barriers 148

      10. 2.4.10 Priority Inversion 150

      11. 2.4.11 Avoiding Locks: Read-Copy-Update 151

    5. 2.5 Scheduling 152

      1. 2.5.1 Introduction to Scheduling 153

      2. 2.5.2 Scheduling in Batch Systems 160

      3. 2.5.3 Scheduling in Interactive Systems 162

      4. 2.5.4 Scheduling in Real-Time Systems 168

      5. 2.5.5 Policy Versus Mechanism 169

      6. 2.5.6 Thread Scheduling 169

    6. 2.6 Research on Processes and Threads 171

    1. 2.7 Summary 172

  3. 3 Memory Management 179

    1. 3.1 No Memory Abstraction 180

      1. 3.1.1 Running Multiple Programs Without a Memory Abstraction 181

    2. 3.2 A Memory Abstraction: Address Spaces 183

      1. 3.2.1 The Notion of an Address Space 184

      2. 3.2.2 Swapping 185

      3. 3.2.3 Managing Free Memory 188

    3. 3.3 Virtual Memory 192

      1. 3.3.1 Paging 193

      2. 3.3.2 Page Tables 196

      3. 3.3.3 Speeding Up Paging 200

      4. 3.3.4 Page Tables for Large Memories 203

    4. 3.4 Page Replacement Algorithms 207

      1. 3.4.1 The Optimal Page Replacement Algorithm 208

      2. 3.4.2 The Not Recently Used Page Replacement Algorithm 209

      3. 3.4.3 The First-In, First-Out (FIFO) Page Replacement Algorithm 210

      4. 3.4.4 The Second-Chance Page Replacement Algorithm 210

      5. 3.4.5 The Clock Page Replacement Algorithm 211

      6. 3.4.6 The Least Recently Used (LRU) Page Replacement Algorithm 212

      7. 3.4.7 Simulating LRU in Software 212

      8. 3.4.8 The Working Set Page Replacement Algorithm 214

      9. 3.4.9 The WSClock Page Replacement Algorithm 218

      10. 3.4.10 Summary of Page Replacement Algorithms 220

    5. 3.5 Design Issues for Paging Systems 221

      1. 3.5.1 Local versus Global Allocation Policies 221

      2. 3.5.2 Load Control 224

      3. 3.5.3 Cleaning Policy 225

      4. 3.5.4 Page Size 226

      5. 3.5.5 Separate Instruction and Data Spaces 227

      6. 3.5.6 Shared Pages 228

      7. 3.5.7 Shared Libraries 230

      8. 3.5.8 Mapped Files 232

    6. 3.6 Implementation Issues 232

      1. 3.6.1 Operating System Involvement with Paging 232

      2. 3.6.2 Page Fault Handling 233

      3. 3.6.3 Instruction Backup 234

      4. 3.6.4 Locking Pages in Memory 236

      5. 3.6.5 Backing Store 236

      6. 3.6.6 Separation of Policy and Mechanism 238

    7. 3.7 Segmentation 240

      1. 3.7.1 Implementation of Pure Segmentation 242

      2. 3.7.2 Segmentation with Paging: MULTICS 243

      3. 3.7.3 Segmentation with Paging: The Intel x86 248

    8. 3.8 Research on Memory Management 248

    1. 3.9 Summary 250

  4. 4 File Systems 259

    1. 4.1 Files 261

      1. 4.1.1 File Naming 261

      2. 4.1.2 File Structure 263

      3. 4.1.3 File Types 264

      4. 4.1.4 File Access 266

      5. 4.1.5 File Attributes 267

      6. 4.1.6 File Operations 269

      7. 4.1.7 An Example Program Using File-System Calls 270

    2. 4.2 Directories 272

      1. 4.2.1 Single-Level Directory Systems 272

      2. 4.2.2 Hierarchical Directory Systems 273

      3. 4.2.3 Path Names 274

      4. 4.2.4 Directory Operations 277

    3. 4.3 File-System Implementation 278

      1. 4.3.1 File-System Layout 278

      2. 4.3.2 Implementing Files 280

      3. 4.3.3 Implementing Directories 285

      4. 4.3.4 Shared Files 288

      5. 4.3.5 Log-Structured File Systems 290

      6. 4.3.6 Journaling File Systems 292

      7. 4.3.7 Flash-based File Systems 293

      8. 4.3.8 Virtual File Systems 298

    4. 4.4 File-System Management and Optimization 301

      1. 4.4.1 Disk-Space Management 301

      2. 4.4.2 File-System Backups 307

      3. 4.4.3 File-System Consistency 312

      4. 4.4.4 File-System Performance 315

      5. 4.4.5 Defragmenting Disks 320

      6. 4.4.6 Compression and Deduplication 321

      7. 4.4.7 Secure File Deletion and Disk Encryption 322

    5. 4.5 Example File Systems 324

      1. 4.5.1 The MS-DOS File System 324

      2. 4.5.2 The UNIX V7 File System 327

    6. 4.6 Research on File Systems 330

    1. 4.7 Summary 331

  5. 5 Input/Output 337

    1. 5.1 Principles of I/O Hardware 337

      1. 5.1.1 I/O Devices 338

      2. 5.1.2 Device Controllers 338

      3. 5.1.3 Memory-Mapped I/O 340

      4. 5.1.4 Direct Memory Access 344

      5. 5.1.5 Interrupts Revisited 347

    2. 5.2 Principles of I/O Software 352

      1. 5.2.1 Goals of the I/O Software 352

      2. 5.2.2 Programmed I/O 354

      3. 5.2.3 Interrupt-Driven I/O 355

      4. 5.2.4 I/O Using DMA 356

    3. 5.3 I/O Software Layers 357

      1. 5.3.1 Interrupt Handlers 357

      2. 5.3.2 Device Drivers 359

      3. 5.3.3 Device-Independent I/O Software 362

      4. 5.3.4 User-Space I/O Software 368

    4. 5.4 Mass Storage: Disk and SSD 370

      1. 5.4.1 Magnetic Disks 370

      2. 5.4.2 Solid State Drives (SSDs) 381

      3. 5.4.3 RAID 385

    5. 5.5 Clocks 390

      1. 5.5.1 Clock Hardware 390

      2. 5.5.2 Clock Software 391

      3. 5.5.3 Soft Timers 394

    6. 5.6 User Interfaces: Keyboard, Mouse, & Monitor 395

      1. 5.6.1 Input Software 396

      2. 5.6.2 Output Software 402

    7. 5.7 Thin Clients 419

    8. 5.8 Power Management 420

      1. 5.8.1 Hardware Issues 421

      2. 5.8.2 Operating System Issues 422

      3. 5.8.3 Application Program Issues 428

    9. 5.9 Research on Input/Output 428

    1. 5.10 Summary 430

  6. 6 Deadlocks 437

    1. 6.1 Resources 438

      1. 6.1.1 Preemptable and Nonpreemptable Resources 438

      2. 6.1.2 Resource Acquisition 439

      3. 6.1.3 The Dining Philosophers Problem 440

    2. 6.2 Introduction to Deadlocks 444

      1. 6.2.1 Conditions for Resource Deadlocks 445

      2. 6.2.2 Deadlock Modeling 445

    3. 6.3 The Ostrich Algorithm 447

    4. 6.4 Deadlock Detection and Recovery 449

      1. 6.4.1 Deadlock Detection with One Resource of Each Type 449

      2. 6.4.2 Deadlock Detection with Multiple Resources of Each Type 451

      3. 6.4.3 Recovery from Deadlock 454

    5. 6.5 Deadlock Avoidance 455

      1. 6.5.1 Resource Trajectories 456

      2. 6.5.2 Safe and Unsafe States 457

      3. 6.5.3 The Banker’s Algorithm for a Single Resource 458

      4. 6.5.4 The Banker’s Algorithm for Multiple Resources 459

    6. 6.6 Deadlock Prevention 461

      1. 6.6.1 Attacking the Mutual-Exclusion Condition 461

      2. 6.6.2 Attacking the Hold-and-Wait Condition 462

      3. 6.6.3 Attacking the No-Preemption Condition 462

      4. 6.6.4 Attacking the Circular Wait Condition 463

    7. 6.7 Other Issues 464

      1. 6.7.1 Two-Phase Locking 464

      2. 6.7.2 Communication Deadlocks 465

      3. 6.7.3 Livelock 467

      4. 6.7.4 Starvation 468

    8. 6.8 Research on Deadlocks 469

    1. 6.9 Summary 470

  7. 7 Virtualization and the Cloud 477

    1. 7.1 History 480

    2. 7.2 Requirements for Virtualization 482

    3. 7.3 Type 1 and Type 2 Hypervisors 484

    4. 7.4 Techniques for Efficient Virtualization 486

      1. 7.4.1 Virtualizing the Unvirtualizable 487

      2. 7.4.2 The Cost of Virtualization 489

    5. 7.5 Are Hypervisors Microkernels Done Right? 490

    6. 7.6 Memory Virtualization 493

    7. 7.7 I/O Virtualization 497

    8. 7.8 Virtual Machines on Multicore CPUs 501

    9. 7.9 Clouds 501

      1. 7.9.1 Clouds as a Service 502

      2. 7.9.2 Virtual Machine Migration 503

      3. 7.9.3 Checkpointing 504

    10. 7.10 OS-Level Virtualization 504

    11. 7.11 Case Study: VMware 507

      1. 7.11.1 The Early History of VMware 507

      2. 7.11.2 VMware Workstation 509

      3. 7.11.3 Challenges in Bringing Virtualization to the x86 509

      4. 7.11.4 VMware Workstation: Solution Overview 511

      5. 7.11.5 The Evolution of VMware Workstation 520

      6. 7.11.6 ESX Server: VMware’s type 1 Hypervisor 521

    12. 7.12 Research on Virtualization and the Cloud 523

    1. 7.13 Summary 524

  8. 8 Multiple Processor Systems 527

    1. 8.1 Multiprocessors 530

      1. 8.1.1 Multiprocessor Hardware 530

      2. 8.1.2 Multiprocessor Operating System Types 541

      3. 8.1.3 Multiprocessor Synchronization 545

      4. 8.1.4 Multiprocessor Scheduling 550

    2. 8.2 Multicomputers 557

      1. 8.2.1 Multicomputer Hardware 558

      2. 8.2.2 Low-Level Communication Software 562

      3. 8.2.3 User-Level Communication Software 565

      4. 8.2.4 Remote Procedure Call 569

      5. 8.2.5 Distributed Shared Memory 571

      6. 8.2.6 Multicomputer Scheduling 575

      7. 8.2.7 Load Balancing 576

    3. 8.3 Distributed Systems 579

      1. 8.3.1 Network Hardware 581

      2. 8.3.2 Network Services and Protocols 585

      3. 8.3.3 Document-Based Middleware 588

      4. 8.3.4 File-System-Based Middleware 590

      5. 8.3.5 Object-Based Middleware 594

      6. 8.3.6 Coordination-Based Middleware 595

    4. 8.4 Research on Multiple Processor Systems 598

    1. 8.5 Summary 600

  9. 9 Security 605

    1. 9.1 Fundamentals of Operating System Security 607

      1. 9.1.1 The CIA Security Triad 608

      2. 9.1.2 Security Principles 609

      3. 9.1.3 Security of the Operating System Structure 611

      4. 9.1.4 Trusted Computing Base 612

      5. 9.1.5 Attackers 614

      6. 9.1.6 Can We Build Secure Systems? 617

    2. 9.2 Controlling Access to Resources 618

      1. 9.2.1 Protection Domains 619

      2. 9.2.2 Access Control Lists 621

      3. 9.2.3 Capabilities 625

    3. 9.3 Formal Models of Secure Systems 628

      1. 9.3.1 Multilevel Security 629

      2. 9.3.2 Cryptography 632

      3. 9.3.3 Trusted Platform Modules 636

    4. 9.4 Authentication 637

      1. 9.4.1 Passwords 637

      2. 9.4.2 Authentication Using a Physical Object 644

      3. 9.4.3 Authentication Using Biometrics 645

    5. 9.5 Exploiting Software 647

      1. 9.5.1 Buffer Overflow Attacks 648

      2. 9.5.2 Format String Attacks 658

      3. 9.5.3 Use-After-Free Attacks 661

      4. 9.5.4 Type Confusion Vulnerabilities 662

      5. 9.5.5 Null Pointer Dereference Attacks 664

      6. 9.5.6 Integer Overflow Attacks 665

      7. 9.5.7 Command Injection Attacks 666

      8. 9.5.8 Time of Check to Time of Use Attacks 667

      9. 9.5.9 Double Fetch Vulnerability 668

    6. 9.6 Exploiting Hardware 668

      1. 9.6.1 Covert Channels 669

      2. 9.6.2 Side Channels 671

      3. 9.6.3 Transient Execution Attacks 674

    7. 9.7 Insider Attacks 679

      1. 9.7.1 Logic Bombs 679

      2. 9.7.2 Back Doors 680

      3. 9.7.3 Login Spoofing 681

    8. 9.8 Operating System Hardening 681

      1. 9.8.1 Fine-Grained Randomization 682

      2. 9.8.2 Control-Flow Restrictions 683

      3. 9.8.3 Access Restrictions 685

      4. 9.8.4 Code and Data Integrity Checks 689

      5. 9.8.5 Remote Attestation Using a Trusted Platform Module 690

      6. 9.8.6 Encapsulating Untrusted Code 691

    9. 9.9 Research on Security 694

    1. 9.10 Summary 696

  10. 10 Case Study 1: Unix, Linux, and Android 703

    1. 10.1 History of UNIX and Linux 704

      1. 10.1.1 UNICS 704

      2. 10.1.2 PDP-11 UNIX 705

      3. 10.1.3 Portable UNIX 706

      4. 10.1.4 Berkeley UNIX 707

      5. 10.1.5 Standard UNIX 708

      6. 10.1.6 MINIX 709

      7. 10.1.7 Linux 710

    2. 10.2 Overview of Linux 713

      1. 10.2.1 Linux Goals 713

      2. 10.2.2 Interfaces to Linux 714

      3. 10.2.3 The Shell 716

      4. 10.2.4 Linux Utility Programs 719

      5. 10.2.5 Kernel Structure 720

    3. 10.3 Processes in Linux 723

      1. 10.3.1 Fundamental Concepts 724

      2. 10.3.2 Process-Management System Calls in Linux 726

      3. 10.3.3 Implementation of Processes and Threads in Linux 730

      4. 10.3.4 Scheduling in Linux 736

      5. 10.3.5 Synchronization in Linux 740

      6. 10.3.6 Booting Linux 741

    4. 10.4 Memory Management in Linux 743

      1. 10.4.1 Fundamental Concepts 744

      2. 10.4.2 Memory Management System Calls in Linux 746

      3. 10.4.3 Implementation of Memory Management in Linux 748

      4. 10.4.4 Paging in Linux 754

    5. 10.5 Input/Output in Linux 757

      1. 10.5.1 Fundamental Concepts 758

      2. 10.5.2 Networking 759

      3. 10.5.3 Input/Output System Calls in Linux 761

      4. 10.5.4 Implementation of Input/Output in Linux 762

      5. 10.5.5 Modules in Linux 765

    6. 10.6 The Linux File System 766

      1. 10.6.1 Fundamental Concepts 766

      2. 10.6.2 File-System Calls in Linux 770

      3. 10.6.3 Implementation of the Linux File System 774

      4. 10.6.4 NFS: The Network File System 783

    7. 10.7 Security in Linux 789

      1. 10.7.1 Fundamental Concepts 789

      2. 10.7.2 Security System Calls in Linux 791

      3. 10.7.3 Implementation of Security in Linux 792

    8. 10.8 Android 793

      1. 10.8.1 Android and Google 794

      2. 10.8.2 History of Android 794

      3. 10.8.3 Design Goals 800

      4. 10.8.4 Android Architecture 801

      5. 10.8.5 Linux Extensions 803

      6. 10.8.6 ART 807

      7. 10.8.7 Binder IPC 809

      8. 10.8.8 Android Applications 818

      9. 10.8.9 Intents 830

      10. 10.8.10 Process Model 831

      11. 10.8.11 Security and Privacy 836

      12. 10.8.12 Background Execution and Social Engineering 856

    1. 10.9 Summary 863

  11. 11 Case Study 2: Windows 11 871

    1. 11.1 History of Windows Through Windows 11 871

      1. 11.1.1 1980s: MS-DOS 872

      2. 11.1.2 1990s: MS-DOS-based Windows 873

      3. 11.1.3 2000s: NT-based Windows 873

      4. 11.1.4 Windows Vista 876

      5. 11.1.5 Windows 8 877

      6. 11.1.6 Windows 10 878

      7. 11.1.7 Windows 11 879

    2. 11.2 Programming Windows 880

      1. 11.2.1 Universal Windows Platform 881

      2. 11.2.2 Windows Subsystems 883

      3. 11.2.3 The Native NT Application Programming Interface 884

      4. 11.2.4 The Win32 Application Programming Interface 887

      5. 11.2.5 The Windows Registry 891

    3. 11.3 System Structure 894

      1. 11.3.1 Operating System Structure 894

      2. 11.3.2 Booting Windows 910

      3. 11.3.3 Implementation of the Object Manager 914

      4. 11.3.4 Subsystems, DLLs, and User-Mode Services 926

    4. 11.4 Processes and Threads in Windows 929

      1. 11.4.1 Fundamental Concepts 929

      2. 11.4.2 Job, Process, Thread, and Fiber Management API Calls 934

      3. 11.4.3 Implementation of Processes and Threads 941

      4. 11.4.4 WoW64 and Emulation 950

    5. 11.5 Memory Management 955

      1. 11.5.1 Fundamental Concepts 955

      2. 11.5.2 Memory-Management System Calls 961

      3. 11.5.3 Implementation of Memory Management 962

      4. 11.5.4 Memory Compression 973

      5. 11.5.5 Memory Partitions 976

    6. 11.6 Caching in Windows 977

    7. 11.7 Input/Output in Windows 979

      1. 11.7.1 Fundamental Concepts 980

      2. 11.7.2 Input/Output API Calls 982

      3. 11.7.3 Implementation of I/O 984

    8. 11.8 The Windows NT File System 989

      1. 11.8.1 Fundamental Concepts 989

      2. 11.8.2 Implementation of the NT File System 990

    9. 11.9 Windows Power Management 1000

    10. 11.10 Virtualization in Windows 1003

      1. 11.10.1 Hyper-V 1003

      2. 11.10.2 Containers 1011

      3. 11.10.3 Virtualization-Based Security 1017

    11. 11.11 Security in Windows 1018

      1. 11.11.1 Fundamental Concepts 1020

      2. 11.11.2 Security API Calls 1022

      3. 11.11.3 Implementation of Security 1023

      4. 11.11.4 Security Mitigations 1025

    1. 11.12 Summary 1035

  12. 12 Operating System Design 1041

    1. 12.1 The Nature of the Design Problem 1042

      1. 12.1.1 Goals 1042

      2. 12.1.2 Why Is It Hard to Design an Operating System? 1043

    2. 12.2 Interface Design 1045

      1. 12.2.1 Guiding Principles 1045

      2. 12.2.2 Paradigms 1048

      3. 12.2.3 The System-Call Interface 1051

    3. 12.3 Implementation 1053

      1. 12.3.1 System Structure 1054

      2. 12.3.2 Mechanism vs. Policy 1057

      3. 12.3.3 Orthogonality 1058

      4. 12.3.4 Naming 1059

      5. 12.3.5 Binding Time 1061

      6. 12.3.6 Static vs. Dynamic Structures 1062

      7. 12.3.7 Top-Down vs. Bottom-Up Implementation 1063

      8. 12.3.8 Synchronous vs. Asynchronous Communication 1064

      9. 12.3.9 Useful Techniques 1065

    4. 12.4 Performance 1070

      1. 12.4.1 Why Are Operating Systems Slow? 1071

      2. 12.4.2 What Should Be Optimized? 1071

      3. 12.4.3 Space-Time Trade-offs 1072

      4. 12.4.4 Caching 1075

      5. 12.4.5 Hints 1076

      6. 12.4.6 Exploiting Locality 1077

      7. 12.4.7 Optimize the Common Case 1077

    5. 12.5 Project Management 1078

      1. 12.5.1 The Mythical Man Month 1078

      2. 12.5.2 Team Structure 1079

      3. 12.5.3 The Role of Experience 1081

      4. 12.5.4 No Silver Bullet 1082

  13. 13 Reading List and Bibliography 1087

    1. 13.1 Suggestions for Further Reading 1087

      1. 13.1.1 Introduction 1088

      2. 13.1.2 Processes and Threads 1088

      3. 13.1.3 Memory Management 1089

      4. 13.1.4 File Systems 1090

      5. 13.1.5 Input/Output 1090

      6. 13.1.6 Deadlocks 1091

      7. 13.1.7 Virtualization and the Cloud 1092

      8. 13.1.8 Multiple Processor Systems 1093

      9. 13.1.9 Security 1093

      10. 13.1.10 Case Study 1: UNIX, Linux, and Android 1094

      11. 13.1.11 Case Study 2: Windows 1095

      12. 13.1.12 Operating System Design 1096

    1. 13.2 Alphabetical Bibliography 1097

  1. Index 1121