Computer Systems A Programmer s Perspective 1 (Beta Draft)

Similar documents
Dynamic Memory Allocation: Advanced Concepts

Introduction to C. Why C? Difference between Python and C C compiler stages Basic syntax in C

Martin Kruliš, v

Main Points of the Computer Organization and System Software Module

Computer Architecture Review. Jo, Heeseung

CS 61C: Great Ideas in Computer Architecture. (Brief) Review Lecture

Introduction to Computer Systems

Course Outline Computing Science Department. Faculty of Science. COMP Credits Introduction to Computer Systems (3,1,0) Fall 2015

CS 261 Fall Mike Lam, Professor. Virtual Memory

Final Exam. 12 December 2018, 120 minutes, 26 questions, 100 points

A program execution is memory safe so long as memory access errors never occur:

Great Reality #2: You ve Got to Know Assembly Does not generate random values Arithmetic operations have important mathematical properties

Control Hazards. Branch Prediction

Last 2 Classes: Introduction to Operating Systems & C++ tutorial. Today: OS and Computer Architecture

Final Exam. 11 May 2018, 120 minutes, 26 questions, 100 points

Princeton University COS 217: Introduction to Programming Systems Fall 2017 Final Exam Preparation

Short Notes of CS201

CSE351 Winter 2016, Final Examination March 16, 2016

Why Don t Computers Use Base 10? Lecture 2 Bits and Bytes. Binary Representations. Byte-Oriented Memory Organization. Base 10 Number Representation

The CPU and Memory. How does a computer work? How does a computer interact with data? How are instructions performed? Recall schematic diagram:

CS201 - Introduction to Programming Glossary By

High Performance Computing Lecture 1. Matthew Jacob Indian Institute of Science

Why Don t Computers Use Base 10? Lecture 2 Bits and Bytes. Binary Representations. Byte-Oriented Memory Organization. Base 10 Number Representation

CSE 120 Principles of Operating Systems

Fixed-Point Math and Other Optimizations

Processes. Johan Montelius KTH

Concurrent Programming

Operating Systems CMPSCI 377 Spring Mark Corner University of Massachusetts Amherst

198:231 Intro to Computer Organization. 198:231 Introduction to Computer Organization Lecture 14

Final Exam Introduction to Computer Systems. May 10, Name: Andrew User ID: Recitation Section: Model Solution fp

A process. the stack

Performance of Various Levels of Storage. Movement between levels of storage hierarchy can be explicit or implicit

Integrated Approach. Operating Systems COMPUTER SYSTEMS. LEAHY, Jr. Georgia Institute of Technology. Umakishore RAMACHANDRAN. William D.

POSIX Threads: a first step toward parallel programming. George Bosilca

Memory management. Requirements. Relocation: program loading. Terms. Relocation. Protection. Sharing. Logical organization. Physical organization

ECE 7650 Scalable and Secure Internet Services and Architecture ---- A Systems Perspective. Part I: Operating system overview: Memory Management

CS 5460/6460 Operating Systems

Concurrent Programming

Bits and Bytes. Why bits? Representing information as bits Binary/Hexadecimal Byte representations» numbers» characters and strings» Instructions

Real-Time and Embedded Systems (M) Lecture 19

Concurrent Programming

Lecture 4: Memory Management & The Programming Interface

COS 318: Operating Systems. Overview. Andy Bavier Computer Science Department Princeton University

C Programming. Course Outline. C Programming. Code: MBD101. Duration: 10 Hours. Prerequisites:

Chapter 13 Reduced Instruction Set Computers

Introduction to Computer Systems

CS399 New Beginnings. Jonathan Walpole

Chapter 2. OS Overview

CS252 S05. Main memory management. Memory hardware. The scale of things. Memory hardware (cont.) Bottleneck

Introduction to Computer Systems

Algorithm Performance Factors. Memory Performance of Algorithms. Processor-Memory Performance Gap. Moore s Law. Program Model of Memory I

Protection and System Calls. Otto J. Anshus

PESIT Bangalore South Campus Hosur road, 1km before Electronic City, Bengaluru Department of Electronics and Communication Engineering

