Contents |
|
i | |
Preface |
|
iv | |
Acknowledgments |
|
x | |
|
|
3 | (40) |
|
1.1 What is an operating system? |
|
|
6 | (15) |
|
|
21 | (9) |
|
1.3 A brief history of operating systems |
|
|
30 | (13) |
|
|
|
|
43 | (58) |
|
|
47 | (2) |
|
|
49 | (12) |
|
2.3 Safe control transfer |
|
|
61 | (27) |
|
2.4 Case Study: Booting an operating system kernel |
|
|
88 | (1) |
|
2.5 Case Study: Virtual machines |
|
|
89 | (4) |
|
2.6 Conclusion and future directions |
|
|
93 | (8) |
|
3 The Programming Interface |
|
|
101 | (38) |
|
|
107 | (7) |
|
|
114 | (3) |
|
3.3 Case Study: Implementing a shell |
|
|
117 | (4) |
|
3.4 Case Study: Interprocess communication |
|
|
121 | (4) |
|
3.5 Operating system structure |
|
|
125 | (6) |
|
3.6 Conclusion and future directions |
|
|
131 | (8) |
|
|
|
4 Concurrency and Threads |
|
|
139 | (44) |
|
4.1 Threads: Abstraction and interface |
|
|
140 | (8) |
|
4.2 Simple API and example |
|
|
148 | (3) |
|
|
151 | (6) |
|
4.4 Implementation details |
|
|
157 | (17) |
|
4.5 Asynchronous I/O and event-driven programming |
|
|
174 | (3) |
|
4.6 Conclusion and future directions |
|
|
177 | (6) |
|
5 Synchronizing Access to Shared Objects |
|
|
183 | (74) |
|
|
186 | (7) |
|
5.2 Shared objects and synchronization variables |
|
|
193 | (3) |
|
5.3 Lock: Mutual Exclusion |
|
|
196 | (8) |
|
5.4 Condition variables: Waiting for a change |
|
|
204 | (12) |
|
5.5 Implementing synchronization objects |
|
|
216 | (13) |
|
5.6 Designing and implementing shared objects |
|
|
229 | (21) |
|
|
250 | (7) |
|
6 Advanced Synchronization |
|
|
257 | (40) |
|
6.1 Multi-object synchronization |
|
|
258 | (8) |
|
|
266 | (18) |
|
6.3 Alternative approaches to synchronization |
|
|
284 | (9) |
|
|
293 | (4) |
|
|
297 | (58) |
|
7.1 Uniprocessor scheduling |
|
|
300 | (14) |
|
7.2 Multiprocessor scheduling |
|
|
314 | (9) |
|
7.3 Energy-aware scheduling |
|
|
323 | (3) |
|
|
326 | (3) |
|
|
329 | (13) |
|
|
342 | (3) |
|
7.7 Case Study: Servers in a data center |
|
|
345 | (1) |
|
7.8 Conclusions and Future Directions |
|
|
346 | (9) |
|
|
|
|
355 | (52) |
|
8.1 Address translation concept |
|
|
358 | (2) |
|
8.2 Towards flexible address translation |
|
|
360 | (16) |
|
8.3 Towards efficient address translation |
|
|
376 | (14) |
|
|
390 | (10) |
|
8.5 Conclusions and future directions |
|
|
400 | (7) |
|
9 Caching and Virtual Memory |
|
|
407 | (46) |
|
|
411 | (3) |
|
|
414 | (2) |
|
9.3 When caches work and when they don't |
|
|
416 | (6) |
|
|
422 | (5) |
|
|
427 | (7) |
|
9.6 Case study: memory-mapped files |
|
|
434 | (9) |
|
9.7 Case study: virtual memory |
|
|
443 | (3) |
|
9.8 Conclusions and future directions |
|
|
446 | (7) |
|
10 Advanced Memory Management |
|
|
453 | (28) |
|
|
455 | (3) |
|
|
458 | (6) |
|
|
464 | (6) |
|
|
470 | (1) |
|
10.5 User-level memory management |
|
|
471 | (3) |
|
10.6 Conclusions and future directions |
|
|
474 | (7) |
|
|
|
11 File Systems: Introduction and Overview |
|
|
481 | (26) |
|
11.1 The file system abstraction |
|
|
486 | (6) |
|
|
492 | (4) |
|
|
496 | (8) |
|
11.4 Conclusions and future directions |
|
|
504 | (3) |
|
|
507 | (32) |
|
|
508 | (14) |
|
|
522 | (7) |
|
12.3 Conclusions and future directions |
|
|
529 | (10) |
|
|
539 | (44) |
|
13.1 Implementation overview |
|
|
540 | (1) |
|
13.2 Directories: Naming data |
|
|
541 | (6) |
|
|
547 | (28) |
|
13.4 Putting it all together: File and directory access |
|
|
575 | (3) |
|
13.5 Conclusions and future directions |
|
|
578 | (5) |
|
|
583 | (58) |
|
14.1 Transactions: Atomic updates |
|
|
587 | (21) |
|
14.2 Error detection and correction |
|
|
608 | (25) |
|
14.3 Conclusion and future directions |
|
|
633 | (8) |
Index and References |
|
Glossary |
|
641 | (1) |
Index |
|
641 | (6) |
References |
|
647 | |