Assembly Language. Lecture 2 - x86 Processor Architecture. Ahmed Sallam

Lec 13: Linking and Memory. Kavita Bala CS 3410, Fall 2008 Computer Science Cornell University. Announcements

CSE 410: Systems Programming

COS 318: Operating Systems. Overview. Prof. Margaret Martonosi Computer Science Department Princeton University

Tutorial 11. Final Exam Review

Dynamic Memory Allocation I

Dynamic Memory Allocation

! What is main memory? ! What is static and dynamic allocation? ! What is segmentation? Maria Hybinette, UGA. High Address (0x7fffffff) !

Physical memory vs. Logical memory Process address space Addresses assignment to processes Operating system tasks Hardware support CONCEPTS 3.

CSE 120 Principles of Operating Systems Spring 2017

Darek Mihocka, Emulators.com Stanislav Shwartsman, Intel Corp. June

C++ for System Developers with Design Pattern

6.172 Performance Engineering of Software Systems Spring Lecture 9. P after. Figure 1: A diagram of the stack (Image by MIT OpenCourseWare.

Control Hazards. Prediction

Processors, Performance, and Profiling

COMPUTER ORGANIZATION & ARCHITECTURE

CS 430 Spring Mike Lam, Professor. Data Types and Type Checking

Language Translation. Compilation vs. interpretation. Compilation diagram. Step 1: compile. Step 2: run. compiler. Compiled program. program.

«Computer Science» Requirements for applicants by Innopolis University

Assembly Language. Lecture 2 x86 Processor Architecture

CSE 2021: Computer Organization

Operating System. Operating System Overview. Structure of a Computer System. Structure of a Computer System. Structure of a Computer System

Chapter 1 GETTING STARTED. SYS-ED/ Computer Education Techniques, Inc.

Chapter 1 INTRODUCTION SYS-ED/ COMPUTER EDUCATION TECHNIQUES, INC.

CIS 21 Final Study Guide. Final covers ch. 1-20, except for 17. Need to know:

Agenda. CSE P 501 Compilers. Java Implementation Overview. JVM Architecture. JVM Runtime Data Areas (1) JVM Data Types. CSE P 501 Su04 T-1

ECE 498 Linux Assembly Language Lecture 1

CS6303 Computer Architecture Regulation 2013 BE-Computer Science and Engineering III semester 2 MARKS

CISC 662 Graduate Computer Architecture Lecture 16 - Cache and virtual memory review

VEOS high level design. Revision 2.1 NEC

Chapter 2. Parallel Hardware and Parallel Software. An Introduction to Parallel Programming. The Von Neuman Architecture

Dr. Rafiq Zakaria Campus. Maulana Azad College of Arts, Science & Commerce, Aurangabad. Department of Computer Science. Academic Year

Design Overview of the FreeBSD Kernel CIS 657

Instruction Sets: Characteristics and Functions Addressing Modes

Design Overview of the FreeBSD Kernel. Organization of the Kernel. What Code is Machine Independent?

CS 3330 Exam 3 Fall 2017 Computing ID:

CSE 504: Compiler Design. Runtime Environments

Topics Power tends to corrupt; absolute power corrupts absolutely. Computer Organization CS Data Representation

Classifying Information Stored in Memory! Memory Management in a Uniprogrammed System! Segments of a Process! Processing a User Program!

Stand-Alone RTLinux-GPL

Memory Management. Reading: Silberschatz chapter 9 Reading: Stallings. chapter 7 EEL 358

Overview of the ECE Computer Software Curriculum. David O Hallaron Associate Professor of ECE and CS Carnegie Mellon University

Porting Linux to x86-64

Index. object lifetimes, and ownership, use after change by an alias errors, use after drop errors, BTreeMap, 309

Agenda Process Concept Process Scheduling Operations on Processes Interprocess Communication 3.2

Memory Management (Chaper 4, Tanenbaum)

CIS 1.5 Course Objectives. a. Understand the concept of a program (i.e., a computer following a series of instructions)

Transcription:

Computer Systems A Programmer s Perspective 1 (Beta Draft) Randal E. Bryant David R. O Hallaron August 1, 2001 1 Copyright c 2001, R. E. Bryant, D. R. O Hallaron. All rights reserved.

2

Contents Preface i 1 Introduction 1 1.1 Information is Bits in Context................................. 2 1.2 Programs are Translated by Other Programs into Different Forms............... 3 1.3 It Pays to Understand How Compilation Systems Work.................... 4 1.4 Processors Read and Interpret Instructions Stored in Memory................. 5 1.4.1 Hardware Organization of a System.......................... 5 1.4.2 Running the hello Program............................. 8 1.5 Caches Matter.......................................... 9 1.6 Storage Devices Form a Hierarchy............................... 10 1.7 The Operating System Manages the Hardware......................... 11 1.7.1 Processes........................................ 13 1.7.2 Threads......................................... 14 1.7.3 Virtual Memory..................................... 14 1.7.4 Files........................................... 15 1.8 Systems Communicate With Other Systems Using Networks................. 16 1.9 Summary............................................ 18 I Program Structure and Execution 19 2 Representing and Manipulating Information 21 2.1 Information Storage....................................... 22 2.1.1 Hexadecimal Notation................................. 23 2.1.2 Words.......................................... 25 3

4 CONTENTS 2.1.3 Data Sizes........................................ 25 2.1.4 Addressing and Byte Ordering............................. 26 2.1.5 Representing Strings.................................. 33 2.1.6 Representing Code................................... 33 2.1.7 Boolean Algebras and Rings.............................. 34 2.1.8 Bit-Level Operations in C............................... 37 2.1.9 Logical Operations in C................................ 39 2.1.10 Shift Operations in C.................................. 40 2.2 Integer Representations..................................... 41 2.2.1 Integral Data Types................................... 41 2.2.2 Unsigned and Two s Complement Encodings..................... 41 2.2.3 Conversions Between Signed and Unsigned...................... 45 2.2.4 Signed vs. Unsigned in C................................ 47 2.2.5 Expanding the Bit Representation of a Number.................... 49 2.2.6 Truncating Numbers.................................. 51 2.2.7 Advice on Signed vs. Unsigned............................ 52 2.3 Integer Arithmetic........................................ 53 2.3.1 Unsigned Addition................................... 53 2.3.2 Two s Complement Addition.............................. 56 2.3.3 Two s Complement Negation.............................. 60 2.3.4 Unsigned Multiplication................................ 61 2.3.5 Two s Complement Multiplication........................... 62 2.3.6 Multiplying by Powers of Two............................. 63 2.3.7 Dividing by Powers of Two.............................. 64 2.4 Floating Point.......................................... 66 2.4.1 Fractional Binary Numbers............................... 67 2.4.2 IEEE Floating-Point Representation.......................... 69 2.4.3 Example Numbers................................... 71 2.4.4 Rounding........................................ 74 2.4.5 Floating-Point Operations............................... 76 2.4.6 Floating Point in C................................... 77 2.5 Summary............................................ 79

CONTENTS 5 3 Machine-Level Representation of C Programs 91 3.1 A Historical Perspective.................................... 92 3.2 Program Encodings....................................... 94 3.2.1 Machine-Level Code.................................. 95 3.2.2 Code Examples..................................... 96 3.2.3 A Note on Formatting................................. 99 3.3 Data Formats.......................................... 100 3.4 Accessing Information..................................... 101 3.4.1 Operand Specifiers................................... 102 3.4.2 Data Movement Instructions.............................. 104 3.4.3 Data Movement Example................................ 105 3.5 Arithmetic and Logical Operations............................... 107 3.5.1 Load Effective Address................................. 108 3.5.2 Unary and Binary Operations............................. 108 3.5.3 Shift Operations.................................... 109 3.5.4 Discussion....................................... 110 3.5.5 Special Arithmetic Operations............................. 111 3.6 Control............................................. 112 3.6.1 Condition Codes.................................... 112 3.6.2 Accessing the Condition Codes............................ 113 3.6.3 Jump Instructions and their Encodings......................... 116 3.6.4 Translating Conditional Branches........................... 119 3.6.5 Loops.......................................... 121 3.6.6 Switch Statements................................... 130 3.7 Procedures............................................ 134 3.7.1 Stack Frame Structure................................. 134 3.7.2 Transferring Control.................................. 136 3.7.3 Register Usage Conventions.............................. 137 3.7.4 Procedure Example................................... 139 3.7.5 Recursive Procedures.................................. 142 3.8 Array Allocation and Access.................................. 144 3.8.1 Basic Principles..................................... 145 3.8.2 Pointer Arithmetic................................... 146

6 CONTENTS 3.8.3 Arrays and Loops.................................... 147 3.8.4 Nested Arrays...................................... 147 3.8.5 Fixed Size Arrays.................................... 150 3.8.6 Dynamically Allocated Arrays............................. 152 3.9 Heterogeneous Data Structures................................. 155 3.9.1 Structures........................................ 155 3.9.2 Unions......................................... 158 3.10 Alignment............................................ 162 3.11 Putting it Together: Understanding Pointers.......................... 164 3.12 Life in the Real World: Using the GDB Debugger....................... 167 3.13 Out-of-Bounds Memory References and Buffer Overflow................... 169 3.14 *Floating-Point Code...................................... 174 3.14.1 Floating-Point Registers................................ 174 3.14.2 Extended-Precision Arithmetic............................. 175 3.14.3 Stack Evaluation of Expressions............................ 178 3.14.4 Floating-Point Data Movement and Conversion Operations.............. 181 3.14.5 Floating-Point Arithmetic Instructions......................... 183 3.14.6 Using Floating Point in Procedures.......................... 185 3.14.7 Testing and Comparing Floating-Point Values..................... 186 3.15 *Embedding Assembly Code in C Programs.......................... 188 3.15.1 Basic Inline Assembly................................. 189 3.15.2 Extended Form of asm................................. 191 3.16 Summary............................................ 194 4 Processor Architecture 203 5 Optimizing Program Performance 205 5.1 Capabilities and Limitations of Optimizing Compilers..................... 206 5.2 Expressing Program Performance............................... 209 5.3 Program Example........................................ 211 5.4 Eliminating Loop Inefficiencies................................. 214 5.5 Reducing Procedure Calls.................................... 218 5.6 Eliminating Unneeded Memory References.......................... 220

CONTENTS 7 5.7 Understanding Modern Processors............................... 222 5.7.1 Overall Operation.................................... 223 5.7.2 Functional Unit Performance.............................. 226 5.7.3 A Closer Look at Processor Operation......................... 227 5.8 Reducing Loop Overhead.................................... 235 5.9 Converting to Pointer Code................................... 240 5.10 Enhancing Parallelism..................................... 243 5.10.1 Loop Splitting..................................... 243 5.10.2 Register Spilling.................................... 247 5.10.3 Limits to Parallelism.................................. 249 5.11 Putting it Together: Summary of Results for Optimizing Combining Code.......... 249 5.11.1 Floating-Point Performance Anomaly......................... 250 5.11.2 Changing Platforms.................................. 251 5.12 Branch Prediction and Misprediction Penalties......................... 251 5.13 Understanding Memory Performance.............................. 254 5.13.1 Load Latency...................................... 255 5.13.2 Store Latency...................................... 257 5.14 Life in the Real World: Performance Improvement Techniques................ 262 5.15 Identifying and Eliminating Performance Bottlenecks..................... 263 5.15.1 Program Profiling.................................... 263 5.15.2 Using a Profiler to Guide Optimization........................ 265 5.15.3 Amdahl s Law..................................... 268 5.16 Summary............................................ 269 6 The Memory Hierarchy 277 6.1 Storage Technologies...................................... 278 6.1.1 Random-Access Memory................................ 278 6.1.2 Disk Storage...................................... 287 6.1.3 Storage Technology Trends.............................. 295 6.2 Locality............................................. 297 6.2.1 Locality of References to Program Data........................ 297 6.2.2 Locality of Instruction Fetches............................. 299 6.2.3 Summary of Locality.................................. 299

8 CONTENTS 6.3 The Memory Hierarchy..................................... 300 6.3.1 Caching in the Memory Hierarchy........................... 303 6.3.2 Summary of Memory Hierarchy Concepts....................... 305 6.4 Cache Memories........................................ 306 6.4.1 Generic Cache Memory Organization......................... 307 6.4.2 Direct-Mapped Caches................................. 308 6.4.3 Set Associative Caches................................. 315 6.4.4 Fully Associative Caches................................ 317 6.4.5 Issues with Writes................................... 320 6.4.6 Instruction Caches and Unified Caches........................ 321 6.4.7 Performance Impact of Cache Parameters....................... 322 6.5 Writing Cache-friendly Code.................................. 324 6.6 Putting it Together: The Impact of Caches on Program Performance............. 329 6.6.1 The Memory Mountain................................. 329 6.6.2 Rearranging Loops to Increase Spatial Locality.................... 333 6.6.3 Using Blocking to Increase Temporal Locality.................... 337 6.7 Summary............................................ 340 II Running Programs on a System 349 7 Linking 351 7.1 Compiler Drivers........................................ 352 7.2 Static Linking.......................................... 353 7.3 Object Files........................................... 354 7.4 Relocatable Object Files.................................... 355 7.5 Symbols and Symbol Tables.................................. 356 7.6 Symbol Resolution....................................... 359 7.6.1 How Linkers Resolve Multiply-Defined Global Symbols............... 360 7.6.2 Linking with Static Libraries.............................. 363 7.6.3 How Linkers Use Static Libraries to Resolve References............... 366 7.7 Relocation............................................ 367 7.7.1 Relocation Entries................................... 368 7.7.2 Relocating Symbol References............................. 369

CONTENTS 9 7.8 Executable Object Files..................................... 373 7.9 Loading Executable Object Files................................ 374 7.10 Dynamic Linking with Shared Libraries............................ 376 7.11 Loading and Linking Shared Libraries from Applications................... 378 7.12 *Position-Independent Code (PIC)............................... 379 7.13 Tools for Manipulating Object Files.............................. 383 7.14 Summary............................................ 384 8 Exceptional Control Flow 393 8.1 Exceptions............................................ 394 8.1.1 Exception Handling.................................. 395 8.1.2 Classes of Exceptions................................. 396 8.1.3 Exceptions in Intel Processors............................. 399 8.2 Processes............................................ 400 8.2.1 Logical Control Flow.................................. 400 8.2.2 Private Address Space................................. 401 8.2.3 User and Kernel Modes................................ 402 8.2.4 Context Switches.................................... 403 8.3 System Calls and Error Handling................................ 404 8.4 Process Control......................................... 405 8.4.1 Obtaining Process ID s................................. 406 8.4.2 Creating and Terminating Processes.......................... 406 8.4.3 Reaping Child Processes................................ 411 8.4.4 Putting Processes to Sleep............................... 416 8.4.5 Loading and Running Programs............................ 417 8.4.6 Using fork and execve to Run Programs...................... 420 8.5 Signals.............................................. 421 8.5.1 Signal Terminology................................... 421 8.5.2 Sending Signals..................................... 425 8.5.3 Receiving Signals.................................... 428 8.5.4 Signal Handling Issues................................. 431 8.5.5 Portable Signal Handling................................ 436 8.6 Nonlocal Jumps......................................... 438

10 CONTENTS 8.7 Tools for Manipulating Processes................................ 443 8.8 Summary............................................ 443 9 Measuring Program Execution Time 451 9.1 The Flow of Time on a Computer System........................... 452 9.1.1 Process Scheduling and Timer Interrupts....................... 453 9.1.2 Time from an Application Program s Perspective................... 454 9.2 Measuring Time by Interval Counting............................. 456 9.2.1 Operation........................................ 458 9.2.2 Reading the Process Timers.............................. 458 9.2.3 Accuracy of Process Timers.............................. 459 9.3 Cycle Counters......................................... 461 9.3.1 IA32 Cycle Counters.................................. 462 9.4 Measuring Program Execution Time with Cycle Counters................... 462 9.4.1 The Effects of Context Switching........................... 464 9.4.2 Caching and Other Effects............................... 465 9.4.3 The -Best Measurement Scheme........................... 469 9.5 Time-of-Day Measurements.................................. 478 9.6 Putting it Together: An Experimental Protocol......................... 480 9.7 Looking into the Future..................................... 482 9.8 Life in the Real World: An Implementation of the -Best Measurement Scheme...... 482 9.9 Summary............................................ 483 10 Virtual Memory 487 10.1 Physical and Virtual Addressing................................ 488 10.2 Address Spaces......................................... 489 10.3 VM as a Tool for Caching.................................... 490 10.3.1 DRAM Cache Organization.............................. 491 10.3.2 Page Tables....................................... 491 10.3.3 Page Hits........................................ 492 10.3.4 Page Faults....................................... 493 10.3.5 Allocating Pages.................................... 494 10.3.6 Locality to the Rescue Again.............................. 495

CONTENTS 11 10.4 VM as a Tool for Memory Management............................ 495 10.4.1 Simplifying Linking.................................. 496 10.4.2 Simplifying Sharing.................................. 496 10.4.3 Simplifying Memory Allocation............................ 497 10.4.4 Simplifying Loading.................................. 497 10.5 VM as a Tool for Memory Protection.............................. 498 10.6 Address Translation....................................... 499 10.6.1 Integrating Caches and VM.............................. 502 10.6.2 Speeding up Address Translation with a TLB..................... 502 10.6.3 Multi-level Page Tables................................. 503 10.6.4 Putting it Together: End-to-end Address Translation................. 506 10.7 Case Study: The Pentium/Linux Memory System....................... 510 10.7.1 Pentium Address Translation.............................. 510 10.7.2 Linux Virtual Memory System............................. 515 10.8 Memory Mapping........................................ 518 10.8.1 Shared Objects Revisited................................ 519 10.8.2 The fork Function Revisited............................. 521 10.8.3 The execve Function Revisited............................ 521 10.8.4 User-level Memory Mapping with the mmap Function................ 522 10.9 Dynamic Memory Allocation.................................. 524 10.9.1 The malloc and free Functions........................... 525 10.9.2 Why Dynamic Memory Allocation?.......................... 526 10.9.3 Allocator Requirements and Goals........................... 528 10.9.4 Fragmentation..................................... 530 10.9.5 Implementation Issues................................. 531 10.9.6 Implicit Free Lists................................... 531 10.9.7 Placing Allocated Blocks................................ 533 10.9.8 Splitting Free Blocks.................................. 533 10.9.9 Getting Additional Heap Memory........................... 534 10.9.10 Coalescing Free Blocks................................. 534 10.9.11 Coalescing with Boundary Tags............................ 535 10.9.12 Putting it Together: Implementing a Simple Allocator................. 537 10.9.13 Explicit Free Lists................................... 545

12 CONTENTS 10.9.14 Segregated Free Lists.................................. 546 10.10Garbage Collection....................................... 548 10.10.1 Garbage Collector Basics................................ 549 10.10.2 Mark&Sweep Garbage Collectors........................... 550 10.10.3 Conservative Mark&Sweep for C Programs...................... 552 10.11Common Memory-related Bugs in C Programs........................ 553 10.11.1 Dereferencing Bad Pointers.............................. 553 10.11.2 Reading Uninitialized Memory............................. 553 10.11.3 Allowing Stack Buffer Overflows........................... 554 10.11.4 Assuming that Pointers and the Objects they Point to Are the Same Size....... 554 10.11.5 Making Off-by-one Errors............................... 555 10.11.6 Referencing a Pointer Instead of the Object it Points to................ 555 10.11.7 Misunderstanding Pointer Arithmetic......................... 556 10.11.8 Referencing Non-existent Variables.......................... 556 10.11.9 Referencing Data in Free Heap Blocks......................... 557 10.11.10Introducing Memory Leaks............................... 557 10.12Summary............................................ 558 III Interaction and Communication Between Programs 563 11 Concurrent Programming with Threads 565 11.1 Basic Thread Concepts..................................... 565 11.2 Thread Control......................................... 568 11.2.1 Creating Threads.................................... 569 11.2.2 Terminating Threads.................................. 569 11.2.3 Reaping Terminated Threads.............................. 570 11.2.4 Detaching Threads................................... 570 11.3 Shared Variables in Threaded Programs............................ 572 11.3.1 Threads Memory Model................................ 572 11.3.2 Mapping Variables to Memory............................. 572 11.3.3 Shared Variables.................................... 574 11.4 Synchronizing Threads with Semaphores........................... 575 11.4.1 Sequential Consistency................................. 575

CONTENTS 13 11.4.2 Progress Graphs.................................... 578 11.4.3 Protecting Shared Variables with Semaphores..................... 581 11.4.4 Posix Semaphores................................... 582 11.4.5 Signaling With Semaphores.............................. 583 11.5 Synchronizing Threads with Mutex and Condition Variables................. 585 11.5.1 Mutex Variables.................................... 585 11.5.2 Condition Variables................................... 588 11.5.3 Barrier Synchronization................................ 589 11.5.4 Timeout Waiting.................................... 590 11.6 Thread-safe and Reentrant Functions.............................. 594 11.6.1 Reentrant Functions.................................. 595 11.6.2 Thread-safe Library Functions............................. 598 11.7 Other Synchronization Errors.................................. 598 11.7.1 Races.......................................... 598 11.7.2 Deadlocks........................................ 601 11.8 Summary............................................ 602 12 Network Programming 607 12.1 Client-Server Programming Model............................... 607 12.2 Networks............................................ 608 12.3 The Global IP Internet..................................... 613 12.3.1 IP Addresses...................................... 614 12.3.2 Internet Domain Names................................ 616 12.3.3 Internet Connections.................................. 620 12.4 Unix file I/O........................................... 621 12.4.1 The read and write Functions........................... 622 12.4.2 Robust File I/O With the readn and writen Functions............... 623 12.4.3 Robust Input of Text Lines Using the readline Function.............. 625 12.4.4 The stat Function.................................. 625 12.4.5 The dup2 Function.................................. 628 12.4.6 The close Function.................................. 629 12.4.7 Other Unix I/O Functions............................... 630 12.4.8 Unix I/O vs. Standard I/O............................... 630

14 CONTENTS 12.5 The Sockets Interface...................................... 631 12.5.1 Socket Address Structures............................... 631 12.5.2 The socket Function................................. 633 12.5.3 The connect Function................................ 633 12.5.4 The bind Function.................................. 635 12.5.5 The listen Function................................. 635 12.5.6 The accept Function................................. 637 12.5.7 Example Echo Client and Server............................ 638 12.6 Concurrent Servers....................................... 640 12.6.1 Concurrent Servers Based on Processes........................ 640 12.6.2 Concurrent Servers Based on Threads......................... 642 12.7 Web Servers........................................... 648 12.7.1 Web Basics....................................... 649 12.7.2 Web Content...................................... 649 12.7.3 HTTP Transactions................................... 650 12.7.4 Serving Dynamic Content............................... 653 12.8 Putting it Together: The TINY Web Server........................... 654 12.9 Summary............................................ 664 A Error handling 667 A.1 Introduction........................................... 667 A.2 Error handling in Unix systems................................. 668 A.3 Error-handling wrappers.................................... 669 A.4 The csapp.h header file..................................... 673 A.5 The csapp.c source file..................................... 677 B Solutions to Practice Problems 693 B.1 Intro............................................... 693 B.2 Representing and Manipulating Information.......................... 693 B.3 Machine Level Representation of C Programs......................... 702 B.4 Processor Architecture..................................... 717 B.5 Optimizing Program Performance............................... 717 B.6 The Memory Hierarchy..................................... 719

CONTENTS 15 B.7 Linking............................................. 725 B.8 Exceptional Control Flow.................................... 727 B.9 Measuring Program Performance................................ 729 B.10 Virtual Memory......................................... 731 B.11 Concurrent Programming with Threads............................ 736 B.12 Network Programming..................................... 738

16 CONTENTS