Computer Science: An Overview [12th ed] 1292061162, 9781292061160, 9781292061801, 1292061804 - DOKUMEN.PUB (2022)

Table of contents :
Cover......Page 1
Title......Page 2
Copyright......Page 3
Contents......Page 11
Chapter 0 Introduction......Page 14
0.1 The Role of Algorithms......Page 15
0.2 The History of Computing......Page 17
0.3 An Outline of Our Study......Page 22
0.4 The Overarching Themes of Computer Science......Page 24
Chapter 1 Data Storage......Page 32
1.1 Bits and Their Storage......Page 33
1.2 Main Memory......Page 39
1.3 Mass Storage......Page 42
1.4 Representing Information as Bit Patterns......Page 47
1.5 The Binary System......Page 53
1.6 Storing Integers......Page 59
1.7 Storing Fractions......Page 65
1.8 Data and Programming......Page 70
1.9 Data Compression......Page 76
1.10 Communication Errors......Page 82
Chapter 2 Data Manipulation......Page 94
2.1 Computer Architecture......Page 95
2.2 Machine Language......Page 98
2.3 Program Execution......Page 104
2.4 Arithmetic/Logic Instructions......Page 111
2.5 Communicating with Other Devices......Page 116
2.6 Programming Data Manipulation......Page 121
2.7 Other Architectures......Page 130
Chapter 3 Operating Systems......Page 140
3.1 The History of Operating Systems......Page 141
3.2 Operating System Architecture......Page 145
3.3 Coordinating the Machine’s Activities......Page 153
3.4 Handling Competition Among Processes......Page 156
3.5 Security......Page 161
Chapter 4 Networking and the Internet......Page 170
4.1 Network Fundamentals......Page 171
4.2 The Internet......Page 180
4.3 The World Wide Web......Page 189
4.4 Internet Protocols......Page 198
4.5 Security......Page 204
Chapter 5 Algorithms......Page 218
5.1 The Concept of an Algorithm......Page 219
5.2 Algorithm Representation......Page 222
5.3 Algorithm Discovery......Page 229
5.4 Iterative Structures......Page 235
5.5 Recursive Structures......Page 246
5.6 Efficiency and Correctness......Page 254
Chapter 6 Programming Languages......Page 272
6.1 Historical Perspective......Page 273
6.2 Traditional Programming Concepts......Page 281
6.3 Procedural Units......Page 293
6.4 Language Implementation......Page 301
6.5 Object-Oriented Programming......Page 309
6.6 Programming Concurrent Activities......Page 316
6.7 Declarative Programming......Page 319
Chapter 7 Software Engineering......Page 332
7.1 The Software Engineering Discipline......Page 333
7.2 The Software Life Cycle......Page 335
7.3 Software Engineering Methodologies......Page 339
7.4 Modularity......Page 342
7.5 Tools of the Trade......Page 349
7.6 Quality Assurance......Page 357
7.7 Documentation......Page 361
7.8 The Human-Machine Interface......Page 362
7.9 Software Ownership and Liability......Page 365
Chapter 8 Data Abstractions......Page 374
8.1 Basic Data Structures......Page 375
8.2 Related Concepts......Page 378
8.3 Implementing Data Structures......Page 381
8.4 A Short Case Study......Page 395
8.5 Customized Data Types......Page 400
8.6 Classes and Objects......Page 404
8.7 Pointers in Machine Language......Page 406
Chapter 9 Database Systems......Page 416
9.1 Database Fundamentals......Page 417
9.2 The Relational Model......Page 422
9.3 Object-Oriented Databases......Page 433
9.4 Maintaining Database Integrity......Page 435
9.5 Traditional File Structures......Page 439
9.6 Data Mining......Page 447
9.7 Social Impact of Database Technology......Page 449
Chapter 10 Computer Graphics......Page 458
10.1 The Scope of Computer Graphics......Page 459
10.2 Overview of 3D Graphics......Page 461
10.3 Modeling......Page 462
10.4 Rendering......Page 470
10.5 Dealing with Global Lighting......Page 481
10.6 Animation......Page 484
Chapter 11 Artificial Intelligence......Page 492
11.1 Intelligence and Machines......Page 493
11.2 Perception......Page 498
11.3 Reasoning......Page 504
11.4 Additional Areas of Research......Page 515
11.5 Artificial Neural Networks......Page 520
11.6 Robotics......Page 527
11.7 Considering the Consequences......Page 530
Chapter 12 Theory of Computation......Page 540
12.1 Functions and Their Computation......Page 541
12.2 Turing Machines......Page 543
12.3 Universal Programming Languages......Page 547
12.4 A Noncomputable Function......Page 553
12.5 Complexity of Problems......Page 557
12.6 Public-Key Cryptography......Page 566
Appendixes......Page 576
A ASCII......Page 578
B Circuits to Manipulate Two’s Complement Representations......Page 579
C A Simple Machine Language......Page 582
D High-Level Programming Languages......Page 584
E The Equivalence of Iterative and Recursive Structures......Page 586
F Answers to Questions & Exercises......Page 588
Index......Page 630

Citation preview

computer science An Overview

12th Edition Global Edition J. Glenn Brookshear and Dennis Brylow Global Edition contributions by Manasa S.

Boston Columbus Indianapolis New York San Francisco Upper Saddle River Amsterdam Cape Town Dubai London Madrid Milan Munich Paris Montréal Toronto Delhi Mexico City São Paulo Sydney Hong Kong Seoul Singapore Taipei Tokyo

A01_BROO1160_12_SE_FM.indd 1

01/08/14 9:37 AM

Vice President and Editorial Director, ECS: Marcia Horton Executive Editor: Tracy Johnson Program Management Team Lead: Scott Disanno Program Manager: Carole Snyder Project Manager: Camille Trentacoste Head, Learning Asset Acquisitions, Global Edition: Laura Dent Acquisition Editor, Global Edition: Karthik Subramanian Project Editor, Global Edition: Anuprova Dey Chowdhuri Operations Specialist: Linda Sager Cover Designer: Lumina Datamatics Ltd Cover Image: Andrea Danti/Shutterstock Cover Printer/Binder: Courier Kendallville Pearson Education Limited Edinburgh Gate Harlow Essex CM20 2JE England and Associated Companies throughout the world Visit us on the World Wide Web at: www.pearsonglobaleditions.com © Pearson Education Limited 2015 The rights of J. Glenn Brookshear and Dennis Brylow to be identified as the authors of this work have been asserted by them in accordance with the Copyright, Designs and Patents Act 1988. Authorized adaptation from the United States edition, entitled computer science: An Overview, 12th edition, ISBN 973-0-13-376006-4, by J.Glenn Brookshear and Dennis Brylow, published by Pearson Education © 2015. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, electronic, mechanical, photocopying, recording or otherwise, without either the prior written permission of the publisher or a license permitting restricted copying in the United Kingdom issued by the Copyright Licensing Agency Ltd, Saffron House, 6–10 Kirby Street, London EC1N 8TS. All trademarks used herein are the property of their respective owners.The use of any trademark in this text does not vest in the author or publisher any trademark ownership rights in such trademarks, nor does the use of such trademarks imply any affiliation with or endorsement of this book by such owners. Microsoft and/or its respective suppliers make no representations about the suitability of the information contained in the documents and related graphics published as part of the services for any purpose. All such documents and related graphics are provided “as is” without warranty of any kind. Microsoft and/or its respective suppliers hereby disclaim all warranties and conditions with regard to this information, including all warranties and conditions of merchantability, whether express, implied or statutory, fitness for a particular purpose, title and non-infringement. In no event shall Microsoft and/or its respective suppliers be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of information available from the services. The documents and related graphics contained herein could include technical inaccuracies or typographical errors. Changes are periodically added to the information herein. Microsoft and/or its respective suppliers may make improvements and/or changes in the product(s) and/ or the program(s) described herein at any time. Partial screen shots may be viewed in full within the software version specified. Microsoft® and Windows® are registered trademarks of the Microsoft Corporation in the U.S.A. and other countries. This book is not sponsored or endorsed by or affiliated with the Microsoft Corporation. ISBN 10: 1-292-06116-2 ISBN 13: 978-1-292-06116-0 10 9 8 7 6 5 4 3 2 1 14 13 12 11 10 British Library Cataloguing-in-Publication Data A catalogue record for this book is available from the British Library Typeset in 8 VeljovicStd-Books by Laserwords Private, LTD. Printed and bound by Courier Kendallville. The publisher’s policy is to use paper manufactured from sustainable forests.

A01_BROO1160_12_SE_FM.indd 2

01/08/14 9:37 AM

Preface This book presents an introductory survey of computer science. It explores the breadth of the subject while including enough depth to convey an honest appreciation for the topics involved.

Audience We wrote this text for students of computer science as well as students from other disciplines. As for computer science students, most begin their studies with the illusion that computer science is programming, Web browsing, and Internet file sharing because that is essentially all they have seen. Yet computer science is much more than this. Beginning computer science students need exposure to the breadth of the subject in which they are planning to major. Providing this exposure is the theme of this book. It gives students an overview of computer science—a foundation from which they can appreciate the relevance and interrelationships of future courses in the field. This survey approach is, in fact, the model used for introductory courses in the natural sciences. This broad background is also what students from other disciplines need if they are to relate to the technical society in which they live. A computer science course for this audience should provide a practical, realistic understanding of the entire field rather than merely an introduction to using the Internet or training in the use of some popular software packages. There is, of course, a proper place for that training, but this text is about educating. While writing previous editions of this text, maintaining accessibility for nontechnical students was a major goal. The result was that the book has been used successfully in courses for students over a wide range of disciplines and educational levels, ranging from high school to graduate courses. This 12th edition is designed to continue that tradition.

New in the 12th Edition The underlying theme during the development of this 12th edition has been incorporating an introduction to the Python programming language into key ­chapters. In the earliest chapters, these supplementary sections are labeled optional.

3

A01_BROO1160_12_SE_FM.indd 3

01/08/14 9:37 AM

4

Preface

ByChapter5, we replace the previous editions’ Pascal-like notation with Python and Python-flavored pseudocode. This represents a significant change for a book that has historically striven to sidestep allegiance to any specific language. We make this change for several reasons. First, the text already contains quite a bit of code in various languages, including detailed pseudocode in several chapters. To the extent that readers are already absorbing a fair amount of syntax, it seems appropriate to retarget that syntax toward a language they may actually see in a subsequent course. More importantly, a growing number of instructors who use this text have made the determination that even in a breadth-first introduction to computing, it is difficult for students to master many of the topics in the absence of programming tools for exploration and experimentation. But why Python? Choosing a language is always a contentious matter, with any choice bound to upset at least as many as it pleases. Python is an excellent middle ground, with: • a clean, easily learned syntax, • simple I/O primitives, • data types and control structures that correspond closely to the ­pseudocode primitives used in earlier editions, and • support for multiple programming paradigms. It is a mature language with a vibrant development community and copious online resources for further study. Python remains one of the top 10 most commonly used languages in industry by some measures, and has seen a sharp increase in its usage for introductory computer science courses. It is particularly popular for introductory courses for non-majors, and has wide acceptance in other STEM fields such as physics and biology as the language of choice for computational science applications. Nevertheless, the focus of the text remains on broad computer science ­concepts; the Python supplements are intended to give readers a deeper taste of programming than previous editions, but not to serve as a full-fledged introduction to programming. The Python topics covered are driven by the existing structure of the text. Thus, Chapter 1 touches on Python syntax for representing data—­integers, floats, ASCII and Unicode strings, etc. Chapter 2 touches on Python operations that closely mirror the machine primitives discussed throughout the rest of the chapter. Conditionals, loops, and functions are introduced in Chapter5, at the time that those constructs are needed to devise a sufficiently complete pseudocode for describing algorithms. In short, Python constructs are used to reinforce computer science concepts rather than to hijack the conversation. In addition to the Python content, virtually every chapter has seen revisions, updates, and corrections from the previous editions.

Organization This text follows a bottom-up arrangement of subjects that progresses from the concrete to the abstract—an order that results in a sound pedagogical presentation in which each topic leads to the next. It begins with the fundamentals of information encoding, data storage, and computer architecture (Chapters 1 and 2); progresses to the study of operating systems (Chapter 3) and computer networks

A01_BROO1160_12_SE_FM.indd 4

01/08/14 9:37 AM

Organization

5

(Chapter 4); investigates the topics of algorithms, programming languages, and software ­development (Chapters 5 through 7); explores techniques for enhancing the accessibility of information (Chapters 8 and 9); considers some major applications of computer technology via graphics (Chapter 10) and artificial intelligence (Chapter 11); and closes with an introduction to the abstract theory of computation (Chapter 12). Although the text follows this natural progression, the individual chapters and sections are surprisingly independent and can usually be read as isolated units or rearranged to form alternative sequences of study. Indeed, the book is often used as a text for courses that cover the material in a variety of orders. One of these alternatives begins with material from Chapters 5 and 6 (Algorithms and Programming Languages) and returns to the earlier chapters as desired. I also know of one course that starts with the material on computability from Chapter12. In still other cases, the text has been used in “senior capstone” courses where it serves as merely a backbone from which to branch into projects in different areas. Courses for less technically-oriented audiences may want to concentrate on Chapters 4 (Networking and the Internet), 9 (Database Systems), 10 (Computer Graphics), and 11 (Artificial Intelligence). On the opening page of each chapter, we have used asterisks to mark some sections as optional. These are sections that cover topics of more specific interest or perhaps explore traditional topics in more depth. Our intention is merely to provide suggestions for alternative paths through the text. There are, of course, other shortcuts. In particular, if you are looking for a quick read, we suggest the following sequence: Section

Topic

1.1–1.4

Basics of data encoding and storage

2.1–2.3

Machine architecture and machine language

3.1–3.3

Operating systems

4.1–4.3

Networking and the Internet

5.1–5.4

Algorithms and algorithm design

6.1–6.4

Programming languages

7.1–7.2

Software engineering

8.1–8.3

Data abstractions

9.1–9.2

Database systems

10.1–10.2

Computer graphics

11.1–11.3

Artificial intelligence

12.1–12.2

Theory of computation

There are several themes woven throughout the text. One is that computer science is dynamic. The text repeatedly presents topics in a historical perspective, discusses the current state of affairs, and indicates directions of research. Another theme is the role of abstraction and the way in which abstract tools are used to control complexity. This theme is introduced in Chapter 0 and then echoed in the context of operating system architecture, networking, algorithm development, programming language design, software engineering, data organization, and computer graphics.

A01_BROO1160_12_SE_FM.indd 5

01/08/14 9:37 AM

6

Preface

To Instructors There is more material in this text than students can normally cover in a single semester so do not hesitate to skip topics that do not fit your course objectives or to rearrange the order as you see fit. You will find that, although the text follows a plot, the topics are covered in a largely independent manner that allows you to pick and choose as you desire. The book is designed to be used as a course resource—not as a course definition. We suggest encouraging students to read the material not explicitly included in your course. We underrate students if we assume that we have to explain everything in class. We should be helping them learn to learn on their own. We feel obliged to say a few words about the bottom-up, concrete-to-abstract organization of the text. As academics, we too often assume that students will appreciate our perspective of a subject—often one that we have developed over many years of working in a field. As teachers, we think we do better by presenting material from the student’s perspective. This is why the text starts with data representation/storage, machine architecture, operating systems, and networking. These are topics to which students readily relate—they have most likely heard terms such as JPEG and MP3; they have probably recorded data on CDs and DVDs; they have purchased computer components; they have interacted with an operating system; and they have used the Internet. By starting the course with these topics, students discover answers to many of the “why” questions they have been carrying for years and learn to view the course as practical rather than theoretical. From this beginning it is natural to move on to the more abstract issues of algorithms, algorithmic structures, programming languages, software development methodologies, computability, and complexity that those of us in the field view as the main topics in the science. As already stated, the topics are presented in a manner that does not force you to follow this bottom-up sequence, but we encourage you to give it a try. We are all aware that students learn a lot more than we teach them directly, and the lessons they learn implicitly are often better absorbed than those that are studied explicitly. This is significant when it comes to “teaching” problem solving. Students do not become problem solvers by studying problem-solving methodologies. They become problem solvers by solving problems—and not just carefully posed “textbook problems.” So this text contains numerous problems, a few of which are intentionally vague—meaning that there is not necessarily a single correct approach or a single correct answer. We encourage you to use these and to expand on them. Other topics in the “implicit learning” category are those of professionalism, ethics, and social responsibility. We do not believe that this material should be presented as an isolated subject that is merely tacked on to the course. Instead, it should be an integral part of the coverage that surfaces when it is relevant. This is the approach followed in this text. You will find that Sections 3.5, 4.5, 7.9, 9.7, and 11.7 present such topics as security, privacy, liability, and social awareness in the context of operating systems, networking, software engineering, database systems, and artificial intelligence. You will also find that each chapter includes a collection of questions called Social Issues that challenge students to think about the relationship between the material in the text and the society in which they live.

A01_BROO1160_12_SE_FM.indd 6

01/08/14 9:37 AM

Supplemental Resources

7

Thank you for considering our text for your course. Whether you do or do not decide that it is right for your situation, I hope that you find it to be a contribution to the computer science education literature.

Pedagogical Features This text is the product of many years of teaching. As a result, it is rich in pedagogical aids. Paramount is the abundance of problems to enhance the student’s participation—over 1,000 in this 12th edition. These are classified as Questions & Exercises, Chapter Review Problems, and Social Issues. The Questions & Exercises appear at the end of each section (except for the introductory chapter). They review the material just discussed, extend the previous discussion, or hint at related topics to be covered later. These questions are answered in Appendix F. The Chapter Review Problems appear at the end of each chapter (except for the introductory chapter). They are designed to serve as “homework” problems in that they cover the material from the entire chapter and are not answered in the text. Also at the end of each chapter are the questions in the Social Issues category. They are designed for thought and discussion. Many of them can be used to launch research assignments culminating in short written or oral reports. Each chapter also ends with a list called Additional Reading that contains references to other material relating to the subject of the chapter. The websites identified in this preface, in the text, and in the sidebars of the text are also good places to look for related material.

Supplemental Resources A variety of supplemental materials for this text are available at the book’s companion website: www.pearsonglobaleditions.com/brookshear. The following are accessible to all readers: • Chapter-by-chapter activities that extend topics in the text and provide opportunities to explore related topics • Chapter-by-chapter “self-tests” that help readers to rethink the material covered in the text • Manuals that teach the basics of Java and C+ in a pedagogical sequence compatible with the text In addition, the following supplements are available to qualified instructors at Pearson Education’s Instructor Resource Center. Please visit www.pearsonglobaleditions.com/brookshear or contact your Pearson sales representative for information on how to access them: • Instructor’s Guide with answers to the Chapter Review Problems • PowerPoint lecture slides • Test bank Errata for this book (should there be any!) will be available at www.pearsonglobaleditions.com/brookshear.

A01_BROO1160_12_SE_FM.indd 7

01/08/14 9:37 AM

8

Preface

To Students Glenn Brookshear is a bit of a nonconformist (some of his friends would say more than a bit) so when he set out to write this text he didn’t always follow the advice he received. In particular, many argued that certain material was too advanced for beginning students. But, we believe that if a topic is relevant, then it is relevant even if the academic community considers it to be an “advanced topic.” You deserve a text that presents a complete picture of computer science—not a watered-down version containing artificially simplified presentations of only those topics that have been deemed appropriate for introductory students. Thus, we have not avoided topics. Instead, we’ve sought better explanations. We’ve tried to provide enough depth to give you an honest picture of what computer science is all about. As in the case of spices in a recipe, you may choose to skip some of the topics in the following pages, but they are there for you to taste if you wish—and we encourage you to do so. We should also point out that in any course dealing with technology, the details you learn today may not be the details you will need to know tomorrow. The field is dynamic—that’s part of the excitement. This book will give you a current picture of the subject as well as a historical perspective. With this background you will be prepared to grow along with technology. We encourage you to start the growing process now by exploring beyond this text. Learn to learn. Thank you for the trust you have placed in us by choosing to read our book. As authors we have an obligation to produce a manuscript that is worth your time. We hope you find that we have lived up to this obligation.

Acknowledgments First and foremost, I thank Glenn Brookshear, who has shepherded this book, “his baby,” through eleven previous editions, spanning more than a quarter century of rapid growth and tumultuous change in the field of computer science. While this is the first edition in which he has allowed a co-author to oversee all of the revisions, the pages of this 12th edition remain overwhelmingly in Glenn’s voice and, I hope, guided by his vision. Any new blemishes are mine; the elegant underlying framework is all his. I join Glenn in thanking those of you who have supported this book by reading and using it in previous editions. We are honored. David T. Smith (Indiana University of Pennsylvania) played a significant role in co-authoring revisions to the 11th edition with me, many of which are still visible in this 12th edition. David’s close reading of this edition and careful attention to the supplemental materials have been essential. Andrew ­Kuemmel (Madison West), George Corliss (Marquette), and Chris Mayfield (James ­Madison) all provided valuable feedback, insight, and/or encouragement on drafts for this edition, while James E. Ames (Virginia Commonwealth), Stephanie E. August (Loyola), Yoonsuck Choe (Texas A&M), Melanie Feinberg (UT-Austin), Eric D. Hanley (Drake), Sudharsan R. Iyengar (Winona State), Ravi Mukkamala (Old­Dominion), and Edward Pryor (Wake Forest) all offered valuable reviews of the ­Python-­specific revisions.

A01_BROO1160_12_SE_FM.indd 8

01/08/14 9:37 AM

Acknowledgments

9

Others who have contributed in this or previous editions include J. M. Adams, C. M. Allen, D. C. S. Allison, E. Angel, R. Ashmore, B. Auernheimer, P. Bankston, M. Barnard, P. Bender, K. Bowyer, P. W. Brashear, C. M. Brown, H. M Brown, B. Calloni, J. Carpinelli, M. Clancy, R. T. Close, D. H. Cooley, L. D. Cornell, M. J. Crowley, F. Deek, M. Dickerson, M. J. Duncan, S. Ezekiel, C. Fox, S. Fox, N. E. Gibbs, J. D. Harris, D. Hascom, L. Heath, P. B. Henderson, L. Hunt, M. Hutchenreuther, L. A. Jehn, K. K. Kolberg, K. Korb, G. Krenz, J. Kurose, J. Liu, T. J. Long, C. May, J. J. McConnell, W. McCown, S. J. Merrill, K. Messersmith, J. C. Moyer, M. Murphy, J. P. Myers, Jr., D. S. Noonan, G. Nutt, W. W. Oblitey, S. Olariu, G. Riccardi, G. Rice, N. Rickert, C. Riedesel, J. B. Rogers, G. Saito, W. Savitch, R. Schlafly, J. C. Schlimmer, S. Sells, Z. Shen, G. Sheppard, J. C. Simms, M. C. Slattery, J. Slimick, J. A. Slomka, J. Solderitsch, R. Steigerwald, L. Steinberg, C. A. Struble, C. L. Struble, W. J. Taffe, J. Talburt, P. Tonellato, P. Tromovitch, P. H. Winston, E. D. Winter, E. Wright, M. Ziegler, and one anonymous. To these individuals we give our sincere thanks. As already mentioned, you will find Java and C++ manuals at the text’s ­Companion Website that teach the basics of these languages in a format compatible with the text. These were written by Diane Christie. Thank you, Diane. Another thank you goes to Roger Eastman who was the creative force behind the chapter-by-chapter activities that you will also find at the companion website. I also thank the good people at Pearson who have supported this project. Tracy Johnson, Camille Trentacoste, and Carole Snyder in particular have been a pleasure to work with, and brought their wisdom and many improvements to the table throughout the process. Finally, my thanks to my wife, Petra—“the Rock”—to whom this edition is dedicated. Her patience and fortitude all too frequently exceeded my own, and this book is better for her steadying influence. D.W.B. Pearson wishes to thank Arup Bhattacharjee, Soumen Mukherjee, and Chethan Venkatesh for reviewing the Global Edition.

A01_BROO1160_12_SE_FM.indd 9

01/08/14 9:37 AM

Contents Chapter 0 Introduction  13 0.1 The Role of Algorithms  14 0.2 The History of Computing  16 0.3 An Outline of Our Study 21 0.4 The Overarching Themes of Computer Science  23

Chapter 1 Data Storage  31

1.1 1.2 1.3 1.4 *1.5 *1.6 *1.7 *1.8 *1.9 *1.10

Bits and Their Storage  32 Main Memory  38 Mass Storage  41 Representing Information as Bit Patterns  46 The Binary System  52 Storing Integers  58 Storing Fractions  64 Data and Programming  69 Data Compression  75 Communication Errors  81

Chapter 2 Data Manipulation  93

2.1 2.2 2.3 *2.4 *2.5 *2.6 *2.7

Computer Architecture  94 Machine Language  97 Program Execution  103 Arithmetic/Logic Instructions  110 Communicating with Other Devices  115 Programming Data Manipulation  120 Other Architectures  129

Chapter 3 Operating Systems  139

3.1 The History of Operating Systems  140 3.2 Operating System Architecture  144 3.3 Coordinating the Machine’s Activities  152

*Asterisks indicate suggestions for optional sections.

10

A01_BROO1160_12_SE_FM.indd 10

01/08/14 9:37 AM

Contents

11

*3.4 Handling Competition Among Processes  155 3.5 Security  160

Chapter 4 Networking and the Internet  169

4.1 Network Fundamentals  170 4.2 The Internet  179 4.3 The World Wide Web  188 *4.4 Internet Protocols  197 4.5 Security  203

Chapter 5 Algorithms  217

5.1 5.2 5.3 5.4 5.5 5.6

The Concept of an Algorithm  218 Algorithm Representation  221 Algorithm Discovery  228 Iterative Structures  234 Recursive Structures  245 Efficiency and Correctness  253

Chapter 6 Programming Languages  271

6.1 6.2 6.3 6.4 6.5 *6.6 *6.7

Historical Perspective  272 Traditional Programming Concepts  280 Procedural Units  292 Language Implementation  300 Object-Oriented Programming  308 Programming Concurrent Activities  315 Declarative Programming  318

Chapter 7 Software Engineering  331

7.1 The Software Engineering Discipline  332 7.2 The Software Life Cycle  334 7.3 Software Engineering Methodologies  338 7.4 Modularity  341 7.5 Tools of the Trade  348 7.6 Quality Assurance  356 7.7 Documentation  360 7.8 The Human-Machine Interface  361 7.9 Software Ownership and Liability  364

Chapter 8 Data Abstractions  373

A01_BROO1160_12_SE_FM.indd 11

8.1 8.2 8.3 8.4 8.5 8.6 *8.7

Basic Data Structures  374 Related Concepts  377 Implementing Data Structures  380 A Short Case Study  394 Customized Data Types  399 Classes and Objects  403 Pointers in Machine Language  405

01/08/14 9:37 AM

12

Contents

Chapter 9 Database Systems  415

9.1 9.2 *9.3 *9.4 *9.5 9.6 9.7

Database Fundamentals  416 The Relational Model  421 Object-Oriented Databases  432 Maintaining Database Integrity  434 Traditional File Structures  438 Data Mining  446 Social Impact of Database Technology  448

Chapter 10 Computer Graphics  457

10.1 The Scope of Computer Graphics  458 10.2 Overview of 3D Graphics  460 10.3 Modeling  461 10.4 Rendering  469 *10.5 Dealing with Global Lighting  480 10.6 Animation  483

Chapter 11 Artificial Intelligence  491

11.1 Intelligence and Machines  492 11.2 Perception  497 11.3 Reasoning  503 11.4 Additional Areas of Research  514 11.5 Artificial Neural Networks  519 11.6 Robotics  526 11.7 Considering the Consequences  529

Chapter 12 Theory of Computation  539

12.1 12.2 12.3 12.4 12.5 *12.6

Functions and Their Computation  540 Turing Machines  542 Universal Programming Languages  546 A Noncomputable Function  552 Complexity of Problems  556 Public-Key Cryptography  565

Appendixes 575

A ASCII  577 B Circuits to Manipulate Two’s Complement Representations 578 C A Simple Machine Language  581 D High-Level Programming Languages  583 E The Equivalence of Iterative and Recursive Structures  585 F Answers to Questions & Exercises  587

Index 629

A01_BROO1160_12_SE_FM.indd 12

01/08/14 9:37 AM

C H A P T E R

Introduction In this preliminary chapter we consider the scope of ­computer ­science, develop a historical perspective, and establish a ­foundation from which to launch our study.

0.1 The Role of Algorithms 0.2 The History of Computing 0.3 An Outline of Our Study

M00_BROO1160_12_SE_C00.indd 13

0.4 The Overarching Themes of Computer Science Algorithms Abstraction Creativity

Data Programming Internet Impact

01/08/14 11:18 AM

14

Chapter 0  Introduction

Computer science is the discipline that seeks to build a scientific foundation for such topics as computer design, computer programming, information processing, algorithmic solutions of problems, and the algorithmic process itself. It provides the underpinnings for today’s computer applications as well as the foundations for tomorrow’s computing infrastructure. This book provides a comprehensive introduction to this science. We will investigate a wide range of topics including most of those that constitute a typical university computer science curriculum. We want to appreciate the full scope and dynamics of the field. Thus, in addition to the topics themselves, we will be interested in their historical development, the current state of research, and prospects for the future. Our goal is to establish a functional understanding of computer science—one that will support those who wish to pursue more specialized studies in the science as well as one that will enable those in other fields to flourish in an increasingly technical society.

0.1  The Role of Algorithms We begin with the most fundamental concept of computer science—that of an algorithm. Informally, an algorithm is a set of steps that defines how a task is performed. (We will be more precise later in Chapter5.) For example, there are algorithms for cooking (called recipes), for finding your way through a strange city (more commonly called directions), for operating washing machines (usually displayed on the inside of the washer’s lid or perhaps on the wall of a laundromat), for playing music (expressed in the form of sheet music), and for performing magic tricks (Figure0.1). Before a machine such as a computer can perform a task, an algorithm for performing that task must be discovered and represented in a form that is compatible with the machine. A representation of an algorithm is called a program. For the convenience of humans, computer programs are usually printed on paper or displayed on computer screens. For the convenience of machines, programs are encoded in a manner compatible with the technology of the machine. The process of developing a program, encoding it in machine-compatible form, and inserting it into a machine is called programming. Programs, and the algorithms they represent, are collectively referred to as software, in contrast to the machinery itself, which is known as hardware. The study of algorithms began as a subject in mathematics. Indeed, the search for algorithms was a significant activity of mathematicians long before the d ­ evelopment of today’s computers. The goal was to find a single set of directions that described how all problems of a particular type could be solved. One of the best known examples of this early research is the long division algorithm for finding the quotient of two multiple-digit numbers. Another example is the Euclidean algorithm, discovered by the ancient Greek mathematician Euclid, for finding the greatest common divisor of two positive integers (Figure0.2). Once an algorithm for performing a task has been found, the performance of that task no longer requires an understanding of the principles on which the algorithm is based. Instead, the performance of the task is reduced to the process of merely following directions. (We can follow the long division algorithm to find a quotient or the Euclidean algorithm to find a greatest common divisor without

M00_BROO1160_12_SE_C00.indd 14

01/08/14 11:18 AM

0.1  The Role of Algorithms

15

Figure 0.1   An algorithm for a magic trick Effect: The performer places some cards from a normal deck of playing cards face down on a table and mixes them thoroughly while spreading them out on the table. Then, as the audience requests either red or black cards, the performer turns over cards of the requested color. Secret and Patter: Step 1. From a normal deck of cards, select ten red cards and ten black cards. Deal these cards face up in two piles on the table according to color.

Step 2. Announce that you have selected some red cards and some black cards. Step 3. Pick up the red cards. Under the pretense of aligning them into a small deck, hold them face down in your left hand and, with the thumb and first finger of your right hand, pull back on each end of the deck so that each card is given a slightly backward curve. Then place the deck of red cards face down on the table as you say, “Here are the red cards in this stack.”

Step 4. Pick up the black cards. In a manner similar to that in step 3, give these cards a slight forward curve. Then return these cards to the table in a face-down deck as you say, “And here are the black cards in this stack.”

Step 5. Immediately after returning the black cards to the table, use both hands to mix the red

and black cards (still face down) as you spread them out on the tabletop. Explain that you are thoroughly mixing the cards.

Step 6. As long as there are face-down cards on the table, repeatedly execute the following steps:

6.1. Ask the audience to request either a red or a black card. 6.2. If the color requested is red and there is a face-down card with a concave appearance, turn over such a card while saying, “Here is a red card.”

6.3. If the color requested is black and there is a face-down card with a convex appearance, turn over such a card while saying, “Here is a black card.”

6.4. Otherwise, state that there are no more cards of the requested color and turn over the remaining cards to prove your claim.

Figure 0.2   The Euclidean algorithm for finding the greatest common divisor of two positiveintegers Description: This algorithm assumes that its input consists of two positive integers and proceeds to compute the greatest common divisor of these two values. Procedure: Step 1. Assign M and N the value of the larger and smaller of the two input values, respectively. Step 2. Divide M by N, and call the remainder R. Step 3. If R is not 0, then assign M the value of N, assign N the value of R, and return to step 2; otherwise, the greatest common divisor is the value currently assigned to N.

M00_BROO1160_12_SE_C00.indd 15

01/08/14 11:18 AM

16

Chapter 0  Introduction

understanding why the algorithm works.) In a sense, the intelligence required to solve the problem at hand is encoded in the algorithm. Capturing and conveying intelligence (or at least intelligent behavior) by means of algorithms allows us to build machines that perform useful tasks. ­Consequently, the level of intelligence displayed by machines is limited by the intelligence that can be conveyed through algorithms. We can construct a machine to perform a task only if an algorithm exists for performing that task. In turn, if no algorithm exists for solving a problem, then the solution of that problem lies beyond the capabilities of machines. Identifying the limitations of algorithmic capabilities solidified as a subject in mathematics in the 1930s with the publication of Kurt Gödel’s incompleteness theorem. This theorem essentially states that in any mathematical theory encompassing our traditional arithmetic system, there are statements whose truth or falseness cannot be established by algorithmic means. In short, any complete study of our arithmetic system lies beyond the capabilities of algorithmic ­activities. This realization shook the foundations of mathematics, and the study of algorithmic capabilities that ensued was the beginning of the field known today as computer science. Indeed, it is the study of algorithms that forms the core of computer science.

0.2  The History of Computing Today’s computers have an extensive genealogy. One of the earlier computing devices was the abacus. History tells us that it probably had its roots in ancient China and was used in the early Greek and Roman civilizations. The machine is quite simple, consisting of beads strung on rods that are in turn mounted in a rectangular frame (Figure0.3). As the beads are moved back and forth on the rods, their positions represent stored values. It is in the positions of the beads that this “computer” represents and stores data. For control of an algorithm’s execution, the machine relies on the human operator. Thus the abacus alone is merely a data storage system; it must be combined with a human to create a complete computational machine. In the time period after the Middle Ages and before the Modern Era, the quest for more sophisticated computing machines was seeded. A few inventors began to experiment with the technology of gears. Among these were Blaise ­Pascal (1623–1662) of France, Gottfried Wilhelm Leibniz (1646–1716) of Germany, and Charles Babbage (1792–1871) of England. These machines represented data through gear positioning, with data being entered mechanically by establishing initial gear positions. Output from Pascal’s and Leibniz’s machines was achieved by observing the final gear positions. Babbage, on the other hand, envisioned machines that would print results of computations on paper so that the possibility of transcription errors would be eliminated. As for the ability to follow an algorithm, we can see a progression of flexibility in these machines. Pascal’s machine was built to perform only addition. ­Consequently, the appropriate sequence of steps was embedded into the structure of the machine itself. In a similar manner, Leibniz’s machine had its algorithms firmly embedded in its architecture, although the operator could select from a variety of arithmetic operations it offered. Babbage’s Difference Engine

M00_BROO1160_12_SE_C00.indd 16

01/08/14 11:18 AM

0.2  The History of Computing

17

Figure 0.3   Chinese wooden abacus (Pink Badger/Fotolia)

(ofwhich only a demonstration model was constructed) could be modified to perform a variety of calculations, but his Analytical Engine (never funded for construction) was designed to read instructions in the form of holes in paper cards. Thus Babbage’s Analytical Engine was programmable. In fact, Augusta AdaByron (AdaLovelace), who published a paper in which she demonstrated how Babbage’s Analytical Engine could be programmed to perform various computations, is often identified today as the world’s first programmer. The idea of communicating an algorithm via holes in paper was not originated by Babbage. He got the idea from Joseph Jacquard (1752–1834), who, in 1801, had developed a weaving loom in which the steps to be performed during the weaving process were determined by patterns of holes in large thick cards made of wood (or cardboard). In this manner, the algorithm followed by the loom could be changed easily to produce different woven designs. Another beneficiary of Jacquard’s idea was Herman Hollerith (1860–1929), who applied the concept of representing information as holes in paper cards to speed up the tabulation process in the 1890 U.S. census. (It was this work by Hollerith that led to the creation of IBM.) Such cards ultimately came to be known as punched cards and survived as a popular means of communicating with computers well into the 1970s. Nineteenth-century technology was unable to produce the complex geardriven machines of Pascal, Leibniz, and Babbage cost-effectively. But with the advances in electronics in the early 1900s, this barrier was overcome. ­Examples of this progress include the electromechanical machine of George Stibitz, ­completed in 1940 at Bell Laboratories, and the Mark I, completed in 1944 at ­Harvard U ­ niversity by Howard Aiken and a group of IBM engineers. These machines made heavy use of electronically controlled mechanical relays. In this sense they were obsolete almost as soon as they were built, because other researchers were a­ pplying the technology of vacuum tubes to construct totally

M00_BROO1160_12_SE_C00.indd 17

01/08/14 11:18 AM

18

Chapter 0  Introduction

Figure 0.4   Three women operating the ENIAC’s (Electronic Numerical Integrator And ­Computer) main control panel while the machine was at the Moore School. The machine was later moved to the U.S. Army’s Ballistics Research Laboratory. (Courtesy U.S. Army.)

electronic computers. The first of these vacuum tube machines was apparently the Atanasoff-Berry machine, constructed during the period from 1937 to 1941 at Iowa State College (now Iowa State University) by John Atanasoff and his assistant, Clifford Berry. Another was a machine called Colossus, built under thedirection of Tommy F ­ lowers in England to decode German messages duringthe latter part of World War II. (Actually, as many as ten of these machines were apparently built, but military secrecy and issues of national security kept their existence from becoming part of the “computer family tree.”) Other, more flexible machines, such as the ENIAC (electronic numerical integrator and calcu­ lator) developed by John Mauchly and J. Presper Eckert at the Moore School of Electrical Engineering, University of Pennsylvania, soon followed (Figure0.4). From that point on, the history of computing machines has been closely linked to advancing technology, including the invention of transistors (for which physicists William Shockley, John Bardeen, and Walter Brattain were awarded a Nobel Prize) and the subsequent development of complete circuits constructed as single units, called integrated circuits (for which Jack Kilby also won a Nobel Prize in physics). With these developments, the room-sized machines of the 1940s were reduced over the decades to the size of single cabinets. At the same time, the processing power of computing machines began to double every two years (a trend that has continued to this day). As work on integrated circuitry progressed, many of the components within a computer became readily available on the open market as integrated circuits encased in toy-sized blocks of plastic called chips. A major step toward popularizing computing was the development of desktop computers. The origins of these machines can be traced to the computer hobbyists who built homemade computers from combinations of chips. It was within this “underground” of hobby activity that Steve Jobs and Stephen Wozniak

M00_BROO1160_12_SE_C00.indd 18

01/08/14 11:18 AM

0.2  The History of Computing

19

Babbage’s Difference Engine The machines designed by Charles Babbage were truly the forerunners of modern computer design. If technology had been able to produce his machines in an eco­ nomically feasible manner and if the data processing demands of commerce and government had been on the scale of today’s requirements, Babbage’s ideas could have led to a computer revolution in the 1800s. As it was, only a demonstration model of his Difference Engine was constructed in his lifetime. This machine determined numerical values by computing “successive differences.” We can gain an insight to this technique by considering the problem of computing the squares of the integers. We begin with the knowledge that the square of 0 is 0, the square of 1 is 1, the square of 2 is 4, and the square of 3 is 9. With this, we can determine the square of 4 in the following manner (see the following diagram). We first compute the differ­ ences of the squares we already know: 12 - 02 = 1, 22 - 12 = 3, and 32 - 22 = 5. Then we compute the differences of these results: 3 - 1 = 2, and 5 - 3 = 2. Note that these differences are both 2. Assuming that this consistency continues (mathe­ matics can show that it does), we conclude that the difference between the value (42 - 32) and the value (32 - 22) must also be 2. Hence (42 - 32) must be 2 greater than (32 - 22), so 42 - 32 = 7 and thus 42 = 32 + 7 = 16. Now that we know the square of 4, we could continue our procedure to compute the square of 5 based on the values of 12, 22, 32, and 42. (Although a more in−depth discussion of successive differences is beyond the scope of our current study, students of calculus may wish to observe that the preceding example is based on the fact that the derivative of y = x 2 is a straight line with a slope of 2.) x

x2

1

1

2

4

3

9

4

16

First difference

1 3 5 7

Second difference

2 2 2 2

5

built a commercially viable home computer and, in 1976, established Apple Computer, Inc. (now Apple Inc.) to manufacture and market their products. Other ­companies that marketed similar products were Commodore, Heathkit, and Radio Shack. Although these products were popular among computer hobbyists, they were not widely accepted by the business community, which continued to look to the well-established IBM and its large mainframe computers for the majority of its computing needs. In 1981, IBM introduced its first desktop computer, called the personal ­computer, or PC, whose underlying software was developed by a newly formed company known as Microsoft. The PC was an instant success and legitimized

M00_BROO1160_12_SE_C00.indd 19

01/08/14 11:18 AM

20

Chapter 0  Introduction

Augusta Ada Byron Augusta Ada Byron, Countess of Lovelace, has been the subject of much ­commentary in the computing community. She lived a somewhat tragic life of less than 37 years (1815–1852) that was complicated by poor health and the fact that she was a non­ conformist in a society that limited the professional role of women. Although she was interested in a wide range of science, she concentrated her studies in ­mathematics. Her interest in “compute science” began when she became fascinated by the machines of Charles Babbage at a demonstration of a prototype of his Difference Engine in 1833. Her contribution to computer science stems from her translation from French into English of a paper discussing Babbage’s designs for the Analytical Engine. To this translation, Babbage encouraged her to attach an addendum describ­ ing applications of the engine and containing examples of how the engine could be programmed to perform various tasks. Babbage’s enthusiasm for Ada Byron’s work was apparently motivated by his hope that its publication would lead to financial backing for the construction of his Analytical Engine. (As the daughter of Lord Byron, Ada Byron held celebrity status with potentially significant financial connections.) Thisbacking never materialized, but Ada Byron’s addendum has survived and is considered to contain the first examples of computer programs. The degree to which Babbage influenced Ada Byron’s work is debated by historians. Some argue that Babbage made major contributions, whereas others contend that he was more of an obstacle than an aid. Nonetheless, Augusta Ada Byron is recognized today as the world’s first programmer, a status that was certified by the U.S. Department of Defense when it named a prominent programming language (Ada) in her honor.

the desktop computer as an established commodity in the minds of the business ­community. Today, the term PC is widely used to refer to all those machines (from various manufacturers) whose design has evolved from IBM’s initial desktop computer, most of which continue to be marketed with software from ­Microsoft. At times, however, the term PC is used interchangeably with the generic terms desktop or laptop. As the twentieth century drew to a close, the ability to connect individual computers in a world-wide system called the Internet was revolutionizing communication. In this context, Tim Berners-Lee (a British scientist) proposed a system by which documents stored on computers throughout the Internet could be linked together producing a maze of linked information called the World Wide Web (often shortened to “Web”). To make the information on the Web accessible, software systems, called search engines, were developed to “sift through” the Web, “categorize” their findings, and then use the results to assist users researching particular topics. Major players in this field are Google, Yahoo, and Microsoft. These companies continue to expand their Web-related activities, often in directions that challenge our traditional way of thinking. At the same time that desktop and laptop computers were being accepted and used in homes, the miniaturization of computing machines continued. Today, tiny computers are embedded within a wide variety of electronic appliances and devices. Automobiles may now contain dozens of small computers running Global Positioning Systems (GPS), monitoring the function of the engine, and providing

M00_BROO1160_12_SE_C00.indd 20

01/08/14 11:18 AM

0.3  An Outline of Our Study

21

Google Founded in 1998, Google Inc. has become one of the world’s most recognized tech­ nology companies. Its core service, the Google search engine, is used by millions of people to find documents on the World Wide Web. In addition, Google provides electronic mail service (called Gmail), an Internet-based video-sharing service (called ­YouTube), and a host of other Internet services (including Google Maps, Google ­Calendar, Google Earth, Google Books, and Google Translate). However, in addition to being a prime example of the entrepreneurial spirit, Google also provides examples of how expanding technology is challenging society. For example, Google’s search engine has led to questions regarding the extent to which an international company should comply with the wishes of individual ­governments; YouTube has raised questions regarding the extent to which a company should be liable for information that others distribute through its services as well as the degree to which the company can claim ownership of that information; Google Books has generated concerns regarding the scope and limitations of intellectual property rights; and Google Maps has been accused of violating privacy rights.

voice command services for controlling the car’s audio and phone communication systems. Perhaps the most revolutionary application of computer miniaturization is found in the expanding capabilities of smartphones, hand-held general-purpose computers on which telephony is only one of many applications. More powerful than the supercomputers of prior decades, these pocket-sized devices are equipped with a rich array of sensors and interfaces including cameras, microphones, compasses, touch screens, accelerometers (to detect the phone’s orientation and motion), and a number of wireless technologies to communicate with other smartphones and computers. Many argue that the smartphone is having a greater effect on global society than the PC revolution.

0.3  An Outline of Our Study This text follows a bottom-up approach to the study of computer science, beginning with such hands-on topics as computer hardware and leading to the more abstract topics such as algorithm complexity and computability. The result is that our study follows a pattern of building larger and larger abstract tools as our understanding of the subject expands. We begin by considering topics dealing with the design and construction of machines for executing algorithms. In Chapter1 (Data Storage), we look at how information is encoded and stored within modern computers, and in Chapter2 (Data Manipulation), we investigate the basic internal operation of a simple computer. Although part of this study involves technology, the general theme is technology independent. That is, such topics as digital circuit design, data encoding and compression systems, and computer architecture are relevant over a wide range of technology and promise to remain relevant regardless of the direction of future technology.

M00_BROO1160_12_SE_C00.indd 21

01/08/14 11:18 AM

22

Chapter 0  Introduction

In Chapter3 (Operating Systems), we study the software that controls the overall operation of a computer. This software is called an operating system. It is a computer’s operating system that controls the interface between the machine and its outside world, protecting the machine and the data stored within from unauthorized access, allowing a computer user to request the execution of various programs, and coordinating the internal activities required to fulfill the user’s requests. In Chapter4 (Networking and the Internet), we study how computers are connected to each other to form computer networks and how networks are connected to form internets. This study leads to topics such as network protocols, the Internet’s structure and internal operation, the World Wide Web, and numerous issues of security. Chapter5 (Algorithms) introduces the study of algorithms from a more formal perspective. We investigate how algorithms are discovered, identify several fundamental algorithmic structures, develop elementary techniques for representing algorithms, and introduce the subjects of algorithm efficiency and correctness. In Chapter6 (Programming Languages), we consider the subject of algorithm representation and the program development process. Here we find that the search for better programming techniques has led to a variety of programming methodologies or paradigms, each with its own set of programming languages. We investigate these paradigms and languages as well as consider issues of grammar and language translation. Chapter7 (Software Engineering) introduces the branch of computer science known as software engineering, which deals with the problems encountered when developing large software systems. The underlying theme is that the design of large software systems is a complex task that embraces problems beyond those of traditional engineering. Thus, the subject of software engineering has become an important field of research within computer science, drawing from such diverse fields as engineering, project management, personnel management, programming language design, and even architecture. In the next two chapters we look at ways data can be organized within a computer system. In Chapter8 (Data Abstractions), we introduce techniques traditionally used for organizing data in a computer’s main memory and then trace the evolution of data abstraction from the concept of primitives to today’s object-oriented techniques. In Chapter 9 (Database Systems), we consider methods traditionally used for organizing data in a computer’s mass storage and investigate how extremely large and complex database systems are implemented. In Chapter10 (Computer Graphics), we explore the subject of graphics and animation, a field that deals with creating and photographing virtual worlds. Based on advancements in the more traditional areas of computer science such as machine architecture, algorithm design, data structures, and software engineering, the discipline of graphics and animation has seen significant progress and has now blossomed into an exciting, dynamic subject. Moreover, the field exemplifies how various components of computer science combine with other disciplines such as physics, art, and photography to produce striking results. In Chapter11 (Artificial Intelligence), we learn that to develop more useful machines computer science has turned to the study of human intelligence for insight. The hope is that by understanding how our own minds reason and

M00_BROO1160_12_SE_C00.indd 22

01/08/14 11:18 AM

0.4  The Overarching Themes of Computer Science

23

perceive, researchers will be able to design algorithms that mimic these p ­ rocesses and thus transfer comparable capabilities to machines. The result is the area of computer science known as artificial intelligence, which leans heavily on research in such areas as psychology, biology, and linguistics. We close our study with Chapter12 (Theory of Computation) by investigating the theoretical foundations of computer science—a subject that allows us to understand the limitations of algorithms (and thus machines). Here we identify some problems that cannot be solved algorithmically (and therefore lie beyond the capabilities of machines) as well as learn that the solutions to many other problems require such enormous time or space that they are also unsolvable from a practical perspective. Thus, it is through this study that we are able to grasp the scope and limitations of algorithmic systems. In each chapter, our goal is to explore the subject deeply enough to enable true understanding. We want to develop a working knowledge of computer ­science—a knowledge that will allow you to understand the technical society in which you live and to provide a foundation from which you can learn on your own as science and technology advance.

0.4  The Overarching Themes of Computer Science In addition to the main topics of each chapter as listed above, we also hope to broaden your understanding of computer science by incorporating several overarching themes. The miniaturization of computers and their expanding capabilities have brought computer technology to the forefront of today’s society, and computer technology is so prevalent that familiarity with it is fundamental to being a member of the modern world. Computing technology has altered the ability of governments to exert control; had enormous impact on global economics; led to startling advances in scientific research; revolutionized the role of data collection, storage, and applications; provided new means for people to communicate and interact; and has repeatedly challenged society’s status quo. The result is a proliferation of subjects surrounding computer science, each of which is now a significant field of study in its own right. Moreover, as with mechanical engineering and physics, it is often difficult to draw a line between these fields and computer science itself. Thus, to gain a proper perspective, our study will not only cover topics central to the core of computer science but also will explore a variety of disciplines dealing with both applications and consequences of the science. Indeed, an introduction to computer science is an interdisciplinary undertaking. As we set out to explore the breadth of the field of computing, it is helpful to keep in mind the main themes that unite computer science. While the codification of the “Seven Big Ideas of Computer Science”1 postdates the first ten editions of this book, they closely parallel the themes of the chapters to come. The “Seven Big Ideas” are, briefly: Algorithms, Abstraction, Creativity, Data, Programming, Internet, and Impact. In the chapters that follow, we include a variety of topics, in each case introducing central ideas of the topic, current areas of research, and some of the techniques being applied to advance knowledge in that realm. Watch for the “Big Ideas” as we return to them again and again. 1

www.csprinciples.org

M00_BROO1160_12_SE_C00.indd 23

01/08/14 11:18 AM

24

Chapter 0  Introduction

Algorithms Limited data storage capabilities and intricate, time-consuming programming procedures restricted the complexity of the algorithms used in the earliest computing machines. However, as these limitations began to disappear, machines were applied to increasingly larger and more complex tasks. As attempts to express the composition of these tasks in algorithmic form began to tax the abilities of the human mind, more and more research efforts were directed toward the study of algorithms and the programming process. It was in this context that the theoretical work of mathematicians began to pay dividends. As a consequence of Gödel’s incompleteness theorem, mathematicians had already been investigating those questions regarding algorithmic processes that advancing technology was now raising. With that, the stage was set for the emergence of a new discipline known as computer science. Today, computer science has established itself as the science of algorithms. The scope of this science is broad, drawing from such diverse subjects as mathematics, engineering, psychology, biology, business administration, and ­linguistics. Indeed, researchers in different branches of computer science may have very distinct definitions of the science. For example, a researcher in the field of computer architecture may focus on the task of miniaturizing circuitry and thus view computer science as the advancement and application of technology. But, a researcher in the field of database systems may see computer science as seeking ways to make information systems more useful. And, a researcher in the field of artificial intelligence may regard computer science as the study of intelligence and intelligent behavior. Nevertheless, all of these researchers are involved in aspects of the science of algorithms. Given the central role that algorithms play in computer science (see Figure0.5), it is instructive to identify some questions that will provide focus for our study of this big idea. • Which problems can be solved by algorithmic processes? • How can the discovery of algorithms be made easier? Figure 0.5   The central role of algorithms in computer science Limitations of

Execution of

Application of

Algorithms Communication of

Analysis of

Discovery of

M00_BROO1160_12_SE_C00.indd 24

Representation of

01/08/14 11:18 AM

0.4  The Overarching Themes of Computer Science

25

• How can the techniques of representing and communicating algorithms be improved? • How can the characteristics of different algorithms be analyzed and compared? • How can algorithms be used to manipulate information? • How can algorithms be applied to produce intelligent behavior? • How does the application of algorithms affect society?

Abstraction The term abstraction, as we are using it here, refers to the distinction between the external properties of an entity and the details of the entity’s internal ­composition. It is abstraction that allows us to ignore the internal details of a complex device such as a computer, automobile, or microwave oven and use it as a single, comprehensible unit. Moreover, it is by means of abstraction that such complex systems are designed and manufactured in the first place. Computers, automobiles, and microwave ovens are constructed from components, each of which represents a level of abstraction at which the use of the component is isolated from the details of the component’s internal composition. It is by applying abstraction that we are able to construct, analyze, and manage large, complex computer systems that would be overwhelming if viewed in their entirety at a detailed level. At each level of abstraction, we view the system in terms of components, called abstract tools, whose internal composition we ignore. This allows us to concentrate on how each component interacts with other components at the same level and how the collection as a whole forms a higher-level component. Thus we are able to comprehend the part of the system that is relevant to the task at hand rather than being lost in a sea of details. We emphasize that abstraction is not limited to science and technology. It is an important simplification technique with which our society has created a lifestyle that would otherwise be impossible. Few of us understand how the various conveniences of daily life are actually implemented. We eat food and wear clothes that we cannot produce by ourselves. We use electrical devices and communication systems without understanding the underlying technology. We use the services of others without knowing the details of their professions. With each new advancement, a small part of society chooses to specialize in its implementation, while the rest of us learn to use the results as abstract tools. In this manner, society’s warehouse of abstract tools expands, and society’s ability to progress increases. Abstraction is a recurring pillar of our study. We will learn that computing equipment is constructed in levels of abstract tools. We will also see that the development of large software systems is accomplished in a modular fashion in which each module is used as an abstract tool in larger modules. Moreover, abstraction plays an important role in the task of advancing computer science itself, allowing researchers to focus attention on particular areas within a complex field. In fact, the organization of this text reflects this characteristic of the science. Each chapter, which focuses on a particular area within the science, is often surprisingly independent of the others, yet together the chapters form a comprehensive overview of a vast field of study.

M00_BROO1160_12_SE_C00.indd 25

01/08/14 11:18 AM

26

Chapter 0  Introduction

Creativity While computers may merely be complex machines mechanically executing rote algorithmic instructions, we shall see that the field of computer science is an inherently creative one. Discovering and applying new algorithms is a human activity that depends on our innate desire to apply our tools to solve problems in the world around us. Computer science not only extends forms of expression spanning the visual, language and musical arts, but also enables new modes of digital expression that pervade the modern world. Creating large software systems is much less like following a cookbook recipe than it is like conceiving of a grand new sculpture. Envisioning its form and ­function requires careful planning. Fabricating its components requires time, attention to detail, and practiced skill. The final product embodies the design aesthetics and sensibilities of its creators.

Data Computers are capable of representing any information that can be discretized and digitized. Algorithms can process or transform such digitally represented information in a dizzying variety of ways. The result of this is not merely the shuffling of digital data from one part of the computer to another; computer algorithms enable us to search for patterns, to create simulations, and to correlate connections in ways that generate new knowledge and insight. Massive storage capacities, high-speed computer networks, and powerful computational tools are driving discoveries in many other disciplines of science, engineering and the humanities. Whether predicting the effects of a new drug by simulating complex protein folding, statistically analyzing the evolution of language across centuries of digitized books, or rendering 3D images of internal organs from a noninvasive medical scan, data is driving modern discovery across the breadth of human endeavors. Some of the questions about data that we will explore in our study include: • How do computers store data about common digital artifacts, such as numbers, text, images, sounds, and video? • How do computers approximate data about analog artifacts in the real world? • How do computers detect and prevent errors in data? • What are the ramifications of an ever-growing and interconnected digital universe of data at our disposal?

Programming Translating human intentions into executable computer algorithms is now broadly referred to as programming, although the proliferation of languages and tools available now bear little resemblance to the programmable computers of the 1950s and early 1960s. While computer science consists of much more than computer programming, the ability to solve problems by devising executable algorithms (programs) remains a foundational skill for all computer scientists. Computer hardware is capable of executing only relatively simple algorithmic steps, but the abstractions provided by computer programming languages allow

M00_BROO1160_12_SE_C00.indd 26

01/08/14 11:18 AM

0.4  The Overarching Themes of Computer Science

27

humans to reason about and encode solutions for far more complex problems. Several key questions will frame our discussion of this theme. • • • • •

How are programs built? What kinds of errors can occur in programs? How are errors in programs found and repaired? What are the effects of errors in modern programs? How are programs documented and evaluated?

Internet The Internet connects computers and electronic devices around the world and has had a profound impact in the way that our technological society stores, retrieves, and shares information. Commerce, news, entertainment, and communication now depend increasingly on this interconnected web of smaller computer networks. Our discussion will not only describe the mechanisms of the Internet as an artifact, but will also touch on the many aspects of human society that are now intertwined with the global network. The reach of the Internet also has profound implications for our privacy and the security of our personal information. Cyberspace harbors many dangers. Consequently, cryptography and cybersecurity are of growing importance in our connected world.

Impact Computer science not only has profound impacts on the technologies we use to communicate, work, and play, it also has enormous social repercussions. Progress in computer science is blurring many distinctions on which our society has based decisions in the past and is challenging many of society’s long-held principles. In law, it generates questions regarding the degree to which intellectual property can be owned and the rights and liabilities that accompany that ownership. In ethics, it generates numerous options that challenge the traditional principles on which social behavior is based. In government, it generates debates regarding the extent to which computer technology and its applications should be regulated. In philosophy, it generates contention between the presence of intelligent behavior and the presence of intelligence itself. And, throughout society, it generates disputes concerning whether new applications represent new freedoms or new controls. Such topics are important for those contemplating careers in computing or computer-related fields. Revelations within science have sometimes found controversial applications, causing serious discontent for the researchers involved. Moreover, an otherwise successful career can quickly be derailed by an ethical misstep. The ability to deal with the dilemmas posed by advancing computer technology is also important for those outside its immediate realm. Indeed, technology is infiltrating society so rapidly that few, if any, are independent of its effects. This text provides the technical background needed to approach the dilemmas generated by computer science in a rational manner. However, technical knowledge of the science alone does not provide solutions to all the questions involved. With this in mind, this text includes several sections that are devoted to social, ethical, and legal impacts of computer science. These include security concerns, issues of software ownership and liability, the social impact of database technology, and the consequences of advances in artificial intelligence.

M00_BROO1160_12_SE_C00.indd 27

01/08/14 11:18 AM

28

Chapter 0  Introduction

Moreover, there is often no definitive correct answer to a problem, and many valid solutions are compromises between opposing (and perhaps equally valid) views. Finding solutions in these cases often requires the ability to listen, to recognize other points of view, to carry on a rational debate, and to alter one’s own opinion as new insights are gained. Thus, each chapter of this text ends with a collection of questions under the heading “Social Issues” that investigate the relationship between computer science and society. These are not necessarily questions to be answered. Instead, they are questions to be considered. In many cases, an answer that may appear obvious at first will cease to satisfy you as you explore alternatives. In short, the purpose of these questions is not to lead you to a “correct” answer, but rather to increase your awareness, including your awareness of the various stakeholders in an issue, your awareness of alternatives, and your awareness of both the short- and long-term consequences of those alternatives. Philosophers have introduced many approaches to ethics in their search for fundamental theories that lead to principles for guiding decisions and behavior. Character-based ethics (sometimes called virtue ethics) were promoted by Plato and Aristotle, who argued that “good behavior” is not the result of applying identifiable rules, but instead is a natural consequence of “good character.” Whereas other ethical bases, such as consequence-based ethics, duty-based ethics, and contract-based ethics, propose that a person resolve an ethical dilemma by asking, “What are the consequences?”, “What are my duties?”, or “What contracts do I have?,” character-based ethics proposes that dilemmas be resolved by asking, “Who do I want to be?” Thus, good behavior is obtained by building good character, which is typically the result of sound upbringing and the development of virtuous habits. It is character-based ethics that underlies the approach normally taken when “teaching” ethics to professionals in various fields. Rather than presenting specific ethical theories, the approach is to introduce case studies that expose a variety of ethical questions in the professionals’ area of expertise. Then, by discussing the pros and cons in these cases, the professionals become more aware, insightful, and sensitive to the perils lurking in their professional lives and thus grow in character. This is the spirit in which the questions regarding social issues at the end of each chapter are presented.

Social Issues The following questions are intended as a guide to the ethical/social/legal issues associated with the field of computing. The goal is not merely to answer these questions. You should also consider why you answered as you did and whether your justifications are consistent from one question to the next. 1. The premise that our society is different from what it would have been without

the computer revolution is generally accepted. Is our society better than it would have been without the revolution? Is our society worse? Would your answer differ if your position within society were different? 2. Is it acceptable to participate in today’s technical society without making an effort to understand the basics of that technology? For instance, do members of a democracy, whose votes often determine how technology will be supported and used, have an obligation to try to understand that technology?

M00_BROO1160_12_SE_C00.indd 28

01/08/14 11:18 AM

Social Issues

29

Does your answer depend on which technology is being considered? For example, is your answer the same when considering nuclear technology as when considering computer technology? 3. By using cash in financial transactions, individuals have traditionally had the option to manage their financial affairs without service charges. ­However, as more of our economy is becoming automated, financial institutions are implementing service charges for access to these automated systems. Is there a point at which these charges unfairly restrict an individual’s access to the economy? For example, suppose an employer pays employees only by check, and all financial institutions were to place a service charge on check cashing and depositing. Would the employees be unfairly treated? What if an employer insists on paying only via direct deposit? 4. In the context of interactive television, to what extent should a company be allowed to retrieve information from children (perhaps via an interactive game format)? For example, should a company be allowed to obtain a child’s report on his or her parents’ buying patterns? What about information about the child? 5. To what extent should a government regulate computer technology and its applications? Consider, for example, the issues mentioned in questions 3 and4. What justifies governmental regulation? 6. To what extent will our decisions regarding technology in general, and computer technology in particular, affect future generations? 7. As technology advances, our educational system is constantly challenged to reconsider the level of abstraction at which topics are presented. Many questions take the form of whether a skill is still necessary or whether students should be allowed to rely on an abstract tool. Students of trigonometry are no longer taught how to find the values of trigonometric functions using tables. Instead, they use calculators as abstract tools to find these values. Some argue that long division should also give way to abstraction. What other subjects are involved with similar controversies? Do modern word processors eliminate the need to develop spelling skills? Will the use of video technology someday remove the need to read? 8. The concept of public libraries is largely based on the premise that all citizens in a democracy must have access to information. As more information is stored and disseminated via computer technology, does access to this technology become a right of every individual? If so, should public libraries be the channel by which this access is provided? 9. What ethical concerns arise in a society that relies on the use of abstract tools? Are there cases in which it is unethical to use a product or service without understanding how it works? Without knowing how it is produced? Or, without understanding the byproducts of its use? 10. As our society becomes more automated, it becomes easier for governments to monitor their citizens’ activities. Is that good or bad? 11. Which technologies that were imagined by George Orwell (Eric Blair) in his novel 1984 have become reality? Are they being used in the manner in which Orwell predicted? 12. If you had a time machine, in which period of history would you like to live? Are there current technologies that you would like to take with you? Could your choice of technologies be taken with you without taking others? Towhat

M00_BROO1160_12_SE_C00.indd 29

01/08/14 11:18 AM

30

Chapter 0  Introduction

extent can one technology be separated from another? Is it consistent to ­protest against global warming yet accept modern medical treatment? 13. Suppose your job requires that you reside in another culture. Should you continue to practice the ethics of your native culture or adopt the ethics of your host culture? Does your answer depend on whether the issue involves dress code or human rights? Which ethical standards should prevail if you continue to reside in your native culture but conduct business with a foreign culture on the Internet? 4. Has society become too dependent on computer applications for commerce, 1 communications, or social interactions? For example, what would be the consequences of a long-term interruption in Internet and/or cellular telephone service? 15. Most smartphones are able to identify the phone’s location by means of GPS.

This allows applications to provide location-specific information (such as the local news, local weather, or the presence of businesses in the immediate area) based on the phone’s current location. However, such GPS capabilities may also allow other applications to broadcast the phone’s location to other parties. Is this good? How could knowledge of the phone’s location (thus your location) be abused?

Additional Reading Goldstine, J. J. The Computer from Pascal to von Neumann. Princeton, NJ: P ­ rinceton University Press, 1972. Kizza, J. M. Ethical and Social Issues in the Information Age, 3rd ed. London: Springer-Verlag, 2007. Mollenhoff, C. R. Atanasoff: Forgotten Father of the Computer. Ames, IA: Iowa State University Press, 1988. Neumann, P. G. Computer Related Risks. Boston, MA: Addison-Wesley, 1995. Ni, L. Smart Phone and Next Generation Mobile Computing. San Francisco, CA: Morgan Kaufmann, 2006. Quinn, M. J. Ethics for the Information Age, 5th ed. Boston, MA: AddisonWesley, 2012. Randell, B. The Origins of Digital Computers, 3rd ed. New York: SpringerVerlag, 1982. Spinello, R. A., and H. T. Tavani. Readings in CyberEthics, 2nd ed. Sudbury, MA:Jones and Bartlett, 2004. Swade, D. The Difference Engine. New York: Viking, 2000. Tavani, H. T. Ethics and Technology: Ethical Issues in an Age of Information and Communication Technology, 4th ed. New York: Wiley, 2012. Woolley, B. The Bride of Science: Romance, Reason, and Byron’s Daughter. New York: McGraw-Hill, 1999.

M00_BROO1160_12_SE_C00.indd 30

01/08/14 11:18 AM

1

C H A P T E R

Data Storage In this chapter, we consider topics associated with data represen­ tation and the storage of data within a computer. The types of data we will consider include text, numeric values, images, audio, and video. Much of the information in this chapter is also relevant to fields other than traditional computing, such as digital photogra­ phy, audio/video recording and reproduction, and long-distance communication.

1.1 Bits and Their Storage Boolean Operations Gates and Flip-Flops Hexadecimal Notation

1.2 Main Memory Memory Organization Measuring Memory Capacity

1.3 Mass Storage Magnetic Systems Optical Systems Flash Drives

1.4 Representing I­nformation as Bit Patterns Representing Text Representing Numeric Values

M01_BROO1160_12_SE_C01.indd 31

Representing Images Representing Sound

*1.5 The Binary System Binary Notation Binary Addition Fractions in Binary

*1.6 Storing Integers Two’s Complement Notation Excess Notation

*1.7 Storing Fractions Floating-Point Notation Truncation Errors

*1.8 Data and Programming

Variables Operators and Expressions Currency Conversion Debugging

*1.9 Data Compression Generic Data Compression Techniques Compressing Images Compressing Audio and Video

*1.10  Communication Errors Parity Bits Error-Correcting Codes *Asterisks indicate suggestions for optional sections.

Getting Started With Python Hello Python

01/08/14 11:18 AM

32

Chapter 1  Data Storage

We begin our study of computer science by considering how information is encoded and stored inside computers. Our first step is to discuss the basics of a computer’s data storage devices and then to consider how information is encoded for storage in these systems. We will explore the ramifications of today’s data ­storage systems and how such techniques as data compression and error handling are used to overcome their shortfalls.

1.1  Bits and Their Storage Inside today’s computers information is encoded as patterns of 0s and 1s. These digits are called bits (short for binary digits). Although you may be inclined to associate bits with numeric values, they are really only symbols whose meaning depends on the application at hand. Sometimes patterns of bits are used to represent numeric values; sometimes they represent characters in an alphabet and punctuation marks; sometimes they represent images; and sometimes they represent sounds.

Boolean Operations To understand how individual bits are stored and manipulated inside a computer, it is convenient to imagine that the bit 0 represents the value false and the bit 1 represents the value true. Operations that manipulate true/false values are called Boolean operations, in honor of the mathematician George Boole (1815–1864), who was a pioneer in the field of mathematics called logic. Three of the basic Boolean operations are AND, OR, and XOR (exclusive or) as summarized in F ­ igure1.1. (We capitalize these Boolean operation names to distinguish them from their English word counterparts.) These operations are similar to the arithmetic operations TIMES and PLUS because they combine a pair of values (the operation’s input) to produce a third value (the output). In contrast to arithmetic operations, however, Boolean operations combine true/false values rather than numeric values. The Boolean operation AND is designed to reflect the truth or falseness of a statement formed by combining two smaller, or simpler, statements with the conjunction and. Such statements have the generic form P AND Q

where P represents one statement, and Q represents another—for example, Kermit is a frog AND Miss Piggy is an actress.

The inputs to the AND operation represent the truth or falseness of the compound statement’s components; the output represents the truth or falseness of the compound statement itself. Since a statement of the form P AND Q is true only when both of its components are true, we conclude that 1 AND 1 should be 1, whereas all other cases should produce an output of 0, in agreement with Figure1.1. In a similar manner, the OR operation is based on compound statements of the form P OR Q

where, again, P represents one statement and Q represents another. Such statements are true when at least one of their components is true, which agrees with the OR operation depicted in Figure1.1.

M01_BROO1160_12_SE_C01.indd 32

01/08/14 11:18 AM

1.1  Bits and Their Storage

33

Figure 1.1   The possible input and output values of Boolean operations AND, OR, and XOR (exclusive or) The AND operation 0 AND 0 0

0 AND 1 0

1 AND 0 0

1 AND 1 1

The OR operation OR

0 0 0

OR

0 1 1

OR

1 0 1

OR

1 1 1

The XOR operation 0 XOR 0 0

0 XOR 1 1

1 XOR 0 1

1 XOR 1 0

There is not a single conjunction in the English language that captures the meaning of the XOR operation. XOR produces an output of 1 (true) when one of its inputs is 1 (true) and the other is 0 (false). For example, a statement of the form P XOR Q means “either P or Q but not both.” (In short, the XOR operation produces an output of 1 when its inputs are different.) The operation NOT is another Boolean operation. It differs from AND, OR, and XOR because it has only one input. Its output is the opposite of that input; if the input of the operation NOT is true, then the output is false, and vice versa. Thus, if the input of the NOT operation is the truth or falseness of the statement Fozzie is a bear.

then the output would represent the truth or falseness of the statement Fozzie is not a bear.

Gates and Flip-Flops A device that produces the output of a Boolean operation when given the operation’s input values is called a gate. Gates can be constructed from a variety of technologies such as gears, relays, and optic devices. Inside today’s computers, gates are usually implemented as small electronic circuits in which the digits 0 and 1 are represented as voltage levels. We need not concern ourselves with such details, however. For our purposes, it suffices to represent gates in their symbolic form, as shown in Figure1.2. Note that the AND, OR, XOR, and NOT gates are represented by distinctively shaped symbols, with the input values entering on one side, and the output exiting on the other. Gates provide the building blocks from which computers are constructed. One important step in this direction is depicted in the circuit in Figure1.3. This is a particular example from a collection of circuits known as a flip-flop. A ­flip-flop

M01_BROO1160_12_SE_C01.indd 33

01/08/14 11:18 AM

34

Chapter 1  Data Storage

Figure 1.2   A pictorial representation of AND, OR, XOR, and NOT gates as well as their input and output values AND

OR

Inputs

Output

Inputs

0 0 1 1

0 1 0 1

Inputs

Output

Output

Inputs

0 0 0 1

0 0 1 1

XOR

0 1 0 1

Output

0 1 1 1

NOT

Inputs

Output

Inputs

0 0 1 1

0 1 0 1

Inputs

Output

Output

Inputs

Output

0 1 1 0

0 1

1 0

is a fundamental unit of computer memory. It is a circuit that produces an output value of 0 or 1, which remains constant until a pulse (a temporary change to a 1 that returns to 0) from another circuit causes it to shift to the other value. Inother words, the output can be set to “remember” a zero or a one under control of external stimuli. As long as both inputs in the circuit in Figure1.3 remain 0, theoutput (whether 0 or 1) will not change. However, temporarily placing a 1 onthe upper input will force the output to be 1, whereas temporarily placing a 1 on the lower input will force the output to be 0. Let us consider this claim in more detail. Without knowing the current output of the circuit in Figure1.3, suppose that the upper input is changed to 1 while the lower input remains 0 (Figure 1.4a). This will cause the output of the OR gate to be 1, regardless of the other input to this gate. In turn, both inputs to the AND gate will now be 1, since the other input to this gate is already 1 (the output produced by the NOT gate whenever the lower input of the flip-flop is at 0). The output of the AND gate will then become 1, which means that the second input to the OR gate will now be 1 (Figure 1.4b). This guarantees that the output of the OR gate will remain 1, even when the upper input to the flip-flop is changed back to 0 (Figure 1.4c). In summary, the flip-flop’s output has become 1, and this output value will remain after the upper input returns to 0.

M01_BROO1160_12_SE_C01.indd 34

01/08/14 11:18 AM

1.1  Bits and Their Storage

35

Figure 1.3   A simple flip-flop circuit Input

Output

Input

In a similar manner, temporarily placing the value 1 on the lower input will force the flip-flop’s output to be 0, and this output will persist after the input value returns to 0. Our purpose in introducing the flip-flop circuit in Figures 1.3 and 1.4 is ­threefold. First, it demonstrates how devices can be constructed from gates, a process known as digital circuit design, which is an important topic in computer Figure 1.4   Setting the output of a flip-flop to 1 a. First, a 1 is placed on the upper input.

1

b. This causes the output of the OR gate to be 1 and, in turn, the output of the AND gate to be 1.

1

1 1

1

1 0

0 c. Finally, the 1 from the AND gate keeps the OR gate from changing after the upper input returns to 0.

1 1

1

1 0

M01_BROO1160_12_SE_C01.indd 35

01/08/14 11:18 AM

36

Chapter 1  Data Storage

engineering. Indeed, the flip-flop is only one of many circuits that are basic tools in computer engineering. Second, the concept of a flip-flop provides an example of abstraction and the use of abstract tools. Actually, there are other ways to build a flip-flop. One alternative is shown in Figure1.5. If you experiment with this circuit, you will find that, although it has a different internal structure, its external properties are the same as those of Figure1.3. A computer engineer does not need to know which circuit is actually used within a flip-flop. Instead, only an understanding of the flip-flop’s external properties is needed to use it as an abstract tool. A flipflop, along with other well-defined circuits, forms a set of building blocks from which an engineer can construct more complex circuitry. In turn, the design of computer circuitry takes on a hierarchical structure, each level of which uses the lower level components as abstract tools. The third purpose for introducing the flip-flop is that it is one means of storing a bit within a modern computer. More precisely, a flip-flop can be set to have the output value of either 0 or 1. Other circuits can adjust this value by sending pulses to the flip-flop’s inputs, and still other circuits can respond to the stored value by using the flip-flop’s output as their inputs. Thus, many flip-flops, constructed as very small electrical circuits, can be used inside a computer as a means of recording information that is encoded as patterns of 0s and 1s. Indeed, technology known as very large-scale integration (VLSI), which allows millions of electrical components to be constructed on a wafer (called a chip), is used to create miniature devices containing millions of flip-flops along with their controlling circuitry. Consequently, these chips are used as abstract tools in the construction of computer systems. In fact, in some cases VLSI is used to create an entire computer system on a single chip.

Hexadecimal Notation When considering the internal activities of a computer, we must deal with patterns of bits, which we will refer to as a string of bits, some of which can be quite long. A long string of bits is often called a stream. Unfortunately, streams are difficult for the human mind to comprehend. Merely transcribing the pattern 101101010011 is tedious and error prone. To simplify the representation of such bit patterns, therefore, we usually use a shorthand notation called hexadecimal notation, which takes advantage of the fact that bit patterns within a machine Figure 1.5   Another way of constructing a flip-flop Input

Input

M01_BROO1160_12_SE_C01.indd 36

Output

01/08/14 11:18 AM

1.1  Bits and Their Storage

37

Figure 1.6   The hexadecimal encoding system

Bit pattern

Hexadecimal representation

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

0 1 2 3 4 5 6 7 8 9 A B C D E F

tend to have lengths in multiples of four. In particular, hexadecimal notation uses a single symbol to represent a pattern of four bits. For example, a string of twelve bits can be represented by three hexadecimal symbols. Figure1.6 presents the hexadecimal encoding system. The left column displays all possible bit patterns of length four; the right column shows the symbol used in hexadecimal notation to represent the bit pattern to its left. Using this system, the bit pattern 10110101 is represented as B5. This is obtained by dividing the bit pattern into substrings of length four and then representing each substring by its hexadecimal equivalent—1011 is represented by B, and 0101 is represented by 5. In this manner, the 16-bit pattern 1010010011001000 can be reduced to the more palatable form A4C8. We will use hexadecimal notation extensively in the next chapter. There you will come to appreciate its efficiency.

Questions & Exercises 1. What input bit patterns will cause the following circuit to produce an

­outputof 1? Inputs

Output

2. In the text, we claimed that placing a 1 on the lower input of the flip-flop

in Figure1.3 (while holding the upper input at 0) will force the flip-flop’s ­output to be 0. Describe the sequence of events that occurs within the ­flip-flop in this case.

M01_BROO1160_12_SE_C01.indd 37

01/08/14 11:18 AM

38

Chapter 1  Data Storage

3. Assuming that both inputs to the flip-flop in Figure1.5 begin as 0, describe

the sequence of events that occurs when the upper input is temporarily set to 1. 4. a.  If the output of an AND gate is passed through a NOT gate, the com-

bination computes the Boolean operation called NAND, which has an output of 0 only when both its inputs are 1. The symbol for a NAND gate is the same as an AND gate except that it has a circle at its output. The following is a circuit containing a NAND gate. What Boolean operation does the circuit compute? Input

Input

b. If the output of an OR gate is passed through a NOT gate, the combina-

tion computes the Boolean operation called NOR that has an output of 1 only when both its inputs are 0. The symbol for a NOR gate is the same as an OR gate except that it has a circle at its output. The following is a circuit containing an AND gate and two NOR gates. What Boolean operation does the circuit compute? Input Output Input

5. Use hexadecimal notation to represent the following bit patterns: a. 0110101011110010 c. 01001000

b.  111010000101010100010111

6. What bit patterns are represented by the following hexadecimal patterns? a. 5FD97    b.  610A    c. ABCD    d. 0100

1.2  Main Memory For the purpose of storing data, a computer contains a large collection of circuits (such as flip-flops), each capable of storing a single bit. This bit reservoir is known as the machine’s main memory.

Memory Organization A computer’s main memory is organized in manageable units called cells, with a typical cell size being eight bits. (A string of eight bits is called a byte. Thus, a typical memory cell has a capacity of one byte.) Small computers embedded in such household devices as microwave ovens may have main memories consisting

M01_BROO1160_12_SE_C01.indd 38

01/08/14 11:18 AM

1.2  Main Memory

39

Figure 1.7   The organization of a byte-size memory cell 0

High-order end

1

1

1

1

Low-order end

Least significant bit

Most significant bit

of only a few hundred cells, whereas large computers may have billions of cells in their main memories. Although there is no left or right within a computer, we normally envision the bits within a memory cell as being arranged in a row. The left end of this row is called the high-order end, and the right end is called the low-order end. The leftmost bit is called either the high-order bit or the most significant bit in reference to the fact that if the contents of the cell were interpreted as representing a numeric value, this bit would be the most significant digit in the number. Similarly, the rightmost bit is referred to as the low-order bit or the least significant bit. Thus we may represent the contents of a byte-size memory cell as shown in Figure1.7. To identify individual cells in a computer’s main memory, each cell is assigned a unique “name,” called its address. The system is analogous to the technique of identifying houses in a city by addresses. In the case of memory cells, however, the addresses used are entirely numeric. To be more precise, we envision all the cells being placed in a single row and numbered in this order starting with the value zero. Such an addressing system not only gives us a way of uniquely identifying each cell but also associates an order to the cells (Figure1.8), giving us phrases such as “the next cell” or “the previous cell.” An important consequence of assigning an order to both the cells in main memory and the bits within each cell is that the entire collection of bits within a computer’s main memory is essentially ordered in one long row. Pieces of this long row can therefore be used to store bit patterns that may be longer than the Figure 1.8   Memory cells arranged by address

101

111

000

10

111

100

001

10

011

10

111 001

01

11

101

01

010

01

10

101

01

l el

8

7

6

5

l4

l3

ll

2

1

C

110

10

ll

Ce

M01_BROO1160_12_SE_C01.indd 39

01 Ce

011

l

Ce

l Ce

011

100

ll

11

l

Ce

111

011

ll

Ce

000

ll

Ce

100

l el

9

ll

Ce

C

101

101

10 Ce

100

ll

Ce

100

0 l1

01/08/14 11:18 AM

40

Chapter 1  Data Storage

length of a single cell. In particular, we can still store a string of 16 bits merely by using two consecutive memory cells. To complete the main memory of a computer, the circuitry that actually holds the bits is combined with the circuitry required to allow other circuits to store and retrieve data from the memory cells. In this way, other circuits can get data from the memory by electronically asking for the contents of a certain address (called a read operation), or they can record information in the memory by requesting that a certain bit pattern be placed in the cell at a particular address (called a write operation). Because a computer’s main memory is organized as individual, addressable cells, the cells can be accessed independently as required. To reflect the ability to access cells in any order, a computer’s main memory is often called random access memory (RAM). This random access feature of main memory is in stark contrast to the mass storage systems that we will discuss in the next section, in which long strings of bits are manipulated as amalgamated blocks. Although we have introduced flip-flops as a means of storing bits, the RAM in most modern computers is constructed using analogous, but more complex technologies that provide greater miniaturization and faster response time. Many of these technologies store bits as tiny electric charges that dissipate quickly. Thus these devices require additional circuitry, known as a refresh circuit, that repeatedly replenishes the charges many times a second. In recognition of this volatility, computer memory constructed from such technology is often called dynamic memory, leading to the term DRAM (pronounced “DEE–ram”) meaning Dynamic RAM. Or, at times the term SDRAM (pronounced “ES-DEE-ram”), meaning Synchronous DRAM, is used in reference to DRAM that applies additional techniques to decrease the time needed to retrieve the contents from its memory cells.

Measuring Memory Capacity As we will learn in the next chapter, it is convenient to design main memory systems in which the total number of cells is a power of two. In turn, the size of the memories in early computers were often measured in 1024 (which is 210) cell units. Since 1024 is close to the value 1000, the computing community adopted the prefix kilo in reference to this unit. That is, the term kilobyte (abbreviated KB) was used to refer to 1024 bytes. Thus, a machine with 4096 memory cells was said to have a 4KB memory (4096 = 4 * 1024). As memories became larger, this terminology grew to include MB (megabyte), GB (gigabyte), and TB (terabyte). Unfortunately, this application of prefixes kilo-, mega-, and so on, represents a misuse of terminology because these are already used in other fields in reference to units that are powers of a thousand. For example, when measuring distance, kilometer refers to 1000 meters, and when measuring radio frequencies, ­megahertz refers to 1,000,000 hertz. In the late 1990s, international standards organizations developed specialized terminology for powers of two: kibi-, mebi-, gibi-, and tebi-bytes denote powers of 1024, rather than powers of a thousand. However, while this distinction is the law of the land in many parts of the world, both the general public and many computer scientists have been reluctant to abandon the more familiar, yet ambiguous “megabyte.” Thus, a word of caution is in order when using this terminology. As a general rule, terms such as kilo-, mega-, etc. refer to powers of two when used in the context of computer measurements, but they refer to powers of a thousand when used in other contexts.

M01_BROO1160_12_SE_C01.indd 40

01/08/14 11:18 AM

1.3  Mass Storage

41

Questions & Exercises 1. If the memory cell whose address is 5 contains the value 8, what is the

difference between writing the value 5 into cell number 6 and moving the contents of cell number 5 into cell number 6? 2. Suppose you want to interchange the values stored in memory cells 2 and

3. What is wrong with the following sequence of steps: Step 1. Move the contents of cell number 2 to cell number 3. Step 2. Move the contents of cell number 3 to cell number 2. Design a sequence of steps that correctly interchanges the contents of these cells. If needed, you may use additional cells. 3. How many bits would be in the memory of a computer with 4KB memory?

1.3  Mass Storage Due to the volatility and limited size of a computer’s main memory, most computers have additional memory devices called mass storage (or secondary storage) systems, including magnetic disks, CDs, DVDs, magnetic tapes, flash drives, and solid-state disks (all of which we will discuss shortly). The advantages of mass storage systems over main memory include less volatility, large storage capacities, low cost, and in many cases, the ability to remove the storage medium from the machine for archival purposes. A major disadvantage of magnetic and optical mass storage systems is that they typically require mechanical motion and therefore require significantly more time to store and retrieve data than a machine’s main memory, where all activities are performed electronically. Moreover, storage systems with moving parts are more prone to mechanical failures than solid state systems.

Magnetic Systems For years, magnetic technology has dominated the mass storage arena. The most common example in use today is the magnetic disk or hard disk drive (HDD), in which a thin spinning disk with magnetic coating is used to hold data (­Figure1.9). Read/write heads are placed above and/or below the disk so that as the disk spins, each head traverses a circle, called a track. By repositioning the read/write heads, different concentric tracks can be accessed. In many cases, a disk storage system consists of several disks mounted on a common spindle, one on top of the other, with enough space for the read/write heads to slip between the platters. In such cases, the read/write heads move in unison. Each time the read/write heads are repositioned, a new set of tracks—which is called a ­cylinder—becomes accessible. Since a track can contain more information than we would normally want to manipulate at any one time, each track is divided into small arcs called sectors on which information is recorded as a continuous string of bits. All sectors on a disk contain the same number of bits (typical capacities are in the range of 512 bytes to a few KB), and in the simplest disk storage systems each track contains the same

M01_BROO1160_12_SE_C01.indd 41

01/08/14 11:18 AM

42

Chapter 1  Data Storage

Figure 1.9   A disk storage system Track divided into sectors Disk

Read/write head

Access arm

Arm motion Disk motion

number of sectors. Thus, the bits within a sector on a track near the outer edge of the disk are less compactly stored than those on the tracks near the center, since the outer tracks are longer than the inner ones. In contrast, in high-capacity disk storage systems, the tracks near the outer edge are capable of containing significantly more sectors than those near the center, and this capability is often used by applying a technique called zoned-bit recording. Using zoned-bit recording, several adjacent tracks are collectively known as zones, with a typical disk containing approximately 10 zones. All tracks within a zone have the same number of sectors, but each zone has more sectors per track than the zone inside of it. In this manner, efficient use of the entire disk surface is achieved. Regardless of the details, a disk storage system consists of many individual sectors, each of which can be accessed as an independent string of bits. The capacity of a disk storage system depends on the number of platters used and the density in which the tracks and sectors are placed. Lower-capacity systems may consist of a single platter. High-capacity disk systems, capable of holding many gigabytes, or even terabytes, consist of perhaps three to six platters mounted on a common spindle. Furthermore, data may be stored on both the upper and lower surfaces of each platter. Several measurements are used to evaluate a disk system’s performance: (1) seek time (the time required to move the read/write heads from one track to another); (2) rotation delay or latency time (half the time required for the disk to make a complete rotation, which is the average amount of time required for the desired data to rotate around to the read/write head once the head has been positioned over the desired track); (3) access time (the sum of seek time and rotation delay); and (4) transfer rate (the rate at which data can be transferred to or from the disk). (Note that in the case of zone-bit recording, the amount of data passing a read/write head in a single disk rotation is greater for tracks in an outer zone than for an inner zone, and therefore the data transfer rate varies depending on the portion of the disk being used.) A factor limiting the access time and transfer rate is the speed at which a disk system rotates. To facilitate fast rotation speeds, the read/write heads in these systems do not touch the disk but instead “float” just off the surface. The spacing is so close that even a single particle of dust could become jammed

M01_BROO1160_12_SE_C01.indd 42

01/08/14 11:18 AM

1.3  Mass Storage

43

between the head and disk surface, destroying both (a phenomenon known as a head crash). Thus, disk systems are typically housed in cases that are sealed at the factory. With this construction, disk systems are able to rotate at speeds of several hundred times per second, achieving transfer rates that are measured in MB per second. Since disk systems require physical motion for their operation, these systems suffer when compared to speeds within electronic circuitry. Delay times within an electronic circuit are measured in units of nanoseconds (billionths of a second) or less, whereas seek times, latency times, and access times of disk systems are measured in milliseconds (thousandths of a second). Thus the time required to retrieve information from a disk system can seem like an eternity to an electronic circuit awaiting a result. Magnetic storage technologies that are now less widely used include m ­ agnetic tape, in which information is recorded on the magnetic coating of a thin plastic tape wound on reels, and floppy disk drives, in which single platters with a magnetic coating are encased in a portable cartridge designed to be readily removed from the drive. Magnetic tape drives have extremely long seek times, just as their cousins, audio cassettes, suffer from long rewind and fast-forward times. Low cost and high data capacities still make magnetic tape suitable for applications where data is primarily read or written linearly, such as archival data backups. The removable nature of floppy disk platters came at the cost of much lower data densities and access speeds than hard disk platters, but their portability was extremely valuable in earlier decades, prior to the arrival of flash drives with larger capacity and higher durability.

Optical Systems Another class of mass storage systems applies optical technology. An example is the compact disk (CD). These disks are 12 centimeters (approximately 5 inches) in diameter and consist of reflective material covered with a clear protective coating. Information is recorded on them by creating variations in their reflective surfaces. This information can then be retrieved by means of a laser that detects irregularities on the reflective surface of the CD as it spins. CD technology was originally applied to audio recordings using a recording format known as CD-DA (compact disk-digital audio), and the CDs used today for computer data storage use essentially the same format. In particular, information on these CDs is stored on a single track that spirals around the CD like a groove in an old-fashioned phonograph record, however, unlike old-fashioned phonograph records, the track on a CD spirals from the inside out (Figure1.10). This track is divided into units called sectors, each with its own identifying markings and a capacity of 2KB of data, which equates to 1/75 of a second of music in the case of audio recordings. Note that the distance around the spiraled track is greater toward the outer edge of the disk than at the inner portion. To maximize the capacity of a CD, information is stored at a uniform linear density over the entire spiraled track, which means that more information is stored in a loop around the outer portion of the spiral than in a loop around the inner portion. In turn, more sectors will be read in a single revolution of the disk when the laser is scanning the outer portion of the spiraled track than when the laser is scanning the inner portion of the track. Thus, to obtain a uniform rate of data transfer, CD-DA players are designed

M01_BROO1160_12_SE_C01.indd 43

01/08/14 11:18 AM

44

Chapter 1  Data Storage

Figure 1.10   CD storage format Data recorded on a single track, consisting of individual sectors, that spirals toward the outer edge CD

Disk motion

to vary the rotation speed depending on the location of the laser. However, most CD systems used for computer data storage spin at a faster, constant speed and thus must accommodate variations in data transfer rates. As a consequence of such design decisions, CD storage systems perform best when dealing with long, continuous strings of data, as when reproducing music. In contrast, when an application requires access to items of data in a random manner, the approach used in magnetic disk storage (individual, concentric tracks divided into individually accessible sectors) outperforms the spiral approach used in CDs. Traditional CDs have capacities in the range of 600 to 700MB. However, DVDs (Digital Versatile Disks), which are constructed from multiple, semitransparent layers that serve as distinct surfaces when viewed by a precisely focused laser, provide storage capacities of several GB. Such disks are capable of storing lengthy multimedia presentations, including entire motion pictures. Finally, Blu-ray technology, which uses a laser in the blue-violet spectrum of light (instead of red), is able to focus its laser beam with very fine precision. As a result, BDs (Blu-ray Disks) provides over five times the capacity of a DVD. This seemingly vast amount of storage is needed to meet the demands of high definition video.

Flash Drives A common property of mass storage systems based on magnetic or optic technology is that physical motion, such as spinning disks, moving read/write heads, and aiming laser beams, is required to store and retrieve data. This means that data storage and retrieval is slow compared to the speed of electronic circuitry. Flash memory technology has the potential of alleviating this drawback. In a flash memory system, bits are stored by sending electronic signals directly to the storage medium where they cause electrons to be trapped in tiny chambers of silicon dioxide, thus altering the characteristics of small electronic circuits. Since these chambers are able to hold their captive electrons for many years without external power, this technology is excellent for portable, nonvolatile data storage.

M01_BROO1160_12_SE_C01.indd 44

01/08/14 11:18 AM

1.3  Mass Storage

45

Although data stored in flash memory systems can be accessed in small bytesize units as in RAM applications, current technology dictates that stored data be erased in large blocks. Moreover, repeated erasing slowly damages the silicon dioxide chambers, meaning that current flash memory technology is not suitable for general main memory applications where its contents might be altered many times a second. However, in those applications in which alterations can be controlled to a reasonable level, such as in digital cameras and smartphones, flash memory has become the mass storage technology of choice. Indeed, since flash memory is not sensitive to physical shock (in contrast to magnetic and optic systems), it is now replacing other mass storage technologies in portable applications such as laptop computers. Flash memory devices called flash drives, with capacities of hundreds of GBs, are available for general mass storage applications. These units are packaged in ever smaller plastic cases with a removable cap on one end to protect the unit’s electrical connector when the drive is offline. The high capacity of these portable units as well as the fact that they are easily connected to and disconnected from a computer make them ideal for portable data storage. However, the vulnerability of their tiny storage chambers dictates that they are not as reliable as optical disks for truly long-term applications. Larger flash memory devices called SSDs (solid-state disks) are explicitly designed to take the place of magnetic hard disks. SSDs compare favorably to hard disks in their resilience to vibrations and physical shock, their quiet operation (due to no moving parts), and their lower access times. SSDs remain more expensive than hard disks of comparable size and thus are still considered a high-end option when buying a computer. SSD sectors suffer from the more limited lifetime of all flash memory technologies, but the use of wear-leveling techniques can reduce the impact of this by relocating frequently altered data blocks to fresh locations on the drive. Another application of flash technology is found in SD (Secure Digital) memory cards (or just SD Card). These provide up to two GBs of storage and are packaged in a plastic rigged wafer about the size a postage stamp (SD cards are also available in smaller mini and micro sizes), SDHC (High Capacity) memory cards can provide up to 32 GBs and the next generation SDXC (Extended Capacity) memory cards may exceed a TB. Given their compact physical size, these cards conveniently slip into slots of small electronic devices. Thus, they are ideal for digital cameras, smartphones, music players, car navigation systems, and a host of other electronic appliances.

Questions & Exercises 1. What is gained by increasing the rotation speed of a disk or CD? 2. When recording data on a multiple-disk storage system, should we fill a

complete disk surface before starting on another surface, or should we first fill an entire cylinder before starting on another cylinder? 3. Why should the data in a reservation system that is constantly being

updated be stored on a magnetic disk instead of a CD or DVD?

M01_BROO1160_12_SE_C01.indd 45

01/08/14 11:18 AM

46

Chapter 1  Data Storage

4. What factors allow CD, DVD, and Blu-ray disks all to be read by the same

drive? 5. What advantage do flash drives have over the other mass storage systems

introduced in this section? 6. What advantages continue to make magnetic hard disk drives competitive?

1.4  Representing Information as Bit Patterns Having considered techniques for storing bits, we now consider how information can be encoded as bit patterns. Our study focuses on popular methods for encoding text, numerical data, images, and sound. Each of these systems has repercussions that are often visible to a typical computer user. Our goal is to understand enough about these techniques so that we can recognize their consequences for what they are.

Representing Text Information in the form of text is normally represented by means of a code in which each of the different symbols in the text (such as the letters of the alphabet and punctuation marks) is assigned a unique bit pattern. The text is then represented as a long string of bits in which the successive patterns represent the successive symbols in the original text. In the 1940s and 1950s, many such codes were designed and used in connection with different pieces of equipment, producing a corresponding proliferation of communication problems. To alleviate this situation, the American National Standards Institute (ANSI, pronounced “AN–see”) adopted the American Standard Code for Information Interchange (ASCII, pronounced “AS–kee”). This code uses bit patterns of length seven to represent the upper- and lowercase letters of the English alphabet, punctuation symbols, the digits 0 through 9, and certain control information such as line feeds, carriage returns, and tabs. ASCII is extended to an eight-bit-per-symbol format by adding a 0 at the most significant end of each of the seven-bit patterns. This technique not only produces a code in which each pattern fits conveniently into a typical byte-size memory cell but also provides 128 additional bit patterns (those obtained by assigning the extra bit the value 1) that can be used to represent symbols beyond the English alphabet and associated punctuation. A portion of ASCII in its eight-bit-per-symbol format is shown in Appendix A. By referring to this appendix, we can decode the bit pattern 01001000   01100101   01101100   01101100   01101111   00101110

as the message “Hello.” as demonstrated in Figure1.11. The International Organization for Standardization (also known as ISO, in reference to the Greek word isos, meaning equal) has developed a number of extensions to ASCII, each of which was designed to accommodate a major language group. For example, one standard provides the symbols needed to express the text of most Western European languages. Included in its 128 additional patterns are symbols for the British pound and the German vowels ä, ö, and ü.

M01_BROO1160_12_SE_C01.indd 46

01/08/14 11:18 AM

1.4  Representing Information as Bit Patterns

47

Figure 1.11   The message “Hello.” in ASCII or UTF-8 encoding 01001000

01100101

01101100

01101100

01101111

00101110

H

e

I

I

o

.

The ISO-extended ASCII standards made tremendous headway toward supporting all of the world’s multilingual communication; however, two major obstacles surfaced. First, the number of extra bit patterns available in extended ASCII is simply insufficient to accommodate the alphabet of many Asian and some Eastern European languages. Second, because a given document was constrained to using symbols in just the one selected standard, documents containing text of languages from disparate language groups could not be supported. Both proved to be a significant detriment to international use. To address this deficiency, Unicode was developed through the cooperation of several of the leading manufacturers of hardware and software and has rapidly gained the support of the computing community. This code uses a unique pattern of up to 21 bits to represent each symbol. When the Unicode character set is combined with the Unicode Transformation Format 8-bit (UTF-8) encoding standard, the original ASCII characters can still be represented with 8 bits, while the thousands of additional characters from such languages as Chinese, Japanese, and Hebrew can be represented by 16 bits. Beyond the characters required for all of the world’s commonly used languages, UTF-8 uses 24- or 32-bit patterns to represent more obscure Unicode symbols, leaving ample room for future expansion. A file consisting of a long sequence of symbols encoded using ASCII or Unicode is often called a text file. It is important to distinguish between simple text files that are manipulated by utility programs called text editors (or often simply editors) and the more elaborate files produced by word processors such as Microsoft’s Word. Both consist of textual material. However, a text file contains only a character-by-character encoding of the text, whereas a file produced by a word processor contains numerous proprietary codes representing changes in fonts, alignment information, and other parameters.

Representing Numeric Values Storing information in terms of encoded characters is inefficient when the information being recorded is purely numeric. To see why, consider the problem of storing the value 25. If we insist on storing it as encoded symbols in ASCII using one byte per symbol, we need a total of 16 bits. Moreover, the largest number we could store using 16 bits is 99. However, as we will shortly see, by using binary notation we can store any integer in the range from 0 to 65535 in these 16 bits. Thus, binary notation (or variations of it) is used extensively for encoded numeric data for computer storage. Binary notation is a way of representing numeric values using only the digits 0 and 1 rather than the digits 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9 as in the traditional decimal, or base 10, system. We will study the binary system more thoroughly in Section1.5. For now, all we need is an elementary understanding of the system. For this purpose consider an old-fashioned car odometer whose display wheels

M01_BROO1160_12_SE_C01.indd 47

01/08/14 11:18 AM

48

Chapter 1  Data Storage

The American National Standards Institute The American National Standards Institute (ANSI) was founded in 1918 by a small consortium of engineering societies and government agencies as a nonprofit federation to coordinate the development of voluntary standards in the private sector. Today, ANSI membership includes more than 1300 businesses, professional organizations, trade associations, and government agencies. ANSI is headquartered in New York and represents the United States as a member body in the ISO. The website for the American National Standards Institute is at http://www.ansi.org. Similar organizations in other countries include Standards Australia (Australia), Standards Council of Canada (Canada), China State Bureau of Quality and Technical Supervision (China), Deutsches Institut für Normung (Germany), Japanese ­Industrial Standards Committee (Japan), Dirección General de Normas (Mexico), State C ­ ommittee of the Russian Federation for Standardization and Metrology (Russia), Swiss Association for Standardization (Switzerland), and British Standards Institution (United Kingdom).

contain only the digits 0 and 1 rather than the traditional digits 0 through 9. The odometer starts with a reading of all 0s, and as the car is driven for the first few miles, the rightmost wheel rotates from a 0 to a 1. Then, as that 1 rotates back to a 0, it causes a 1 to appear to its left, producing the pattern 10. The 0 on the right then rotates to a 1, producing 11. Now the rightmost wheel rotates from 1 back to 0, causing the 1 to its left to rotate to a 0 as well. This in turn causes another 1 to appear in the third column, producing the pattern 100. In short, as we drive the car we see the following sequence of odometer readings: 0000 0001 0010 0011 0100 0101 0110 0111 1000

This sequence consists of the binary representations of the integers zero through eight. Although tedious, we could extend this counting technique to discover that the bit pattern consisting of 16 1s represents the value 65535, which confirms our claim that any integer in the range from 0 to 65535 can be encoded using 16 bits. Due to this efficiency, it is common to store numeric information in a form of binary notation rather than in encoded symbols. We say “a form of binary notation” because the straightforward binary system just described is only the basis for several numeric storage techniques used within machines. Some of these variations of the binary system are discussed later in this chapter. For now, we merely note that a system called two’s complement notation (see Section1.6) is common for storing whole numbers because it provides a convenient method for representing negative numbers as well as positive. For representing numbers

M01_BROO1160_12_SE_C01.indd 48

01/08/14 11:18 AM

1.4  Representing Information as Bit Patterns

49

with fractional parts such as 4-1/2 or 3/4, another technique, called floatingpoint notation (see Section1.7), is used.

Representing Images One means of representing an image is to interpret the image as a collection of dots, each of which is called a pixel, short for “picture element.” The appearance of each pixel is then encoded and the entire image is represented as a collection of these encoded pixels. Such a collection is called a bit map. This approach is popular because many display devices, such as printers and display screens, operate on the pixel concept. In turn, images in bit map form are easily formatted for display. The method of encoding the pixels in a bit map varies among applications. In the case of a simple black-and-white image, each pixel can be represented by a single bit whose value depends on whether the corresponding pixel is black or white. This is the approach used by most facsimile machines. For more elaborate black-and-white photographs, each pixel can be represented by a collection of bits (usually eight), which allows a variety of shades of grayness to be represented. In the case of color images, each pixel is encoded by more complex system. Two approaches are common. In one, which we will call RGB encoding, each pixel is represented as three color components—a red component, a green component, and a blue component—corresponding to the three primary colors of light. One byte is normally used to represent the intensity of each color component. In turn, three bytes of storage are required to represent a single pixel in the original image. An alternative to simple RGB encoding is to use a “brightness” component and two color components. In this case the “brightness” component, which is called the pixel’s luminance, is essentially the sum of the red, green, and blue components. (Actually, it is considered to be the amount of white light in the pixel, but these details need not concern us here.) The other two components, called the blue chrominance and the red chrominance, are determined by computing the difference between the pixel’s luminance and the amount of blue or red light, respectively, in the pixel. Together these three components contain the information required to reproduce the pixel. The popularity of encoding images using luminance and chrominance components originated in the field of color television broadcast because this approach provided a means of encoding color images that was also compatible with older black-and-white television receivers. Indeed, a gray-scale version of an image can be produced by using only the luminance components of the encoded colorimage.

ISO — The International Organization for Standardization The International Organization for Standardization (more commonly called ISO) was established in 1947 as a worldwide federation of standardization bodies, one from each country. Today, it is headquartered in Geneva, Switzerland, and has more than 100 member bodies as well as numerous correspondent members. (A ­correspondent member is usually a standardization body from a country that does not have a ­nationally recognized standardization body. Such members cannot participate directly in the development of standards but are kept informed of ISO activities.) ISO maintains a website at http://www.iso.org.

M01_BROO1160_12_SE_C01.indd 49

01/08/14 11:18 AM

50

Chapter 1  Data Storage

A disadvantage of representing images as bit maps is that an image cannot be rescaled easily to any arbitrary size. Essentially, the only way to enlarge the image is to make the pixels bigger, which leads to a grainy appearance. (This is the technique called “digital zoom” used in digital cameras as opposed to “optical zoom” that is obtained by adjusting the camera lens.) An alternate way of representing images that avoids this scaling problem is to describe the image as a collection of geometric structures, such as lines and curves, that can be encoded using techniques of analytic geometry. Such a description allows the device that ultimately displays the image to decide how the geometric structures should be displayed rather than insisting that the device reproduce a particular pixel pattern. This is the approach used to produce the scalable fonts that are available via today’s word processing systems. For example, TrueType (developed by Microsoft and Apple) is a system for geometrically describing text symbols. Likewise, PostScript (developed by Adobe Systems) provides a means of describing characters as well as more general pictorial data. This geometric means of representing images is also popular in computer-aided design (CAD) systems in which drawings of three-dimensional objects are displayed and manipulated on computer display screens. The distinction between representing an image in the form of geometric structures as opposed to bit maps is evident to users of many drawing software systems (such as Microsoft’s Paint utility) that allow the user to draw pictures consisting of pre-established shapes such as rectangles, ovals, and elementary curves. The user simply selects the desired geometric shape from a menu and then directs the drawing of that shape via a mouse. During the drawing process, the software maintains a geometric description of the shape being drawn. As directions are given by the mouse, the internal geometric representation is modified, reconverted to bit map form, and displayed. This allows for easy scaling and shaping of the image. Once the drawing process is complete, however, the underlying geometric description is discarded and only the bit map is preserved, meaning that additional alterations require a tedious pixel-by-pixel modification process. On the other hand, some drawing systems preserve the description as geometric shapes that can be modified later. With these systems, the shapes can be easily resized, maintaining a crisp display at any dimension.

Representing Sound The most generic method of encoding audio information for computer storage and manipulation is to sample the amplitude of the sound wave at regular intervals and record the series of values obtained. For instance, the series 0, 1.5, 2.0, 1.5, 2.0, 3.0, 4.0, 3.0, 0 would represent a sound wave that rises in amplitude, falls briefly, rises to a higher level, and then drops back to 0 (Figure1.12). This technique, using a sample rate of 8000 samples per second, has been used for years in long-distance voice telephone communication. The voice at one end of the communication is encoded as numeric values representing the amplitude of the voice every eight-thousandth of a second. These numeric values are then transmitted over the communication line to the receiving end, where they are used to reproduce the sound of the voice. Although 8000 samples per second may seem to be a rapid rate, it is not sufficient for high-fidelity music recordings. To obtain the quality sound reproduction obtained by today’s musical CDs, a sample rate of 44,100 samples per second

M01_BROO1160_12_SE_C01.indd 50

01/08/14 11:18 AM

1.4  Representing Information as Bit Patterns

51

Figure 1.12   The sound wave represented by the sequence 0, 1.5, 2.0, 1.5, 2.0, 3.0, 4.0, 3.0, 0 Encoded sound wave

1.5

2.0

1.5

2.0

3.0

4.0

3.0

Amplitudes

is used. The data obtained from each sample are represented in 16 bits (32 bits for stereo recordings). Consequently, each second of music recorded in stereo requires more than a million bits. An alternative encoding system known as Musical Instrument Digital Interface (MIDI, pronounced “MID–ee”) is widely used in the music synthesizers found in electronic keyboards, for video game sound, and for sound effects accompanying websites. By encoding directions for producing music on a synthesizer rather than encoding the sound itself, MIDI avoids the large storage requirements of the sampling technique. More precisely, MIDI encodes what instrument is to play which note for what duration of time, which means that a clarinet playing the note D for two seconds can be encoding in three bytes rather than more than two million bits when sampled at a rate of 44,100 samples per second. In short, MIDI can be thought of as a way of encoding the sheet music read by a performer rather than the performance itself, and in turn, a MIDI “recording” can sound significantly different when performed on different synthesizers.

Questions & Exercises 1. Here is a message encoded in ASCII using 8 bits per symbol. What does

it say? (See AppendixA) 01000011 01101111 01101101 01110000 01110101 01110100 01100101 01110010 00100000 01010011 01100011 01101001 01100101 01101110 01100011 01100101

2. In the ASCII code, what is the relationship between the codes for an

uppercase letter and the same letter in lowercase? (See AppendixA.)

M01_BROO1160_12_SE_C01.indd 51

01/08/14 11:18 AM

52

Chapter 1  Data Storage

3. Encode these sentences in ASCII: a. “Stop!” Cheryl shouted.

b.  Does 2 + 3 = 5?

4. Describe a device from everyday life that can be in either of two states,

such as a flag on a flagpole that is either up or down. Assign the symbol 1 to one of the states and 0 to the other, and show how the ASCII representation for the letter b would appear when stored with such bits. 5. Convert each of the following binary representations to its equivalent

base 10 form: a. 0101    b.  1001    c.  1011 d. 0110    e.  10000      f.  10010 6. Convert each of the following base 10 representations to its equivalent

binary form: a. 6 d. 18

b.  13 e.  27

c.  11 f.  4

7. What is the largest numeric value that could be represented with three

bytes if each digit were encoded using one ASCII pattern per byte? What if binary notation were used? 8. An alternative to hexadecimal notation for representing bit patterns

is ­dotted decimal notation in which each byte in the pattern is represented by its base 10 equivalent. In turn, these byte representations are separated by periods. For example, 12.5 represents the pattern 0000110000000101 (the byte 00001100 is represented by 12, and 00000101 is represented by 5), and the pattern 100010000001000000000111 is represented by 136.16.7. Represent each of the following bit patterns in dotted decimal notation. a. 0000111100001111 c. 0000101010100000

b.  001100110000000010000000

9. What is an advantage of representing images via geometric structures as

opposed to bit maps? What about bit map techniques as opposed to geometric structures? 10. Suppose a stereo recording of one hour of music is encoded using a sam-

ple rate of 44,100 samples per second as discussed in the text. How does the size of the encoded version compare to the storage capacity of a CD?

1.5  The Binary System In Section1.4 we saw that binary notation is a means of representing numeric values using only the digits 0 and 1 rather than the 10 digits 0 through 9 that are used in the more common base 10 notational system. It is time now to look at binary notation more thoroughly.

M01_BROO1160_12_SE_C01.indd 52

01/08/14 11:18 AM

1.5  The Binary System

53

Binary Notation Recall that in the base 10 system, each position in a representation is associated with a quantity. In the representation 375, the 5 is in the position associated with the quantity one, the 7 is in the position associated with ten, and the 3 is in the position associated with the quantity one hundred (Figure 1.13a). Each quantity is 10 times that of the quantity to its right. The value represented by the entire expression is obtained by multiplying the value of each digit by the quantity associated with that digit’s position and then adding those products. To illustrate, the pattern 375 represents (3 * hundred) + (7 * ten) + (5 * one), which, in more technical notation, is (3 * 102) + (7 * 101) + (5 * 100). The position of each digit in binary notation is also associated with a quantity, except that the quantity associated with each position is twice the quantity associated with the position to its right. More precisely, the rightmost digit in a binary representation is associated with the quantity one (20), the next position to the left is associated with two (21), the next is associated with four (22), the next with eight (23), and so on. For example, in the binary representation 1011, the rightmost 1 is in the position associated with the quantity one, the 1 next to it is in the position associated with two, the 0 is in the position associated with four, and the leftmost 1 is in the position associated with eight (Figure 1.13b). To extract the value represented by a binary representation, we follow the same procedure as in base 10—we multiply the value of each digit by the quantity associated with its position and add the results. For example, the value represented by 100101 is 37, as shown in Figure1.14. Note that since binary notation uses only the digits 0 and 1, this multiply-and-add process reduces merely to adding the quantities associated with the positions occupied by 1s. Thus the binary pattern 1011 represents the value eleven, because the 1s are found in the positions associated with the quantities one, two, and eight. In Section1.4 we learned how to count in binary notation, which allowed us to encode small integers. For finding binary representations of large values, you may prefer the approach described by the algorithm in Figure1.15. Let us apply this algorithm to the value thirteen (Figure1.16). We first divide thirteen by two, obtaining a quotient of six and a remainder of one. Since the quotient was not zero, Step 2 tells us to divide the quotient (six) by two, obtaining a new quotient of three and a remainder of zero. The newest quotient is still not zero, so we divide it by two, obtaining a quotient of one and a remainder of one. Once again, we divide the newest quotient (one) by two, this time obtaining a quotient of zero and a remainder of one. Since we have now acquired a quotient of zero, we move on to Step 3, where we learn that the binary representation of the original value (thirteen) is 1101, obtained from the list of remainders. Figure 1.13   The base 10 and binary systems

Two On e

Position’s quantity

1 0 1 1 ht Fou r

One

Representation

Representation Position’s quantity

Hu

ndr

ed Ten

3 7 5

b. Base two system

Eig

a. Base 10 system

M01_BROO1160_12_SE_C01.indd 53

01/08/14 11:18 AM

54

Chapter 1  Data Storage

Figure 1.14   Decoding the binary representation 100101 Binary pattern

1 0 0 1 0 1 1 0 1 0 0 1

x x x x x x

one two four eight sixteen thirty-two

Value Position’s of bit quantity

= 1 = 0 = 4 = 0 = 0 = 32 37 Total

Figure 1.15   An algorithm for finding the binary representation of a positive integer Step 1.

Divide the value by two and record the remainder.

Step 2.

As long as the quotient obtained is not zero, continue to divide the newest quotient by two and record the remainder.

Step 3.

Now that a quotient of zero has been obtained, the binary representation of the original value consists of the remainders listed from right to left in the order they were recorded.

Figure 1.16   Applying the algorithm in Figure 1.15 to obtain the binary representation ofthirteen 0 2 1

Remainder 1

1 2 3

Remainder 1

3 2 6

Remainder 0

6 Remainder 1 2 13

1 1 0 1

Binary representation

Binary Addition To understand the process of adding two integers that are represented in binary, let us first recall the process of adding values that are represented in traditional base 10 notation. Consider, for example, the following problem: 58 1 27

M01_BROO1160_12_SE_C01.indd 54

01/08/14 11:18 AM

1.5  The Binary System

55

We begin by adding the 8 and the 7 in the rightmost column to obtain the sum 15. We record the 5 at the bottom of that column and carry the 1 to the next column, producing   1   58 1 27   5

We now add the 5 and 2 in the next column along with the 1 that was carried to obtain the sum 8, which we record at the bottom of the column. The result is as follows:   58 1 27   85

In short, the procedure is to progress from right to left as we add the digits in each column, write the least significant digit of that sum under the column, and carry the more significant digit of the sum (if there is one) to the next column. To add two integers represented in binary notation, we follow the same procedure except that all sums are computed using the addition facts shown in ­Figure1.17 rather than the traditional base 10 facts that you learned in elementary school. For example, to solve the problem   111010 1 11011

we begin by adding the rightmost 0 and 1; we obtain 1, which we write below the column. Now we add the 1 and 1 from the next column, obtaining 10. We write the 0 from this 10 under the column and carry the 1 to the top of the next column. At this point, our solution looks like this:   1   111010 1 11011   01

We add the 1, 0, and 0 in the next column, obtain 1, and write the 1 under this column. The 1 and 1 from the next column total 10; we write the 0 under the column and carry the 1 to the next column. Now our solution looks like this:   1   111010 1 11011   0101

Figure 1.17   The binary addition facts 0 +0 0

1 +0 1

M01_BROO1160_12_SE_C01.indd 55

0 +1 1

1 +1 10

01/08/14 11:18 AM

56

Chapter 1  Data Storage

The 1, 1, and 1 in the next column total 11 (binary notation for the value three); we write the low-order 1 under the column and carry the other 1 to the top of the next column. We add that 1 to the 1 already in that column to obtain 10. Again, we record the low-order 0 and carry the 1 to the next column. We now have   1 111010 1   11011 010101

The only entry in the next column is the 1 that we carried from the previous column so we record it in the answer. Our final solution is this:   111010 1 11011   1010101

Fractions in Binary To extend binary notation to accommodate fractional values, we use a radix point in the same role as the decimal point in decimal notation. That is, the digits to the left of the point represent the integer part (whole part) of the value and are interpreted as in the binary system discussed previously. The digits to its right represent the fractional part of the value and are interpreted in a manner similar to the other bits, except their positions are assigned fractional quantities. That is, the first position to the right of the radix is assigned the quantity 1/2 (which is 2-1), the next position the quantity 1/4 (which is 2-2), the next 1/8 (which is 2-3), and so on. Note that this is merely a continuation of the rule stated previously: Each position is assigned a quantity twice the size of the one to its right. With these quantities assigned to the bit positions, decoding a binary representation containing a radix point requires the same procedure as used without a radix point. More precisely, we multiply each bit value by the quantity assigned to that bit’s position in the representation. To illustrate, the binary representation 101.101 decodes to 5-5/8, as shown in Figure1.18. For addition, the techniques applied in the base 10 system are also applicable in binary. That is, to add two binary representations having radix points, we

Figure 1.18   Decoding the binary representation 101.101 Binary pattern

1 0 1 .1 0 1 1 0 1 1 0 1

x x x x x x

one-eighth one-fourth one-half one two four

Value Position’s of bit quantity

M01_BROO1160_12_SE_C01.indd 56

= = = = = =

18

0 12

1 0 4 55 8 Total

01/08/14 11:18 AM

1.5  The Binary System

57

Analog versus Digital Prior to the twenty-first century, many researchers debated the pros and cons of digital versus analog technology. In a digital system, a value is encoded as a series of digits and then stored using several devices, each representing one of the digits. In an analog system, each value is stored in a single device that can represent any value within a continuous range. Let us compare the two approaches using buckets of water as the storage devices. To simulate a digital system, we could agree to let an empty bucket represent the digit 0 and a full bucket represent the digit 1. Then we could store a numeric value in a row of buckets using floating-point notation (see Section1.7). In contrast, we could simulate an analog system by partially filling a single bucket to the point at which the water level represented the numeric value being represented. At first glance, the analog system may appear to be more accurate since it would not suffer from the truncation errors inherent in the digital system (again see Section1.7). However, any movement of the bucket in the analog system could cause errors in detecting the water level, whereas a significant amount of sloshing would have to occur in the digital system before the distinction between a full bucket and an empty bucket would be blurred. Thus the digital system would be less sensitive to error than the analog system. This robustness is a major reason why many applications that were originally based on analog technology (such as telephone communication, audio recordings, and television) are shifting to digital technology.

merely align the radix points and apply the same addition process as before. For example, 10.011 added to 100.11 produces 111.001, as shown here: 10.011 + 100.110 111.001

Questions & Exercises 1. Convert each of the following binary representations to its equivalent

base 10 form: a. 101010    b.  100001    c.  10111    d.  0110    e.  11111 2. Convert each of the following base 10 representations to its equivalent

binary form: a. 32         b.  64         c.  96        d.  15      e.  27 3. Convert each of the following binary representations to its equivalent

base 10 form: a. 11.01     b.  101.111 

  c.  10.1 

  d.  110.011  e.  0.101

4. Express the following values in binary notation: a. 41⁄2 

M01_BROO1160_12_SE_C01.indd 57

   b.  23⁄4 

   c.  11⁄8  

  d.  5⁄16 

   e.  55⁄8

01/08/14 11:18 AM

58

Chapter 1  Data Storage

5. Perform the following additions in binary notation: a.  11011 11100

b. 1010.001

c. 11111

d. 111.11

1.101

1   0001

1   00.01

1

1.6  Storing Integers Mathematicians have long been interested in numeric notational systems, and many of their ideas have turned out to be very compatible with the design of digital circuitry. In this section we consider two of these notational systems, two’s complement notation and excess notation, which are used for representing integer values in computing equipment. These systems are based on the binary system but have additional properties that make them more compatible with computer design. With these advantages, however, come disadvantages as well. Our goal is to understand these properties and how they affect computer usage.

Two’s Complement Notation The most popular system for representing integers within today’s computers is two’s complement notation. This system uses a fixed number of bits to represent each of the values in the system. In today’s equipment, it is common to use a two’s complement system in which each value is represented by a pattern of 32 bits. Such a large system allows a wide range of numbers to be represented but is awkward for demonstration purposes. Thus, to study the properties of two’s complement systems, we will concentrate on smaller systems. Figure1.19 shows two complete two’s complement systems—one based on bit patterns of length three, the other based on bit patterns of length four. Such a system is constructed by starting with a string of 0s of the appropriate length and then counting in binary until the pattern consisting of a single 0 followed by 1s is reached. These patterns represent the values 0, 1, 2, 3, .... The patterns representing negative values are obtained by starting with a string of 1s of the appropriate length and then counting backward in binary until the pattern consisting of a single 1 followed by 0s is reached. These patterns represent the values -1, -2, -3, . . . . (If counting backward in binary is difficult for you, merely start at the very bottom of the table with the pattern consisting of a single 1 followed by 0s, and count up to the pattern consisting of all 1s.) Note that in a two’s complement system, the leftmost bit of a bit pattern indicates the sign of the value represented. Thus, the leftmost bit is often called the sign bit. In a two’s complement system, negative values are represented by the patterns whose sign bits are 1; nonnegative values are represented by patterns whose sign bits are 0. In a two’s complement system, there is a convenient relationship between the patterns representing positive and negative values of the same magnitude. They are identical when read from right to left, up to and including the first 1. From there on, the patterns are complements of one another. (The complement of a pattern is the pattern obtained by changing all the 0s to 1s and all the 1s to 0s; 0110 and 1001 are complements.) For example, in the 4-bit system in Figure1.19

M01_BROO1160_12_SE_C01.indd 58

01/08/14 11:18 AM

1.6  Storing Integers

59

Figure 1.19   Two’s complement notation systems a. Using patterns of length three Bit pattern

011 010 001 000 111 110 101 100

b. Using patterns of length four

Value represented

Bit pattern

0111 0110 0101 0100 0011 0010 0001 0000 1111 1110 1101 1100 1011 1010 1001 1000

3 2 1 0 -1 -2 -3 -4

Value represented

7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7 -8

the patterns representing 2 and -2 both end with 10, but the pattern representing 2 begins with 00, whereas the pattern representing -2 begins with 11. This observation leads to an algorithm for converting back and forth between bit patterns representing positive and negative values of the same magnitude. We merely copy the original pattern from right to left until a 1 has been copied, then we complement the remaining bits as they are transferred to the final bit pattern (Figure1.20). Understanding these basic properties of two’s complement systems also leads to an algorithm for decoding two’s complement representations. If the pattern Figure 1.20   Encoding the value—6 in two’s complement notation using 4 bits Two’s complement notation for 6 using four bits

1

1

Copy the bits from right to left until a 1 has been copied

Complement the remaining bits Two’s complement notation for –6 using four bits

M01_BROO1160_12_SE_C01.indd 59

1

1

01/08/14 11:18 AM

60

Chapter 1  Data Storage

to be decoded has a sign bit of 0, we need merely read the value as though the pattern were a binary representation. For example, 0110 represents the value6, because 110 is binary for 6. If the pattern to be decoded has a sign bit of 1, we know the value represented is negative, and all that remains is to find the magnitude of the value. We do this by applying the “copy and complement” procedure in Figure1.20 and then decoding the pattern obtained as though it were a straightforward binary representation. For example, to decode the pattern 1010, we first recognize that since the sign bit is 1, the value represented is negative. Hence, we apply the “copy and complement” procedure to obtain the pattern 0110, recognize that this is the binary representation for 6, and conclude that the original pattern represents -6. Addition in Two’s Complement Notation  To add values represented in two’s comple-

ment notation, we apply the same algorithm that we used for binary addition, except that all bit patterns, including the answer, are the same length. This means that when adding in a two’s complement system, any extra bit generated on the left of the answer by a final carry must be truncated. Thus “adding” 0101 and 0010 produces 0111, and “adding” 0111 and 1011 results in 0010 (0111 + 1011 = 10010, which is truncated to 0010). With this understanding, consider the three addition problems in Figure1.21. In each case, we have translated the problem into two’s complement notation (using bit patterns of length four), performed the addition process previously described, and decoded the result back into our usual base 10 notation. Observe that the third problem in Figure1.21 involves the addition of a positive number to a negative number, which demonstrates a major benefit of two’s complement notation: Addition of any combination of signed numbers can be accomplished using the same algorithm and thus the same circuitry. This is in stark contrast to how humans traditionally perform arithmetic computations. Whereas elementary school children are first taught to add and later taught to subtract, a machine using two’s complement notation needs to know only how to add. Figure 1.21   Addition problems converted to two’s complement notation

M01_BROO1160_12_SE_C01.indd 60

Problem in base 10

Problem in two's complement

3 + 2

0011 + 0010 0101

5

-3 + -2

1101 + 1110 1011

-5

7 + -5

0111 + 1011 0010

2

Answer in base 10

01/08/14 11:18 AM

1.6  Storing Integers

61

For example, the subtraction problem 7 - 5 is the same as the addition problem 7 + ( -5). Consequently, if a machine were asked to subtract 5 (stored as 0101) from 7 (stored as 0111), it would first change the 5 to -5 (represented as 1011) and then perform the addition process of 0111 + 1011 to obtain 0010, which represents 2, as follows: 7 0111        0111 –5    →      – 0101      →     + 1011     0010    →    2

We see, then, that when two’s complement notation is used to represent numeric values, a circuit for addition combined with a circuit for negating a value is sufficient for solving both addition and subtraction problems. (Such circuits are shown and explained in Appendix B.) The Problem of Overflow  One problem we have avoided in the preceding examples is that in any two’s complement system there is a limit to the size of the values that can be represented. When using two’s complement with patterns of 4 bits, the largest positive integer that can be represented is 7, and the most negative integer is -8. In particular, the value 9 cannot be represented, which means that we cannot hope to obtain the correct answer to the problem 5 + 4. In fact, the result would appear as -7. This phenomenon is called overflow. That is, overflow is the problem that occurs when a computation produces a value that falls outside the range of values that can be represented. When using two’s complement notation, this might occur when adding two positive values or when adding two negative values. In either case, the condition can be detected by checking the sign bit of the answer. An overflow is indicated if the addition of two positive values results in the pattern for a negative value or if the sum of two negative values appears to be positive. Of course, because most computers use two’s complement systems with longer bit patterns than we have used in our examples, larger values can be manipulated without causing an overflow. Today, it is common to use patterns of 32 bits for storing values in two’s complement notation, allowing for positive values as large as 2,147,483,647 to accumulate before overflow occurs. If still larger values are needed, longer bit patterns can be used or perhaps the units of measure can be changed. For instance, finding a solution in terms of miles instead of inches results in smaller numbers being used and might still provide the accuracy required. The point is that computers can make mistakes. So, the person using the machine must be aware of the dangers involved. One problem is that computer programmers and users become complacent and ignore the fact that small values can accumulate to produce large numbers. For example, in the past it was common to use patterns of 16 bits for representing values in two’s complement notation, which meant that overflow would occur when values of 215 = 32,768 or larger were reached. On September 19, 1989, a hospital computer system malfunctioned after years of reliable service. Close inspection revealed that this date was 32,768 days after January 1, 1900, and the machine was programmed to compute dates based on that starting date. Thus, because of overflow, September 19, 1989, produced a negative value—a phenomenon the computer’s program was not designed to handle.

M01_BROO1160_12_SE_C01.indd 61

01/08/14 11:18 AM

62

Chapter 1  Data Storage

Excess Notation Another method of representing integer values is excess notation. As is the case with two’s complement notation, each of the values in an excess notation system is represented by a bit pattern of the same length. To establish an excess system, we first select the pattern length to be used, then write down all the different bit patterns of that length in the order they would appear if we were counting in binary. Next, we observe that the first pattern with a 1 as its most significant bit appears approximately halfway through the list. We pick this pattern to represent zero; the patterns following this are used to represent 1, 2, 3, ...; and the patterns preceding it are used for -1, -2, -3, c. The resulting code, when using patterns of length four, is shown in Figure1.22. There we see that the value 5 is represented by the pattern 1101 and -5 is represented by 0011. (Note that one difference between an excess system and a two’s complement system is that the sign bits are reversed.) The system represented in Figure1.22 is known as excess eight notation. To understand why, first interpret each of the patterns in the code using the traditional binary system and then compare these results to the values represented in the excess notation. In each case, you will find that the binary interpretation exceeds the excess notation interpretation by the value 8. For example, the pattern 1100 in binary notation represents the value 12, but in our excess system it represents 4; 0000 in binary notation represents 0, but in the excess system it represents negative 8. In a similar manner, an excess system based on patterns of length five would be called excess 16 notation, because the pattern 10000, for instance, would be used to represent zero rather than representing its usual value of 16. Likewise, you may want to confirm that the three-bit excess system would be known as excess four notation (Figure1.23).

Figure 1.22   An excess eight conversion table

M01_BROO1160_12_SE_C01.indd 62

Bit pattern

Value represented

1111 1110 1101 1100 1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001 0000

7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7 -8

01/08/14 11:18 AM

1.6  Storing Integers

63

Figure 1.23   An excess notation system using bit patterns of length three Bit pattern

Value represented

111 110 101 100 011 010 001 000

3 2 1 0 -1 -2 -3 -4

Questions & Exercises 1. Convert each of the following two’s complement representations to its

equivalent base 10 form: a. 00011 b.  01111 c.  11100 d. 11010 e.  00000 f.  10000 2. Convert each of the following base 10 representations to its equivalent

two’s complement form using patterns of 8 bits: a. 6 b.  -6 c.  -17 d. 13 e.  0 -1 f.  3. Suppose the following bit patterns represent values stored in two’s com-

plement notation. Find the two’s complement representation of the negative of each value: a. 00000001 b.  01010101 c.  11111100 d. 11111110 e.  00000000 f.  01111111 4. Suppose a machine stores numbers in two’s complement notation. What

are the largest and smallest numbers that can be stored if the machine uses bit patterns of the following lengths? a. four b.  six c.  eight 5. In the following problems, each bit pattern represents a value stored in

two’s complement notation. Find the answer to each problem in two’s complement notation by performing the addition process described in the text. Then check your work by translating the problem and your answer into base 10 notation. a. 0101 + 0010 b.  0011 + 0001   c. 0101 + 1010 d. 1110 + 0011    e. 1010 + 1110

M01_BROO1160_12_SE_C01.indd 63

01/08/14 11:18 AM

64

Chapter 1  Data Storage

6. Solve each of the following problems in two’s complement notation, but

this time watch for overflow and indicate which answers are incorrect because of this phenomenon. a. 0100 + 0011     b. 0101 + 0110     c. 1010 + 1010 d. 1010 + 0111     e. 0111 + 0001 7. Translate each of the following problems from base 10 notation into two’s

complement notation using bit patterns of length four, then convert each problem to an equivalent addition problem (as a machine might do), and perform the addition. Check your answers by converting them back to base 10 notation. a. 6 - ( -1) b.  3 - ( -2) c.  4 - 6 d. 2 - ( -4) e.  1 - 5 8. Can overflow ever occur when values are added in two’s complement

notation with one value positive and the other negative? Explain your answer. 9. Convert each of the following excess eight representations to its equiva-

lent base 10 form without referring to the table in the text: a. 1110 b.  0111 c.  1000 d. 0010 e.  0000 f.  1001 10. Convert each of the following base 10 representations to its equivalent

excess eight form without referring to the table in the text: a. 5 b.  -5 c.  3 d. 0 e.  7 f.  -8 11. Can the value 9 be represented in excess eight notation? What about rep-

resenting 6 in excess four notation? Explain your answer.

1.7  Storing Fractions In contrast to the storage of integers, the storage of a value with a fractional part requires that we store not only the pattern of 0s and 1s representing its binary representation but also the position of the radix point. A popular way of doing this is based on scientific notation and is called floating-point notation.

Floating-Point Notation Let us explain floating-point notation with an example using only one byte of storage. Although machines normally use much longer patterns, this 8-bit format is representative of actual systems and serves to demonstrate the important concepts without the clutter of long bit patterns. We first designate the high-order bit of the byte as the sign bit. Once again, a 0 in the sign bit will mean that the value stored is nonnegative, and a 1 will mean that the value is negative. Next, we divide the remaining 7 bits of the byte into two groups, or fields: the exponent field and the mantissa field. Let us designate

M01_BROO1160_12_SE_C01.indd 64

01/08/14 11:18 AM

1.7  Storing Fractions

65

the 3 bits following the sign bit as the exponent field and the remaining 4 bits as the mantissa field. Figure1.24 illustrates how the byte is divided. We can explain the meaning of the fields by considering the following example. Suppose a byte consists of the bit pattern 01101011. Analyzing this pattern with the preceding format, we see that the sign bit is 0, the exponent is 110, and the mantissa is 1011. To decode the byte, we first extract the mantissa and place a radix point on its left side, obtaining .1011

Next, we extract the contents of the exponent field (110) and interpret it as an integer stored using the 3-bit excess method (see again Figure1.24). Thus the pattern in the exponent field in our example represents a positive 2. This tells us to move the radix in our solution to the right by 2 bits. (A negative exponent would mean to move the radix to the left.) Consequently, we obtain 10.11

which is the binary representation for 23⁄4. (Recall the representation of binary fractions from Figure1.18.) Next, we note that the sign bit in our example is 0; the value represented is thus nonnegative. We conclude that the byte 01101011 represents 23⁄4. Had the pattern been 11101011 (which is the same as before except for the sign bit), the value represented would have been 23⁄4. As another example, consider the byte 00111100. We extract the mantissa to obtain .1100

and move the radix 1 bit to the left, since the exponent field (011) represents the value -1. We therefore have .01100

which represents 3/8. Since the sign bit in the original pattern is 0, the value stored is nonnegative. We conclude that the pattern 00111100 represents 3⁄8. To store a value using floating-point notation, we reverse the preceding process. For example, to encode 11⁄8, first we express it in binary notation and obtain 1.001. Next, we copy the bit pattern into the mantissa field from left to right, starting with the leftmost 1 in the binary representation. At this point, the byte looks like this: 1 0 0 1

Figure 1.24   Floating-point notation components

— ——— ————

Bit positions

Mantissa Exponent Sign bit

M01_BROO1160_12_SE_C01.indd 65

01/08/14 11:18 AM

66

Chapter 1  Data Storage

We must now fill in the exponent field. To this end, we imagine the contents of the mantissa field with a radix point at its left and determine the number of bits and the direction the radix must be moved to obtain the original binary number. In our example, we see that the radix in .1001 must be moved 1 bit to the right to obtain 1.001. The exponent should therefore be a positive one, so we place 101 (which is positive one in excess four notation as shown in Figure1.23) in the exponent field. Finally, we fill the sign bit with 0 because the value being stored is nonnegative. The finished byte looks like this: 0 1 0 1 1 0 0 1

There is a subtle point you may have missed when filling in the mantissa field. The rule is to copy the bit pattern appearing in the binary representation from left to right, starting with the leftmost 1. To clarify, consider the process of storing the value 3⁄8, which is .011 in binary notation. In this case the mantissa will be 1 1 0 0

It will not be 0 1 1 0

This is because we fill in the mantissa field starting with the leftmost 1 that appears in the binary representation. Representations that conform to this rule are said to be in normalized form. Using normalized form eliminates the possibility of multiple representations for the same value. For example, both 00111100 and 01000110 would decode to the value 3⁄8, but only the first pattern is in normalized form. Complying with normalized form also means that the representation for all nonzero values will have a mantissa that starts with 1. The value zero, however, is a special case; its floating-point representation is a bit pattern of all 0s.

Truncation Errors Let us consider the annoying problem that occurs if we try to store the value 25⁄8 with our one-byte floating-point system. We first write 25⁄8 in binary, which gives us 10.101. But when we copy this into the mantissa field, we run out of room, and the rightmost 1 (which represents the last 1⁄8) is lost (Figure1.25). If we ignore this problem for now and continue by filling in the exponent field and the sign bit, we end up with the bit pattern 01101010, which represents 21⁄2 instead of 25⁄8. What has occurred is called a truncation error, or round-off error—meaning that part of the value being stored is lost because the mantissa field is not large enough. The significance of such errors can be reduced by using a longer mantissa field. In fact, most computers manufactured today use at least 32 bits for storing values in floating-point notation instead of the 8 bits we have used here. This also allows for a longer exponent field at the same time. Even with these longer formats, however, there are still times when more accuracy is required. Another source of truncation errors is a phenomenon that you are already accustomed to in base 10 notation: the problem of nonterminating expansions, such as those found when trying to express 1⁄3 in decimal form. Some values cannot be accurately expressed regardless of how many digits we use. The difference between our traditional base 10 notation and binary notation is that more values have nonterminating representations in binary than in decimal notation. For example, the value 1/10 is nonterminating when expressed in binary. Imagine the problems this might cause the unwary person using floating-point notation to

M01_BROO1160_12_SE_C01.indd 66

01/08/14 11:18 AM

1.7  Storing Fractions

67

Figure 1.25   Encoding the value 25⁄8 25/8

Original representation

10.101

Base two representation

1 0 1 01

Raw bit pattern

1 0 1 0

——— ———— Lost bit

Mantissa Exponent Sign bit

store and manipulate dollars and cents. In particular, if the dollar is used as the unit of measure, the value of a dime could not be stored accurately. A solution in this case is to manipulate the data in units of pennies so that all values are integers that can be accurately stored using a method such as two’s complement. Truncation errors and their related problems are an everyday concern for people working in the area of numerical analysis. This branch of mathematics deals with the problems involved when doing actual computations that are often massive and require significant accuracy. The following is an example that would warm the heart of any numerical analyst. Suppose we are asked to add the following three values using our onebyte floating-point notation defined previously: 21⁄2 1 1⁄8 1 1⁄8

Single Precision Floating Point The floating-point notation introduced in this chapter (Section1.7) is far too simplistic to be used in an actual computer. After all, with just 8 bits, only 256 numbers out of the set of all real numbers can be expressed. Our discussion has used 8 bits to keep the examples simple, yet still cover the important underlying concepts. Many of today’s computers support a 32-bit form of this notation called Single Precision Floating Point. This format uses 1 bit for the sign, 8 bits for the exponent (in an excess notation), and 23 bits for the mantissa. Thus, single precision floating point is capable of expressing very large numbers (order of 1038) down to very small numbers (order of 10-37) with the precision of 7 decimal digits. That is to say, the first 7 digits of a given decimal number can be stored with very good accuracy (a small amount of error may still be present). Any digits passed the first 7 will certainly be lost by truncation error (although the magnitude of the number is retained). Another form, called Double Precision Floating Point, uses 64 bits and provides a precision of 15 decimal digits.

M01_BROO1160_12_SE_C01.indd 67

01/08/14 11:18 AM

68

Chapter 1  Data Storage

If we add the values in the order listed, we first add 21⁄2 to 1⁄8 and obtain 25⁄8, which in binary is 10.101. Unfortunately, because this value cannot be stored accurately (as seen previously), the result of our first step ends up being stored as 21⁄2 (which is the same as one of the values we were adding). The next step is to add this result to the last 1/8. Here again a truncation error occurs, and our final result turns out to be the incorrect answer 21⁄2. Now let us add the values in the opposite order. We first add 1⁄8 to 1⁄8 to obtain 1 ⁄4. In binary this is .01; so the result of our first step is stored in a byte as 00111000, which is accurate. We now add this 1⁄4 to the next value in the list, 21⁄2, and obtain 23⁄4, which we can accurately store in a byte as 01101011. The result this time is the correct answer. To summarize, in adding numeric values represented in floating-point notation, the order in which they are added can be important. The problem is that if a very large number is added to a very small number, the small number may be truncated. Thus, the general rule for adding multiple values is to add the smaller values together first, in hopes that they will accumulate to a value that is significant when added to the larger values. This was the phenomenon experienced in the preceding example. Designers of today’s commercial software packages do a good job of shielding the uneducated user from problems such as this. In a typical spreadsheet system, correct answers will be obtained unless the values being added differ in size by a factor of 1016 or more. Thus, if you found it necessary to add one to the value 10,000,000,000,000,000

you might get the answer 10,000,000,000,000,000

rather than 10,000,000,000,000,001

Such problems are significant in applications (such as navigational systems) in which minor errors can be compounded in additional computations and ultimately produce significant consequences, but for the typical PC user the degree of accuracy offered by most commercial software is sufficient.

Questions & Exercises 1. Decode the following bit patterns using the floating-point format dis-

cussed in the text: a. 01001010  b. 01101101  c. 00111001  d. 11011100  e. 10101011 2. Encode the following values into the floating-point format discussed in

the text. Indicate the occurrence of truncation errors. a. 23⁄4        b. 51⁄4        c. 3⁄4         d. 231⁄2       e.  243⁄8

M01_BROO1160_12_SE_C01.indd 68

01/08/14 11:18 AM

1.8  Data and Programming

69

3. In terms of the floating-point format discussed in the text, which of the

patterns 01001001 and 00111101 represents the larger value? Describe a simple procedure for determining which of two patterns represents the larger value. 4. When using the floating-point format discussed in the text, what is the

largest value that can be represented? What is the smallest positive value that can be represented?

1.8  Data and Programming While humans have devised the data representations and basic operations that comprise modern computers, few people are very good at working with computers directly at this level. People prefer to reason about computational problems at a higher level of abstraction, and they rely on the computer to handle the lowest levels of detail. A programming language is a computer system created to allow humans to precisely express algorithms to the computer using a higher level of abstraction. In the twentieth century, programming computers was considered to be the province of a few highly trained experts; to be sure, there remain many problems in computing that require the attention of experienced computer scientists and software engineers. However, in the twenty-first century, as computers and computing have become increasingly intertwined in every aspect of our modern lives, it has grown steadily more difficult to identify career fields that do not require at least some degree of programming skill. Indeed, some have identified programming or coding to be the next foundational pillar of modern literacy, alongside reading, writing, and arithmetic. In this section, and in programming supplement sections in subsequent chapters, we look at how a programming language reflects the main ideas of the chapter and allows humans to more easily solve problems involving computation.

Getting Started with Python Python is a programming language that was created by Guido van Rossum in the late 1980s. Today it is one of the top ten most-used languages and remains popular in developing web applications, in scientific computation, and as an introductory language for students. Organizations that use Python range from Google to NASA, DropBox to Industrial Light & Magic, and across the spectrum of casual, scientific, and artistic computer users. Python emphasizes readability and includes elements of the imperative, object-oriented, and functional programming paradigms, which will be explored in Chapter6. The software for editing and running programs written in Python is freely available from www.python.org, as are many other resources for getting started. The Python language has evolved and continues to evolve over time. All of the examples in this book will use a version of the language called Python 3. Earlier versions of Python are capable of running very similar programs, but there have been many minor changes, such as punctuation, since Python 2.

M01_BROO1160_12_SE_C01.indd 69

01/08/14 11:18 AM

70

Chapter 1  Data Storage

Python is an interpreted language, which for beginners means that Python instructions can be typed into an interactive prompt or can be stored in a plain text file (called a “script”) and run later. In the examples below, either mode can be used, but exercise and chapter review problems will generally ask for a Python script.

Hello Python By longstanding tradition, the first program described in many programming language introductions is “Hello, World.” This simple program outputs a nominal greeting, demonstrating how a particular language produces a result, and also how a language represents text. In Python1, we write this program as print('Hello, World!')

Type this statement into Python’s interactive interpreter, or save it as a Python script and execute it. In either case, the result should be: Hello, World!

Python parrots the text between the quotation marks back to the user. There are several aspects to note even in this simple Python script. First, print is a built-in function, a predefined operation that Python scripts can use to produce output, a result of the program that will be made visible to the user. The print is followed by opening and closing parentheses; what comes between those parentheses is the value to be printed. Second, Python can denote strings of text using single quotation marks. The quotation marks in front of the capital H and after the exclamation point denote the beginning and end of a string of characters that will be treated as a value in Python. Programming languages carry out their instructions very precisely. If a user makes subtle changes to the message between the starting and finishing quotation marks within the print statement, the resultant printed text will change accordingly. Take a moment to try different capitalizations, punctuation, and even different words within the print statement to see that this is so.

Variables Python allows the user to name values for later use, an important abstraction when constructing compact, understandable scripts. These named storage locations are termed variables, analogous to the mathematical variables often seen in algebra courses. Consider the slightly enhanced version of Hello World below: message = 'Hello, World!' print(message)

In this script, the first line is an assignment statement. The use of the = can be misleading to beginners, who are accustomed to the algebraic usage of the equal sign. This assignment statement should be read, “variable message is assigned 1

This Python code is for version 3 of the language, which will be referred to only as “Python” for the remainder of the book. Earlier versions of Python do not always require the opening and closing parentheses.

M01_BROO1160_12_SE_C01.indd 70

01/08/14 11:18 AM

1.8  Data and Programming

71

the string value 'Hello, World!'”. In general, an assignment statement will have a variable name on the left side of the equal sign and a value to the right. Python is a dynamically typed language, which means that our script need not establish ahead of time that there will be a variable called message, or what type of value should be stored in message. In the script, it is sufficient to state that our text string will be assigned to message, and then to refer to that variable message in the subsequent print statement. The naming of variables is largely up to the user in Python. Python’s simple rules are that variable names must begin with an alphabet letter and may consist of an arbitrary number of letters, digits, and the underscore character,_. While a variable named m may be sufficient for a two-line example script, ­experienced programmers strive to give meaningful, descriptive variable names in their scripts. Python variable names are case-sensitive, meaning that capitalization matters. A variable named size is treated as distinct from variables named Size or SIZE. A small number of keywords, names that are reserved for special meaning in Python, cannot be used as variable names. You can view this list by accessing the built-in Python help system. help('keywords')

Variables can be used to store all of the types of values that Python is able to represent. my_integer = 5 my_floating_point = 26.2 my_Boolean = True my_string = 'characters'

Observe that the types of values we see here correspond directly to the representations covered earlier in this chapter: Boolean trues and falses (Section1.1), text (Section1.4), integers (Section1.6), and floating point numbers (Section1.7). With additional Python code (beyond the scope of our simple introduction in this text) we could store image and sound data (Section1.4) with Python variables, as well. Python expresses hexadecimal values using a 0x prefix, as in my_integer = 0xFF print(my_integer)

Specifying a value in hexadecimal does not alter the representation of that value in the computer’s memory, which stores integer values as a collection of ones and zeros regardless of the numerical base used in the programmer’s reasoning. Hexadecimal notation remains a shortcut for humans, used in situations where that representation may aid in understanding the script. The print statement above thus prints 255, the base 10 interpretation of hexadecimal 0xFF, because that is the default behavior for print. More complex adjustments to the print statement can be used to output values in other representations, but we confine our discussion here to the more familiar base 10. Unicode characters, including those beyond the ubiquitous ASCII subset, can be included directly in strings when the text editor supports them, print(' 1000')

M01_BROO1160_12_SE_C01.indd 71

# Prints

1000, one thousand Indian Rupees

01/08/14 11:18 AM

72

Chapter 1  Data Storage

or can be specified using four hexadecimal digits following a '\u' prefix. print('\u00A31000')

# Prints £1000, one thousand British # Pounds Sterling

The portion of the string '\u00A3' encodes the Unicode representation of the British pound symbol. The '1000' follows immediately so that there will be no space between the currency symbol and the amount in the final output: £1000. These example statements introduce another language feature, in addition to Unicode text strings. The # symbol denotes the beginning of a comment, a human-readable notation to the Python code that will be ignored by the computer when executed. Experienced programmers use comments in their code to explain difficult segments of the algorithm, include history or authorship information, or just to note where a human should pay attention when reading the code. All of the characters to the right of the # until the end of the line are ignored by Python.

Operators and Expressions Python’s built-in operators allow values to be manipulated and combined in a variety of familiar ways. print(3 + 4) print(5 – 6) print(7 * 8) print(45 / 4) print(2 ** 10)

# # # # #

Prints Prints Prints Prints Prints

"7", which is 3 plus 4. "−1", which is 5 minus 6 "56", which is 7 times 8 "11.25", which is 45 divided by 4 "1024", which is 2 to the 10th power

When an operation such as forty-five divided by four produces a non-integer result, such as 11.25, Python implicitly switches to a floating-point representation. When purely integer answers are desired, a different set of operators can be used. print(45 // 4) print(45 % 4)

# P rints "11", which is 45 integer divided by 4 # P rints "1", because 4 * 11 + 1 = 45

The double slash signifies the integer floor division operator, while the percentage symbol signifies the modulus, or remainder operator. Taken together, we can read these calculations as, “four goes into forty-five eleven times, with a remainder of one.” In the earlier example, we used ** to signify exponentiation, which can be somewhat surprising given that the caret symbol, ^, is often used for this purpose in typewritten text and even some other programming languages. In Python, the caret operator belongs to the group of bitwise Boolean operations, which will be discussed in the next chapter. String values also can be combined and manipulated in some intuitive ways. s = 'hello' + 'world' t = s * 4 print(t)

M01_BROO1160_12_SE_C01.indd 72

# Prints "helloworldhelloworldhelloworldhelloworld"

01/08/14 11:18 AM

1.8  Data and Programming

73

The plus operator concatenates string values, while the multiplication operator replicates string values. The multiple meanings of some of the built-in operators can lead to confusion. This script will produce an error: print('USD$' + 1000)

# TypeError: Can't convert 'int' to str implicitly

The error indicates that the string concatenation operator doesn’t know what to do when the second operand is not also a string. Fortunately, Python provides functions that allow values to be converted from one type of representation to another. The int() function will convert a floating-point value back to an integer representation, discarding the fractional part. It will also convert a string of text digits into an integer representation, provided that the string correctly spells out a valid number. Likewise, the str() function can be used to convert numeric representations into UTF-8 encoded text strings. Thus, the following modification to the print statement above corrects the error. print('USD$' + str(1000))

# Prints "USD$1000"

Currency Conversion The complete Python script example below demonstrates many of the concepts introduced in this section. Given a set number of U.S. dollars, the script produces monetary conversions to four other currencies. # A converter for international currency exchange. USD_to_GBP = 0.66 # Today's rate, US dollars to British Pounds USD_to_EUR = 0.77 # Today's rate, US dollars to Euros USD_to_JPY = 99.18 # Today's rate, US dollars to Japanese Yen USD_to_INR = 59.52 # Today's rate, US dollars to Indian Rupees GBP_sign EUR_sign JPY_sign INR_sign

= = = =

'\u00A3' # Unicode values for non-ASCII currency symbols. '\u20AC' '\u00A5' '\u20B9'

dollars

= 1000 # The number of dollars to convert

pounds euros yen rupees

= = = =

dollars dollars dollars dollars

* * * *

USD_to_GBP USD_to_EUR USD_to_JPY USD_to_INR

# Conversion calculations

print('Today, $' + str(dollars)) # Printing the results print('converts to ' + GBP_sign + str(pounds))

M01_BROO1160_12_SE_C01.indd 73

01/08/14 11:18 AM

74

Chapter 1  Data Storage

print('converts to ' + EUR_sign + str(euros)) print('converts to ' + JPY_sign + str(yen)) print('converts to ' + INR_sign + str(rupees))

When executed, this script outputs the following: Today, $1000 converts to £660.0 converts to €770.0 converts to ¥99180.0 converts to 59520.0

Debugging Programming languages are not very forgiving for beginners, and a great deal of time learning to write software can be spent trying to find bugs, or errors in the code. There are three major classes of bug that we create in software: syntax errors (mistakes in the symbols that have been typed), semantic errors (mistakes in the meaning of the program), and runtime errors (mistakes that occur when the program is executed.) Syntax errors are the most common for novices and include simple errors such as forgetting one of the quote marks at the beginning or ending of a text string, failing to close open parentheses, or misspelling the function name print. The Python interpreter will generally try to point these errors out when it encounters them, displaying an offending line number and a description of the problem. With some practice, a beginner can quickly learn to recognize and interpret common error cases. As examples: print(5 + ) SyntaxError: invalid syntax

This expression is missing a value between the addition operator and the closing parenthesis. print(5.e) SyntaxError: invalid token

Python expects digits to follow the decimal point, not a letter. pront(5) NameError: name 'pront' is not defined

Like calling someone by the wrong name, misspelling the name of a known function or variable can result in confusion and embarrassment. Semantic errors are flaws in the algorithm, or flaws in the way the algorithm is expressed in a language. Examples might include using the wrong variable name in a calculation or getting the order of arithmetic operations wrong in a complex expression. Python follows the standard rules for operator precedence, so in an expression like total_pay = 40 + extra_hours * pay_rate, the multiplication will be performed before the addition, incorrectly calculating the total pay. (Unless your pay rate happens to be $1/hour.) Use parenthesis to properly specify the order of operations in complex expressions, thereby avoiding both semantic errors and code that may be harder to understand (e.g., total_pay = (40 + extra_hours) * pay_rate).

M01_BROO1160_12_SE_C01.indd 74

01/08/14 11:18 AM

1.9  Data Compression

75

Finally, runtime errors at this level might include unintentionally dividing by zero or using a variable before you have defined it. Python reads statements from top to bottom; it and must see an assignment statement to a variable before that variable is used in an expression. Testing is an integral part of writing Python scripts—or really any kind of program—effectively. Run your script frequently as you write it, perhaps as often as after you complete each line of code. This allows syntax errors to be identified and fixed early and helps focus the author’s attention on what should be happening at each step of the script.

Questions & Exercises 1. What makes Python an interpreted programming language? 2. Write Python statements that print the following: a. The words “Computer Science Rocks”, followed by an exclamation

point b. The number 42 c. An approximation of the value of Pi to 4 decimal places 3. Write Python statements to make the following assignments to variables: a. The word “programmer” to a variable called, rockstar b. The number of seconds in an hour to a variable called seconds_per_hour

c. The average temperature of the human body to a variable called bodyTemp

4. Write a Python statement that given an existing variable called bodyTemp

in degrees Fahrenheit stores the equivalent temperature in degrees Celsius to a new variable called metricBodyTemp.

1.9  Data Compression For the purpose of storing or transferring data, it is often helpful (and sometimes mandatory) to reduce the size of the data involved while retaining the underlying information. The technique for accomplishing this is called data compression. We begin this section by considering some generic data compression methods and then look at some approaches designed for specific applications.

Generic Data Compression Techniques Data compression schemes fall into two categories. Some are lossless, others are lossy. Lossless schemes are those that do not lose information in the compression process. Lossy schemes are those that may lead to the loss of information. Lossy techniques often provide more compression than lossless ones and are

M01_BROO1160_12_SE_C01.indd 75

01/08/14 11:18 AM

76

Chapter 1  Data Storage

therefore popular in settings in which minor errors can be tolerated, as in the case of images and audio. In cases where the data being compressed consist of long sequences of the same value, the compression technique called run-length encoding, which is a lossless method, is popular. It is the process of replacing sequences of identical data elements with a code indicating the element that is repeated and the number of times it occurs in the sequence. For example, less space is required to indicate that a bit pattern consists of 253 ones, followed by 118 zeros, followed by 87 ones than to actually list all 458 bits. Another lossless data compression technique is frequency-dependent encoding, a system in which the length of the bit pattern used to represent a data item is inversely related to the frequency of the item’s use. Such codes are examples of variable-length codes, meaning that items are represented by patterns of different lengths. David Huffman is credited with discovering an algorithm that is commonly used for developing frequency-dependent codes, and it is common practice to refer to codes developed in this manner as Huffman codes. In turn, most frequency-dependent codes in use today are Huffman codes. As an example of frequency-dependent encoding, consider the task of encoded English language text. In the English language the letters e, t, a, and i are used more frequently than the letters z, q, and x. So, when constructing a code for text in the English language, space can be saved by using short bit patterns to represent the former letters and longer bit patterns to represent the latter ones. The result would be a code in which English text would have shorter representations than would be obtained with uniform-length codes. In some cases, the stream of data to be compressed consists of units, each of which differs only slightly from the preceding one. An example would be consecutive frames of a motion picture. In these cases, techniques using relative encoding, also known as differential encoding, are helpful. These techniques record the differences between consecutive data units rather than entire units; that is, each unit is encoded in terms of its relationship to the previous unit. Relative encoding can be implemented in either lossless or lossy form depending on whether the differences between consecutive data units are encoded precisely or approximated. Still other popular compression systems are based on dictionary encoding techniques. Here the term dictionary refers to a collection of building blocks from which the message being compressed is constructed, and the message itself is encoded as a sequence of references to the dictionary. We normally think of dictionary encoding systems as lossless systems, but as we will see in our discussion of image compression, there are times when the entries in the dictionary are only approximations of the correct data elements, resulting in a lossy compression system. Dictionary encoding can be used by word processors to compress text documents because the dictionaries already contained in these processors for the purpose of spell checking make excellent compression dictionaries. In particular, an entire word can be encoded as a single reference to this dictionary rather than as a sequence of individual characters encoded using a system such as UTF-8. A typical dictionary in a word processor contains approximately 25,000 entries, which means an individual entry can be identified by an integer in the range of 0 to 24,999. This means that a particular entry in the dictionary can be identified by a pattern of only 15 bits. In contrast, if the word being referenced

M01_BROO1160_12_SE_C01.indd 76

01/08/14 11:18 AM

1.9  Data Compression

77

consisted of six letters, its character-by-character encoding would require 48 bits using UTF-8. A variation of dictionary encoding is adaptive dictionary encoding (also known as dynamic dictionary encoding). In an adaptive dictionary encoding system, the dictionary is allowed to change during the encoding process. A popular example is Lempel-Ziv-Welsh (LZW) encoding (named after its creators, Abraham Lempel, Jacob Ziv, and Terry Welsh). To encode a message using LZW, one starts with a dictionary containing the basic building blocks from which the message is constructed, but as larger units are found in the message, they are added to the dictionary—meaning that future occurrences of those units can be encoded as single, rather than multiple, dictionary references. For example, when encoding English text, one could start with a dictionary containing individual characters, digits, and punctuation marks. But as words in the message are identified, they could be added to the dictionary. Thus, the dictionary would grow as the message is encoded, and as the dictionary grows, more words (or recurring patterns of words) in the message could be encoded as single references to the dictionary. The result would be a message encoded in terms of a rather large dictionary that is unique to that particular message. But this large dictionary would not have to be present to decode the message. Only the original small dictionary would be needed. Indeed, the decoding process could begin with the same small dictionary with which the encoding process started. Then, as the decoding process continues, it would encounter the same units found during the encoding process, and thus be able to add them to the dictionary for future reference just as in the encoding process. To clarify, consider applying LZW encoding to the message xyx xyx xyx xyx

starting with a dictionary with three entries, the first being x, the second being y, and the third being a space. We would begin by encoding xyx as 121, meaning that the message starts with the pattern consisting of the first dictionary entry, followed by the second, followed by the first. Then the space is encoded to produce 1213. But, having reached a space, we know that the preceding string of characters forms a word, and so we add the pattern xyx to the dictionary as the fourth entry. Continuing in this manner, the entire message would be encoded as 121343434. If we were now asked to decode this message, starting with the original threeentry dictionary, we would begin by decoding the initial string 1213 as xyx followed by a space. At this point we would recognize that the string xyx forms a word and add it to the dictionary as the fourth entry, just as we did during the encoding process. We would then continue decoding the message by recognizing that the 4 in the message refers to this new fourth entry and decode it as the word xyx, producing the pattern xyx xyx

Continuing in this manner we would ultimately decode the string 121343434 as xyx xyx xyx xyx

which is the original message.

M01_BROO1160_12_SE_C01.indd 77

01/08/14 11:18 AM

78

Chapter 1  Data Storage

Compressing Images In Section1.4, we saw how images are encoded using bit map techniques. Unfortunately, the bit maps produced are often very large. In turn, numerous compression schemes have been developed specifically for image representations. One system known as GIF (short for Graphic Interchange Format and pronounced “Giff” by some and “Jiff” by others) is a dictionary encoding system that was developed by CompuServe. It approaches the compression problem by reducing the number of colors that can be assigned to a pixel to only 256. The redgreen-blue combination for each of these colors is encoded using three bytes, and these 256 encodings are stored in a table (a dictionary) called the palette. Each pixel in an image can then be represented by a single byte whose value indicates which of the 256 palette entries represents the pixel’s color. (Recall that a single byte can contain any one of 256 different bit patterns.) Note that GIF is a lossy compression system when applied to arbitrary images because the colors in the palette may not be identical to the colors in the original image. GIF can obtain additional compression by extending this simple dictionary system to an adaptive dictionary system using LZW techniques. In particular, as patterns of pixels are encountered during the encoding process, they are added to the dictionary so that future occurrences of these patterns can be encoded more efficiently. Thus, the final dictionary consists of the original palette and a collection of pixel patterns. One of the colors in a GIF palette is normally assigned the value “transparent,” which means that the background is allowed to show through each region assigned that “color.” This option, combined with the relative simplicity of the GIF system, makes GIF a logical choice in simple animation applications in which multiple images must move around on a computer screen. On the other hand, its ability to encode only 256 colors renders it unsuitable for applications in which higher precision is required, as in the field of photography. Another popular compression system for images is JPEG (pronounced “JAYpeg”). It is a standard developed by the Joint Photographic Experts Group (hence the standard’s name) within ISO. JPEG has proved to be an effective standard for compressing color photographs and is widely used in the photography industry, as witnessed by the fact that most digital cameras use JPEG as their default compression technique. The JPEG standard actually encompasses several methods of image compression, each with its own goals. In those situations that require the utmost in precision, JPEG provides a lossless mode. However, JPEG’s lossless mode does not produce high levels of compression when compared to other JPEG options. Moreover, other JPEG options have proven very successful, meaning that JPEG’s lossless mode is rarely used. Instead, the option known as JPEG’s baseline standard (also known as JPEG’s lossy sequential mode) has become the standard of choice in many applications. Image compression using the JPEG baseline standard requires a sequence of steps, some of which are designed to take advantage of a human eye’s limitations. In particular, the human eye is more sensitive to changes in brightness than to changes in color. So, starting from an image that is encoded in terms of luminance and chrominance components, the first step is to average the chrominance values over two-by-two pixel squares. This reduces the size of the chrominance information by a factor of four while preserving all the original brightness information. The result is a significant degree of compression without a noticeable loss of image quality.

M01_BROO1160_12_SE_C01.indd 78

01/08/14 11:18 AM

1.9  Data Compression

79

The next step is to divide the image into eight-by-eight pixel blocks and to compress the information in each block as a unit. This is done by applying a mathematical technique known as the discrete cosine transform, whose details need not concern us here. The important point is that this transformation converts the original eight-by-eight block into another block whose entries reflect how the pixels in the original block relate to each other rather than the actual pixel values. Within this new block, values below a predetermined threshold are then replaced by zeros, reflecting the fact that the changes represented by these values are too subtle to be detected by the human eye. For example, if the original block contained a checkerboard pattern, the new block might reflect a uniform average color. (A typical eight-by-eight pixel block would represent a very small square within the image so the human eye would not identify the checkerboard appearance anyway.) At this point, more traditional run-length encoding, relative encoding, and variable-length encoding techniques are applied to obtain additional compression. All together, JPEG’s baseline standard normally compresses color images by a factor of at least 10, and often by as much as 30, without noticeable loss of quality. Still another data compression system associated with images is TIFF (short for Tagged Image File Format). However, the most popular use of TIFF is not as a means of data compression but instead as a standardized format for storing photographs along with related information such as date, time, and camera settings. In this context, the image itself is normally stored as red, green, and blue pixel components without compression. The TIFF collection of standards does include data compression techniques, most of which are designed for compressing images of text documents in facsimile applications. These use variations of run-length encoding to take advantage of the fact that text documents consist of long strings of white pixels. The color image compression option included in the TIFF standards is based on techniques similar to those used by GIF and are therefore not widely used in the photography community.

Compressing Audio and Video The most commonly used standards for encoding and compressing audio and video were developed by the Motion Picture Experts Group (MPEG) under the leadership of ISO. In turn, these standards themselves are called MPEG. MPEG encompasses a variety of standards for different applications. For example, the demands for high definition television (HDTV) broadcast are distinct from those for video conferencing, in which the broadcast signal must find its way over a variety of communication paths that may have limited capabilities. Both of these applications differ from that of storing video in such a manner that sections can be replayed or skipped over. The techniques employed by MPEG are well beyond the scope of this text, but in general, video compression techniques are based on video being constructed as a sequence of pictures in much the same way that motion pictures are recorded on film. To compress such sequences, only some of the pictures, called I-frames, are encoded in their entirety. The pictures between the I-frames are encoded using relative encoding techniques. That is, rather than encode the entire picture, only its distinctions from the prior image are recorded. The I-frames themselves are usually compressed with techniques similar to JPEG. The best known system for compressing audio is MP3, which was developed within the MPEG standards. In fact, the acronym MP3 is short for

M01_BROO1160_12_SE_C01.indd 79

01/08/14 11:18 AM

80

Chapter 1  Data Storage

MPEG layer 3. Among other compression techniques, MP3 takes advantage of the properties of the human ear, removing those details that the human ear cannot perceive. One such property, called temporal masking, is that for a short period after a loud sound, the human ear cannot detect softer sounds that would otherwise be audible. Another, called frequency masking, is that a sound at one frequency tends to mask softer sounds at nearby frequencies. By taking advantage of such characteristics, MP3 can be used to obtain significant compression of audio while maintaining near CD quality sound. Using MPEG and MP3 compression techniques, video cameras are able to record as much as an hour’s worth of video within 128MB of storage, and portable music players can store as many as 400 popular songs in a single GB. But, in contrast to the goals of compression in other settings, the goal of compressing audio and video is not necessarily to save storage space. Just as important is the goal of obtaining encodings that allow information to be transmitted over today’s communication systems fast enough to provide timely presentation. If each video frame required a MB of storage and the frames had to be transmitted over a communication path that could relay only one KB per second, there would be no hope of successful video conferencing. Thus, in addition to the quality of reproduction allowed, audio and video compression systems are often judged by the transmission speeds required for timely data communication. These speeds are normally measured in bits per second (bps). Common units include Kbps (kilo-bps, equal to one thousand bps), Mbps (mega-bps, equal to one million bps), and Gbps (gigabps, equal to one billion bps). Using MPEG techniques, video presentations can be successfully relayed over communication paths that provide transfer rates of 40 Mbps. MP3 recordings generally require transfer rates of no more than 64 Kbps.

Questions & Exercises 1. List four generic compression techniques. 2. What would be the encoded version of the message xyx yxxxy xyx yxxxy yxxxy

if LZW compression, starting with the dictionary containing x, y, and a space (as described in the text), were used? 3. Why would GIF be better than JPEG when encoding color cartoons? 4. Suppose you were part of a team designing a spacecraft that will travel to

other planets and send back photographs. Would it be a good idea to compress the photographs using GIF or JPEG’s baseline standard to reduce the resources required to store and transmit the images? 5. What characteristic of the human eye does JPEG’s baseline standard

exploit? 6. What characteristic of the human ear does MP3 exploit? 7. Identify a troubling phenomenon that is common when encoding numeric

information, images, and sound as bit patterns.

M01_BROO1160_12_SE_C01.indd 80

01/08/14 11:18 AM

1.10  Communication Errors

81

1.10  Communication Errors When information is transferred back and forth among the various parts of a computer, or transmitted from the earth to the moon and back, or, for that matter, merely left in storage, a chance exists that the bit pattern ultimately retrieved may not be identical to the original one. Particles of dirt or grease on a magnetic recording surface or a malfunctioning circuit may cause data to be incorrectly recorded or read. Static on a transmission path may corrupt portions of the data. In the case of some technologies, normal background radiation can alter patterns stored in a machine’s main memory. To resolve such problems, a variety of encoding techniques have been developed to allow the detection and even the correction of errors. Today, because these techniques are largely built into the internal components of a computer system, they are not apparent to the personnel using the machine. Nonetheless, their presence is important and represents a significant contribution to scientific research. It is fitting, therefore, that we investigate some of these techniques that lie behind the reliability of today’s equipment.

Parity Bits A simple method of detecting errors is based on the principle that if each bit pattern being manipulated has an odd number of 1s and a pattern with an even number of 1s is encountered, an error must have occurred. To use this principle, we need an encoding system in which each pattern contains an odd number of 1s. This is easily obtained by first adding an additional bit, called a parity bit, to each pattern in an encoding system already available (perhaps at the high-order end). In each case, we assign the value 1 or 0 to this new bit so that the entire resulting pattern has an odd number of 1s. Once our encoding system has been modified in this way, a pattern with an even number of 1s indicates that an error has occurred and that the pattern being manipulated is incorrect. Figure1.26 demonstrates how parity bits could be added to the ASCII codes for the letters A and F. Note that the code for A becomes 101000001 (parity bit 1) and the ASCII for F becomes 001000110 (parity bit 0). Although the original 8-bit pattern for A has an even number of 1s and the original 8-bit pattern for F has an odd number of 1s, both the 9-bit patterns have an odd number of 1s. If this technique were applied to all the 8-bit ASCII patterns, we would obtain a 9-bit encoding system in which an error would be indicated by any 9-bit pattern with an even number of 1s. Figure 1.26   The ASCII codes for the letters A and F adjusted for odd parity Parity bit

ASCII A containing an even number of 1s

1 0 1 0 0 0 0 0 1 Total pattern has an odd number of 1s

M01_BROO1160_12_SE_C01.indd 81

Parity bit

ASCII F containing an odd number of 1s

0 0 1 0 0 0 1 1 0 Total pattern has an odd number of 1s

01/08/14 11:18 AM

82

Chapter 1  Data Storage

The parity system just described is called odd parity, because we designed our system so that each correct pattern contains an odd number of 1s. Another technique is called even parity. In an even parity system, each pattern is designed to contain an even number of 1s, and thus an error is signaled by the occurrence of a pattern with an odd number of 1s. Today it is not unusual to find parity bits being used in a computer’s main memory. Although we envision these machines as having memory cells of 8-bit capacity, in reality each has a capacity of 9 bits, 1 bit of which is used as a parity bit. Each time an 8-bit pattern is given to the memory circuitry for storage, the circuitry adds a parity bit and stores the resulting 9-bit pattern. When the pattern is later retrieved, the circuitry checks the parity of the 9-bit pattern. If this does not indicate an error, then the memory removes the parity bit and confidently returns the remaining 8-bit pattern. Otherwise, the memory returns the 8 data bits with a warning that the pattern being returned may not be the same pattern that was originally entrusted to memory. The straightforward use of parity bits is simple, but it has its limitations. If a pattern originally has an odd number of 1s and suffers two errors, it will still have an odd number of 1s, and thus the parity system will not detect the errors. In fact, straightforward applications of parity bits fail to detect any even number of errors within a pattern. One means of minimizing this problem is sometimes applied to long bit patterns, such as the string of bits recorded in a sector on a magnetic disk. In this case the pattern is accompanied by a collection of parity bits making up a checkbyte. Each bit within the checkbyte is a parity bit associated with a particular collection of bits scattered throughout the pattern. For instance, one parity bit may be associated with every eighth bit in the pattern starting with the first bit, while another may be associated with every eighth bit starting with the second bit. In this manner, a collection of errors concentrated in one area of the original pattern is more likely to be detected, since it will be in the scope of several parity bits. Variations of this checkbyte concept lead to error detection schemes known as checksums and cyclic redundancy checks (CRC).

Error-Correcting Codes Although the use of a parity bit allows the detection of an error, it does not provide the information needed to correct the error. Many people are surprised that error-correcting codes can be designed so that errors can be not only detected but also corrected. After all, intuition says that we cannot correct errors in a received message unless we already know the information in the message. However, a simple code with such a corrective property is presented in Figure1.27. To understand how this code works, we first define the term Hamming distance, which is named after R. W. Hamming, who pioneered the search for error-correcting codes after becoming frustrated with the lack of reliability of the early relay machines of the 1940s. The Hamming distance between two bit patterns is the number of bits in which the patterns differ. For example, the Hamming distance between the patterns representing A and B in the code in Figure1.27 is four, and the Hamming distance between B and C is three. The

M01_BROO1160_12_SE_C01.indd 82

01/08/14 11:18 AM

1.10  Communication Errors

83

Figure 1.27   An error-correcting code Symbol

Code

A B C D E F G H

000000 001111 010011 011100 100110 101001 110101 111010

important feature of the code in Figure1.27 is that any two patterns are separated by a Hamming distance of at least three. If a single bit is modified in a pattern from Figure1.27, the error can be detected since the result will not be a legal pattern. (We must change at least 3 bits in any pattern before it will look like another legal pattern.) Moreover, we can also figure out what the original pattern was. After all, the modified pattern will be a Hamming distance of only one from its original form but at least two from any of the other legal patterns. Thus, to decode a message that was originally encoded using Figure1.27, we simply compare each received pattern with the patterns in the code until we find one that is within a distance of one from the received pattern. We consider this to be the correct symbol for decoding. For example, if we received the bit pattern 010100 and compared this pattern to the patterns in the code, we would obtain the table in Figure1.28. Thus, we would conclude that the character transmitted must have been a D because this is the closest match. Figure 1.28   Decoding the pattern 010100 using the code in Figure 1.27

Character

A B C D E F G H

M01_BROO1160_12_SE_C01.indd 83

Code

0 0 0 0 1 1 1 1

0 0 1 1 0 0 1 1

0 1 0 1 0 1 0 1

0 1 0 1 1 0 1 0

Distance between received pattern and code

Pattern received

0 1 1 0 1 0 0 1

0 1 1 0 0 1 1 0

0 0 0 0 0 0 0 0

1 1 1 1 1 1 1 1

0 0 0 0 0 0 0 0

1 1 1 1 1 1 1 1

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

2 4 3 1 3 5 2 4

Smallest distance

01/08/14 11:18 AM

84

Chapter 1  Data Storage

You will observe that using this technique with the code in Figure1.27 actually allows us to detect up to two errors per pattern and to correct one error. If we designed the code so that each pattern was a Hamming distance of at least five from each of the others, we would be able to detect up to four errors per pattern and correct up to two. Of course, the design of efficient codes associated with large Hamming distances is not a straightforward task. In fact, it constitutes a part of the branch of mathematics called algebraic coding theory, which is a subject within the fields of linear algebra and matrix theory. Error-correcting techniques are used extensively to increase the reliability of computing equipment. For example, they are often used in high-capacity magnetic disk drives to reduce the possibility that flaws in the magnetic surface will corrupt data. Moreover, a major distinction between the original CD format used for audio disks and the later format used for computer data storage is in the degree of error correction involved. CD-DA format incorporates error-correcting features that reduce the error rate to only one error for two CDs. This is quite adequate for audio recordings, but a company using CDs to supply software to customers would find that flaws in 50 percent of the disks would be intolerable. Thus, additional error-correcting features are employed in CDs used for data storage, reducing the probability of error to one in 20,000 disks.

Questions & Exercises 1. The following bytes were originally encoded using odd parity. In which

of them do you know that an error has occurred? a. 100101101    b.  100000001    c.  000000000 d. 111000000    e.  011111111

2. Could errors have occurred in a byte from question 1 without your

­knowing it? Explain your answer. 3. How would your answers to questions 1 and 2 change if you were told

that even parity had been used instead of odd? 4. Encode these sentences in ASCII using odd parity by adding a parity bit

at the high-order end of each character code: a. "Stop!" Cheryl shouted.

b.  Does 2 + 3 = 5?

5. Using the error-correcting code presented in Figure 1.27, decode the

following messages: a. 001111 100100 001100 b.  010001 000000 001011 c. 011010 110110 100000 011100 6. Construct a code for the characters A, B, C, and D using bit patterns of

length five so that the Hamming distance between any two patterns is at least three.

M01_BROO1160_12_SE_C01.indd 84

01/08/14 11:18 AM

85

Chapter Review Problems

Chapter Review Problems (Asterisked problems are associated with optional sections.)

1. Determine the output of each of the follow-

use this device as an abstract tool in other circuits. Consider the circuitry using two of the following flip-flops. If a pulse were sent on the circuit’s input, the bottom flip-flop would change state. However, the second flip-flop would not change, since its input (received from the output of the NOT gate) went from a 1 to a 0. As a result, this circuit would now produce the outputs 0 and 1. Asecond pulse would flip the state of both flip-flops, producing an output of 1 and 0. What would be the output after a third pulse? After a fourth pulse?

ing circuits, assuming that the upper input is 1 and the lower input is 0. What would be the output when upper input is 0 and the lower input is 1?

a.

b.

Output 0

flip

2. a. What Boolean operation does the circuit

compute?

flip

Input Output

Input

b. What Boolean operation does the circuit compute?

Input Output Input

*3. a. If we were to purchase a flip-flop circuit

from an electronic component store, we may find that it has an additional input called flip. When this input changes from a 0 to 1, the output flips state (if it was 0 it is now 1 and vice versa). However, when the flip input changes from 1 to a 0, nothing happens. Even though we may not know the details of the circuitry needed to accomplish this behavior, we could still

Flip-flop

Input

M01_BROO1160_12_SE_C01.indd 85

1

c.

Flip-flop

b. It is often necessary to coordinate ­activities of various components within a ­computer. This is accomplished by connecting a pulsating signal (called a clock) to c­ ircuitry similar to part a. Additional gates (as shown) send signals in a coordinated fashion to other connected circuits. On studying this circuit, you should be able to confirm that on the 1st, 5th, 9th...pulses of the clock, a 1 will be sent on output A. On what pulses of the clock will a 1 be sent on output B? On what pulses of the clock will a 1 be sent on output C? On which output is a 1 sent on the 4th pulse of the clock? Output A flip

Flip-flop Output B

Clock

flip

Flip-flop

Output C

01/08/14 11:18 AM

86

Chapter 1  Data Storage

4. Assume that both of the inputs in the follow-

ing circuit are 1. Describe what would happen if the upper input were temporarily changed to 0. Describe what would happen if the lower input were temporarily changed to 0. Redraw the circuit using NAND gates.

9. Express the following bit patterns in hexadeci-

mal notation: a. 10110100101101001011 b. 000111100001 c. 1111111011011011 10. Suppose a digital camera has a storage capac-

ity of 500MB. How many black-and-white photographs could be stored in the camera if each consisted of 512 pixels per row and 512 pixels per column if each pixel required one bit of storage? 11. Suppose an image is represented on a dis-

play screen by a square array containing 256columns and 256 rows of pixels. If for each pixel, 3 bytes are required to encode the color and 8 bits to encode the intensity, how many byte-size memory cells are required to hold the entire picture?

5. The following table represents the addresses

and contents (using hexadecimal notation) of some cells in a machine’s main memory. Starting with this memory arrangement, follow the sequence of instructions and record the final contents of each of these memory cells: Address 00 01 02 03

Contents AB 53 D6 02

Step 1. Move the contents of the cell whose address is 03 to the cell at address 00. Step 2. Move the value 01 into the cell at address 02. Step 3. Move the value stored at address 01 into the cell at address 03. 6. How many cells can be in a computer’s main

memory if each cell’s address can be represented by two hexadecimal digits? What if four hexadecimal digits are used? 7. What bit patterns are represented by the fol-

lowing hexadecimal notations? a. 8A9    b. DCB    c. EF3 d. A01    e. C99 8. What is the value of the least significant bit in

the bit patterns represented by the following hexadecimal notations? a. 9A     b. 90 c. 1B     d.  6E

M01_BROO1160_12_SE_C01.indd 86

12. a. What are the advantages, if any, of using

zoned-bit recording? b. What is the difference between seek time and access time?

13. Suppose that you want to create a backup of

your entire data which is around 10GB. Would it be reasonable to use DVDs for the purpose of creating this backup? What about BDs (Blu-ray Disks)? 14. If each sector on a magnetic disk can store

512bytes of data, how many sectors are required to store two pages of integers (perhaps 10 lines of 100 integers in each page) if every integer is represented by using four bytes? 15. How many bytes of storage space would be

required to store a 20-page document containing details of employees, in which each page contains 100 records and every record is of 200 characters, if two byte Unicode characters were used? 16. In zoned-bit recording, why does the rate of

data transfer vary, depending on the portion of the disk being used? 17. What is the average access time for a

hard disk which has a rotation delay of 10 milliseconds and a seek time of 9 milliseconds? 18. Suppose a disk storage system consists of

5platters with 10 tracks on each side and

01/08/14 11:18 AM

Chapter Review Problems

87

8sectors in each track. What is the capacity of *29. Convert each of the following base the system? Assume every sector contains 512 10representations to its equivalent excess bytes and data can be stored on both surfaces sixteen representation: of each platter. a. -12     b. 0     c. 10 d. -8        e. 9 19. Here is a message in ASCII. What does it say? 01000011 01101111 01101101 01110000 *30. Convert each of the following two’s comple01110101 01110100 01100101 01110010 ment representations to its equivalent base 00100000 01010011 01100011 01101001 10representation: 01100101 01101110 01100011 01100101 a. 010101   b. 101010   c. 110110 00100001 d. 011011   e. 111001 20. The following two messages are encoded in *31. Convert each of the following base ASCII using one byte per character and then 10representations to its equivalent two’s comrepresented in hexadecimal notation. Are plement representation in which each value is both the messages same? represented in 8 bits: 436F6D7075746572  436F6D7075736572 a. -27     b. 3    c. 21 d. 8       e. -18 21. Encode the following sentences in ASCII using one byte per character. *32. Perform each of the following additions a. Is 1 byte = 8 bits? assuming the bit strings represent values in b. Yes, a byte contains 8 bits! two’s complement notation. Identify each 22. Combine the two sentences of the previous

problem and express it in hexadecimal notation. 23. List the hexadecimal representations of the

integers from 20 to 27. 24. a. Write the number 100 by representing 1

case in which the answer is incorrect because of overflow. a. 00101 1 01000  b.  11111 1 00001 c. 01111 1 00001   d.  10111 1 11010 e. 11111 1 11111   f.  00111 1 01100

*33. Solve each of the following problems by and 0 in ASCII. translating the values into two’s complement b.  Write the number 255 in binary representation. notation (using patterns of 5 bits), convert 25. What values have binary representations in ing any subtraction problem to an equivalent which only one of the bits is 1? List the binary addition problem, and performing that addirepresentations for the smallest six values tion. Check your work by converting your with this property. answer to base 10 notation. (Watch out for *26. Convert each of the following hexadecimal overflow.) representations to binary representation and a. 5 1 1 b. 5 2 1 c. 12 2 5 then to its equivalent base 10 representation: d. 8 2 7 e. 12 1 5 f. 5 2 11 a. A    b.  14   c.  1E *34. Convert each of the following binary rep d. 28   e.  32   f.  3C resentations into its equivalent base 10 g. 46   h.  65   i.  CA representation: j. 12F    k.  194       l.  1F9 a. 11.11 b.  100.0101 c.  0.1101 *27. Convert each of the following base 10 d. 1.0 e.  10.01 representations to its equivalent binary *35. Express each of the following values in binary representation: notation: a. 110     b.  99     c. 72 a. 53⁄4 b. 1515⁄16 c. 53⁄8 d. 81       e.  36 1 5 d. 1 ⁄4 e. 6 ⁄8 *28. Convert each of the following excess 32 representations to its equivalent base 10 *36. Decode the following bit patterns using the representation: floating-point format described in Figure1.24: a. 011111   b. 100110   c. 111000 a. 01011001 b.  11001000 d. 000101   e. 010101 c. 10101100 d.  00111001

M01_BROO1160_12_SE_C01.indd 87

01/08/14 11:18 AM

88

Chapter 1  Data Storage

*37. Encode the following values using the 8-bit

floating-point format described in Figure1.24. Indicate each case in which a truncation error occurs. 1 a. 271⁄2 b.  ⁄2 c.  233⁄4 7 31 d. ⁄32 e.  ⁄32 *38. Assuming you are not restricted to using nor-

malized form, list all the bit patterns that could be used to represent the value 3/8 using the floating-point format described in Figure1.24. *39. What is the best approximation to the square

root of 2 that can be expressed in the 8-bit floating-point format described in Figure1.24? What value is actually obtained if this approximation is squared by a machine using this floating-point format? *40. What is the best approximation to the value

one-tenth that can be represented using the 8-bit floating-point format described in Figure1.24? *41. Explain how errors can occur when measure-

ments using the metric system are recorded in floating-point notation. For example, what if 110 cm was recorded in units of meters? *42. One of the bit patterns 01011 and 11011 repre-

*45. If you changed the length of the bit strings

being used to represent integers in binary from 4 bits to 6 bits, what change would be made in the value of the largest integer you could represent? What if you were using two’s complement notation? *46. What would be the hexadecimal represen-

tation of the largest memory address in a memory consisting of 4MB if each cell had a one-byte capacity? *47. What would be the encoded version of the

message xxy yyx xxy xxy yyx

if LZW compression, starting with the dictionary containing x, y, and a space (as described in Section1.8), were used? *48. The following message was compressed using

LZW compression with a dictionary whose first, second, and third entries are x, y, and space, respectively. What is the decompressed message? 22123113431213536

*49. If the message xxy yyx xxy xxyy

were compressed using LZW with a starting dicsents a value stored in excess 16 notation and tionary whose first, second, and third entries the other represents the same value stored in were x, y, and space, respectively, what would two’s complement notation. be the entries in the final dictionary? a. What can be determined about this common value? *50. As we will learn in the next chapter, one b. What is the relationship between a patmeans of transmitting bits over traditional tern representing a value stored in two’s telephone systems is to convert the bit patcomplement notation and the pattern repterns into sound, transfer the sound over the resenting the same value stored in excess telephone lines, and then convert the sound notation when both systems use the same back into bit patterns. Such techniques are bit pattern length? limited to transfer rates of 57.6 Kbps. Is this sufficient for teleconferencing if the video is *43. The three bit patterns 10000010, 01101000, compressed using MPEG? and 00000010 are representations of the same value in two’s complement, excess, and *51. Encode the following sentences in ASCII the 8-bit floating-point format presented in using even parity by adding a parity bit at the ­Figure1.24, but not necessarily in that order. high-order end of each character code: What is the common value, and which pattern a. Does 100/5 = 20? is in which notation? b. The total cost is $7.25. *44. Which of the following values cannot be rep-

resented accurately in the floating-point format introduced in Figure1.24? 13 a. 61⁄2 b.  ⁄16 c. 9 17 15 d. ⁄32 e.  ⁄16

M01_BROO1160_12_SE_C01.indd 88

*52. The following message was originally transmit-

ted with odd parity in each short bit string. In which strings have errors definitely occurred? 11001 11011 10110 00000 11111 10001 10101 00100 01110

01/08/14 11:18 AM

Social Issues

89

*53. Suppose a 24-bit code is generated by repre-

may get strange symbols in your text editor senting each symbol by three ­consecutive copwhen you try to do this.) ies of its ASCII representation (for example, *58. The currency converter script of Section1.8 the symbol A is represented by the bit string uses the variable dollars to store the amount 010000010100000101000001). What errorof money to be converted before performing correcting properties does this new code have? each of the multiplications. This made the *54. Using the error-correcting code described in script one line longer than simply typing the Figure1.28, decode the following words: integer quantity 1000 directly into each of a. 111010 110110 the multiplication calculations. Why is it b. 101000 100110 001100 advantageous to create this extra variable c. 011101 000110 000000 010100 ahead of time? d. 010010 001000 001110 101111 *59. Write and test a Python script that given a 000000 110111 100110

e. 010011 000000 101001 100110 *55. International currency exchange rates change

frequently. Investigate current exchange rates, and update the currency converter script from Section1.8 accordingly. *56. Find another currency not already included

in the currency converter from Section1.8. Acquire its current conversion rate and find its Unicode currency symbol on the web. Extend the script to convert this new currency. *57. If your web browser and text editor properly

support Unicode and UTF-8, copy/paste the actual international currency symbols into the converter script of Section1.8, in place of the cumbersome codes like, '\u00A3'. (If your software has trouble handling Unicode, you

number of bytes outputs the equivalent number of kilobytes, megabytes, gigabytes, and terabytes. Write and test a complementary script that given a number of terabytes outputs the equivalent number of GB, MB, KB, and bytes. *60. Write and test a Python script that given

a number of minutes and seconds for a ­recording calculates the number of bits usedto encode uncompressed, CD-quality stereo audio data of that length. (Review ­Section1.4 for the necessary parameters and equations.) *61. Identify the error(s) in this Python script. days_per_week = 7 weeks_per_year = 52 days_per_year = d ays_per_week ** weeks_per_year PRINT(days_per_year)

Social Issues The following questions are intended as a guide to the ethical/social/legal issues associated with the field of computing. The goal is not merely to answer these questions. You should also consider why you answered as you did and whether your justifications are consistent from one question to the next. 1. A truncation error has occurred in a critical situation, causing extensive dam-

age and loss of life. Who is liable, if anyone? The designer of the hardware? The designer of the software? The programmer who actually wrote that part of the program? The person who decided to use the software in that particular application? What if the software had been corrected by the company that originally developed it, but that update had not been purchased and applied in the critical application? What if the software had been pirated?

M01_BROO1160_12_SE_C01.indd 89

01/08/14 11:18 AM

90

Chapter 1  Data Storage

2. Is it acceptable for an individual to ignore the possibility of truncation errors

and their consequences when developing his or her own applications? 3. Was it ethical to develop software in the 1970s using only two digits to repre-

sent the year (such as using 76 to represent the year 1976), ignoring the fact that the software would be flawed as the turn of the century approached? Is it ethical today to use only three digits to represent the year (such as 982 for 1982 and 015 for 2015)? What about using only four digits? 4. Many argue that encoding information often dilutes or otherwise distorts the information, since it essentially forces the information to be quantified. They argue that a questionnaire in which subjects are required to record their opinions by responding within a scale from one to five is inherently flawed. To what extent is information quantifiable? Can the pros and cons of different locations for a waste disposal plant be quantified? Is the debate over nuclear power and nuclear waste quantifiable? Is it dangerous to base decisions on averages and other statistical analysis? Is it ethical for news agencies to report polling results without including the exact wording of the questions? Is it possible to quantify the value of a human life? Is it acceptable for a company to stop investing in the improvement of a product, even though additional investment could lower the possibility of a fatality relating to the product’s use? 5. Should there be a distinction in the rights to collect and disseminate data depending on the form of the data? That is, should the right to collect and disseminate photographs, audio, or video be the same as the right to collect and disseminate text? 6. Whether intentional or not, a report submitted by a journalist usually reflects that journalist’s bias. Often by changing only a few words, a story can be given either a positive or negative connotation. (Compare, “The majority of those surveyed opposed the referendum.” to “A significant portion of those surveyed supported the referendum.”) Is there a difference between altering a story (by leaving out certain points or carefully selecting words) and altering a photograph? 7. Suppose that the use of a data compression system results in the loss of subtle

but significant items of information. What liability issues might be raised? How should they be resolved?

Additional Reading Drew, M., and Z. Li. Fundamentals of Multimedia. Upper Saddle River, NJ: ­Prentice-Hall, 2004. Halsall, F. Multimedia Communications. Boston, MA: Addison-Wesley, 2001. Hamacher, V. C., Z. G. Vranesic, and S. G. Zaky. Computer Organization, 5th ed. New York: McGraw-Hill, 2002. Knuth, D. E. The Art of Computer Programming, Vol. 2, 3rd ed. Boston, MA: ­Addison-Wesley, 1998.

M01_BROO1160_12_SE_C01.indd 90

01/08/14 11:18 AM

Additional Reading

91

Long, B. Complete Digital Photography, 3rd ed. Hingham, MA: Charles River Media,2005. Miano, J. Compressed Image File Formats. New York: ACM Press, 1999. Petzold, C. CODE: The Hidden Language of Computer Hardware and Software. ­ edman, WA: Microsoft Press, 2000. R Salomon, D. Data Compression: The Complete Reference, 4th ed. New York: Springer, 2007. Sayood, K. Introduction to Data Compression, 3rd ed. San Francisco, CA: Morgan Kaufmann, 2005.

M01_BROO1160_12_SE_C01.indd 91

01/08/14 11:18 AM

M01_BROO1160_12_SE_C01.indd 92

01/08/14 11:18 AM

2

C H A P T E R

Data Manipulation In this chapter we will learn how a computer manipulates data and communicates with peripheral devices such as printers and keyboards. In doing so, we will explore the basics of computer architecture and learn how computers are programmed by means of encoded instructions, called machine language instructions.

2.1 Computer Architecture CPU Basics The Stored-Program Concept

2.2 Machine Language The Instruction Repertoire An Illustrative Machine Language

2.3 Program Execution An Example of Program Execution Programs Versus Data

M02_BROO1160_12_SE_C02.indd 93

*2.4 Arithmetic/Logic Instructions

*2.6 Programming Data Manipulation

Logic Operations Rotation and Shift Operations Arithmetic Operations

Logic and Shift Operations Control Structures Input and Output Marathon Training Assistant

*2.5 Communicating with Other Devices The Role of Controllers Direct Memory Access Handshaking Popular Communication Media Communication Rates

*2.7 Other Architectures Pipelining Multiprocessor Machines *Asterisks indicate suggestions for optional sections.

01/08/14 11:18 AM

94

Chapter 2  Data Manipulation

In Chapter1 we studied topics relating to the storage of data inside a computer. In this chapter we will see how a computer manipulates that data. This manipu­ lation consists of moving data from one location to another as well as performing operations such as arithmetic calculations, text editing, and image manipulation. We begin by extending our understanding of computer architecture beyond that of data storage systems.

2.1  Computer Architecture The circuitry in a computer that controls the manipulation of data is called the central processing unit, or CPU (often referred to as merely the processor). In the machines of the mid-twentieth century, CPUs were large units comprised of perhaps several racks of electronic circuitry that reflected the significance of the unit. However, technology has shrunk these devices drastically. The CPUs found in today’s desktop computers and notebooks are packaged as small flat squares (approximately two inches by two inches) whose connecting pins plug into a socket mounted on the machine’s main circuit board (called the motherboard). In smartphones, mini-notebooks, and other Mobile Internet Devices (MID), CPUs are around half the size of a postage stamp. Due to their small size, these processors are called microprocessors.

CPU Basics A CPU consists of three parts (Figure2.1): the arithmetic/logic unit, which contains the circuitry that performs operations on data (such as addition and subtraction); the control unit, which contains the circuitry for coordinating the machine’s activities; and the register unit, which contains data storage cells (similar to main memory cells), called registers, that are used for temporary storage of information within the CPU. Some of the registers within the register unit are considered general-­purpose registers, whereas others are special-purpose registers. We will discuss some of the special-purpose registers in Section2.3. For now, we are concerned only with the general-purpose registers. Figure 2.1   CPU and main memory connected via a bus Central processing unit

Main memory

Registers Arithmetic/logic unit . . .

Bus

Control unit

M02_BROO1160_12_SE_C02.indd 94

01/08/14 11:18 AM

2.1  Computer Architecture

95

General-purpose registers serve as temporary holding places for data being manipulated by the CPU. These registers hold the inputs to the arithmetic/logic unit’s circuitry and provide storage space for results produced by that unit. Toper­ form an operation on data stored in main memory, the control unit transfers the data from memory into the general-purpose registers, informs the arithmetic/ logic unit which registers hold the data, activates the appropriate circuitry within the arithmetic/logic unit, and tells the arithmetic/logic unit which register should receive the result. For the purpose of transferring bit patterns, a machine’s CPU and main mem­ ory are connected by a collection of wires called a bus (see again Figure2.1). Through this bus, the CPU extracts (reads) data from main memory by supplying the address of the pertinent memory cell along with an electronic signal telling the memory circuitry that it is supposed to retrieve the data in the indicated cell. In a similar manner, the CPU places (writes) data in memory by providing the address of the destination cell and the data to be stored together with the appro­ priate electronic signal telling main memory that it is supposed to store the data being sent to it. Based on this design, the task of adding two values stored in main memory involves more than the mere execution of the addition operation. The data must be transferred from main memory to registers within the CPU, the values must be added with the result being placed in a register, and the result must then be stored in a memory cell. The entire process is summarized by the five steps listed in Figure2.2.

The Stored-Program Concept Early computers were not known for their flexibility—the steps that each device executed were built into the control unit as a part of the machine. To gain more flexibility, some of the early electronic computers were designed so that the CPU could be conveniently rewired. This flexibility was accomplished by means of a pegboard arrangement similar to old telephone switchboards in which the ends of jumper wires were plugged into holes.

Figure 2.2   Adding values stored in memory Step 1. Get one of the values to be added from memory and place it in a register.

Step 2. Get the other value to be

added from memory and place it in another register.

Step 3. Activate the addition circuitry with the registers used in Steps 1 and 2 as inputs and another register designated to hold the result.

Step 4. Store the result in memory. Step 5. Stop.

M02_BROO1160_12_SE_C02.indd 95

01/08/14 11:18 AM

96

Chapter 2  Data Manipulation

Cache Memory It is instructive to compare the memory facilities within a computer in relation to their functionality. Registers are used to hold the data immediately applicable to the operation at hand; main memory is used to hold data that will be needed in the near future; and mass storage is used to hold data that will likely not be needed in the immediate future. Many machines are designed with an additional memory level, called cache memory. Cache memory is a portion (perhaps several hundred KB) of high-speed memory located within the CPU itself. In this special memory area, the machine attempts to keep a copy of that portion of main memory that is of current interest. In this setting, data transfers that normally would be made between registers and main memory are made between registers and cache memory. Any changes made to cache memory are then transferred collectively to main memory at a more opportune time. The result is a CPU that can execute its machine cycle more rapidly because it is not delayed by main memory communication.

A breakthrough (credited, apparently incorrectly, to John von Neumann) came with the realization that a program, just like data, can be encoded and stored in main memory. If the control unit is designed to extract the program from memory, decode the instructions, and execute them, the program that the machine follows can be changed merely by changing the contents of the com­ puter’s memory instead of rewiring the CPU. The idea of storing a computer’s program in its main memory is called the stored-program concept and has become the standard approach used today—so standard, in fact, that it seems obvious. What made it difficult origi­ nally was that everyone thought of programs and data as different entities: Data were stored in memory; programs were part of the CPU. The result was a prime example of not seeing the forest for the trees. It is easy to be caught in such ruts, and the development of computer science might still be in many of them today without our knowing it. Indeed, part of the excitement of the science is that new insights are constantly opening doors to new theories and applications.

Questions & Exercises 1. What sequence of events do you think would be required to move the

contents of one memory cell in a computer to another memory cell? 2. What information must the CPU supply to the main memory circuitry to

write a value into a memory cell? 3. Mass storage, main memory, and general-purpose registers are all storage

systems. What is the difference in their use?

M02_BROO1160_12_SE_C02.indd 96

01/08/14 11:18 AM

2.2  Machine Language

97

2.2  Machine Language To apply the stored-program concept, CPUs are designed to recognize instructions encoded as bit patterns. This collection of instructions along with the ­encoding system is called the machine language. An instruction expressed in this lan­ guage is called a machine-level instruction or, more commonly, a machine instruction.

The Instruction Repertoire The list of machine instructions that a typical CPU must be able to decode and execute is quite short. In fact, once a machine can perform certain elementary but well-chosen tasks, adding more features does not increase the machine’s theoretical capabilities. In other words, beyond a certain point, additional fea­ tures may increase such things as convenience but add nothing to the machine’s fundamental capabilities. The degree to which machine designs should take advantage of this fact has led to two philosophies of CPU architecture. One is that a CPU should be designed to execute a minimal set of machine instructions. This approach leads to what is called a reduced instruction set computer (RISC). The argument in favor of RISC architecture is that such a machine is efficient, fast, and less expensive to manufacture. On the other hand, others argue in favor of CPUs with the ability to execute a large number of complex instructions, even though many of them are technically redundant. The result of this approach is known as a complex instruction set computer (CISC). The argument in favor of CISC ­architecture is that the more complex CPU can better cope with the ever-increasing complexities

Who Invented What? Awarding a single individual credit for an invention is always a dubious u ­ ndertaking. Thomas Edison is credited with inventing the incandescent lamp, but other researchers were developing similar lamps, and in a sense Edison was lucky to be the one to obtain the patent. The Wright brothers are credited with inventing the airplane, but they were competing with and benefited from the work of many contemporaries, all of whom were preempted to some degree by Leonardo da Vinci, who toyed with the idea of flying machines in the fifteenth century. Even Leonardo’s designs were apparently based on earlier ideas. Of course, in these cases the designated inventor still has legitimate claims to the credit bestowed. In other cases, history seems to have awarded credit inappropriately—an example is the storedprogram concept. Without a doubt, John von Neumann was a brilliant scientist who deserves credit for numerous contributions. But one of the contributions for which popular history has chosen to credit him, the stored-program concept, was apparently developed by researchers led by J. P. Eckert at the Moore School of Electrical Engineering at the University of Pennsylvania. John von Neumann was merely the first to publish work reporting the idea and thus computing lore has selected him as the inventor.

M02_BROO1160_12_SE_C02.indd 97

01/08/14 11:18 AM

98

Chapter 2  Data Manipulation

of today’s software. With CISC, programs can exploit a powerful rich set of instruc­ tions, many of which would require a multi-instruction sequence in a RISC design. In the 1990s and into the millennium, commercially available CISC and RISC processors were actively competing for dominance in desktop computing. Intel processors, used in PCs, are examples of CISC architecture; PowerPC processors (developed by an alliance between Apple, IBM, and Motorola) are examples of RISC architecture and were used in the Apple Macintosh. As time progressed, the manufacturing cost of CISC was drastically reduced; thus Intel’s processors (or their equivalent from AMD—Advanced Micro Devices, Inc.) are now found in virtually all desktop and laptop computers (even Apple is now building computers based on Intel products). While CISC secured its place in desktop computers, it has an insatiable thirst for electrical power. In contrast, the company Advanced RISC Machine (ARM) has designed a RISC architecture specifically for low power consumption. (Advanced RISC Machine was originally Acorn Computers and is now ARM Holdings.) Thus, ARM-based processors, manufactured by a host of vendors including Qualcomm and Texas Instruments, are readily found in game controllers, digital TVs, naviga­ tion systems, automotive modules, cellular telephones, smartphones, and other consumer electronics. Regardless of the choice between RISC and CISC, a machine’s instructions can be categorized into three groupings: (1) the data transfer group, (2) the ­arithmetic/logic group, and (3) the control group. Data Transfer  The data transfer group consists of instructions that request the

movement of data from one location to another. Steps 1, 2, and 4 in Figure2.2 fall into this category. We should note that using terms such as transfer or move to identify this group of instructions is actually a misnomer. It is rare that the data being transferred is erased from its original location. The process involved in a transfer instruction is more like copying the data rather than moving it. Thus terms such as copy or clone better describe the actions of this group of instructions. While on the subject of terminology, we should mention that special terms are used when referring to the transfer of data between the CPU and main m ­ emory. A request to fill a general-purpose register with the contents of a memory cell is

Variable-Length Instructions To simplify explanations in the text, the machine language used for examples in this chapter (and described in Appendix C) uses a fixed size (two bytes) for all instructions. Thus, to fetch an instruction, the CPU always retrieves the contents of two consecutive memory cells and increments its program counter by two. This consistency streamlines the task of fetching instructions and is characteristic of RISC machines. CISC machines, however, have machine languages whose instructions vary in length. Today’s Intel processors, for example, have instructions that range from single-byte instructions to multiple-byte instructions whose length depends on the exact useof the instruction. CPUs with such machine languages determine the length of the incoming instruction by the instruction’s op-code. That is, the CPU first fetches the op-code of the instruction and then, based on the bit pattern received, knows how many more bytes to fetch from memory to obtain the rest of the instruction.

M02_BROO1160_12_SE_C02.indd 98

01/08/14 11:18 AM

2.2  Machine Language

99

commonly referred to as a LOAD instruction; conversely, a request to transfer the contents of a register to a memory cell is called a STORE instruction. In ­Figure2.2, Steps 1 and 2 are LOAD instructions, and Step 4 is a STORE instruction. An important group of instructions within the data transfer category con­ sists of the commands for communicating with devices outside the CPU-main memory context (printers, keyboards, display screens, disk drives, etc.). Since these instructions handle the input/output (I/O) activities of the machine, they are called I/O instructions and are sometimes considered as a category in their own right. On the other hand, Section2.5 describes how these I/O activities can be handled by the same instructions that request data transfers between the CPU and main memory. Thus, we shall consider the I/O instructions to be a part of the data transfer group. Arithmetic/Logic  The arithmetic/logic group consists of the instructions that tell

the control unit to request an activity within the arithmetic/logic unit. Step 3 in Figure2.2 falls into this group. As its name suggests, the arithmetic/logic unit is capable of performing operations other than the basic arithmetic operations. Some of these additional operations are the Boolean operations AND, OR, and XOR, introduced in Chapter1, which we will discuss in more detail later in this chapter. Another collection of operations available within most arithmetic/logic units allows the contents of registers to be moved to the right or the left within the register. These operations are known as either SHIFT or ROTATE operations, depending on whether the bits that “fall off the end” of the register are merely discarded (SHIFT) or are used to fill the holes left at the other end (ROTATE). Control  The control group consists of those instructions that direct the execution of the program rather than the manipulation of data. Step 5 in Figure2.2 falls into this category, although it is an extremely elementary example. This group con­ tains many of the more interesting instructions in a machine’s repertoire, such as the family of JUMP (or BRANCH) instructions used to direct the CPU to execute an instruction other than the next one in the list. These JUMP instructions appear in two varieties: unconditional jumps and conditional jumps. An example of the former would be the instruction “Skip to Step 5”; an example of the latter would be, “If the value obtained is 0, then skip to Step 5.” The distinction is that a conditional jump results in a “change of venue” only if a certain condition is satisfied. As an example, the sequence of instructions in Figure2.3 represents an algorithm for dividing two values where Step 3 is a conditional jump that protects against the possibility of division by zero.

An Illustrative Machine Language Let us now consider how the instructions of a typical computer are encoded. The machine that we will use for our discussion is described in Appendix C and sum­ marized in Figure2.4. It has 16 general-purpose registers and 256 main memory cells, each with a capacity of 8 bits. For referencing purposes, we label the regis­ ters with the values 0 through 15 and address the memory cells with the values 0 through 255. For convenience we think of these labels and addresses as values represented in base two and compress the resulting bit patterns using hexadeci­ mal notation. Thus, the registers are labeled 0 through F, and the memory cells are addressed 00 through FF.

M02_BROO1160_12_SE_C02.indd 99

01/08/14 11:18 AM

100

Chapter 2  Data Manipulation

Figure 2.3   Dividing values stored in memory Step 1. LOAD a register with a value from memory.

Step 2. LOAD another register with

another value from memory.

Step 3. If this second value is zero, JUMP to Step 6.

Step 4. Divide the contents of the

first register by the second register and leave the result in a third register.

Step 5. STORE the contents of the third register in memory.

Step 6. STOP.

The encoded version of a machine instruction consists of two parts: the op-code (short for operation code) field and the operand field. The bit pattern appearing in the op-code field indicates which of the elementary operations, such as STORE, SHIFT, XOR, and JUMP, is requested by the instruction. The bit patterns found in the operand field provide more detailed information about the operation specified by the op-code. For example, in the case of a STORE opera­ tion, the information in the operand field indicates which register contains the data to be stored and which memory cell is to receive the data. The entire machine language of our illustrative machine (Appendix C) con­ sists of only twelve basic instructions. Each of these instructions is encoded using a total of 16 bits, represented by four hexadecimal digits (Figure 2.5). The op-code for each instruction consists of the first 4 bits or, equivalently, the first hexadecimal digit. Note (Appendix C) that these op-codes are represented by the hexadecimal digits 1 through C. In particular, the table in Appendix C Figure 2.4   The architecture of the machine described in Appendix C Main memory

Central processing unit

Address

Registers

2 . . .

F

M02_BROO1160_12_SE_C02.indd 100

00

Program counter Bus

1

Cells

01 02

Instruction register

03 . . .

. . .

FF

01/08/14 11:18 AM

2.2  Machine Language

101

Figure 2.5   The composition of an instruction for the machine in Appendix C Op-code

Operand

0011 0101 3

5

1010

0111

A

7

Actual bit pattern (16 bits) Hexadecimal form (4 digits)

shows us that an instruction beginning with the hexadecimal digit 3 refers to a STORE instruction, and an instruction beginning with hexadecimal A refers to a ROTATE instruction. The operand field of each instruction in our illustrative machine consists of three hexadecimal digits (12 bits), and in each case (except for the HALT ­instruction, which needs no further refinement) clarifies the general instruction given by the op-code. For example (Figure2.6), if the first hexadecimal digit of an instruction were 3 (the op-code for storing the contents of a register), the next hexadecimal digit of the instruction would indicate which register is to be stored, and the last two hexadecimal digits would indicate which memory cell is to receive the data. Thus the instruction 35A7 (hexadecimal) translates to the statement “STORE the bit pattern found in register 5 in the memory cell whose address is A7.” (Note how the use of hexadecimal notation simplifies our discus­ sion. In reality, the instruction 35A7 is the bit pattern 0011010110100111.) The instruction 35A7 also provides an explicit example of why main memory capacities are measured in powers of two. Because 8 bits in the instruction are reserved for specifying the memory cell utilized by this instruction, it is possible to reference exactly 28 different memory cells. It behooves us therefore to build main memory with this many cells—addressed from 0 to 255. If main memory had more cells, we would not be able to write instructions that distinguished between them; if main memory had fewer cells, we would be able to write instruc­ tions that referenced nonexisting cells.

Figure 2.6   Decoding the instruction 35A7 Instruction

Op-code 3 means to store the contents of a register in a memory cell.

3

5

A

7

This part of the operand identifies the address of the memory cell that is to receive data.

This part of the operand identifies the register whose contents are to be stored.

M02_BROO1160_12_SE_C02.indd 101

01/08/14 11:18 AM

102

Chapter 2  Data Manipulation

As another example of how the operand field is used to clarify the general instruction given by an op-code, consider an instruction with the op-code 7 (hexa­ decimal), which requests that the contents of two registers be ORed. (We will see what it means to OR two registers in Section2.4. For now we are interested merely in how instructions are encoded.) In this case, the next hexadecimal digit indicates the register in which the result should be placed, while the last two hexa­ decimal digits indicate which two registers are to be ORed. Thus the instruction 70C5 translates to the statement “OR the contents of register C with the contents of register 5 and leave the result in register 0.” A subtle distinction exists between our machine’s two LOAD instructions. Here we see that the op-code 1 (hexadecimal) identifies an instruction that loads a register with the contents of a memory cell, whereas the op-code 2 ­(hexadecimal) identifies an instruction that loads a register with a particular value. The dif­ ference is that the operand field in an instruction of the first type contains an address, whereas in the second type the operand field contains the actual bit pattern to be loaded. Note that the machine has two ADD instructions: one for adding two’s com­ plement representations and one for adding floating-point representations. This distinction is a consequence of the fact that adding bit patterns that represent values encoded in two’s complement notation requires different activities within the arithmetic/logic unit from adding values encoded in floating-point notation. We close this section with Figure2.7, which contains an encoded version of the instructions in Figure2.2. We have assumed that the values to be added are stored in two’s complement notation at memory addresses 6C and 6D and the sum is to be placed in the memory cell at address 6E. Figure 2.7   An encoded version of the instructions in Figure2.2 Encoded instructions

M02_BROO1160_12_SE_C02.indd 102

Translation

156C

Load register 5 with the bit pattern found in the memory cell at address 6C.

166D

Load register 6 with the bit pattern found in the memory cell at address 6D.

5056

Add the contents of register 5 and 6 as though they were two’s complement representation and leave the result in register 0.

306E

Store the contents of register 0 in the memory cell at address 6E.

C000

Halt.

01/08/14 11:18 AM

2.3  Program Execution

103

Questions & Exercises 1. Why might the term move be considered an incorrect name for the opera­

tion of moving data from one location in a machine to another? 2. In the text, JUMP instructions were expressed by identifying the destina­

tion explicitly by stating the name (or step number) of the destination within the JUMP instruction (for example, “Jump to Step 6”). A drawback of this technique is that if an instruction name (number) is later changed, we must be sure to find all jumps to that instruction and change that name also. Describe another way of expressing a JUMP instruction so that the name of the destination is not explicitly stated. 3. Is the instruction “If 0 equals 0, then jump to Step 7” a conditional or

unconditional jump? Explain your answer. 4. Write the example program in Figure2.7 in actual bit patterns. 5. The following are instructions written in the machine language described

in Appendix C. Rewrite them in English. a. 368A    b.  BADE    c.  803C    d.  40F4 6. What is the difference between the instructions 15AB and 25AB in the

machine language of Appendix C? 7. Here are some instructions in English. Translate each of them into the

machine language of Appendix C. a. LOAD register number 3 with the hexadecimal value 56. b. ROTATE register number 5 three bits to the right. c. AND the contents of register A with the contents of register 5 and leave

the result in register 0.

2.3  Program Execution A computer follows a program stored in its memory by copying the instruc­ tions from memory into the CPU as needed. Once in the CPU, each instruction is decoded and obeyed. The order in which the instructions are fetched from memory corresponds to the order in which the instructions are stored in memory unless otherwise altered by a JUMP instruction. To understand how the overall execution process takes place, it is necessary to consider two of the special purpose registers within the CPU: the instruction register and the program counter (see again Figure2.4). The instruction reg­ ister is used to hold the instruction being executed. The program counter con­ tains the address of the next instruction to be executed, thereby serving as the machine’s way of keeping track of where it is in the program. The CPU performs its job by continually repeating an algorithm that guides it through a three-step process known as the machine cycle. The steps in the

M02_BROO1160_12_SE_C02.indd 103

01/08/14 11:18 AM

104

Chapter 2  Data Manipulation

machine cycle are fetch, decode, and execute (Figure2.8). During the fetch step, the CPU requests that main memory provide it with the instruction that is stored at the address indicated by the program counter. Since each instruction in our machine is two bytes long, this fetch process involves retrieving the contents of two memory cells from main memory. The CPU places the instruction received from memory in its instruction register and then increments the program counter by two so that the counter contains the address of the next instruction stored in memory. Thus the program counter will be ready for the next fetch. With the instruction now in the instruction register, the CPU decodes the instruction, which involves breaking the operand field into its proper components based on the instruction’s op-code. The CPU then executes the instruction by activating the appropriate circuitry to perform the requested task. For example, if the instruction is a load from memory, the CPU sends the appropriate signals to main memory, waits for main memory to send the data, and then places the data in the requested register. If the instruction is for an arithmetic operation, the CPU activates the appropriate circuitry in the arithmetic/logic unit with the correct registers as inputs and waits for the arithmetic/logic unit to compute the answer and place it in the appropri­ ate register. Once the instruction in the instruction register has been executed, the CPU again begins the machine cycle with the fetch step. Observe that since the pro­ gram counter was incremented at the end of the previous fetch, it again provides the CPU with the correct address. A somewhat special case is the execution of a JUMP instruction. Consider, for example, the instruction B258 (Figure2.9), which means “JUMP to the instruc­ tion at address 58 (hexadecimal) if the contents of register 2 is the same as that of register 0.” In this case, the execute step of the machine cycle begins with the comparison of registers 2 and 0. If they contain different bit patterns, the execute Figure 2.8   The machine cycle

De

Fe t

e

ch

d co

1. Retrieve the next instruction from memory (as indicated by the program counter) and then increment the program counter.

2. Decode the bit pattern in the instruction register.

Execute

3. Perform the action required by the instruction in the instruction register.

M02_BROO1160_12_SE_C02.indd 104

01/08/14 11:18 AM

2.3  Program Execution

105

Comparing Computer Power When shopping for a personal computer, you will find that clock speeds are often used to compare machines. A computer’s clock is a circuit, called an oscillator, that generates pulses that are used to coordinate the machine’s activities—the faster this oscillating circuit generates pulses, the faster the machine performs its machine cycle. Clock speeds are measured in hertz (abbreviated as Hz) with one Hz equal to one cycle (or pulse) per second. Typical clock speeds in desktop computers are in the range of a few hundred MHz (older models) to several GHz. (MHz is short for megahertz, which is a million Hz. GHz is short for gigahertz, which is 1000 MHz.) Unfortunately, different CPU designs might perform different amounts of work in one clock cycle, and thus clock speed alone fails to be relevant in comparing machines with different CPUs. If you are comparing a machine based on an Intel processor to one based on ARM, it would be more meaningful to compare performance by means of benchmarking, which is the process of comparing the performance of different machines when executing the same program, known as a benchmark. By selecting benchmarks representing different types of applications, you get meaningful comparisons for various market segments.

step terminates and the next machine cycle begins. If, however, the contents of these registers are equal, the machine places the value 58 (hexadecimal) in its program counter during the execute step. In this case, then, the next fetch step finds 58 in the program counter, so the instruction at that address will be the next instruction to be fetched and executed. Note that if the instruction had been B058, then the decision of whether the program counter should be changed would depend on whether the contents of register 0 was equal to that of register 0. But these are the same registers and thus must have equal content. In turn, any instruction of the form B0XY will cause a jump to be executed to the memory location XY regardless of the contents of register 0. Figure 2.9   Decoding the instruction B258 Instruction

Op-code B means to change the value of the program counter if the contents of the indicated register is the same as that in register 0.

B

2

5

8

This part of the operand is the address to be placed in the program counter.

This part of the operand identifies the register to be compared to register 0.

M02_BROO1160_12_SE_C02.indd 105

01/08/14 11:18 AM

106

Chapter 2  Data Manipulation

An Example of Program Execution Let us follow the machine cycle applied to the program presented in Figure2.7, which retrieves two values from main memory, computes their sum, and stores that total in a main memory cell. We first need to put the program somewhere in memory. For our example, suppose the program is stored in consecutive addresses, starting at address A0 (hexadecimal). With the program stored in this manner, we can cause the machine to execute it by placing the address (A0) of the first instruction in the program counter and starting the machine (Figure2.10). The CPU begins the fetch step of the machine cycle by extracting the instruc­ tion stored in main memory at location A0 and placing this instruction (156C) in its instruction register (Figure 2.11a). Notice that, in our machine, instructions are 16 bits (two bytes) long. Thus the entire instruction to be fetched occupies the memory cells at both address A0 and A1. The CPU is designed to take this into account so it retrieves the contents of both cells and places the bit patterns received in the instruction register, which is 16 bits long. The CPU then adds two to the program counter so that this register contains the address of the next instruction (Figure 2.11b). At the end of the fetch step of the first machine cycle, the program counter and instruction register contain the following data: Program Counter: A2 Instruction Register: 156C

Next, the CPU analyzes the instruction in its instruction register and con­ cludes that it is to load register 5 with the contents of the memory cell at address 6C. This load activity is performed during the execution step of the machine cycle, and the CPU then begins the next cycle. This cycle begins by fetching the instruction 166D from the two ­memory cells starting at address A2. The CPU places this instruction in the instruction register Figure 2.10   The program from Figure2.7 stored in main memory ready for execution Program counter contains address of first instructions. CPU

Main memory Address

Cells

A0

15

A1

6C

A2

16

A3

6D

A4

50

A5

56

A6

30

A7

6E

A8

C0

A9

00

Registers Program counter

A0

1 2

. . . Instruction register

F

M02_BROO1160_12_SE_C02.indd 106

Bus

Program is stored in main memory beginning at address A0.

01/08/14 11:18 AM

2.3  Program Execution

107

Figure 2.11   Performing the fetch step of the machine cycle CPU

Main memory

Program counter

A0 Bus Instruction register

156C

Address

Cells

A0

15

A1

6C

A2

16

A3

6D

a. At the beginning of the fetch step the instruction starting at address A0 is retrieved from memory and placed in the instruction register.

CPU

Main memory

Program counter

A2 Bus Instruction register

156C

Address

Cells

A0

15

A1

6C

A2

16

A3

6D

b. Then the program counter is incremented so that it points to the next instruction.

and increments the program counter to A4. The values in the program counter and instruction register therefore become the following: Program Counter: A4 Instruction Register: 166D

Now the CPU decodes the instruction 166D and determines that it is to load register 6 with the contents of memory address 6D. It then executes the instruc­ tion. It is at this time that register 6 is actually loaded. Since the program counter now contains A4, the CPU extracts the next instruc­ tion starting at this address. The result is that 5056 is placed in the instruction register, and the program counter is incremented to A6. The CPU now decodes the contents of its instruction register and executes it by activating the two’s complement addition circuitry with inputs being registers 5 and 6. During this execution step, the arithmetic/logic unit performs the requested addition, leaves the result in register 0 (as requested by the control unit), and reports to the control unit that it has finished. The CPU then begins another machine cycle. Once again, with the aid of the program counter, it fetches the

M02_BROO1160_12_SE_C02.indd 107

01/08/14 11:18 AM

108

Chapter 2  Data Manipulation

next instruction (306E) from the two memory cells starting at memory location A6 and increments the program counter to A8. This instruction is then decoded and executed. At this point, the sum is placed in memory location 6E. The next instruction is fetched starting from memory location A8, and the program counter is incremented to AA. The contents of the instruction register (C000) are now decoded as the halt instruction. Consequently, the machine stops during the execute step of the machine cycle, and the program is completed. In summary, we see that the execution of a program stored in memory involves the same process you and I might use if we needed to follow a detailed list of instructions. Whereas we might keep our place by marking the instructions as we perform them, the CPU keeps its place by using the program counter. After determining which instruction to execute next, we would read the instruction and extract its meaning. Then, we would perform the task requested and return to the list for the next instruction in the same manner that the CPU executes the instruction in its instruction register and then continues with another fetch.

Programs Versus Data Many programs can be stored simultaneously in a computer’s main memory, as long as they occupy different locations. Which program will be run when the machine is started can then be determined merely by setting the program counter appropriately. One must keep in mind, however, that because data are also contained in main memory and encoded in terms of 0s and 1s, the machine alone has no way of knowing what is data and what is program. If the program counter were assigned the address of data instead of the address of the desired program, the CPU, not knowing any better, would extract the data bit patterns as though they were instructions and execute them. The final result would depend on the data involved. We should not conclude, however, that providing programs and data with a common appearance in a machine’s memory is bad. In fact, it has proved a useful attribute because it allows one program to manipulate other programs (or even itself) the same as it would data. Imagine, for example, a program that modifies itself in response to its interaction with its environment and thus exhibits the ability to learn, or perhaps a program that writes and executes other programs in order to solve problems presented to it.

Questions & Exercises 1. Suppose the memory cells from addresses 00 to 05 in the machine

described in Appendix C contain the (hexadecimal) bit patterns given in the following table: Address 00 01 02 03 04 05

M02_BROO1160_12_SE_C02.indd 108

Contents 14 02 34 17 C0 00

01/08/14 11:18 AM

2.3  Program Execution

109

If we start the machine with its program counter containing 00, what bit pattern is in the memory cell whose address is hexadecimal 17 when the machine halts? 2. Suppose the memory cells at addresses B0 to B8 in the machine described

in Appendix C contain the (hexadecimal) bit patterns given in the ­following table: Address B0 B1 B2 B3 B4 B5 B6 B7 B8

Contents 13 B8 A3 02 33 B8 C0 00 0F

a. If the program counter starts at B0, what bit pattern is in register

­ umber 3 after the first instruction has been executed? n b. What bit pattern is in memory cell B8 when the halt instruction is executed? 3. Suppose the memory cells at addresses A4 to B1 in the machine described

in Appendix C contain the (hexadecimal) bit patterns given in the ­following table: Address A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1

Contents 20 00 21 03 22 01 B1 B0 50 02 B0 AA C0 00

When answering the following questions, assume that the machine is started with its program counter containing A4. a. What is in register 0 the first time the instruction at address AA is

executed? b. What is in register 0 the second time the instruction at address AA is

executed? c. How many times is the instruction at address AA executed before the machine halts?

M02_BROO1160_12_SE_C02.indd 109

01/08/14 11:18 AM

110

Chapter 2  Data Manipulation

4. Suppose the memory cells at addresses F0 to F9 in the machine described

in Appendix C contain the (hexadecimal) bit patterns described in the following table: Address F0 F1 F2 F3 F4 F5 F6 F7 F8 F9

Contents 20 C0 30 F8 20 00 30 F9 FF FF

If we start the machine with its program counter containing F0, what does the machine do when it reaches the instruction at address F8?

2.4  Arithmetic/Logic Instructions As indicated earlier, the arithmetic/logic group of instructions consists of instruc­ tions requesting arithmetic, logic, and shift operations. In this section, we look at these operations more closely.

Logic Operations We introduced the logic operations AND, OR, and XOR (exclusive or, often pro­ nounced, “ex-or”) in Chapter1 as operations that combine two input bits to pro­ duce a single output bit. These operations can be extended to bitwise operations that combine two strings of bits to produce a single output string by applying the basic operation to individual columns. For example, the result of ANDing the patterns 10011010 and 11001001 results in 10011010 AND 11001001 10001000

where we have merely written the result of ANDing the two bits in each column at the bottom of the column. Likewise, ORing and XORing these patterns would produce 10011010 OR 11001001 11011011

10011010 XOR 11001001 01010011

One of the major uses of the AND operation is for placing 0s in one part of a bit pattern while not disturbing the other part. There are many applications for this in practice, such as filtering certain colors out of a digital image represented in the RGB format, as described in the previous chapter. Consider, for example, what happens if the byte 00001111 is the first operand of an AND operation.

M02_BROO1160_12_SE_C02.indd 110

01/08/14 11:18 AM

2.4  Arithmetic/Logic Instructions

111

Without knowing the contents of the second operand, we still can conclude that the four most significant bits of the result will be 0s. Moreover, the four least significant bits of the result will be a copy of that part of the second operand, as shown in the following example: 00001111 AND 10101010 00001010

This use of the AND operation is an example of the process called masking. Here one operand, called a mask, determines which part of the other operand will affect the result. In the case of the AND operation, masking produces a result that is a partial replica of one of the operands, with 0s occupying the nondupli­ cated positions. One trivial use of the AND operation in this context would be to mask off all of the bits associated with the red component of the pixels in an image, leaving only the blue and green components. This transformation is fre­ quently available as an option in image manipulation software. AND operations are useful when manipulating other types of bit map besides images, whenever a string of bits is used in which each bit represents the presence or absence of a particular object. As a non-graphical example, a string of 52 bits, in which each bit is associated with a particular playing card, can be used to represent a poker hand by assigning 1s to those five bits associ­ ated with the cards in the hand and 0s to all the others. Likewise, a bit map of 52 bits, of which thirteen are 1s, can be used to represent a hand of bridge, or a bit map of 32 bits can be used to represent which of thirty-two ice cream flavors are available. Suppose, then, that the eight bits in a memory cell are being used as a bit map, and we want to find out whether the object associated with the third bit from the high-order end is present. We merely need to AND the entire byte with the mask 00100000, which produces a byte of all 0s if and only if the third bit from the high-order end of the bit map is itself 0. A program can then act accordingly by following the AND operation with a conditional branch instruc­ tion. Moreover, if the third bit from the high-order end of the bit map is a 1, and we want to change it to a 0 without disturbing the other bits, we can AND the bit map with the mask 11011111 and then store the result in place of the original bit map. Where the AND operation can be used to duplicate a part of a bit string while placing 0s in the nonduplicated part, the OR operation can be used to duplicate a part of a string while putting 1s in the nonduplicated part. For this we again use a mask, but this time we indicate the bit positions to be duplicated with 0s and use 1s to indicate the nonduplicated positions. For example, ORing any byte with 11110000 produces a result with 1s in its most significant four bits while its remaining bits are a copy of the least significant four bits of the other operand, as demonstrated by the following example: 11110000 OR 10101010 11111010

Consequently, whereas the mask 11011111 can be used with the AND operation to force a 0 in the third bit from the high-order end of a byte, the mask 00100000 can be used with the OR operation to force a 1 in that position.

M02_BROO1160_12_SE_C02.indd 111

01/08/14 11:18 AM

112

Chapter 2  Data Manipulation

A major use of the XOR operation is in forming the complement of a bit string. XORing any byte with a mask of all 1s produces the complement of the byte. For example, note the relationship between the second operand and the result in the following example: 11111111 XOR 10101010 01010101

The XOR operation can be used to invert all of the bits of an RGB bitmap image, resulting in an “inverted” color image in which light colors have been replaced by dark colors, and vice versa. In the machine language described in Appendix C, op-codes 7, 8, and 9 are used for the logic operations OR, AND, and XOR, respectively. Each requests that the corresponding logic operation be performed between the contents of two designated registers and that the result be placed in another designated register. For example, the instruction 7ABC requests that the result of ORing the contents of registers B and C be placed in register A.

Rotation and Shift Operations The operations in the class of rotation and shift operations provide a means for moving bits within a register and are often used in solving alignment prob­ lems. These operations are classified by the direction of motion (right or left) and whether the process is circular. Within these classification guidelines are numerous variations with mixed terminology. Let us take a quick look at the ideas involved. Consider a register containing a byte of bits. If we shift its contents one bit to the right, we imagine the rightmost bit falling off the edge and a hole appearing at the leftmost end. What happens with this extra bit and the hole is the distinguish­ ing feature among the various shift operations. One technique is to place the bit that fell off the right end in the hole at the left end. The result is a circular shift, also called a rotation. Thus, if we perform a right circular shift on a byte-size bit pattern eight times, we obtain the same bit pattern we started with. Another technique is to discard the bit that falls off the edge and always fill the hole with a 0. The term logical shift is often used to refer to these operations. Such shifts to the left can be used for multiplying two’s complement representations by two. After all, shifting binary digits to the left corresponds to multiplication by two, just as a similar shift of decimal digits corresponds to multiplication by ten. Moreover, division by two can be accomplished by shift­ ing the binary string to the right. In either shift, care must be taken to preserve the sign bit when using certain notational systems. Thus, we often find right shifts that always fill the hole (which occurs at the sign bit position) with its original value. Shifts that leave the sign bit unchanged are sometimes called arithmetic shifts. Among the variety of shift and rotate instructions possible, the machine lan­ guage described in Appendix C contains only a right circular shift, designated by op-code A. In this case the first hexadecimal digit in the operand specifies the register to be rotated, and the rest of the operand specifies the number of bits to be rotated. Thus the instruction A501 means “Rotate the contents of register

M02_BROO1160_12_SE_C02.indd 112

01/08/14 11:18 AM

2.4  Arithmetic/Logic Instructions

113

5 to the right by 1 bit.” In particular, if register 5 originally contained the bit pattern 65 (hexadecimal), then it would contain B2 after this instruction is exe­ cuted (Figure2.12). (You may wish to experiment with how other shift and rotate instructions can be produced with combinations of the instructions provided in the machine language of Appendix C. For example, since a register is eight bits long, a right circular shift of three bits produces the same result as a left circular shift of five bits.)

Arithmetic Operations Although we have already mentioned the arithmetic operations of add, subtract, multiply, and divide, a few loose ends should still be connected. First, we have already seen that subtraction can be simulated by means of addition and negation. Moreover, multiplication is merely repeated addition and division is repeated sub­ traction. (Six divided by two is three because three twos can be subtracted from six.) For this reason, some small CPUs are designed with only the add or perhaps only the add and subtract instructions. We should also mention that numerous variations exist for each arithmetic operation. We have already alluded to this in relation to the add operations avail­ able on our machine in Appendix C. In the case of addition, for example, if the values to be added are stored in two’s complement notation, the addition process must be performed as a straightforward column by column addition. However, if the operands are stored as floating-point values, the addition process must extract the mantissa of each, shift them right or left according to the exponent fields, check the sign bits, perform the addition, and translate the result into floatingpoint notation. Thus, although both operations are considered addition, the action of the machine is not the same.

Figure 2.12   Rotating the bit pattern 65 (hexadecimal) one bit to the right 0

1

1

1

M02_BROO1160_12_SE_C02.indd 113

1

1

1

1

1

1

The original bit pattern

1

1

The bits move one position to the right. The rightmost bit “falls off” the end and is placed in the hole at the other end.

The final bit pattern

01/08/14 11:18 AM

114

Chapter 2  Data Manipulation

Questions & Exercises 1. Perform the indicated operations. 01001011

b. 100000011

c. 11111111

AND 10101011

AND 11101100

AND 00101101

e. 10000011

f. 11111111

a.

d.

01001011

OR

10101011

g.

01001011

h. 100000011

i. 11111111

XOR 10101011

XOR 11101100

XOR 00101101

OR

11101100

OR

00101101

2. Suppose you want to isolate the middle four bits of a byte by placing 0s

in the other four bits without disturbing the middle four bits. What mask must you use together with what operation? 3. Suppose you want to complement the four middle bits of a byte while

leaving the other four bits undisturbed. What mask must you use together with what operation? 4. a.  Suppose you XOR the first two bits of a string of bits and then continue

down the string by successively XORing each result with the next bit in the string. How is your result related to the number of 1s appearing in the string? b. How does this problem relate to determining what the appropriate parity bit should be when encoding a message? 5. It is often convenient to use a logical operation in place of a numeric one.

For example, the logical operation AND combines two bits in the same manner as multiplication. Which logical operation is almost the same as adding two bits, and what goes wrong in this case? 6. What logical operation together with what mask can you use to change

ASCII codes of lowercase letters to uppercase? What about uppercase to lowercase? 7. What is the result of performing a three-bit right circular shift on the fol­

lowing bit strings: a. 01101010 b.  00001111 c.  01111111 8. What is the result of performing a one-bit left circular shift on the fol­

lowing bytes represented in hexadecimal notation? Give your answer in hexadecimal form. a. AB b.  5C c.  B7 d.  35 9. A right circular shift of three bits on a string of eight bits is equivalent to

a left circular shift of how many bits? 10. What bit pattern represents the sum of 01101010 and 11001100 if the pat­

terns represent values stored in two’s complement notation? What if the

M02_BROO1160_12_SE_C02.indd 114

01/08/14 11:18 AM

2.5  Communicating with Other Devices

115

patterns represent values stored in the floating-point format discussed in Chapter1? 11. Using the machine language of Appendix C, write a program that places

a 1 in the most significant bit of the memory cell whose address is A7 without modifying the remaining bits in the cell. 12. Using the machine language of Appendix C, write a program that copies

the middle four bits from memory cell E0 into the least significant four bits of memory cell E1, while placing 0s in the most significant four bits of the cell at location E1.

2.5  Communicating with Other Devices Main memory and the CPU form the core of a computer. In this section, we investigate how this core, which we will refer to as the computer, communicates with peripheral devices such as mass storage systems, printers, keyboards, mice, display screens, digital cameras, and even other computers.

The Role of Controllers Communication between a computer and other devices is normally handled through an intermediary apparatus known as a controller. In the case of a per­ sonal computer, a controller may consist of circuitry permanently mounted on the computer’s motherboard or, for flexibility, it may take the form of a circuit board that plugs into a slot on the motherboard. In either case, the controller connects via cables to peripheral devices within the computer case or perhaps to a connector, called a port, on the back of the computer where external devices can be attached. These controllers are sometimes small computers themselves, each with its own memory circuitry and simple CPU that performs a program directing the activities of the controller. A controller translates messages and data back and forth between forms com­ patible with the internal characteristics of the computer and those of the periph­ eral device to which it is attached. Originally, each controller was designed for a particular type of device; thus, purchasing a new peripheral device often required the purchase of a new controller as well. Recently, steps have been taken within the personal computer arena to develop standards, such as the universal serial bus (USB) and FireWire, by which a single controller is able to handle a variety of devices. For example, a single USB controller can be used as the interface between a computer and any collection of USB-compatible devices. The list of devices on the market today that can communicate with a USB controller includes mice, printers, scanners, mass storage devices, digital cameras, and smartphones. Each controller communicates with the computer itself by means of con­ nections to the same bus that connects the computer’s CPU and main memory ­(Figure2.13). From this position it is able to monitor the signals being sent between the CPU and main memory as well as to inject its own signals onto the bus.

M02_BROO1160_12_SE_C02.indd 115

01/08/14 11:18 AM

116

Chapter 2  Data Manipulation

Figure 2.13   Controllers attached to a machine’s bus CD drive

Modem

Controller

Controller Bus

CPU

Controller

Controller

Monitor

Disk drive

Main memory

With this arrangement, the CPU is able to communicate with the controllers attached to the bus in the same manner that it communicates with main memory. To send a bit pattern to a controller, the bit pattern is first constructed in one of the CPU’s general-purpose registers. Then an instruction similar to a STORE instruction is executed by the CPU to “store” the bit pattern in the controller. Likewise, to receive a bit pattern from a controller, an instruction similar to a LOAD instruction is used. In some computer designs the transfer of data to and from controllers is directed by the same LOAD and STORE op-codes that are already provided for communication with main memory. In these cases, each controller is designed to respond to references to a unique set of addresses while main memory is designed to ignore references to these locations. Thus when the CPU sends a message on the bus to store a bit pattern at a memory location that is assigned to a controller, the bit pattern is actually “stored” in the controller rather than main memory. Likewise, if the CPU tries to read data from such a memory location, as in a LOAD instruction, it will receive a bit pattern from the controller rather than from memory. Such a communication system is called memory-mapped I/O because the computer’s input/output devices appear to be in various memory locations (Figure2.14). An alternative to memory-mapped I/O is to provide special op-codes in the machine language to direct transfers to and from controllers. Instructions with these op-codes are called I/O instructions. As an example, if the language

Figure 2.14   A conceptual representation of memory-mapped I/O Bus CPU

Main memory Controller

M02_BROO1160_12_SE_C02.indd 116

Peripheral device

01/08/14 11:18 AM

2.5  Communicating with Other Devices

117

described in Appendix C followed this approach, it might include an instruction such as F5A3 to mean “STORE the contents of register 5 in the controller identi­ fied by the bit pattern A3.”

Direct Memory Access Since a controller is attached to a computer’s bus, it can carry on its own com­ munication with main memory during those nanoseconds in which the CPU is not using the bus. This ability of a controller to access main memory is known as direct memory access (DMA), and it is a significant asset to a computer’s performance. For instance, to retrieve data from a sector of a disk, the CPU can send requests encoded as bit patterns to the controller attached to the disk asking the controller to read the sector and place the data in a specified area of main memory. The CPU can then continue with other tasks while the controller per­ forms the read operation and deposits the data in main memory via DMA. Thus two activities will be performed at the same time. The CPU will be executing a program and the controller will be overseeing the transfer of data between the disk and main memory. In this manner, the computing resources of the CPU are not wasted during the relatively slow data transfer. The use of DMA also has the detrimental effect of complicating the commu­ nication taking place over a computer’s bus. Bit patterns must move between the CPU and main memory, between the CPU and each controller, and between each controller and main memory. Coordination of all this activity on the bus is a major design issue. Even with excellent designs, the central bus can become an impedi­ ment as the CPU and the controllers compete for bus access. This impediment

USB and FireWire The universal serial bus (USB) and FireWire are standardized serial communication systems that simplify the process of adding new peripheral devices to a personal computer. USB was developed under the lead of Intel. The development of FireWire was led by Apple. In both cases the underlying theme is for a single controller to provide external ports at which a variety of peripheral devices can be attached. In this setting, the controller translates the internal signal characteristics of the computer to the appropriate USB or FireWire standard signals. In turn, each device connected to the controller converts its internal idiosyncrasies to the same USB or FireWire standard, allowing communication with the controller. The result is that attaching a new device to a PC does not require the insertion of a new controller. Instead, one merely plugs any USB compatible device into a USB port or a FireWire compatible device into a FireWire port. Of the two, FireWire provides a faster transfer rate, but the lower cost of USB 2.0 technology has made it the leader in the lower-cost mass market arena. A new, faster version of the USB standard, version 3.0, has also begun to appear on the market. USB-compatible devices on the market today include mice, keyboards, printers, scanners, digital cameras, smartphones, and mass storage systems designed for backup applications. FireWire applications tend to focus on devices that require higher transfer rates such as video recorders and online mass storage systems.

M02_BROO1160_12_SE_C02.indd 117

01/08/14 11:18 AM

118

Chapter 2  Data Manipulation

is known as the von Neumann bottleneck because it is a consequence of the underlying von Neumann architecture in which a CPU fetches its instructions from memory over a central bus.

Handshaking The transfer of data between two computer components is rarely a one-way affair. Even though we may think of a printer as a device that receives data, the truth is that a printer also sends data back to the computer. After all, a computer can produce and send characters to a printer much faster than the printer can print them. If a computer blindly sent data to a printer, the printer would quickly fall behind, resulting in lost data. Thus a process such as printing a document involves a constant two-way dialogue, known as handshaking, in which the com­ puter and the peripheral device exchange information about the device’s status and coordinate their activities. Handshaking often involves a status word, which is a bit pattern that is generated by the peripheral device and sent to the controller. The status word is a bit map in which the bits reflect the conditions of the device. For example, in the case of a printer, the value of the least significant bit of the status word may indicate whether the printer is out of paper, while the next bit may indicate whether the printer is ready for additional data. Still another bit may be used to indicate the presence of a paper jam. Depending on the system, the controller may respond to this status information itself or make it available to the CPU. In either case, the status word provides the mechanism by which communication with a peripheral device can be coordinated.

Popular Communication Media Communication between computing devices is handled over two types of paths: parallel and serial. These terms refer to the manner in which signals are transferred with respect to each other. In the case of parallel communication, several signals are transferred at the same time, each on a separate “line.” Such a technique is capa­ ble of transferring data rapidly but requires a relatively complex communication path. Examples include a computer’s internal bus where multiple wires are used to allow large blocks of data and other signals to be transferred simultaneously. In contrast, serial communication is based on transferring signals one after the other over a single line. Thus serial communication requires a simpler data path than parallel communication, which is the reason for its popularity. USB and FireWire, which offer relatively high-speed data transfer over short distances of only a few meters, are examples of serial communication systems. For slightly longer distances (within a home or office building), serial communication over Ethernet connections (Section4.1), either by wire or radio broadcast, are popular. For communication over greater distances, traditional voice telephone lines dominated the personal computer arena for many years. These communication paths, consisting of a single wire over which tones are transferred one after the other, are inherently serial systems. The transfer of digital data over these lines is accomplished by first converting bit patterns into audible tones by means of a modem (short for modulator-demodulator), transferring these tones serially over the telephone system, and then converting the tones back into bits by another modem at the destination.

M02_BROO1160_12_SE_C02.indd 118

01/08/14 11:18 AM

2.5  Communicating with Other Devices

119

For faster long-distance communication over traditional telephone lines, tele­ phone companies offer a service known as DSL (Digital Subscriber Line), which takes advantage of the fact that existing telephone lines are capable of handling a wider frequency range than that used by traditional voice communi­ cation. More precisely, DSL uses frequencies above the audible range to transfer digital data while leaving the lower-frequency spectrum for voice communica­ tion. Although DSL has been highly successful, telephone companies are rapidly upgrading their systems to fiber-optic lines, which support digital communication more readily than traditional telephone lines. Cable modems are a competing technology that modulate and demodulate bit patterns to be transmitted over cable television systems. Many cable providers now make use of both fiber-optic lines and traditional coaxial cable to provide both high definition television signals and computer network access. Satellite links via high-frequency radio broadcast make computer network access possible even in some remote locations far from high speed telephone and cable television networks.

Communication Rates The rate at which bits are transferred from one computing component to another is measured in bits per second (bps). Common units include Kbps (kilo-bps, equal to one thousand bps), Mbps (mega-bps, equal to one million bps), and Gbps (giga-bps, equal to one billion bps). (Note the distinction between bits and bytes—that is, 8 Kbps is equal to 1 KB per second. In abbreviations, a lowercase b usually means bit whereas an uppercase B means byte.) For short distance communication, USB 2.0 and FireWire provide transfer rates of several hundred Mbps, which is sufficient for most multimedia applica­ tions. This, combined with their convenience and relatively low cost, is why they are popular for communication between home computers and local peripherals such as printers, external disk drives, and cameras. By combining multiplexing (the encoding or interweaving of data so that a single communication path serves the purpose of multiple paths) and data com­ pression techniques, traditional voice telephone systems were able to support transfer rates of 57.6 Kbps. This falls short of the needs of today’s multimedia and Internet applications, such as high definition video streaming from sites like Netflix or YouTube. To play MP3 music recordings requires a transfer rate of about 64 Kbps, and to play even low quality video clips requires transfer rates measured in units of Mbps. This is why alternatives such as DSL, cable, and satel­ lite links, which provide transfer rates well into the Mbps range, have replaced traditional audio telephone systems. (For example, DSL offers transfer rates on the order of 54 Mbps.) The maximum rate available in a particular setting depends on the type of the communication path and the technology used in its implementation. This maximum rate is often loosely equated to the communication path’s bandwidth, although the term bandwidth also has connotations of capacity rather than trans­ fer rate. That is, to say that a communication path has a high bandwidth (or provides broadband service) means that the communication path has the abil­ ity to transfer bits at a high rate as well as the capacity to carry large amounts of information simultaneously.

M02_BROO1160_12_SE_C02.indd 119

01/08/14 11:18 AM

120

Chapter 2  Data Manipulation

Questions & Exercises 1. Assume that the machine described in Appendix C uses memory-mapped

I/O and that the address B5 is the location within the printer port to which data to be printed should be sent. a. If register 7 contains the ASCII code for the letter A, what machine

language instruction should be used to cause that letter to be printed at the printer? b. If the machine executes a million instructions per second, how many times can this character be sent to the printer in one second? c. If the printer is capable of printing five traditional pages of text per minute, will it be able to keep up with the characters being sent to it in (b)? 2. Suppose that the hard disk on your personal computer rotates at 3000

revolutions a minute, that each track contains 16 sectors, and that each sector contains 1024 bytes. Approximately what communication rate is required between the disk drive and the disk controller if the controller is going to receive bits from the disk drive as they are read from the spin­ ning disk? 3. Estimate how long it would take to transfer a 300-page novel encoded in

16-bit Unicode characters at a transfer rate of 54 Mbps.

2.6  Programming Data Manipulation One of the essential features of computer programming languages such as Python is that they shield users from the tedious details of working with the lowest levels of the machine. Having just completed much of a chapter on the lowest levels of data manipulation in computer processors, it is instructive to review some of the major details that Python scripts shield the programmer from needing to worry about. As we will explore in greater detail in Chapter6, high-level programming language statements are mapped down to low-level machine instructions in order to be executed. A single Python statement might map to a single machine instruc­ tion, or to many tens or even hundreds of machine instructions, depending on the complexity of the statement and the efficiency of the machine language. Dif­ ferent implementations of the Python language interpreter, in concert with other elements of the computer’s operating system software, take care of this mapping process for each particular computer processor. As a result, the Python program­ mer does not need to know whether she is executing her Python script on a RISC processor or a CISC processor. We can recognize many Python operations that correspond closely to the basic machine instructions for modern computers or for the simple machine described in Appendix C. Addition of Python integers and floating-point numbers clearly resembles the ADD op-codes of our simple machine. Assigning values

M02_BROO1160_12_SE_C02.indd 120

01/08/14 11:18 AM

2.6  Programming Data Manipulation

121

to variables surely involves the LOAD, STORE, and MOVE op-codes in some arrangement. Python shields us from worrying about which processor registers are in use, but leverages the op-codes of the machine to carry out our instruc­ tions. We cannot see the instruction register, program counter, or memory cell addresses, but the Python script executes sequentially, one statement after the other, in the same way as the simple machine language programs.

Logic and Shift Operations Logic and shift operations can be executed on any kind of numerical data, but because they often deal with individual bits of data, it is easiest to illustrate these operations with binary values. Just as Python uses the 0x prefix to specify values in hexadecimal, the 0b prefix can be used to specify values in binary1. x = 0b00110011 mask = 0b00001111

Note that this is effectively no different from assigning x the value 51, (which is 110011 in binary), or 0x33 (which is 51 expressed in hexadecimal), or from assign­ ing mask the value 15, (which is 1111 in binary), or 0x0F (15 in hexadecimal). The representation we use to spell out the integer value in the Python assign­ ment statement does not change how it is represented in the computer, only how human readers understand it. Built-in Python operators exist for each of the bitwise logical operators described in Section2.4. print(0b00000101 ^ 0b00000100) print(0b00000101 | 0b00000100) print(0b00000101 & 0b00000100)

# Prints 5 XOR 4, which is 1 # Prints 5 OR 4, which is 5 # Prints 5 AND 4, which is 4

As a result, we can replicate each of the example problems of Section2.4 as Python code. print(0b10011010 & 0b11001001)

# # #

10011010 AND 11001001 10001000

print(0b10011010 | 0b11001001)

# # #

OR

print(0b10011010 ^ 0b11001001)

# # #

10011010 XOR 11001001 01010011

10011010 11001001 11011011

For all of these examples, Python will print the result in its default output representation, which is base-10. If the user would also like the output to be displayed in binary notation, a built-in function exists to convert any integer value into the string of zero and one characters for the corresponding binary representation. 1

This syntax is another recent addition to the evolving Python language. Make sure that you are using at least Python 3 to replicate these examples.

M02_BROO1160_12_SE_C02.indd 121

01/08/14 11:18 AM

122

Chapter 2  Data Manipulation

print(bin(0b10011010 & 0b11001001)) print(bin(0b10011010 | 0b11001001)) print(bin(0b10011010 ^ 0b11001001))

# Prints "0b10001000" # Prints "0b11011011" # Prints "0b1010011"

Because newer versions of Python can use an arbitrary number of digits for repre­ senting numbers, leading zeros are not printed. Thus, the third line above prints only seven digits, rather than eight. Python’s built-in operators for performing logical shift operations consist of dual greater-than and less-than symbols, visually suggesting the direction of shift. The operand on the right of the operator indicates the number of bit positions to shift. print(0b00111100 >> 2) print(0b00111100 140): print('Bath water too hot!')

Intuitively, this Python snippet will be mapped to machine instructions that make the comparison between the water_temp variable and the integer value 140, prob­ ably both previously loaded into registers. A conditional jump instruction will skip over the machine instructions for the print() built-in if the water_temp value was not 140 or larger. Another control structure is the looping construct while, which allows a segment of code to be executed multiple times, often subject to some condition. while (n
Assuming the variable n starts with a value less than 10, this loop will continue printing and incrementing n until it becomes greater than or equal to 10. We will spend more time examining these and other control structures in Chapter5 and beyond. For now, we focus on a mechanism that allows us to jump to another part of the program, carry out a desired task, and then return to the program point we came from. Functions  We have already seen three built-in Python operations that do not f­ ollow

the same syntactic form as the arithmetic and logic operators. The print(),

M02_BROO1160_12_SE_C02.indd 122

01/08/14 11:18 AM

2.6  Programming Data Manipulation

123

str() and bin() operations are invoked using given names instead of symbols, and also involve parentheses wrapped around their operands. Both of these are examples of a Python language feature called functions. The term function in mathematics is often used to describe algebraic relation­ ships, such as “f(x) = x2 + 3x + 4.” Upon seeing such a function definition, we understand that in subsequent lines the expression “f(5)” is taken to mean that the value 5 should be plugged in wherever the parameter x occurs in the expression defining f( ). Thus, f(5) = 52 + 3*5 + 4 = 25 + 15 + 4 = 44. Programming lan­ guage functions are quite similar in that they allow us to use a name for a series of operations that should be performed on the given parameter or parameters. Due to the way that this language feature is mapped to lower level machine lan­ guages, the appearance of a function in an expression or statement is known as a function call, or sometimes calling a function. The occurrences of print() and bin() in the examples above are two such function calls; they indicate that the Python interpreter will go execute the defini­ tion of the named function, and then return to continue with its work. The syntax is to follow the name of the function immediately with an opening parenthesis, and then to give the function argument value that will be plugged in for the parameter when the function definition is evaluated, followed by a closing paren­ thesis. It is important to match opening and closing parentheses—not doing so will cause a Python syntax error and is a common mistake for beginners. From now on, we will follow the convention of including the parentheses when talking about Python functions, such as print(), so as to clearly denote them as distinct from variables or other items. Functions come in many varieties beyond what we have already seen. Some functions take more than one argument, such as the max() function: x = 1034 y = 1056 z = 2078 biggest = max(x, y, z) print(biggest)

# Prints "2078"

Multiple arguments are separated by commas within the parentheses. Some functions return a value, which is to say that the function call itself can appear as part of a more complex expression, or as the right-hand side of an assign­ ment statement. These are sometimes called fruitful functions. This is the case for both max() (as above) and bin(), which takes an integer value as an argument and returns the corresponding string of zeros and ones. Other func­ tions do not return a value, and usually are used as standalone statements, as is the case for print(). Functions that do not return a value are sometimes called void functions, or procedures, although Python makes no distinction in its syntax rules. It makes no sense to assign the result of a void function to a variable, as in x = print('hello world!')

# x is assigned None

although this is not an error in Python, per se, and is subtly different from not assigning a value to x at all. Each of the functions we have seen so far is one of the few dozen built-in functions that Python knows about, but there are extensive libraries of additional functions that a more advanced script can refer to. The Python library modules

M02_BROO1160_12_SE_C02.indd 123

01/08/14 11:18 AM

124

Chapter 2  Data Manipulation

contain many useful functions that may not normally be required, but that can be called upon when needed. # Calculates the hypotenuse of a right triangle import math sideA = 3.0 sideB = 4.0 # Calculate third side via Pythagorean Theorem hypotenuse = math.sqrt(sideA**2 + sideB**2) print(hypotenuse)

In this example, the import statement forewarns the Python interpreter that the script refers to the library called “math,” which happens to be one of the standard set of library modules that Python comes equipped with. The sqrt() function defined within the math library module provides the square root of the argument, which in this case was the expression of sideA squared plus sideB squared. Note that the library function call includes both the module name (“math”) and the function name (“sqrt”), joined by a period. The Python math module includes dozens of useful mathematical functions, including logorithmic, trigonometric, and hyperbolic functions, as well as some familiar constant values such as math.pi. Beyond the built-in and library module functions, Python provides syntax for a script to define its own functions. We will define a few very simple examples at the end of this section, and explore more elaborate variations in a later chapter.

Input and Output The previous example snippets and scripts have used the built-in Python print() function to output results. Many programming languages provide similar mecha­ nisms for achieving input and output, providing programmers with a convenient abstraction to move data in or out of the computer processor. In fact, these I/O built-ins communicate with the hardware controllers and peripheral devices dis­ cussed in the previous section. None of our example scripts thus far have required any input from the user. Simple user input can be accomplished with the built-in Python input() function. echo = input('Please enter a string to echo: ') print(echo * 3)

The input() function takes as an optional argument a prompt string to present to the user when waiting for input. When run, this script will pause after displaying “Please enter a string to echo: ”, and wait for the user to type something. When the user hits the enter key, the script assigns the string of characters typed (not including the enter key,) to the variable echo. The second line of the script then outputs the string repeated three times. (Recall that the * operator replicates string operands.) Armed with the ability to acquire input, let’s rewrite our hypotenuse script to prompt a user for the side lengths rather than hardcode the values into assign­ ment statements.

M02_BROO1160_12_SE_C02.indd 124

01/08/14 11:18 AM

2.6  Programming Data Manipulation

125

# Calculates the hypotenuse of a right triangle import math # Inputting the side lengths, first try sideA = input('Length of side A? ') sideB = input('Length of side B? ') # Calculate third side via Pythagorean Theorem hypotenuse = math.sqrt(sideA**2 + sideB**2) print(hypotenuse)

When run, this script prompts the user with, “Length of side A? ”, and awaits input. Let us suppose that the user types “3” and enter. The script prompts the user with “Length of side B? ”, and awaits input. Let us suppose that the user types “4” and enter. At this point, the Python interpreter aborts the script, print­ ing out: hypotenuse = math.sqrt(sideA**2 + sideB**2) TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

This type of error can be easy to create in a dynamically typed language like Python. Our hypotenuse calculation, which worked in the earlier version of the script, now causes an error when the values have been read as input from the user instead. The problem is indeed a “TypeError,” stemming from the fact that Python no longer knows how to take the square of variable sideA, because sideA is now a character string in this version of the script, rather than an integer as before. The problem comes not from the line that calculates the hypotenuse, but from earlier in the script, when the values of sideA and sideB are returned from input(). This, too, is common when encountering errors with programming languages. The Python interpreter attempts to provide the line of script responsible for the problem, but the real culprit is actually earlier in the script. In the string echoing snippet above, it was clear that the value assigned to echo should be the string of characters typed in by the user. The input() function behaves in the same way in the hypotenuse program, even though the program­ mer’s intent is now to enter integer values. The representation of the ASCII- or UTF-8-encoded string “4” differs from the two’s complement representation of the integer 4, and the Python script must explicitly make the conversion from one representation to the other before proceeding to calculations with integers. Fortunately, another built-in function provides the capability. The int() function attempts to convert its argument into an integer representation. If it cannot, an appropriate error message is produced. There are at least three places that we can use the int() function to remove the bug in this script. We can call it before even assigning the result of input() to the variable. We can add new lines of script that are only for calling the conver­ sion function. Or, we can make the conversion just before squaring the variable within the call to the math.sqrt() function. The revised script below uses the first option; the other two are left as an exercise for the reader. # Calculates the hypotenuse of a right triangle import math

M02_BROO1160_12_SE_C02.indd 125

01/08/14 11:18 AM

126

Chapter 2  Data Manipulation

# Inputting the side lengths, with integer conversion sideA = int(input('Length of side A? ')) sideB = int(input('Length of side B? ')) # Calculate third side via Pythagorean Theorem hypotenuse = math.sqrt(sideA**2 + sideB**2) print(hypotenuse)

The revised script operates as intended and can be used for many right triangles without having to edit the script, as in the pre-input version. As a final note, the int() function performs its conversion by carefully exam­ ining the string argument and interpreting it as a number. If the input string is a number, but not an integer, as for example, “3.14,” the int() function discards the fractional portion and returns only the integer value. This operation is a truncation and will not “round up” as a human might expect. Similar conversion functions exist in Python for all of the other standard value types.

Marathon Training Assistant The complete Python script below demonstrates many of the concepts introduced in this section. As the popularity of recreational distance running has increased, many participants find themselves pursuing complex training schedules to pre­ pare their bodies for the rigors of running a marathon. This script assists a runner who wishes to calculate how long her training workout will take, based upon the distance and pace she wishes to run. Given a pace (number of minutes and sec­ onds to run a single mile), and a total mileage, this script calculates the projected elapsed time to run the workout, as well as a user-friendly speed calculation in miles per hour. Figure2.15 gives some example data points; in each row, given the first three columns as input, the last three columns would be the expected results. Note that different implementations of Python may print a different num­ ber of decimal places from Figure2.15 for speed values that don’t work out to round numbers.

Figure 2.15   Example marathon training data Time Per Mile

M02_BROO1160_12_SE_C02.indd 126

Total Elapsed Time

Minutes

Seconds

Miles

Speed (mph)

Minutes

Seconds

9

14

5

6.49819494584

46

10

8

3

7.5

24

7

45

6

7.74193548387

46

30

7

25

1

8.08988764044

7

25

01/08/14 11:18 AM

2.6  Programming Data Manipulation

127

# Marathon training assistant. import math # This function converts a number of minutes and seconds into just seconds. def total_seconds(min, sec): return min * 60 + sec # This function calculates a speed in miles per hour given # a time (in seconds) to run a single mile. def speed(time): return 3600 / time # Prompt user for pace and mileage. pace_minutes = int(input('Minutes per mile? ')) pace_seconds = int(input('Seconds per mile? ')) miles = int(input('Total miles? ')) # Calculate and print speed. mph = speed(total_seconds(pace_minutes, pace_seconds)) print('Your speed is') print(mph) # Calculate elapsed time for planned workout. total = miles * total_seconds(pace_minutes, pace_seconds) elapsed_minutes = total // 60 elapsed_seconds = total % 60 print('Your total elapsed time is') print(elapsed_minutes) print(elapsed_seconds)

The script above uses both built-in functions— input() , int() , and print()—as well as user-defined functions—speed() and total_seconds(). The keyword def precedes a user function definition and is followed by the name for the function and a list of parameters to be provided when the func­ tion is called. The indented line that follows is called the body of a function and expresses the steps that define the function. In a later chapter, we will see examples of functions with more than one statement in their body. The keyword return highlights the expression that will be calculated to find the result of the function. The user-defined functions are defined at the top of the script, but are not actually invoked until the script reaches the lines where they are called as part of a larger expression. Note also the way in which function calls are stacked in this script. The results of the calls to input() are immediately passed as arguments to the int() function, and the result of the int() function is then assigned to a variable. Similarly, the result of total_seconds() is immediately passed as an argument to the speed() function, whose result is then assigned to the variable mph. In each of these cases, it would be permissible to make the function calls one at a time, assign the result to a new variable, and then call the next function

M02_BROO1160_12_SE_C02.indd 127

01/08/14 11:18 AM

128

Chapter 2  Data Manipulation

that relies on the first result. However, this more compact form is more succinct and does not require a proliferation of temporary variables to hold intermediate results of the calculation. Given inputs of 7 minutes and 45 seconds per mile, for 6 miles, this script outputs: Your speed is 7.74193548387 Your total elapsed time is 46 30

The format of this output remains quite primitive. It lacks proper units (7.74193548387 mph, and 46 minutes, 30 seconds), prints an inappropriate number of decimal places for a simple calculation, and breaks lines in too many places. Cleaner output is left as an exercise for the reader.

Questions & Exercises 1. The hypotenuse example script truncates the sides to integers, but out­

puts a floating-point number. Why? Adapt the script to output an integer. 2. Adapt the hypotenuse script to use floating-point numbers as input, with­

out truncating them. Which is more appropriate, the integer version from the previous question, or the floating-point version? 3. The Python built-in function str() will convert a numerical argument

into a character string representation, and the '+' can be used to concat­ enate strings together. Use these to modify the marathon script to produce cleaner output, for example: Your speed is 7.74193548387 mph Your total elapsed time is 46 minutes, 30 seconds

4. Use the Python built-in bin() to write a script that reads a base-10 inte­

gers as input and outputs the corresponding binary representation of that integer in ones and zeros. 5. The XOR operation is often used both for efficiently calculating check­

sums (see Section1.9) and encryption (see Section4.5). Write a simple Python script that reads in a number and outputs that number XORed with a pattern of ones and zeros, such as 0x55555555. The same script will “encrypt” a number into a seemingly unrelated number, but when run again and given the encrypted number as input will return the original number. 6. Explore some of the error conditions that you can create with unexpected

inputs to the example scripts from this section. What happens if you enter all zeros for the hypotenuse script or the marathon script? What about negative numbers? Strings of characters instead of numbers?

M02_BROO1160_12_SE_C02.indd 128

01/08/14 11:18 AM

2.7  Other Architectures

129

2.7  Other Architectures To broaden our perspective, let us consider some alternatives to the traditional machine architecture we have discussed so far.

Pipelining Electric pulses travel through a wire no faster than the speed of light. Since light travels approximately 1 foot in a nanosecond (one billionth of a second), it requires at least 2 nanoseconds for the CPU to fetch an instruction from a mem­ ory cell that is 1 foot away. (The read request must be sent to memory, requiring at least 1 nanosecond, and the instruction must be sent back to the CPU, requiring at least another nanosecond.) Consequently, to fetch and execute an instruction in such a machine requires several nanoseconds—which means that increasing the execution speed of a machine ultimately becomes a miniaturization problem. However, increasing execution speed is not the only way to improve a com­ puter’s performance. The real goal is to improve the machine’s throughput, which refers to the total amount of work the machine can accomplish in a given amount of time. An example of how a computer’s throughput can be increased without requir­ ing an increase in execution speed involves pipelining, which is the technique of allowing the steps in the machine cycle to overlap. In particular, while one instruction is being executed, the next instruction can be fetched, which means that more than one instruction can be in “the pipe” at any one time, each at a different stage of being processed. In turn, the total throughput of the machine is increased even though the time required to fetch and execute each individual instruction remains the same. (Of course, when a JUMP instruction is reached, any gain that would have been obtained by prefetching is not realized because the instructions in “the pipe” are not the ones needed after all.) Modern machine designs push the pipelining concept beyond our simple example. They are often capable of fetching several instructions at the same time and actually executing more than one instruction at a time when those instruc­ tions do not rely on each other.

The Multi-Core CPU As technology provides ways of placing more and more circuitry on a silicon chip, the physical distinction between a computer’s components diminishes. For instance, a single chip might contain a CPU and main memory. This is an example of the “system-on-a-chip (SoC)” approach in which the goal is to provide a complete apparatus in a single device that can be used as an abstract tool in higher level designs. In other cases, multiple copies of the same circuit are provided within a single device. This latter tactic originally appeared in the form of chips containing several independent gates or perhaps multiple flip-flops. Today’s state of the art allows for more than one entire CPU to be placed on a single chip. This is the underlying architecture of devices known as multi-core CPUs, which consist of two or more CPUs residing on the same chip along with shared cache memory. (Multi-core CPUs containing two processing units are typically called dual-core CPUs.) Such devices simplify the construction of MIMD systems and are readily available for use in home computers.

M02_BROO1160_12_SE_C02.indd 129

01/08/14 11:18 AM

130

Chapter 2  Data Manipulation

Multiprocessor Machines Pipelining can be viewed as a first step toward parallel processing, which is the performance of several activities at the same time. However, true parallel pro­ cessing requires more than one processing unit, resulting in computers known as multiprocessor or multi-core machines. Most computers today are designed with this idea in mind. One strategy is to attach several processing units, each resembling the CPU in a single-processor machine, to the same main memory. In this configuration, the processors can proceed independently yet coordinate their efforts by leaving messages to one another in the common memory cells. For instance, when one processor is faced with a large task, it can store a program for part of that task in the common memory and then request another processor to execute it. The result is a machine in which different instruction sequences are performed on different sets of data, which is called a MIMD (multiple-instruction stream, m ­ ultiple-data stream) architecture, as opposed to the more traditional SISD (single-­instruction stream, single-data stream) architecture. A variation of multiple-processor architecture is to link the processors together so that they execute the same sequence of instructions in unison, each with its own set of data. This leads to a SIMD (single-instruction stream, m ­ ultiple-data stream) architecture. Such machines are useful in applications in which the same task must be applied to each set of similar items within a large block of data. Another approach to parallel processing is to construct large computers as conglomerates of smaller machines, each with its own memory and CPU. Within such an architecture, each of the small machines is coupled to its neighbors so that tasks assigned to the whole system can be divided among the individual machines. Thus if a task assigned to one of the internal machines can be broken into independent subtasks, that machine can ask its neighbors to perform these subtasks concurrently. The original task can then be completed in much less time than would be required by a single-processor machine.

Questions & Exercises 1. Referring back to question 3 of Section2.3, if the machine used the pipe­

line technique discussed in the text, what will be in “the pipe” when the instruction at address AA is executed? Under what conditions would pipelining not prove beneficial at this point in the program? 2. What conflicts must be resolved in running the program in question 4 of

Section2.3 on a pipeline machine? 3. Suppose there were two “central” processing units attached to the same

memory and executing different programs. Furthermore, suppose that one of these processors needs to add one to the contents of a memory cell at roughly the same time that the other needs to subtract one from the same cell. (The net effect should be that the cell ends up with the same value with which it started.) a. Describe a sequence in which these activities would result in the cell

ending up with a value one less than its starting value. b. Describe a sequence in which these activities would result in the cell ending up with a value one greater than its starting value.

M02_BROO1160_12_SE_C02.indd 130

01/08/14 11:18 AM

131

Chapter Review Problems

Chapter Review Problems (Asterisked problems are associated with optional sections.)

1. a. In what way are general-purpose registers

and main memory cells similar? b. In what way do general-purpose registers and main memory cells differ?

machine language described in Appendix C. a. Write the instruction 2304 (hexadecimal) as a string of 16 bits. b. Write the op-code of the instruction B2A5 (hexadecimal) as a string of 4 bits. c. Write the operand field of the instruction B2A5 (hexadecimal) as a string of 12 bits.

3. Suppose a block of data is stored in the mem­

ory cells of the machine described in Appen­ dix C from address 98 to A2, inclusive. How many memory cells are in this block? List their addresses. 4. What is the value of the program counter in

the machine described in Appendix C imme­ diately after executing the instruction B0CD?

Address

Contents

00 01 02 03 04 05

22 11 32 02 C0 00

Assuming that the program counter initially contained 00, record the contents of the pro­ gram counter, instruction register, and memory cell at address 02 at the end of each fetch phase of the machine cycle until the machine halts.

9. Translate the following instructions from

7. The following are instructions written in the

machine language described in Appendix C. Translate them into English.

M02_BROO1160_12_SE_C02.indd 131

­ nglish into the machine language described E in Appendix C. a. L OAD register 6 with the hexadecimal value77. b. LOAD register 7 with the contents of mem­ ory cell 77. c. JUMP to the instruction at memory location 24 if the contents of register 0 equals the value in register A. d. ROTATE register 4 three bits to the right. e. AND the contents of registers E and 2 leav­ ing the result in register 1.

10. Rewrite the program in Figure2.7 assuming

that the values to be added are encoded using floating-point notation rather than two’s com­ plement notation. 11. Classify each of the following instructions

(in the machine language of Appendix C) in terms of whether its execution changes the contents of the memory cell at location 3B, retrieves the contents of the memory cell at location 3C, or is independent of the contents of the memory cell at location 3C. a. 353C b. 253C c. 153C d. 3C3C e.  403C

12. Suppose the memory cells at addresses 00

through 03 in the machine described in Appendix C contain the following bit patterns:

6. Suppose three values x, y, and z are stored in

a machine’s memory. Describe the sequence of events (loading registers from memory, saving values in memory, and so on) that leads to the computation of x + y + z. How about (2x) + y?

c. A304

an op-code field of 4 bits. How many different instruction types can the language contain? What if the op-code field is increased to 6 bits?

5. Suppose the memory cells at addresses 00

through 05 in the machine described in Appendix C contain the following bit patterns:

b. 40E1 e.  2BCD

8. Suppose a machine language is designed with

2. Answer the following questions in terms of the

a. 7123 d. B100

Address

Contents

00 01 02 03

26 55 C0 00

a. Translate the first instruction into English. b. If the machine is started with its program counter containing 00, what bit pattern is in register 6 when the machine halts?

01/08/14 11:18 AM

132

Chapter 2  Data Manipulation

13. Suppose the memory cells at addresses 00

through 02 in the machine described in Appendix C contain the following bit patterns:

Address

Contents

00 01 02

12 21 34

Assume that the machine starts with its pro­ gram counter containing 00. a. What will be in the memory cell at address 00 when the machine halts? b. What bit pattern will be in the program coun­ ter when the machine halts? 16. Suppose the memory cells at addresses 00

through 07 in the machine described in Appendix C contain the following bit patterns:

a. What would be the first instruction executed if we started the machine with its program counter containing 00? b. What would be the first instruction executed if we started the machine with its program counter containing 01?

14. Suppose the memory cells at addresses 00

through 05 in the machine described in Appendix C contain the following bit patterns: Address

Contents

00 01 02 03 04 05

12 02 32 42 C0 00

When answering the following questions, assume that the machine starts with its pro­ gram counter equal to 00. a. Translate the instructions that are executed into English. b. What bit pattern is in the memory cell at address 42 when the machine halts? c. What bit pattern is in the program counter when the machine halts? 15. Suppose the memory cells at addresses 00

through 09 in the machine described in Appendix C contain the following bit patterns: Address

Contents

00 01 02 03 04 05 06 07 08 09

1C 03 2B 03 5A BC 3A 00 C0 00

M02_BROO1160_12_SE_C02.indd 132

Address

Contents

00 01 02 03 04 05 06 07

2B 07 3B 06 C0 00 00 23

a. List the addresses of the memory cells that contain the program that will be executed if we start the machine with its program coun­ ter containing 00. b. List the addresses of the memory cells that are used to hold data.

17. Suppose the memory cells at addresses 00

through 0D in the machine described in Appendix C contain the following bit patterns: Address

Contents

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D

20 04 21 01 40 12 51 12 B1 0C B0 06 C0 00

Assume that the machine starts with its pro­ gram counter containing 00. a. What bit pattern will be in register 0 when the machine halts?

01/08/14 11:18 AM

133

Chapter Review Problems

b. What bit pattern will be in register 1 when the machine halts? c. What bit pattern is in the program counter when the machine halts?

18. Suppose the memory cells at addresses F0

through FD in the machine described in Appendix C contain the following (hexadeci­ mal) bit patterns: Address F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD

Contents 20 00 22 02 23 04 B3 FC 50 02 B0 F6 C0 00

Assume that the machine starts with its ­program counter containing 20. a. What bit patterns will be in registers 0, 1, and 2 when the machine halts? b. What bit pattern will be in the memory cell at address 30 when the machine halts? c. What bit pattern will be in the memory cell at address B0 when the machine halts? 21. Suppose the memory cells at addresses AF

through B1 in the machine described in Appendix C contain the following bit patterns:

20through 28 in the machine described in Appendix C contain the following bit patterns: Address 20 21 22 23 24 25 26 27 28

M02_BROO1160_12_SE_C02.indd 133

Contents 12 20 32 30 B0 21 24 C0 00

AF

B0

B0

B0

B1

AF

22. Suppose the memory cells at addresses 00

through 05 in the machine described in Appendix C contain the following (hexadeci­ mal) bit patterns:

19. If the machine in Appendix C executes an

20. Suppose the memory cells at addresses

Contents

What would happen if we started the machine with its program counter containing AF?

If we start the machine with its program coun­ ter containing F0, what is the value in register 0 when the machine finally executes the halt instruction at location FC? instruction every microsecond (a millionth of a second), how long does it take to complete the program in Problem 18?

Address

Address

Contents

00

25

01

B0

02

35

03

04

04

C0

05

00

If we start the machine with its program coun­ ter containing 00, when does the machine halt? 23. In each of the following cases, write a short

program in the machine language described in Appendix C to perform the requested activ­ ities. Assume that each of your programs is placed in memory starting at address 00. a. Move the value at memory location D8 to memory location B3. b. Interchange the values stored at memory locations D8 and B3. c. If the value stored in memory location 44 is 00, then place the value 01 in memory location 46; otherwise, put the value FF in memory location 46.

01/08/14 11:18 AM

134

Chapter 2  Data Manipulation

24. A game that used to be popular among com­

puter hobbyists is core wars—a variation of battleship. (The term core originates from an early memory technology in which 0s and 1s were represented as magnetic fields in little rings of magnetic material. The rings were called cores.) The game is played between two opposing programs, each stored in dif­ ferent locations of the same computer’s memory. The computer is assumed to alter­ nate between the two programs, executing an instruction from one followed by an instruc­ tion from the other. The goal of each program is to cause the other to malfunction by writing extraneous data on top of it; however, neither program knows the location of the other. a. Write a program in the machine language of Appendix C that approaches the game in a defensive manner by being as small as possible. b. Write a program in the language of Appen­ dix C that tries to avoid any attacks from the opposing program by moving to different locations. More precisely, beginning at loca­ tion 00, write a program that will copy itself to location 70 and then jump to location 70. c. Extend the program in (b) to continue relo­ cating to new memory locations. In particu­ lar, make your program move to location 70, then to E0 (5 70 1 70) then to 60 (5701 70170) etc.

25. Write a program in the machine language of

Appendix C to compute the sum of floatingpoint values stored at memory locations A0, A1, A2, and A3. Your program should store the total at memory location A4. 26. Suppose the memory cells at addresses 00

through 05 in the machine described in Appendix C contain the following (hexadeci­ mal) bit patterns: Address 00 01 02 03 04 05

M02_BROO1160_12_SE_C02.indd 134

Contents 20 C0 30 04 00 00

What happens if we start the machine with its program counter containing 00? 27. What happens if the memory cells at addresses

08 and 09 of the machine described in Appen­ dix C contain the bit patterns B0 and 08, respectively, and the machine is started with its program counter containing the value 08? 28. Suppose the following program, written in the

machine language of Appendix C, is stored in main memory beginning at address 30 (hexa­ decimal). What task will the program perform when executed? 2003 2101 2200 2310 1400 3410 5221 5331 3239 333B B248 B038 C000

29. Summarize the steps involved when the

machine described in Appendix C performs an instruction with op-code B. Express your answer as a set of directions as though you were telling the CPU what to do. *30. Summarize the steps involved when the

machine described in Appendix C performs an instruction with op-code 5. Express your answer as a set of directions as though you were telling the CPU what to do. *31. Summarize the steps involved when the

machine described in Appendix C performs an instruction with op-code 6. Express your answer as a set of directions as though you were telling the CPU what to do. *32. Suppose the registers 4 and 5 in the machine

described in Appendix C contain the bit patterns 3A and C8, respectively. What bit ­pattern is left in register 0 after executing each of the following instructions: a. 5045 b. 6045 c. 7045 d. 8045 e.  9045

01/08/14 11:18 AM

Chapter Review Problems

135

*33. Using the machine language described in

f. Filter out all of the green color component Appendix C, write programs to perform each from an RGB bitmap image pixel in which of the following tasks: the middle 8 bits of a 24-bit pattern store the green information. a. Copy the bit pattern stored in memory g. Invert all of the bits in a 24-bit RGB bitmap ­location 44 into memory location AA. pixel. b. Change the least significant 4 bits in the h. Set all the bits in a 24-bit RGB bitmap pixel memory cell at location 34 to 0s while to 1, indicating the color “white”. ­leaving the other bits unchanged. Write and test short Python scripts to imple­ c. Copy the least significant 4 bits from ­memory *36. ment each of the parts of the previous location A5 into the least significant 4 bits of question. location A6 while leaving the other bits at location A6 unchanged. *37. Identify a logical operation (along with a d. Copy the least significant 4 bits from ­memory corresponding mask) that, when applied to location A5 into the most significant 4 bits of an input string of 8 bits, produces an output A5. (Thus, the first 4 bits in A5 will be the string of all 0s if and only if the input string is same as the last 4 bits.) 10000001. *34. Perform the indicated operations: *38. Write and test a short Python script to imple­ a. 111001 b. 000101 ment the previous question. AND 101001

c.

e.

AND 101010

001110 AND 010101

d.

111001 101001

f.

OR

000100 010101

OR

g.

111011 AND 110111 OR

010100 101010

OR

101010 110101

h.

i.

111001 XOR 101001

j.

000111 XOR 101010

k.

010000 XOR 010101

l.

111111 XOR 110101

*35. Identify both the mask and the logical opera­

*39. Describe a sequence of logical operations

(along with their corresponding masks) that, when applied to an input string of 8bits, produces an output byte of all 0s if the input string both begins and ends with 1s. Otherwise, the output should contain at least one1. *40. Write and test a short Python script to imple­

ment the previous question. *41. What would be the result of performing a

4-bit left circular shift on the following bit patterns? a. 10101 b. 11110000 c. 001 d. 101000 e.  00001

tion needed to accomplish each of the follow­ *42. What would be the result of performing a 2-bit ing objectives: right circular shift on the following bytes rep­ a. Put 1s in the upper 4 bits of an 8-bit pattern resented in hexadecimal notation (give your without disturbing the other bits. answers in hexadecimal notation)? b. Complement the most significant bit of an a. 3F b. 0D 8-bit pattern without changing the other c. FF d. 77 bits. *43. a. What single instruction in the machine c. Complement a pattern of 8 bits. language of Appendix C could be used to d. P ut a 0 in the least significant bit of an accomplish a 5-bit right circular shift of 8-bit pattern without disturbing the other ­register B? bits. b. What single instruction in the machine e. Put 1s in all but the most significant bit of language of Appendix C could be used ­ an 8-bit pattern without disturbing the most to accomplish a 2-bit left circular shift of significant bit. ­register B?

M02_BROO1160_12_SE_C02.indd 135

01/08/14 11:18 AM

136

Chapter 2  Data Manipulation

*44. Write a program in the machine language of

Appendix C that reverses the contents of the memory cell at address 8C. (That is, the final bit pattern at address 8C when read from left to right should agree with the original pattern when read from right to left.) *45. Write a program in the machine language of

Appendix C that subtracts the value stored at A1 from the value stored at address A2 and places the result at address A0. Assume that the values are encoded in two’s complement notation. *46. High definition video can be delivered at a

character represented by the bit pattern in register 5 to the printer. *50. Write a program in the machine language

described in Appendix C that places 0s in all the memory cells from address A0 through C0 but is small enough to fit in the memory cells from address 00 through 13 (hexadecimal). *51. Suppose a machine has 200 GB of

s­ toragespace available on a hard disk andreceives data over a broadband ­connection at the rate of 15 Mbps. At this rate,how long will it take to fill the available storage space?

rate of 30 frames per second (fps) where each frame has a resolution of 1920 x 1080 pixels *52. Suppose a satellite system is being used to using 24 bits per pixel. Can an uncompressed receive a serial data stream at 250 Kbps. If video stream of this format be sent over a USB a burst of atmospheric interference lasts 1.1 serial port? USB 2.0 serial port? USB 3.0 6.96 seconds, how many data bits will be serial port? (Note: The maximum speeds of affected? USB 1.1, USB 2.0, and USB 3.0 serial ports are *53. Suppose you are given 32 processors, each 12Mbps, 480Mbps, and 5Gbps respectively.) capable of finding the sum of two multidigit *47. Suppose a person is typing forty words per numbers in a millionth of a second. Describe minute at a keyboard. (A word is consid­ how parallel processing techniques can be ered to be five characters.) If a machine applied to find the sum of 64 numbers in only executes 500 instructions every microsecond six-millionths of a second. How much time (millionth of a second), how many instruc­ does a single processor require to find this tions does the machine execute during the same sum? time between the typing of two consecutive *54. Summarize the difference between a CISC characters? architecture and a RISC architecture. *48. How many bits per second must a keyboard *55. Identify two approaches to increasing transmit to keep up with a typist typing forty throughput. words per minute? (Assume each character is encoded in ASCII and each word consists of *56. Describe how the average of a collection six characters.) of numbers can be computed more rapidly with a multiprocessor machine than a single *49. Suppose the machine described in ­processor machine. ­AppendixC communicates with a printer using the technique of memory-mapped *57. Write and test a Python script that reads in a I/O. Suppose also that address FF is used to floating-point radius of a circle and outputs send characters to the printer, and address the circumference and area of the circle. FE is used to receive information about the *58. Write and test a Python script that reads in a printer’s status. In particular, suppose the character string and an integer and outputs least significant bit at the address FE indi­ the character string repeated the number of cates whether the printer is ready to receive times given by the integer. another character (with a 0 indicating “not *59. Write and test a Python script that reads ready” and a 1 indicating “ready”). Start­ in two floating-point side lengths of a right ing at address 00, write a machine language ­triangle and outputs the hypotenuse length, routine that waits until the printer is ready perimeter, and area. for another character and then sends the

M02_BROO1160_12_SE_C02.indd 136

01/08/14 11:18 AM

Social Issues

137

Social Issues The following questions are intended as a guide to the ethical/social/legal issues associated with the field of computing. The goal is not merely to answer these questions. You should also consider why you answered as you did and whether your justifications are consistent from one question to the next. 1. Suppose a computer manufacturer develops a new machine architecture. To

what extent should the company be allowed to own that architecture? What policy would be best for society? 2. In a sense, the year 1923 marked the birth of what many now call planned obsolescence. This was the year that General Motors, led by Alfred Sloan, introduced the automobile industry to the concept of model years. The idea was to increase sales by changing styling rather than necessarily introducing a better automobile. Sloan is quoted as saying, “We want to make you dissatis­ fied with your current car so you will buy a new one.” To what extent is this marketing ploy used today in the computer industry? 3. We often think in terms of how computer technology has changed our ­society. Many argue, however, that this technology has often kept changes from occur­ ring by allowing old systems to survive and, in some cases, become more entrenched. For example, would a central government’s role in society have survived without computer technology? To what extent would centralized authority be present today had computer technology not been available? To what extent would we be better or worse off without computer technology? 4. Is it ethical for an individual to take the attitude that he or she does not need to know anything about the internal details of a machine because someone else will build it, maintain it, and fix any problems that arise? Does your answer depend on whether the machine is a computer, automobile, nuclear power plant, or toaster? 5. Suppose a manufacturer produces a computer chip and later discovers a flaw in its design. Suppose further that the manufacturer corrects the flaw in future production but decides to keep the original flaw a secret and does not recall the chips already shipped, reasoning that none of the chips already in use are being used in an application in which the flaw will have consequences. Is anyone hurt by the manufacturer’s decision? Is the manufacturer’s decision justified if no one is hurt and the decision keeps the manufacturer from losing money and possibly having to lay off employees? 6. Does advancing technology provide cures for heart disease or is it a source of a sedentary life style that contributes to heart disease? 7. It is easy to imagine financial or navigational disasters that may occur as the result of arithmetic errors due to overflow and truncation problems. What consequences could result from errors in image storage systems due to loss of image details (perhaps in fields such as reconnaissance or medical diagnosis)? 8. ARM Holdings is a small company that designs the processors for a wide variety of consumer electronic devices. It does not manufacture any of the processors; instead the designs are licensed to semiconductor vendors (such as Qualcomm, Samsung, and Texas Instruments) who pay a royalty for each unit produced. This business model spreads the high cost of research and

M02_BROO1160_12_SE_C02.indd 137

01/08/14 11:18 AM

138

Chapter 2  Data Manipulation

development of computer processors across the entire consumer electronic market. Today, over 95 percent of all cellular phones (not just smartphones), over 40 percent of all digital cameras, and 25 percent of digital TVs use an ARM processor. Furthermore, ARM processors are found in mini-­notebooks, MP3 players, game controllers, electronic book readers, navigation systems, and the list goes on. Given this, do you consider this company to be a ­monopoly? Why or why not? Because consumer devices play an ever-­increasing role in today’s society, is the dependency on this little-known company good, or does it raise concerns?

Additional Reading Carpinelli, J. D. Computer Systems Organization and Architecture. Boston, MA: ­Addison-Wesley, 2001. Comer, D. E. Essentials of Computer Architecture. Upper Saddle River, NJ: ­Prentice-Hall, 2005. Dandamudi, S P. Guide to RISC Processors for Programmers and Engineers. New York: Springer, 2005. Furber, S. ARM System-on-Chip Architecture, 2nd ed. Boston, MA: Addison Wesley, 2000. Hamacher, V. C., Z. G. Vranesic, and S. G. Zaky. Computer Organization, 5th ed. New York: McGraw-Hill, 2002. Knuth, D. E. The Art of Computer Programming, Vol. 1, 3rd ed. Boston, MA: ­Addison-Wesley, 1998. Murdocca, M. J., and V. P. Heuring. Computer Architecture and Organization: AnIntegrated Approach. New York: Wiley, 2007. Stallings, W. Computer Organization and Architecture, 9th ed. Upper Saddle River, NJ: Prentice-Hall, 2012. Tanenbaum, A. S. Structured Computer Organization, 6th ed. Upper Saddle River, NJ: Prentice-Hall, 2012.

M02_BROO1160_12_SE_C02.indd 138

01/08/14 11:18 AM

Operating Systems In this chapter we study operating systems, which are software

3

C H A P T E R

packages that coordinate a computer’s internal activities as well as oversee its communication with the outside world. It is a computer’s operating system that transforms the computer hardware into a useful tool. Our goal is to understand what operating systems do and how they do it. Such a background is central to being an enlightened computer user.

3.1 The History of Operating Systems 3.2 Operating System Architecture A Software Survey Components of an Operating System Getting It Started

M03_BROO1160_12_SE_C03.indd 139

3.3 Coordinating the Machine’s Activities The Concept of a Process Process Administration

*3.4 Handling Competition Among Processes

3.5 Security Attacks from the Outside Attacks from Within *Asterisks indicate suggestions for optional sections.

Semaphores Deadlock

23/07/14 8:25 pm

140

Chapter 3  Operating Systems

An operating system is the software that controls the overall operation of a computer. It provides the means by which a user can store and retrieve files, provides the interface by which a user can request the execution of programs, and provides the environment necessary to execute the programs requested. Perhaps the best known example of an operating system is Windows, which is provided in numerous versions by Microsoft and widely used in the PC arena. Another well-established example is UNIX, which is a popular choice for larger computer systems as well as PCs. In fact, UNIX is the core of two other popular operating systems: Mac OS, which is the operating system provided by Apple for its range of Mac machines, and Solaris, which was developed by Sun Microsystems (now owned by Oracle). Still another example of an operating system found on both large and small machines is Linux, which was originally developed noncommercially by computer enthusiasts and is now available through many commercial sources, including IBM. For casual computer users, the differences between operating systems are largely cosmetic. For computing professionals, different operating systems can represent major changes in the tools they work with or the philosophy they follow in disseminating and maintaining their work. Nevertheless, at their core all mainstream operating systems address the same kinds of problems that computing experts have faced for more than half a century.

3.1  The History of Operating Systems Today’s operating systems are large, complex software packages that have grown from humble beginnings. The computers of the 1940s and 1950s were not very flexible or efficient. Machines occupied entire rooms. Program execution required significant preparation of equipment in terms of mounting magnetic tapes, placing punched cards in card readers, setting switches, and so on. The execution of each program, called a job, was handled as an isolated activity—the machine was prepared for executing the program, the program was executed, and then all the tapes, punched cards, etc. had to be retrieved before the next program preparation could begin. When several users needed to share a machine, sign-up sheets were provided so that users could reserve the machine for blocks of time. During the time period allocated to a user, the machine was totally under that user’s control. The session usually began with program setup, followed by short periods of program execution. It was often completed in a hurried effort to do just one more thing (“It will only take a minute”) while the next user was impatiently starting to set up. In such an environment, operating systems began as systems for simplifying program setup and for streamlining the transition between jobs. One early development was the separation of users and equipment, which eliminated the physical transition of people in and out of the computer room. For this purpose a computer operator was hired to operate the machine. Anyone wanting a program run was required to submit it, along with any required data and special directions about the program’s requirements, to the operator and return later for the results. The operator, in turn, loaded these materials into the machine’s mass storage where a program called the operating system could read and execute them one at a time. This was the beginning of batch processing—the execution of jobs by collecting them in a single batch, then executing them without further interaction with the user.

M03_BROO1160_12_SE_C03.indd 140

23/07/14 8:25 pm

3.1  The History of Operating Systems

141

In batch processing systems, the jobs residing in mass storage wait for execution in a job queue (Figure3.1). A queue is a storage organization in which objects (in this case, jobs) are ordered in first-in, first-out (abbreviated FIFO and pronounced “FI-foe”) fashion. That is, the objects are removed from the queue in the order in which they arrived. In reality, most job queues do not rigorously follow the FIFO structure, since most operating systems provide for consideration of job priorities. As a result, a job waiting in the job queue can be bumped by a higher-priority job. In early batch-processing systems, each job was accompanied by a set of instructions explaining the steps required to prepare the machine for that particular job. These instructions were encoded, using a system known as a job control language (JCL), and stored with the job in the job queue. When the job was selected for execution, the operating system printed these instructions at a printer where they could be read and followed by the computer operator. This communication between the operating system and the computer operator is still seen today, as witnessed by PC operating systems that report such errors as “network not available” and “printer not responding.” A major drawback to using a computer operator as an intermediary between a computer and its users is that the users have no interaction with their jobs once they are submitted to the operator. This approach is acceptable for some applications, such as payroll processing, in which the data and all processing decisions are established in advance. However, it is not acceptable when the user must interact with a program during its execution. Examples include reservation systems in which reservations and cancellations must be reported as they occur; word processing systems in which documents are developed in a dynamic write and rewrite manner; and computer games in which interaction with the machine is the central feature of the game. To accommodate these needs, new operating systems were developed that allowed a program being executed to carry on a dialogue with the user through remote terminals—a feature known as interactive processing (Figure3.2). (A terminal consisted of little more than an electronic typewriter by which the user could type input and read the computer’s response that was printed on paper. Today terminals have evolved into more sophisticated devices called workstations and even into complete PCs that can function as stand-alone computers when desired.)

Figure 3.1   Batch processing Jobs: Program, data, and directions

Results

User domain Machine domain

M03_BROO1160_12_SE_C03.indd 141

Job queue

23/07/14 8:25 pm

142

Chapter 3  Operating Systems

Figure 3.2   Interactive processing Programs, data, directions, and results User domain Machine domain

Program execution

Paramount to successful interactive processing is that the actions of the computer be sufficiently fast to coordinate with the needs of the user rather than forcing the user to conform to the machine’s timetable. (The task of processing payroll can be scheduled to conform to the amount of time required by the computer, but using a word processor would be frustrating if the machine did not respond promptly as characters are typed.) In a sense, the computer is forced to execute tasks under a deadline, a process that became known as real-time processing in which the actions performed are said to occur in real-time. That is, to say that a computer performs a task in real time means that the computer performs the task in accordance with deadlines in its (external real-world) environment. If interactive systems had been required to serve only one user at a time, real-time processing would have been no problem. But computers in the 1960s and 1970s were expensive, so each machine had to serve more than one user. In turn, it was common for several users, working at remote terminals, to seek interactive service from a machine at the same time, and real-time considerations presented obstacles. If the operating system insisted on executing only one job at a time, only one user would receive satisfactory real-time service. The solution to this problem was to design operating systems that provided service to multiple users at the same time: a feature called time-sharing. One means of implementing time-sharing is to apply the technique called multiprogramming in which time is divided into intervals and then the execution of each job is restricted to only one interval at a time. At the end of each interval, the current job is temporarily set aside and another is allowed to execute during the next interval. By rapidly shuffling the jobs back and forth in this manner, the illusion of several jobs executing simultaneously is created. Depending on the types of jobs being executed, early time-sharing systems were able to provide acceptable real-time processing to as many as 30 users simultaneously. Today, multiprogramming techniques are used in single-user as well as multiuser systems, although in the former the result is usually called multitasking. That is, time-sharing refers to multiple users sharing access to a common computer, whereas multitasking refers to one user executing numerous tasks simultaneously. With the development of multiuser, time-sharing operating systems, a typical computer installation was configured as a large central computer connected to numerous workstations. From these workstations, users could communicate directly with the computer from outside the computer room rather than submitting requests to a computer operator. Commonly used programs were stored in

M03_BROO1160_12_SE_C03.indd 142

23/07/14 8:25 pm

3.1  The History of Operating Systems

143

the machine’s mass storage devices, and operating systems were designed to execute these programs as requested from the workstations. In turn, the role of a computer operator as an intermediary between the users and the computer begins to fade. Today, the existence of a computer operator has essentially disappeared, especially in the arena of personal computers where the computer user assumes all of the responsibilities of computer operation. Even most large computer installations run essentially unattended. Indeed, the job of computer operator has given way to that of a system administrator who manages the computer ­system—­obtaining and overseeing the installation of new equipment and software, enforcing local regulations such as the issuing of new accounts and establishing mass storage space limits for the various users, and coordinating efforts to resolve problems that arise in the system—rather than operating the machines in a hands-on manner. In short, operating systems have grown from simple programs that retrieved and executed programs one at a time into complex systems that coordinate timesharing, maintain programs and data files in the machine’s mass storage devices, and respond directly to requests from the computer’s users. But the evolution of operating systems continues. The development of multiprocessor machines has led to operating systems that provide time-sharing/ multitasking capabilities by assigning different tasks to different processors as well as by sharing the time of each single processor. These operating systems must wrestle with such problems as load balancing (dynamically allocating tasks to the various processors so that all processors are used efficiently) as well as scaling (breaking tasks into a number of subtasks compatible with the number of processors available). Moreover, the advent of computer networks in which numerous machines are connected over great distances has led to the creation of software systems to coordinate the network’s activities. Thus the field of networking (which we will study in Chapter4) is in many ways an extension of the subject of operating ­systems—the goal being to manage resources across many users on many machines rather than a single, isolated computer.

What’s in a Smartphone? As cell phones have become more powerful, it has become possible for them to offer services well beyond simply processing voice calls. A typical smartphone can now be used to text message, browse the Web, provide directions, view multimedia content— in short, it can be used to provide many of the same services as a traditional PC. As such, smartphones require full-fledged operating systems, not only to manage the limited resources of the smartphone hardware, but also to provide features that support the rapidly expanding collection of smartphone application software. The battle for dominance in the smartphone operating system market place promises to be fierce and will likely be settled on the basis of which system can provide the most imaginative features at the best price. Competitors in the smartphone operating system arena include Apple’s iPhone OS, Research In Motion’s BlackBerry OS, Microsoft’s Windows Phone, Nokia’s Symbian OS, and Google’s Android.

M03_BROO1160_12_SE_C03.indd 143

23/07/14 8:25 pm

144

Chapter 3  Operating Systems

Still another direction of research in operating systems focuses on devices that are dedicated to specific tasks such as medical devices, vehicle electronics, home appliances, cell phones, or other hand-held computers. The computer systems found in these devices are known as embedded systems. Embedded operating systems are often expected to conserve battery power, meet demanding real-time deadlines, or operate continuously with little or no human oversight. Successes in this endeavor are marked by systems such as VxWORKS, developed by Wind River Systems and used in the Mars Exploration Rovers named Spirit and Opportunity; Windows CE (also known as Pocket PC) developed by Microsoft; and Palm OS developed by PalmSource, Inc., especially for use in hand-held devices.

Questions & Exercises 1. Identify examples of queues. In each case, indicate any situations that

violate the FIFO structure. 2. Which of the following activities require real-time processing? a. Printing mailing labels b. Playing a computer game c. Displaying numbers on a smartphone screen as they are dialed d. Executing a program that predicts the state of next year’s economy e. Playing an MP3 recording 3. What is the difference between embedded systems and PCs? 4. What is the difference between time-sharing and multitasking?

3.2  Operating System Architecture To understand the composition of a typical operating system, we first consider the complete spectrum of software found within a typical computer system. Then we will concentrate on the operating system itself.

A Software Survey We approach our survey of the software found on a typical computer system by presenting a scheme for classifying software. Such classification schemes invariably place similar software units in different classes in the same manner as the assignment of time zones dictates that nearby communities must set their clocks an hour apart even though there is no significant difference between the occurrence of sunrise and sunset. Moreover, in the case of software classification, the dynamics of the subject and the lack of a definitive authority lead to contradictory terminology. For example, users of Microsoft’s Windows operating systems will find groups of programs called “Accessories” and “Administrative Tools” that include software from what we will call the application and utility classes. The following taxonomy should therefore be viewed as a means of gaining a foothold in an extensive, dynamic subject rather than as a statement of universally accepted fact.

M03_BROO1160_12_SE_C03.indd 144

23/07/14 8:25 pm

3.2  Operating System Architecture

145

Let us begin by dividing a machine’s software into two broad categories: application software and system software (Figure3.3). Application software consists of the programs for performing tasks particular to the machine’s utilization. A machine used to maintain the inventory for a manufacturing company will contain different application software from that found on a machine used by an electrical engineer. Examples of application software include spreadsheets, database systems, desktop publishing systems, accounting systems, program development software, and games. In contrast to application software, system software performs those tasks that are common to computer systems in general. In a sense, the system software provides the infrastructure that the application software requires, in much the same manner as a nation’s infrastructure (government, roads, utilities, financial institutions, etc.) provides the foundation on which its citizens rely for their individual lifestyles. Within the class of system software are two categories: One is the operating system itself and the other consists of software units collectively known as utility software. The majority of an installation’s utility software consists of programs for performing activities that are fundamental to computer installations but not included in the operating system. In a sense, utility software consists of software units that extend (or perhaps customize) the capabilities of the operating system. For example, the ability to format a magnetic disk or to copy a file from a magnetic disk to a CD is often not implemented within the operating system itself but instead is provided by means of a utility program. Other instances of utility software include software to compress and decompress data, software for playing multimedia presentations, and software for handling network communication. Implementing certain activities as utility software allows system software to be customized to the needs of a particular installation more easily than if they were included in the operating system. Indeed, it is common to find companies or

Figure 3.3   Software classification Software

System

Application

Utility

Operating system

User Interface

M03_BROO1160_12_SE_C03.indd 145

Kernel

23/07/14 8:25 pm

146

Chapter 3  Operating Systems

Linux For the computer enthusiast who wants to experiment with the internal components of an operating system, there is Linux. Linux is an operating system originally designed by Linus Torvalds while a student at the University of Helsinki. It is a nonproprietary product and available, along with its source code (see Chapter6) and documentation, without charge. Because it is freely available in source code form, it has become popular among computer hobbyists, students of operating systems, and programmers in general. Moreover, Linux is recognized as one of the more reliable operating systems available today. For this reason, several companies now package and market versions of Linux in an easily usable form, and these products are now challenging the long-established commercial operating systems on the market. You can learn more about Linux from the website at www.linux.org.

individuals who have modified, or added to, the utility software that was originally provided with their machine’s operating system. Unfortunately, the distinction between application software and utility software can be vague. From our point of view, the difference is whether the package is part of the computer’s “software infrastructure.” Thus a new application may evolve to the status of a utility if it becomes a fundamental tool. When still a research project, software for communicating over the Internet was considered application software; today such tools are fundamental to most PC usage and would therefore be classified as utility software. The distinction between utility software and the operating system is equally vague. In particular, antitrust lawsuits in the United States and Europe have been founded on questions regarding whether units such as browsers and media players are components of Microsoft’s operating systems or utilities that Microsoft has included merely to squash competition.

Components of an Operating System Let us focus now on components that are within the domain of an operating system. In order to perform the actions requested by the computer’s users, an operating system must be able to communicate with those users. The portion of an operating system that handles this communication is often called the user interface. Older user interfaces, called shells, communicated with users through textual messages using a keyboard and monitor screen. More modern systems perform this task by means of a graphical user interface (GUI—pronounced “GOO–ee”) in which objects to be manipulated, such as files and programs, are represented pictorially on the display as icons. These systems allow users to issue commands by using one of several common input devices. For example, a computer mouse, with one or more buttons, can be used to click or drag icons on the screen. In place of a mouse, special-purpose pointing devices or styluses are often used by graphic artists or on several types of handheld devices. More recently, advances in fine-grained touch screens allow users to manipulate icons directly with their fingers. Whereas today’s GUIs use two-dimensional image projection systems, three-dimensional interfaces that allow human users to communicate with computers by means of 3D projection systems, tactile sensory devices, and surround sound audio reproduction systems are subjects of current research.

M03_BROO1160_12_SE_C03.indd 146

23/07/14 8:25 pm

3.2  Operating System Architecture

147

Although an operating system’s user interface plays an important role in establishing a machine’s functionality, this framework merely acts as an intermediary between the computer’s user and the real heart of the operating system (Figure3.4). This distinction between the user interface and the internal parts of the operating system is emphasized by the fact that some operating systems allow a user to select among different interfaces to obtain the most comfortable interaction for that particular user. Users of the UNIX operating system, for example, can select among a variety of shells including the Bourne shell, the C shell, and the Korn shell, as well as a GUI called X11. The earliest versions of Microsoft Windows were a GUI application program that could be loaded from the MS-DOS operating system’s command shell. The DOS cmd.exe shell can still be found as a utility program in the latest versions of Windows, although this interface is almost never required by casual users. Similarly, Apple’s OS X retains a Terminal utility shell that hearkens back to that system’s UNIX ancestors. An important component within today’s GUI shells is the window manager, which allocates blocks of space on the screen, called windows, and keeps track of which application is associated with each window. When an application wants to display something on the screen, it notifies the window manager, and the window manager places the desired image in the window assigned to the application. In turn, when a mouse button is clicked, it is the window manager that computes the mouse’s location on the screen and notifies the appropriate application of the mouse action. Window managers are responsible for what is generally called the “style” of a GUI, and most managers offer a range of configurable choices. Linux users even have a range of choices for a window manager, with popular choices including KDE and Gnome. In contrast to an operating system’s user interface, the internal part of an operating system is called the kernel. An operating system’s kernel contains those software components that perform the very basic functions required by the computer installation. One such unit is the file manager, whose job is to coordinate the use of the machine’s mass storage facilities. More precisely, the file manager maintains records of all the files stored in mass storage, including where Figure 3.4   The user interface acts as an intermediary between users and the operating system’s kernel User

User

User

Kernel

User interface User

M03_BROO1160_12_SE_C03.indd 147

User

23/07/14 8:25 pm

148

Chapter 3  Operating Systems

each file is located, which users are allowed to access the various files, and which portions of mass storage are available for new files or extensions to existing files. These records are kept on the individual storage medium containing the related files so that each time the medium is placed online, the file manager can retrieve them and thus know what is stored on that particular medium. For the convenience of the machine’s users, most file managers allow files to be grouped into a bundle called a directory or folder. This approach allows a user to organize his or her files according to their purposes by placing related files in the same directory. Moreover, by allowing directories to contain other directories, called subdirectories, a hierarchical organization can be constructed. For example, a user may create a directory called MyRecords that contains subdirectories called FinancialRecords, MedicalRecords, and HouseHoldRecords. Within each of these subdirectories could be files that fall within that particular category. (Users of a Windows operating system can ask the file manager to ­display the current collection of folders by executing the utility program Windows Explorer.) A chain of directories within directories is called a directory path. Paths are often expressed by listing the directories along the path separated by slashes. For instance, animals/prehistoric/dinosaurs would represent the path starting at the directory named animals, passing through its subdirectory named ­prehistoric, and terminating in the sub-subdirectory dinosaurs. (For Windows users the slashes in such a path expression are reversed as in animals\ prehistoric\dinosaurs.) Any access to a file by other software units is obtained at the discretion of the file manager. The procedure begins by requesting that the file manager grant access to the file through a procedure known as opening the file. If the file manager approves the requested access, it provides the information needed to find and to manipulate the file. Another component of the kernel consists of a collection of device drivers, which are the software units that communicate with the controllers (or at times, directly with peripheral devices) to carry out operations on the peripheral devices attached to the machine. Each device driver is uniquely designed for its particular type of device (such as a printer, disk drive, or monitor) and translates generic requests into the more technical steps required by the device assigned to that driver. For example, a device driver for a printer contains the software for reading and decoding that particular printer’s status word as well as all the other handshaking details. Thus, other software components do not have to deal with those technicalities in order to print a file. Instead, the other components can merely rely on the device driver software to print the file, and let the device driver take care of the details. In this manner, the design of the other software units can be independent of the unique characteristics of particular devices. The result is a generic operating system that can be customized for particular peripheral devices by merely installing the appropriate device drivers. Still another component of an operating system’s kernel is the memory manager, which is charged with the task of coordinating the machine’s use of main memory. Such duties are minimal in an environment in which a computer is asked to perform only one task at a time. In these cases, the program for performing the current task is placed at a predetermined location in main memory, executed, and then replaced by the program for performing the next task. However, in multiuser or multitasking environments in which the computer is asked to address

M03_BROO1160_12_SE_C03.indd 148

23/07/14 8:25 pm

3.2  Operating System Architecture

149

many needs at the same time, the duties of the memory manager are extensive. In these cases, many programs and blocks of data must reside in main memory concurrently. Thus, the memory manager must find and assign memory space for these needs and ensure that the actions of each program are restricted to the program’s allotted space. Moreover, as the needs of different activities come and go, the memory manager must keep track of those memory areas no longer occupied. The task of the memory manager is complicated further when the total main memory space required exceeds the space actually available in the computer. In this case the memory manager may create the illusion of additional memory space by rotating programs and data back and forth between main memory and mass storage (a technique called paging). Suppose, for example, that a main memory of 8GB is required but the computer only has 4GB. To create the illusion of the larger memory space, the memory manager reserves 4GB of storage space on a magnetic disk. There it records the bit patterns that would be stored in main memory if main memory had an actual capacity of 8GB. This data is divided into uniform sized units called pages, which are typically a few KB in size. Then the memory manager shuffles these pages back and forth between main memory and mass storage so that the pages that are needed at any given time are actually present in the 4GB of main memory. The result is that the computer is able to function as though it actually had 8GB of main memory. This large “fictional” memory space created by paging is called virtual memory. Two additional components within the kernel of an operating system are the scheduler and dispatcher, which we will study in the next section. For now we merely note that in a multiprogramming system the scheduler determines which activities are to be considered for execution, and the dispatcher controls the allocation of time to these activities.

Getting It Started We have seen that an operating system provides the software infrastructure required by other software units, but we have not considered how the operating system gets started. This is accomplished through a procedure known as

Firmware In addition to the boot loader, a PC’s ROM contains a collection of software routines for performing fundamental input/output activities such as receiving information from the keyboard, displaying messages on the computer screen, and reading data from mass storage. Being stored in nonvolatile memory such as FlashROM, this software is not immutably etched into the silicon of the machine—the hardware—but is also not as readily changeable as the rest of the programs in mass storage—the software. The term firmware was coined to describe this middle ground. Firmware routines can be used by the boot loader to perform I/O activities before the operating system becomes functional. For example, they are used to communicate with the computer user before the boot process actually begins and to report errors during booting. Widely used firmware systems include the BIOS (Basic Input/Output System) long used in PCs, the newer EFI (Extensible Firmware Interface), Sun’s Open Firmware (now a product of Oracle), and the CFE (Common Firmware Environment) used in many embedded devices.

M03_BROO1160_12_SE_C03.indd 149

23/07/14 8:25 pm

150

Chapter 3  Operating Systems

boot strapping (often shortened to booting) that is performed by a computer each time it is turned on. It is this procedure that transfers the operating system from mass storage (where it is permanently stored) into main memory (which is essentially empty when the machine is first turned on). To understand the boot strap process and the reason it is necessary, we begin by considering the machine’s CPU. A CPU is designed so that its program counter starts with a particular predetermined address each time the CPU is turned on. It is at this location that the CPU expects to find the beginning of the program to be executed. Conceptually, then, all that is needed is to store the operating system at this location. However, for technical reasons, a computer’s main memory is typically constructed from volatile technologies—meaning that the memory loses the data stored in it when the computer is turned off. Thus, the contents of main memory must be replenished each time the computer is restarted. In short, we need a program (preferably the operating system) to be present in main memory when the computer is first turned on, but the computer’s volatile memory is erased each time the machine is turned off. To resolve this dilemma, a small portion of a computer’s main memory where the CPU expects to find its initial program is constructed from special nonvolatile memory cells. Such memory is known as read-only memory (ROM) because its contents can be read but not altered. As an analogy, you can think of storing bit patterns in ROM as blowing tiny fuses (some blown open—ones—and some blown closed—zeros), although the technology used is more advanced. More precisely, most ROM in today’s PCs is constructed with flash memory technology (which means that it is not strictly ROM because it can be altered under special circumstances). In a general-purpose computer, a program called the boot loader is permanently stored in the machine’s ROM. This, then, is the program that is initially executed when the machine is turned on. The instructions in the boot loader direct the CPU to transfer the operating system from a predetermined location into the volatile area of main memory (Figure3.5). Modern boot loaders can copy an operating system into main memory from a variety of locations. For example, in embedded systems, such as smartphones, the operating system is copied from special flash (nonvolatile) memory; in the case of small workstations at large companies or universities, the operating system may be copied from a distant machine over a network. Once the operating system has been placed in main memory, the boot loader directs the CPU to execute a jump instruction to that area of memory. At this point, the operating system takes over and begins controlling the machine’s activities. The overall process of executing the boot loader and thus starting the operating system is called booting the computer. You may ask why desktop computers are not provided with enough ROM to hold the entire operating system so that booting from mass storage would not be necessary. While this is feasible for embedded systems with small operating systems, devoting large blocks of main memory in general-purpose computers to nonvolatile storage is not efficient with today’s technology. Moreover, computer operating systems undergo frequent updates in order to maintain security and keep abreast of new and improved device drivers for the latest hardware. While it is possible to update operating systems and boot loaders stored in ROM (often

M03_BROO1160_12_SE_C03.indd 150

23/07/14 8:25 pm

3.2  Operating System Architecture

151

Figure 3.5   The booting process Main memory ROM

Boot loader

Main memory Disk storage

ROM

Volatile memory

Volatile memory

Boot loader Operating system

Operating system Step 1: Machine starts by executing the boot loader program already in memory. Operating system is stored in mass storage.

Disk storage

Operating system Step 2: Boot loader program directs the transfer of the operating system into main memory and then transfers control to it.

called a firmware update), the technological limits make mass storage the most common choice for more traditional computer systems. In closing we should point out that understanding the boot process as well as the distinctions between an operating system, utility software, and application software allows us to comprehend the overall methodology under which most general-purpose computer systems operate. When such a machine is first turned on, the boot loader loads and activates the operating system. The user then makes requests to the operating system regarding the utility or application programs to be executed. As each utility or application is terminated, the user is put back in touch with the operating system, at which time the user can make additional requests. Learning to use such a system is therefore a two-layered process. In addition to learning the details of the specific utility or application desired, one must learn enough about the machine’s operating system to navigate among the applications.

Questions & Exercises 1. List the components of a typical operating system and summarize the

role of each in a single phrase. 2. What is the difference between application software and utility software? 3. What is virtual memory? 4. Summarize the booting procedure.

M03_BROO1160_12_SE_C03.indd 151

23/07/14 8:25 pm

152

Chapter 3  Operating Systems

3.3  Coordinating the Machine’s Activities In this section we consider how an operating system coordinates the execution of application software, utility software, and units within the operating system itself. We begin with the concept of a process.

The Concept of a Process One of the most fundamental concepts of modern operating systems is the distinction between a program and the activity of executing a program. The former is a static set of directions, whereas the latter is a dynamic activity whose properties change as time progresses. (This distinction is analogous to a piece of sheet music, sitting inert in a book on the shelf, versus a musician performing that piece by taking actions that the sheet music describes.) The activity of executing a program under the control of the operating system is known as a process. Associated with a process is the current status of the activity, called the process state. This state includes the current position in the program being executed (the value of the program counter) as well as the values in the other CPU registers and the associated memory cells. Roughly speaking, the process state is a snapshot of the machine at a particular time. At different times during the execution of a program (at different times in a process) different snapshots (different process states) will be observed. Unlike a musician, who normally tries to play only one musical piece at a time, typical time-sharing/multitasking computers are running many processes, all competing for the computer’s resources. It is the task of the operating system to manage these processes so that each process has the resources (peripheral devices, space in main memory, access to files, and access to a CPU) that it needs, that independent processes do not interfere with one another, and that processes that need to exchange information are able to do so.

Process Administration The tasks associated with coordinating the execution of processes are handled by the scheduler and dispatcher within the operating system’s kernel. The scheduler maintains a record of the processes present in the computer system, introduces new processes to this pool, and removes completed processes from the pool. Thus when a user requests the execution of an application, it is the scheduler that adds the execution of that application to the pool of current processes. To keep track of all the processes, the scheduler maintains a block of information in main memory called the process table. Each time the execution of a program is requested, the scheduler creates a new entry for that process in the process table. This entry contains such information as the memory area assigned to the process (obtained from the memory manager), the priority of the process, and whether the process is ready or waiting. A process is ready if it is in a state in which its progress can continue; it is waiting if its progress is currently delayed until some external event occurs, such as the completion of a mass storage operation, the pressing of a key at the keyboard, or the arrival of a message from another process. The dispatcher is the component of the kernel that oversees the execution of the scheduled processes. In a time-sharing/multitasking system this task is

M03_BROO1160_12_SE_C03.indd 152

23/07/14 8:25 pm

3.3  Coordinating the Machine’s Activities

153

accomplished by multiprogramming; that is, dividing time into short segments, each called a time slice (typically measured in milliseconds or microseconds), and then switching the CPU’s attention among the processes as each is allowed to execute for one time slice (Figure3.6). The procedure of changing from one process to another is called a process switch (or a context switch). Each time the dispatcher awards a time slice to a process, it initiates a timer circuit that will indicate the end of the slice by generating a signal called an interrupt. The CPU reacts to this interrupt signal in much the same way that you react when interrupted from a task. You stop what you are doing, record where you are in the task (so that you will be able to return at a later time), and take care of the interrupting entity. When the CPU receives an interrupt signal, it completes its current machine cycle, saves its position in the current process, and begins executing a program, called an interrupt handler, which is stored at a predetermined location in main memory. This interrupt handler is a part of the dispatcher, and it describes how the dispatcher should respond to the interrupt signal. Thus, the effect of the interrupt signal is to preempt the current process and transfer control back to the dispatcher. At this point, the dispatcher selects the process from the process table that has the highest priority among the ready processes (as determined by the scheduler), restarts the timer circuit, and allows the selected process to begin its time slice. Paramount to the success of a multiprogramming system is the ability to stop, and later restart, a process. If you are interrupted while reading a book, your ability to continue reading at a later time depends on your ability to remember your location in the book as well as the information that you had accumulated to that point. In short, you must be able to re-create the environment that was present immediately prior to the interruption. In the case of a process, the environment that must be re-created is the process’s state, which as already mentioned, includes the value of the program counter as well as the contents of the registers and pertinent memory cells. CPUs designed for multiprogramming systems incorporate the task of saving this information as part of the CPU’s reaction to the interrupt signal. These CPUs

Figure 3.6   Multiprogramming between process A and process B Interrupt

Interrupt

Interrupt

Process B

Process switch

Advancing time

M03_BROO1160_12_SE_C03.indd 153

Process switch

Time slice

Proc

Process switch

Process A

Time slice

Interrupt

Process B

Process switch

ss A

Interrupt

Process switch

Process A

Time slice

Time slice

23/07/14 8:25 pm

154

Chapter 3  Operating Systems

Interrupts The use of interrupts for terminating time slices, as described in the text, is only one of many applications of a computer’s interrupt system. There are many situations in which an interrupt signal is generated, each with its own interrupt routine. Indeed, interrupts provide an important tool for coordinating a computer’s actions with its environment. For example, both clicking a mouse and pressing a key on the keyboard generate interrupt signals that cause the CPU to set aside its current activity and address the cause of the interrupt. To manage the task of recognizing and responding to incoming interrupts, the various interrupt signals are assigned priorities so that the more important tasks can be taken care of first. The highest priority interrupt is usually associated with a power failure. Such an interrupt signal is generated if the computer’s power is unexpectedly disrupted. The associated interrupt routine directs the CPU through a series of “housekeeping” chores during the milliseconds before the voltage level drops below an operational level.

also tend to have machine-language instructions for reloading a previously saved state. Such features simplify the task of the dispatcher when performing a process switch and exemplify how the design of modern CPUs is influenced by the needs of today’s operating systems. In closing, we should note that the use of multiprogramming has been found to increase the overall efficiency of a machine. This is somewhat counterintuitive since the shuffling of processes required by multiprogramming introduces an overhead. However, without multiprogramming each process runs to completion before the next process begins, meaning that the time that a process is waiting for peripheral devices to complete tasks or for a user to make the next request is wasted. Multiprogramming allows this lost time to be given to another process. For example, if a process executes an I/O request, such as a request to retrieve data from a magnetic disk, the scheduler will update the process table to reflect that the process is waiting for an external event. In turn, the dispatcher will cease to award time slices to that process. Later (perhaps several hundred milliseconds), when the I/O request has been completed, the scheduler will update the process table to show that the process is ready, and thus that process will again compete for time slices. In short, progress on other tasks will be made while the I/O request is being performed, and thus the entire collection of tasks will be completed in less time than if executed in a sequential manner.

Questions & Exercises 1. Summarize the difference between a program and a process. 2. Summarize the steps performed by the CPU when an interrupt occurs. 3. In a multiprogramming system, how can high-priority processes be

allowed to run faster than others?

M03_BROO1160_12_SE_C03.indd 154

23/07/14 8:25 pm

3.4  Handling Competition Among Processes

155

4. If each time slice in a multiprogramming system is 50 milliseconds and

each context switch requires at most a microsecond, how many processes can the machine service in a single second? 5. If each process uses its complete time slice in the machine in question4, what fraction of the machine’s time is spent actually performing processes? What would this fraction be if each process executed an I/O request after only a microsecond of its time slice?

3.4  Handling Competition Among Processes An important task of an operating system is the allocation of the machine’s resources to the processes in the system. Here we are using the term resource in a broad sense, including the machine’s peripheral devices as well as features within the machine itself. The file manager allocates access to files as well and allocates mass storage space for the construction of new files; the memory manager allocates memory space; the scheduler allocates space in the process table; and the dispatcher allocates time slices. As with many problems in computer systems, this allocation task may appear simple at first glance. Below the surface, however, lie several subtleties that can lead to malfunctions in a poorly designed system. Remember, a machine does not think for itself; it merely follows directions. Thus, to construct reliable operating systems, we must develop algorithms that cover every possible contingency, regardless of how minuscule it may appear.

Semaphores Let us consider a time-sharing/multitasking operating system controlling the activities of a computer with a single printer. If a process needs to print its results, it must request that the operating system give it access to the printer’s device driver. At this point, the operating system must decide whether to grant this request, depending on whether the printer is already being used by another process. If it is not, the operating system should grant the request and allow the process to continue; otherwise, the operating system should deny the request and

Microsoft’s Task Manager You can gain insight to some of the internal activity of a Microsoft Windows operating system by executing the utility program called Task Manager. (Press the Ctrl, Alt, and Delete keys simultaneously.) In particular, by selecting the Processes tab in the Task Manager window, you can view the process table. Here is an experiment you can perform: Look at the process table before you activate any application program. (You may be surprised that so many processes are already in the table. These are necessary for the system’s basic operation.) Now activate an application and confirm that an additional process has entered the table. You will also be able to see how much memory space was allocated to the process.

M03_BROO1160_12_SE_C03.indd 155

23/07/14 8:25 pm

156

Chapter 3  Operating Systems

perhaps classify the process as a waiting process until the printer becomes available. After all, if two processes were given simultaneous access to the computer’s printer, the results would be worthless to both. To control access to the printer, the operating system must keep track of whether the printer has been allocated. One approach to this task would be to use a flag, which in this context refers to a bit in memory whose states are often referred to as set and clear, rather than 1 and 0. A clear flag (value 0) indicates that the printer is available and a set flag (value 1) indicates that the printer is currently allocated. On the surface, this approach seems well-founded. The operating system merely checks the flag each time a request for printer access is made. If it is clear, the request is granted and the operating system sets the flag. If the flag is set, the operating system makes the requesting process wait. Each time a process finishes with the printer, the operating system either allocates the printer to a waiting process or, if no process is waiting, merely clears the flag. However, this simple flag system has a problem. The task of testing and possibly setting the flag may require several machine instructions. (The value of the flag must be retrieved from main memory, manipulated within the CPU, and finally stored back in memory.) It is therefore possible for a task to be interrupted after a clear flag has been detected but before the flag has been set. In particular, suppose the printer is currently available, and a process requests use of it. The flag is retrieved from main memory and found to be clear, indicating that the printer is available. However, at this point, the process is interrupted and another process begins its time slice. It too requests the use of the printer. Again, the flag is retrieved from main memory and found still clear because the previous process was interrupted before the operating system had time to set the flag in main memory. Consequently, the operating system allows the second process to begin using the printer. Later, the original process resumes execution where it left off, which is immediately after the operating system found the flag to be clear. Thus the operating system continues by setting the flag in main memory and granting the original process access to the printer. Two processes are now using the same printer. The solution to this problem is to insist that the task of testing and possibly setting the flag be completed without interruption. One approach is to use the interrupt disable and interrupt enable instructions provided in most machine languages. When executed, an interrupt disable instruction causes future interrupts to be blocked, whereas an interrupt enable instruction causes the CPU to resume responding to interrupt signals. Thus, if the operating system starts the flag-testing routine with a disable interrupt instruction and ends it with an enable interrupt instruction, no other activity can interrupt the routine once it starts. Another approach is to use the test-and-set instruction that is available in many machine languages. This instruction directs the CPU to retrieve the value of a flag, note the value received, and then set the flag—all within a single machine instruction. The advantage here is that because the CPU always completes an instruction before recognizing an interrupt, the task of testing and setting the flag cannot be split when it is implemented as a single instruction. A properly implemented flag, as just described, is called a semaphore, in reference to the railroad signals used to control access to sections of track. In fact, semaphores are used in software systems in much the same way as they are in railway systems. Corresponding to the section of track that can contain only

M03_BROO1160_12_SE_C03.indd 156

23/07/14 8:25 pm

3.4  Handling Competition Among Processes

157

one train at a time is a sequence of instructions that should be executed by only one process at a time. Such a sequence of instructions is called a critical region. The requirement that only one process at a time be allowed to execute a critical region is known as mutual exclusion. In summary, a common way of obtaining mutual exclusion to a critical region is to guard the critical region with a semaphore. To enter the critical region, a process must find the semaphore clear and then set the semaphore before entering the critical region; then upon exiting the critical region, the process must clear the semaphore. If the semaphore is found in its set state, the process trying to enter the critical region must wait until the semaphore has been cleared.

Deadlock Another problem that can arise during resource allocation is deadlock, the condition in which two or more processes are blocked from progressing because each is waiting for a resource that is allocated to another. For example, one process may have access to the computer’s printer but be waiting for access to the computer’s CD player, while another process has access to the CD player but is waiting for the printer. Another example occurs in systems in which processes are allowed to create new processes (an action called forking in the UNIX vernacular) to perform subtasks. If the scheduler has no space left in the process table and each process in the system must create an additional process before it can complete its task, then no process can continue. Such conditions, as in other settings (Figure3.7), can severely degrade a system’s performance. Analysis of deadlock has revealed that it cannot occur unless all three of the following conditions are satisfied: 1. There is competition for nonsharable resources. 2. The resources are requested on a partial basis; that is, having received

some resources, a process will return later to request more. . Once a resource has been allocated, it cannot be forcibly retrieved. 3 Figure 3.7   A deadlock resulting from competition for nonsharable railroad intersections

M03_BROO1160_12_SE_C03.indd 157

23/07/14 8:25 pm

158

Chapter 3  Operating Systems

Python and Operating Systems When a Python script is executed by a user, the operating system launches a new process to run the script. Such scripts are often applications, although they can also be considered utility software if they extend or customize the capabilities of the system. Python scripts interact with components of the operating system to accomplish their work, such as the file manager for reading and writing files, or the GUI or shell for providing user interactions. The Python module “os” provides a variety of predefined, system-agnostic functions for accessing common operating system features, such as forking new Python processes, or executing other utility or application programs.

The point of isolating these conditions is that the deadlock problem can be removed by attacking any one of the three. Techniques that attack the third condition fall into the category known as deadlock detection and correction schemes. In these cases, the occurrence of deadlock is considered so remote that no effort is made to avoid the problem. Instead, the approach is to detect it should it occur and then correct it by forcibly retrieving some of the allocated resources. Our example of a full process table might fall in this class. If deadlock should occur due to a full table, routines within the operating system (or perhaps a human administrator using his or her powers as “super user”) can remove (the technical term is kill) some of the processes. This releases space in the process table, breaking the deadlock and allowing the remaining processes to continue their tasks. Techniques that attack the first two conditions are known as deadlock avoidance schemes. One, for example, attacks the second condition by requiring each process to request all its resources at one time. Another scheme attacks the first condition, not by removing the competition directly but by converting nonsharable resources into sharable ones. For example, suppose the resource in question is a printer and a variety of processes require its use. Each time a process requests the printer, the operating system could grant the request. However, instead of connecting the process to the printer’s device driver, the operating system would connect it to a device driver that stores the information to be printed in mass storage rather than sending it to the printer. Thus each process, thinking it has access to the printer, could execute in its normal way. Later, when the printer is available, the operating system could transfer the data from mass storage to the printer. In this manner, the operating system would make the nonsharable resource appear sharable by creating the illusion of more than one printer. This technique of holding data for output at a later but more convenient time is called spooling. We have introduced spooling as a technique for granting several processes access to a common resource—a theme that has many variations. For example, a file manager could grant several processes access to the same file if the processes are merely reading data from the file, but conflicts can occur if more than one process tries to alter a file at the same time. Thus, a file manager may allocate file access according to the needs of the processes, allowing several processes to have read access but allowing only one to have write access. Other systems may divide the file into pieces so that different processes can alter different parts of the file concurrently. Each of these techniques, however, has subtleties that must be resolved to obtain a reliable system. How, for example, should those processes with only read access to a file be notified when a process with write access alters the file?

M03_BROO1160_12_SE_C03.indd 158

23/07/14 8:25 pm

3.4  Handling Competition Among Processes

159

Multi-Core Operating Systems Traditional time-sharing/multitasking systems give the illusion of executing many processes at once by switching rapidly between time slices faster than a human can perceive. Modern systems continue to multitask in this way, but in addition, the latest multi-core CPUs are genuinely capable of running two, four, or many more processes simultaneously. Unlike a group of single-core computers working together, a multicore machine contains multiple independent processors (in this case called cores) that share the computer’s peripherals, memory, and other resources. For a multi-core operating system, this means that the dispatcher and scheduler must consider which processes to execute on each core. With different processes running on different cores, handling competition among processes becomes more challenging because disabling interrupts on all cores whenever one needs to enter a critical region would be highly inefficient. Computer science has many active research areas related to building operating system mechanisms better suited to the new multi-core world.

Questions & Exercises 1. Suppose process A and process B are sharing time on the same machine,

and each needs the same nonsharable resource for short periods of time. (For example, each process may be printing a series of independent, short reports.) Each process may then repeatedly acquire the resource, release it, and later request it again. What is a drawback to controlling access to the resource in the following manner: Begin by assigning a flag the value 0. If process A requests the resource and the flag is 0, grant the request. Otherwise, make process A wait. If process B requests the resource and the flag is 1, grant the request. Otherwise, make process B wait. Each time process A finishes with the resource, change the flag to 1. Each time process B finishes with the resource, change the flag to 0.

2. Suppose a two-lane road converges to one lane to pass through a tunnel.

To coordinate the use of the tunnel, the following signal system has been installed: A car entering either end of the tunnel causes red lights above the tunnel entrances to be turned on. As the car exits the tunnel, the lights are turned off. If an approaching car finds a red light on, it waits until the light is turned off before entering the tunnel.

What is the flaw in this system? 3. Suppose the following solutions have been proposed for removing the deadlock that occurs on a single-lane bridge when two cars meet. Identify which condition for deadlock given in the text is removed by each solution. a.  Do not let a car onto the bridge until the bridge is empty. b.  If cars meet, make one of them back up. c.  Add a second lane to the bridge.

M03_BROO1160_12_SE_C03.indd 159

23/07/14 8:25 pm

160

Chapter 3  Operating Systems

4. Suppose we represent each process in a multiprogramming system with a

dot and draw an arrow from one dot to another if the process represented by the first dot is waiting for a (nonsharable) resource being used by the second. Mathematicians call the resulting picture a directed graph. What property of the directed graph is equivalent to deadlock in the system?

3.5  Security Since the operating system oversees the activities in a computer, it is natural for it to play a vital role in maintaining security as well. In the broad sense, this responsibility manifests itself in multiple forms, one of which is reliability. If a flaw in the file manager causes the loss of part of a file, then the file was not secure. If a defect in the dispatcher leads to a system failure (often called a system crash) causing the loss of an hour’s worth of typing, we would argue that our work was not secure. Thus the security of a computer system requires a well-designed, dependable operating system. The development of reliable software is not a subject that is restricted to operating systems. It permeates the entire software development spectrum and constitutes the field of computer science known as software engineering, which we will study in Chapter7. In this section, then, we focus on security problems that are more closely related to the specifics of operating systems.

Attacks from the Outside An important task performed by operating systems is to protect the computer’s resources from access by unauthorized personnel. In the case of computers used by multiple people, this is usually approached by means of establishing “accounts” for the various authorized users—an account being essentially a record within the operating system containing such entries as the user’s name, password, and privileges to be granted to that user. The operating system can then use this information during each login procedure (a sequence of transactions in which the user establishes initial contact with a computer’s operating system) to control access to the system. Accounts are established by a person known as the super user or the administrator. This person gains highly privileged access to the operating system by identifying him- or herself as the administrator (usually by name and password) during the login procedure. Once this contact is established, the administrator can alter settings within the operating system, modify critical software packages, adjust the privileges granted to other users, and perform a variety of other maintenance activities that are denied normal users. From this “lofty perch,” the administrator is also able to monitor activity within the computer system in an effort to detect destructive behavior, whether malicious or accidental. To assist in this regard, numerous software utilities, called auditing software, have been developed that record and then analyze the activities taking place within the computer system. In particular, auditing software may expose a flood of attempts to login using incorrect passwords, indicating that an unauthorized user may be trying to gain access to the computer.

M03_BROO1160_12_SE_C03.indd 160

23/07/14 8:25 pm

3.5 Security

161

Auditing software may also identify activities within a user’s account that do not conform to that user’s past behavior, which may indicate that an unauthorized user has gained access to that account. (It is unlikely that a user who traditionally uses only word processing and spreadsheet software will suddenly begin to access highly technical software applications or try to execute utility packages that lie outside that user’s privileges.) Another culprit that auditing systems are designed to detect is the presence of sniffing software, which is software that, when left running on a computer, records activities and later reports them to a would-be intruder. An old, wellknown example is a program that simulates the operating system’s login procedure. Such a program can be used to trick authorized users into thinking they are communicating with the operating system, whereas they are actually supplying their names and passwords to an impostor. With all the technical complexities associated with computer security, it is surprising to many that one of the major obstacles to the security of computer systems is the carelessness of the users themselves. They select passwords that are relatively easy to guess (such as names and dates), they share their passwords with friends, they fail to change their passwords on a timely basis, they subject offline mass storage devices to potential degradation by transferring them back and forth between machines, and they import unapproved software into the system that might subvert the system’s security. For problems like these, most institutions with large computer installations adopt and enforce policies that catalog the requirements and responsibilities of the users.

Attacks from Within Once an intruder (or perhaps an authorized user with malicious intent) gains access to a computer system, the next step is usually to explore, looking for information of interest or for places to insert destructive software. This is a straightforward process if the prowler has gained access to the administrator’s account, which is why the administrator’s password is closely guarded. If, however, access is through a general user’s account, it becomes necessary to trick the operating system into allowing the intruder to reach beyond the privileges granted to that user. For example, the intruder may try to trick the memory manager into allowing a process to access main memory cells outside its allotted area, or the prowler may try to trick the file manager into retrieving files whose access should be denied. Today’s CPUs are enhanced with features that are designed to foil such attempts. As an example, consider the need to restrict a process to the area of main memory assigned to it by the memory manager. Without such restrictions, a process could erase the operating system from main memory and take control of the computer itself. To counter such attempts, CPUs designed for multiprogramming systems typically contain special-purpose registers in which the operating system can store the upper and lower limits of a process’s allotted memory area. Then, while performing the process, the CPU compares each memory reference to these registers to ensure that the reference is within the designated limits. If the reference is found to be outside the process’s designated area, the CPU automatically transfers control back to the operating system (by performing an interrupt sequence) so that the operating system can take appropriate action. Embedded in this illustration is a subtle but significant problem. Without further security features, a process could still gain access to memory cells outside of

M03_BROO1160_12_SE_C03.indd 161

23/07/14 8:25 pm

162

Chapter 3  Operating Systems

its designated area merely by changing the special-purpose registers that contain its memory limits. That is, a process that wanted access to additional memory could merely increase the value in the register containing the upper memory limit and then proceed to use the additional memory space without approval from the operating system. To protect against such actions, CPUs for multiprogramming systems are designed to operate in one of two privilege levels; we will call one “privileged mode,” the other we will call “nonprivileged mode.” When in privileged mode, the CPU is able to execute all the instructions in its machine language. However, when in nonprivileged mode, the list of acceptable instructions is limited. The instructions that are available only in privileged mode are called privileged instructions. (Typical examples of privileged instructions include instructions that change the contents of memory limit registers and instructions that change the current privilege mode of the CPU.) An attempt to execute a privileged instruction when the CPU is in nonprivileged mode causes an interrupt. This interrupt converts the CPU to privileged mode and transfers control to an interrupt handler within the operating system. When first turned on, the CPU is in privileged mode. Thus, when the operating system starts at the end of the boot process, all instructions are executable. However, each time the operating system allows a process to start a time slice, it switches the CPU to nonprivileged mode by executing a “change privilege mode” instruction. In turn, the operating system will be notified if the process attempts to execute a privileged instruction, and thus the operating system will be in position to maintain the integrity of the computer system. Privileged instructions and the control of privilege levels is the major tool available to operating systems for maintaining security. However, the use of these tools is a complex component of an operating system’s design, and errors continue to be found in current systems. A single flaw in privilege level control can open the door to disaster from malicious programmers or from inadvertent programming errors. If a process is allowed to alter the timer that controls the system’s multiprogramming system, that process can extend its time slice and dominate the machine. If a process is allowed to access peripheral devices directly, then it can read files without supervision by the system’s file manager. If a process is allowed to access memory cells outside its allotted area, it can read and even alter data being used by other processes. Thus, maintaining security continues to be an important task of an administrator as well as a goal in operating system design.

Questions & Exercises 1. Give some examples of poor choices for passwords and explain why they

would be poor choices. 2. Processors in Intel’s Pentium series provide for four privilege levels. Why

would the designers of CPUs decide to provide four levels rather than three or five? 3. If a process in a multiprogramming system could access memory cells outside its allotted area, how could it gain control of the machine?

M03_BROO1160_12_SE_C03.indd 162

23/07/14 8:25 pm

Chapter Review Problems

163

Chapter Review Problems (Asterisked problems are associated with optional sections.)

1. List four activities of a typical operating

system. 2. What led to the development of the interactive

operating system? 3. Suppose three items R, S, and T are placed in a

queue in that order. Then one item is removed from the queue before a fourth item, X, is placed in the queue. Then one item is removed from the queue, the items Y and Z are placed in the queue, and then the queue is emptied by removing one item at a time. List all the items in the order in which they were removed. 4. What is the significance of the window manager

in current GUI shells? 5. What is a real-time operating system? 6. If you have a PC, identify some situations in

which you can take advantage of its multitasking capabilities. 7. On the basis of a computer system with which

you are familiar, identify two units of application software and two units of utility software. Then explain why you classified them as you did. 8. a. What is the role of the user interface of an operating system? b.  What is the role of the kernel of an operating system? 9. What is the use of the process table in

program execution? 10. Give some examples of functions that are

provided by the Python module “os”. 11. What is the Linux or UNIX command for

creating new processes? 12. What is the difference between a process that

is ready and a process that is waiting? 13. What is the difference between virtual mem-

ory and main memory? 14. Suppose a computer contained 512MB (MiB)

of main memory, and an operating system needed to create a virtual memory of twice that size using pages of 2KB (KiB). How many pages would be required?

M03_BROO1160_12_SE_C03.indd 163

15. What complications could arise in a time-

sharing/multitasking system if two processes require access to the same file at the same time? Are there cases in which the file manager should grant such requests? Are there cases in which the file manager should deny such requests? 16. How is firmware different from hardware and

software? What do you mean by a firmware update? 17. Define load balancing and scaling in the con-

text of multiprocessor architectures. 18. What is a context switch? 19. What are the flaws of privilege level control? 20. If you have a PC, record the sequence activities

that you can observe when you turn it on. Then determine what messages appear on the computer screen before the booting process actually begins. What software writes these messages? 21. Suppose a multiprogramming operating system

allocated time slices of 10 milliseconds and the machine executed an average of five instructions per nanosecond. How many instructions could be executed in a single time slice? 22. If a typist types 60 words per minute (where

a word is considered five characters), how much time would pass between typing each character? If a multiprogramming operating system allocated time slices in 10 millisecond units and we ignore the time required for process switches, how many time slices could be allocated between characters being typed? 23. Suppose a multiprogramming operating sys-

tem is allotting time slices of 50 milliseconds. If it normally takes 8 milliseconds to position a disk’s read/write head over the desired track and another 17 milliseconds for the desired data to rotate around to the read/write head, how much of a program’s time slice can be spent waiting for a read operation from a disk to take place? If the machine is capable of executing 10 instructions each nanosecond,

23/07/14 8:25 pm

164

Chapter 3  Operating Systems

how many instructions can be executed during c.  How do you tell the operating system this waiting period? (This is why when a prothat you do not want other users of the cess performs an operation with a peripheral machine to have access to your files? device, a multiprogramming system terminates *33. Explain an important use for the test-andthat process’s time slice and allows another set instruction found in many machine lanprocess to run while the first process is waiting guages. Why is it important for the entire for the services of the peripheral device.) test-and-set process to be implemented as a 4. What is the drawback of using the set and clear 2 single instruction? flag system while allocating devices? *34. A banker with only $100,000 loans $50,000 to 25. A process is said to be I/O-bound if it requires

each of two customers. Later, both customers return with the story that before they can repay their loans they must each borrow another $10,000 to complete the business deals in which their previous loans are involved. The banker resolves this deadlock by borrowing the additional funds from another source and passing on this loan (with an increase in the interest rate) to the two customers. Which of the three conditions for deadlock has the banker removed?

a lot of I/O operations, whereas a process that consists of mostly computations within the CPU/memory system is said to be computebound. If both a compute-bound process and an I/O-bound process are waiting for a time slice, which should be given priority? Why? 26. Would greater throughput be achieved by

a system running two processes in a multiprogramming environment if both processes were I/O-bound (refer to problem 25) or if one were I/O-bound and the other were ­compute-bound? Why?

*35. Students who want to enroll in Model Railroad-

27. Write a set of directions that tells an operating

system’s dispatcher what to do when a process’s time slice is over. 28. What are the various functions of the memory

manager in an operating system? 29. Identify a situation in a multiprogramming

system in which a process does not consume the entire time slice allocated to it. 30. What is meant by an interrupt handler in

multiprogramming systems and what is its significance? 31. Answer each of the following in terms of an

operating system that you use: a.  How do you ask the operating system to copy a file from one location to another? b.  How do you ask the operating system to show you the directory on a disk? c.  How do you ask the operating system to execute a program?

32. Answer each of the following in terms of an

operating system that you use: a.  How does the operating system restrict access to only those who are approved users? b.  How do you ask the operating system to show you what processes are currently in the process table?

M03_BROO1160_12_SE_C03.indd 164

ing II at the local university are required to obtain permission from the instructor and pay a laboratory fee. The two requirements are fulfilled independently in either order and at different locations on campus. Enrollment is limited to 20 students; this limit is maintained by both the instructor, who will grant permission to only 20 students, and the financial office, which will allow only 20 students to pay the laboratory fee. Suppose that this registration system has resulted in 19 students having successfully registered for the course, but with the final space being claimed by two students—one who has only obtained permission from the instructor and another who has only paid the fee. Which requirement for deadlock is removed by each of the following solutions to the problem? a.  Both students are allowed in the course. b.  The class size is reduced to 19, so neither of the two students is allowed to register for the course. c.  The competing students are both denied entry to the class and a third student is given the twentieth space. d.  It is decided that the only requirement for entry into the course is the payment of the fee. Thus the student who has paid the fee gets into the course, and entry is denied to the other student.

23/07/14 8:25 pm

Chapter Review Problems

*36. Since each area on a computer’s display can

be used by only one process at a time (otherwise the image on the screen would be unreadable), these areas are nonsharable resources that are allocated by the window manager. Which of the three conditions necessary for deadlock does the window manager remove in order to avoid deadlock? *37. Suppose each nonsharable resource in a com-

165

able to sense the amount of traffic arriving from each direction and is programmed to give the green light to the heavier traffic, the lighter traffic might suffer from starvation. How is starvation avoided? b.  In what sense can a process starve if the dispatcher always assigns time slices according to a priority system in which the priority of each process remains fixed? (Hint: What is the priority of the process that just completed its time slice in comparison to the processes that are waiting, and consequently which routine gets the next time slice?) How, would you guess, do many operating systems avoid this problem?

puter system is classified as a level 1, level 2, or level 3 resource. Moreover, suppose each process in the system is required to request the resources it needs according to this classification. That is, it must request all the required level 1 resources at once before requesting any level 2 resources. Once it receives the level1 *41. Why can’t special-purpose registers restrict a resources, it can request all the required process in its allotted memory area? Explain level2 resources, and so on. Can deadlock your answer. occur in such a system? Why or why not? *42. The following is the “dining philosophers” *38. Each of two robot arms is programmed to lift problem that was originally proposed by E. W. assemblies from a conveyor belt, test them Dijkstra and is now a part of computer science for tolerances, and place them in one of two folklore. Five philosophers are sitting at a bins depending on the results of the test. The round table. In front of each is a plate of spaassemblies arrive one at a time with a sufghetti. There are five forks on the table, one ficient interval between them. To keep both between each plate. Each philosopher wants arms from trying to grab the same assembly, to alternate between thinking and ­eating. To the computers controlling the arms share a eat, a philosopher requires possession of both common memory cell. If an arm is available the forks that are adjacent to the philosopher’s as an assembly approaches, its controlling plate. Identify the possibilities of deadlock computer reads the value of the common and starvation (see problem 40) that are prescell. If the value is nonzero, the arm lets ent in the dining philosophers’ problem. the assembly pass. Otherwise, the control*43. What problem arises as the lengths of the ling computer places a nonzero value in the time slices in a multiprogramming system are memory cell, directs the arm to pick up the made shorter and shorter? What about as they assembly, and places the value 0 back into become longer and longer? the memory cell after the action is complete. *44. When is it preferable to use the deadlock What sequence of events could lead to a tugprevention scheme, the deadlock avoidance of-war between the two arms? scheme, and the deadlock detection and *39. Why is disabling the interrupts in a multicore recovery scheme? Can you provide scenarios operating system not considered to be an where more than one of these schemes can be efficient approach? used? *40. A process that is waiting for a time slice is 45. Identity two activities that can be performed said to suffer starvation if it is never given a by an operating system’s administrator but time slice. not by a typical user. a.  The pavement in the middle of an intersec 46. How is the read action different from the tion can be considered as a nonsharable write action when multiple processes access resource for which cars approaching the the same file? intersection compete. A traffic light rather than an operating system is used to control 47. Suppose a password consisted of a string of the allocation of the resource. If the light is nine characters from the English alphabet

M03_BROO1160_12_SE_C03.indd 165

23/07/14 8:25 pm

166

Chapter 3  Operating Systems

(26characters). If each possible password could be tested in a millisecond, how long would it take to test all possible passwords? 48. Why are CPUs that are designed for multitask-

ing operating systems capable of operating at different privilege levels? 49. How are privileged instructions handled in

nonprivileged mode? 50. Identify three ways in which a process could

challenge the security of a computer system if not prevented from doing so by the operating system.

51. What are the conditions that lead to a

deadlock? 52. What are the policies that a user should follow

to manage login passwords? 53. Give appropriate examples of auditing soft-

ware and sniffing software. 54. How is security relevant in current operating

systems? 55. How is the booting process different in

embedded systems from traditional systems?

Social Issues The following questions are intended as a guide to the ethical/social/legal issues associated with the field of computing. The goal is not merely to answer these questions. You should also consider why you answered as you did and whether your justifications are consistent from one question to the next. 1. Suppose you are using a multiuser operating system that allows you to view

the names of the files belonging to other users as well as to view the contents of those files that are not otherwise protected. Would viewing such information without permission be similar to wandering through someone’s unlocked home without permission, or would it be more like reading materials placed in a common lounge such as a physician’s waiting room? 2. When you have access to a multiuser computer system, what responsibilities do you have when selecting your password? 3. If a flaw in an operating system’s security allows a malicious programmer to gain unauthorized access to sensitive data, to what extent should the developer of the operating system be held responsible? 4. Is it your responsibility to lock your house in such a way that intruders cannot get in, or is it the public’s responsibility to stay out of your house unless invited? Is it the responsibility of an operating system to guard access to a computer and its contents, or is it the responsibility of hackers to leave the machine alone? 5. In Walden, Henry David Thoreau argues that we have become tools of our tools; that is, instead of benefiting from the tools that we have, we spend our time obtaining and maintaining our tools. To what extent is this true with regard to computing? For example, if you own a personal computer, how much time do you spend earning the money to pay for it, learning how to use its operating system, learning how to use its utility and application software, maintaining it, and downloading upgrades to its software in comparison to the amount of time you spend benefiting from it? When you use it, is your time well spent? Are you more socially active with or without a personal computer?

M03_BROO1160_12_SE_C03.indd 166

23/07/14 8:25 pm

Additional Reading

167

Additional Reading Bishop, M. Introduction to Computer Security. Boston, MA: Addison-Wesley, 2005. Craig, B. Cyberlaw: The Law of the Internet and Information Technology. Upper Saddle River, NJ: Prentice-Hall, 2012. Davis, W. S., and T. M. Rajkumar. Operating Systems: A Systematic View, 6th ed. Boston, MA: Addison-Wesley, 2005. Deitel, H. M., P. J. Deitel, and D. R. Choffnes. Operating Systems, 3rd ed. Upper Saddle River, NJ: Prentice-Hall, 2005. Silberschatz, A., P. B. Galvin, and G. Gagne. Operating System Concepts, 9th ed., New York: Wiley, 2012. Stallings, W. Operating Systems, 8th ed. Upper Saddle River, NJ: Prentice-Hall, 2014. Tanenbaum, A. S. Modern Operating Systems, 3rd ed. Upper Saddle River, NJ: Prentice-Hall, 2008.

M03_BROO1160_12_SE_C03.indd 167

23/07/14 8:25 pm

M03_BROO1160_12_SE_C03.indd 168

23/07/14 8:25 pm

Networking and the Internet In this chapter we discuss the area of computer science known as

4

C H A P T E R

networking, which encompasses the study of how computers can be linked together to share information and resources. Our study will include the construction and operation of networks, applications of networks, and security issues. A prominent topic will be a particular worldwide network of networks known as the Internet.

4.1 Network Fundamentals

4.3 The World Wide Web

4.5 Security

Network Classifications Protocols Combining Networks Methods of Process Communication Distributed Systems

Web Implementation HTML XML Client-Side and Server-Side Activities

Forms of Attack Protection and Cures Encryption Legal Approaches to Network Security

4.2 The Internet

*4.4 Internet Protocols The Layered Approach to Internet Software The TCP/IP Protocol Suite

*Asterisks indicate suggestions for optional sections.

Internet Architecture Internet Addressing Internet Applications

M04_BROO1160_12_SE_C04.indd 169

23/07/14 10:24 am

170

Chapter 4  Networking and the Internet

The need to share information and resources among different computers has led to linked computer systems, called networks, in which computers are connected so that data can be transferred from machine to machine. In these networks, computer users can exchange messages and share resources—such as printing capabilities, software packages, and data storage facilities—that are scattered throughout the system. The underlying software required to support such applications has grown from simple utility packages into an expanding system of network software that provides a sophisticated network-wide infrastructure. In a sense, network software is evolving into a network-wide operating system. In this chapter we will explore this expanding field of computer science.

4.1  Network Fundamentals We begin our study of networks by introducing a variety of basic networking concepts.

Network Classifications A computer network is often classified as being either a personal area network (PAN), a local area network (LAN), a metropolitan area network (MAN), or a wide area network (WAN). A PAN is normally used for shortrange communications—typically less than a few meters—such as between a wireless headset and a smartphone or between a wireless mouse and its PC. In contrast, a LAN normally consists of a collection of computers in a single building or building complex. For example, the computers on a university campus or those in a manufacturing plant might be connected by a LAN. A MAN is a network of intermediate size, such as one spanning a local community. Finally, a WAN links machines over a greater distance—perhaps in neighboring cities or on opposite sides of the world. Another means of classifying networks is based on whether the network’s internal operation is based on designs that are in the public domain or on innovations owned and controlled by a particular entity such as an individual or a corporation. A network of the former type is called an open network; a network of the latter type is called a closed, or sometimes a proprietary, network. Open network designs are freely circulated and often grow in popularity to the point that they ultimately prevail over proprietary approaches whose applications are restricted by license fees and contract conditions. The Internet (a popular worldwide network of networks that we will study in this chapter) is an open system. In particular, communication throughout the Internet is governed by an open collection of standards known as the TCP/IP protocol suite, which is the subject of Section4.4. Anyone is free to use these standards without paying fees or signing license agreements. In contrast, a company such as Novell Inc. might develop proprietary systems for which it chooses to maintain ownership rights, allowing the company to draw income from selling or leasing these products. Still another way of classifying networks is based on the topology of the network, which refers to the pattern in which the machines are connected. Two of the more popular topologies are the bus, in which the machines are all connected to a common communication line called a bus (Figure4.1a), and the star, in which one machine serves as a central focal point to which all the others are

M04_BROO1160_12_SE_C04.indd 170

23/07/14 10:24 am

4.1  Network Fundamentals

171

Figure 4.1   Two popular network topologies a. Bus

b. Star

Computer

Computer

Computer

Computer Computer

Computer

Computer

Computer

Computer

Computer

Computer

connected (Figure4.1b). The bus topology was popularized in the 1990s when it was implemented under a set of standards known as Ethernet, and Ethernet networks remain one of the most popular networking systems in use today. The star topology has roots as far back as the 1970s. It evolved from the paradigm of a large central computer serving many users. As the simple terminals employed by these users grew into small computers themselves, a star network emerged. Today, the star configuration is popular in wireless networks where communication is conducted by means of radio broadcast and the central machine, called the access point (AP), serves as a focal point around which all communication is coordinated. The difference between a bus network and a star network is not always obvious by the physical arrangement of equipment. The distinction is whether the machines in the network envision themselves as communicating directly with each other over a common bus or indirectly through an intermediary central machine. For instance, a bus network might not appear as a long bus from which computers are connected over short links as depicted in Figure4.1. Instead, it may have a very short bus with long links to the individual machines, meaning that the network would look more like a star. Indeed, sometimes a bus network is created by running links from each computer to a central location where they are connected to a device called a hub. This hub is little more than a very short bus. All it does is relay any signal it receives (with perhaps some amplification) back out to all the machines connected to it. The result is a network that looks like a star network although it operates like a bus network.

Protocols For a network to function reliably, it is important to establish rules by which activities are conducted. Such rules are called protocols. By developing and adopting protocol standards, vendors are able to build products for network applications that are compatible with products from other vendors. Thus, the development of protocol standards is an indispensable process in the development of networking technologies. As an introduction to the protocol concept, let us consider the problem of coordinating the transmission of messages among computers in a network. Without rules governing this communication, all the computers might insist on transmitting messages at the same time or fail to assist other machines when that assistance is required.

M04_BROO1160_12_SE_C04.indd 171

23/07/14 10:24 am

172

Chapter 4  Networking and the Internet

In a bus network based on the Ethernet standards, the right to transmit messages is controlled by the protocol known as Carrier Sense, Multiple Access with Collision Detection (CSMA/CD). This protocol dictates that each message be broadcast to all the machines on the bus (Figure4.2). Each machine monitors all the messages but keeps only those addressed to itself. To transmit a message, a machine waits until the bus is silent, and at this time it begins transmitting while continuing to monitor the bus. If another machine also begins transmitting, both machines detect the clash and pause for a brief, independently random period of time before trying to transmit again. The result is a system similar to that used by a small group of people in a conversation. If two people start to talk at once, they both stop. The difference is that people might go through a series such as, “I’m sorry, what were you going to say?”, “No, no. You go first,” whereas under the CSMA/CD protocol each machine merely tries again later. Note that CSMA/CD is not compatible with wireless star networks in which all machines communicate through a central AP. This is because a machine may be unable to detect that its transmissions are colliding with those of another. For example, the machine may not hear the other because its own signal drowns out that of the other machine. Another cause might be that the signals from the different machines are blocked from each other by objects or distance even though they can all communicate with the central AP (a condition known as the hidden terminal problem, Figure4.3). The result is that wireless networks adopt the policy of trying to avoid collisions rather than trying to detect them. Such policies are classified as Carrier Sense, Multiple Access with Collision Avoidance (CSMA/CA), many of which are standardized by IEEE (see the sidebar “Institute of Electrical and Electronics Engineers” in Chapter7) within the protocols defined in IEEE 802.11 and commonly referred to as WiFi. We emphasize that collision avoidance protocols are designed to avoid collisions and may not eliminate them completely. When collisions do occur, messages must be retransmitted. The most common approach to collision avoidance is based on giving advantage to machines that have already been waiting for an opportunity to transmit. The protocol used is similar to Ethernet’s CSMA/CD. The basic difference is that when a machine first needs to transmit a message and finds the communication channel silent, it does not start transmitting immediately. Instead, it waits for a short period of time and then starts transmitting only if the channel has remained silent throughout that period. If a busy channel is experienced during this process, the machine waits for a randomly determined period before trying again. Once this period is exhausted, the machine is allowed to claim a silent channel Figure 4.2   Communication over a bus network Computer

Computer

Computer

M04_BROO1160_12_SE_C04.indd 172

Computer

Computer

23/07/14 10:24 am

4.1  Network Fundamentals

173

Figure 4.3   The hidden terminal problem

Range of B

Range of C B

Access point

Building

C

A

Range of A

None of the end systems can hear each other although each can communicate with the AP.

without hesitation. This means that collisions between “newcomers” and those that have already been waiting are avoided because a “newcomer” is not allowed to claim a silent channel until any machine that has been waiting is given the opportunity to start. This protocol, however, does not solve the hidden terminal problem. After all, any protocol based on distinguishing between a silent or busy channel requires that each individual station be able to hear all the others. To solve this problem, some WiFi networks require that each machine send a short “request” message to the AP and wait until the AP acknowledges that request before transmitting an entire message. If the AP is busy because it is dealing with a “hidden terminal,” it will ignore the request, and the requesting machine will know to wait. Otherwise, the AP will acknowledge the request, and the machine will know that it is safe to transmit. Note that all the machines in the network will hear all acknowledgments sent from the AP and thus have a good idea of whether the AP is busy at any given time, even though they may not be able to hear the transmissions taking place.

Combining Networks Sometimes it is necessary to connect existing networks to form an extended communication system. This can be done by connecting the networks to form a larger version of the same “type” of network. For example, in the case of bus networks

M04_BROO1160_12_SE_C04.indd 173

23/07/14 10:24 am

174

Chapter 4  Networking and the Internet

based on the Ethernet protocols, it is often possible to connect the buses to form a single long bus. This is done by means of different devices known as repeaters, bridges, and switches, the distinctions of which are subtle yet informative. The simplest of these is the repeater, which is little more than a device that passes signals back and forth between the two original buses (usually with some form of amplification) without considering the meaning of the signals (Figure4.4a). A bridge is similar to, but more complex than, a repeater. Like a repeater, it connects two buses, but it does not necessarily pass all messages across the connection. Instead, it looks at the destination address that accompanies each message and forwards a message across the connection only when that message is destined for a computer on the other side. Thus, two machines residing on the same side of a bridge can exchange messages without interfering with communication taking place on the other side. A bridge produces a more efficient system than that produced by a repeater. A switch is essentially a bridge with multiple connections, allowing it to connect several buses rather than just two. Thus, a switch produces a network consisting of several buses extending from the switch as spokes on a wheel (Figure4.4b). As in the case of a bridge, a switch considers the destination addresses of all messages and forwards only those messages destined for other spokes. Moreover, each message that is forwarded is relayed only into the appropriate spoke, thus minimizing the traffic in each spoke. It is important to note that when networks are connected via repeaters, bridges, and switches, the result is a single large network. The entire system operates in the same manner (using the same protocols) as each of the original smaller networks. Sometimes, however, the networks to be connected have incompatible characteristics. For instance, the characteristics of a WiFi network are not readily compatible with an Ethernet network. In these cases the networks must be connected in a manner that builds a network of networks, known as an internet, in Figure 4.4   Building a large bus network from smaller ones Repeater or Bridge

a. A repeater or bridge connecting two buses

M04_BROO1160_12_SE_C04.indd 174

Switch

b. A switch connecting multiple buses

23/07/14 10:24 am

4.1  Network Fundamentals

175

which the original networks maintain their individuality and continue to function as autonomous networks. (Note that the generic term internet is distinct from the Internet. The Internet, written with an uppercase I, refers to a particular, worldwide internet that we will study in later sections of this chapter. There are many other examples of internets. Indeed, traditional telephone communication was handled by worldwide internet systems well before the Internet was popularized.) The connection between networks to form an internet is handled by devices known as routers, which are special purpose computers used for forwarding messages. Note that the task of a router is different from that of repeaters, bridges, and switches in that routers provide links between networks while allowing each network to maintain its unique internal characteristics. As an example, Figure4.5 depicts two WiFi star networks and an Ethernet bus network connected by routers. When a machine in one of the WiFi networks wants to send a message to a machine in the Ethernet network, it first sends the message to the AP in its network. From there, the AP sends the message to its associated router, and this router forwards the message to the router at the Ethernet. There the message is given to a machine on the bus, and that machine then forwards the message to its final destination in the Ethernet. The reason that routers are so named is that their purpose is to forward messages in their proper directions. This forwarding process is based on an internetwide addressing system in which all the devices in an internet (including the machines in the original networks and the routers) are assigned unique addresses. (Thus, each machine in one of the original networks has two addresses: its original “local” address within its own network and its internet address.) A machine wanting to send a message to a machine in a distant network attaches the internet address of the destination to the message and directs the message to its local router. From there it is forwarded in the proper direction. For this forwarding Figure 4.5   Routers connecting two WiFi networks and an Ethernet network to form an internet

WiFi network AP Router

Router

Router

Ethernet network

AP WiFi network

M04_BROO1160_12_SE_C04.indd 175

23/07/14 10:24 am

176

Chapter 4  Networking and the Internet

purpose, each router maintains a forwarding table that contains the router’s knowledge about the direction in which messages should be sent depending on their destination addresses. The “point” at which one network is linked to an internet is often called a gateway because it serves as a passageway between the network and the outside world. Gateways can be found in a variety of forms, and thus the term is used rather loosely. In many cases a network’s gateway is merely the router through which it communicates with the rest of the internet. In other cases the term gateway may be used to refer to more than just a router. For example, in most residential WiFi networks that are connected to the Internet, the term gateway refers collectively to both the network’s AP and the router connected to the AP because these two devices are normally packaged in a single unit.

Methods of Process Communication The various activities (or processes) executing on the different computers within a network (or even executing on the same machine via time-sharing/multitasking) must often communicate with each other to coordinate their actions and to perform their designated tasks. Such communication between processes is called interprocess communication. A popular convention used for interprocess communication is the client/ server model. This model defines the basic roles played by the processes as either a client, which makes requests of other processes, or a server, which satisfies the requests made by clients. An early application of the client/server model appeared in networks connecting all the computers in a cluster of offices. In this situation, a single, highquality printer was attached to the network where it was available to all the machines in the network. In this case the printer played the role of a server (often called a print server), and the other machines were programmed to play the role of clients that sent print requests to the print server. Another early application of the client/server model was used to reduce the cost of magnetic disk storage while also removing the need for duplicate copies of records. Here one machine in a network was equipped with a high-capacity mass storage system (usually a magnetic disk) that contained all of an organization’s records. Other machines on the network then requested access to the records as they needed them. Thus the machine that actually contained the records played the role of a server (called a file server), and the other machines played the role of clients that requested access to the files that were stored at the file server. Today the client/server model is used extensively in network applications, as we will see later in this chapter. However, the client/server model is not the only means of interprocess communication. Another model is the peer-to-peer (often abbreviated P2P) model. Whereas the client/server model involves one process (the server) providing a service to numerous others (clients), the peer-topeer model involves processes that provide service to and receive service from each other (Figure4.6). Moreover, whereas a server must execute continuously so that it is prepared to serve its clients at any time, the peer-to-peer model usually involves processes that execute on a temporary basis. For example, applications of the peer-to-peer model include instant messaging in which people carry on a written conversation over the Internet as well as situations in which people play competitive interactive games.

M04_BROO1160_12_SE_C04.indd 176

23/07/14 10:24 am

4.1  Network Fundamentals

177

Figure 4.6   The client/server model compared to the peer-to-peer model Client

Client

Server

Client

Client

a. Server must be prepared to serve multiple clients at any time.

Peer

Peer

b. Peers communicate as equals on a one-to-one basis.

The peer-to-peer model is also a popular means of distributing files such as music recordings and motion pictures via the Internet. In this case, one peer may receive a file from another and then provide that file to other peers. The collection of peers participating in such a distribution is sometimes called a swarm. The swarm approach to file distribution is in contrast to earlier approaches that applied the client/server model by establishing a central distribution center (the server) from which clients downloaded files (or at least found sources for those files). One reason that the P2P model is replacing the client/server model for file sharing is that it distributes the service task over many peers rather than concentrating it at one server. This lack of a centralized base of operation leads to a more efficient system. Unfortunately, another reason for the popularity of file distribution systems based on the P2P model is that, in cases of questionable legality, the lack of a central server makes legal efforts to enforce copyright laws more difficult. There are numerous cases, however, in which individuals have discovered that “difficult” does not mean “impossible” and have found themselves faced with significant liabilities due to copyright infringement violations. You might often read or hear the term peer-to-peer network, which is an example of how misuse of terminology can evolve when technical terms are adopted by the nontechnical community. The term peer-to-peer refers to a system by which two processes communicate over a network (or internet). It is not a property of the network (or internet). A process might use the peer-to-peer model to communicate with another process and later use the client/server model to communicate with another process over the same network. Thus, it would be more accurate to speak of communicating by means of the peer-to-peer model rather than communicating over a peer-to-peer network.

M04_BROO1160_12_SE_C04.indd 177

23/07/14 10:24 am

178

Chapter 4  Networking and the Internet

Distributed Systems With the success of networking technology, interaction between computers via networks has become common and multifaceted. Many modern software systems, such as global information retrieval systems, company-wide accounting and inventory systems, computer games, and even the software that controls a network’s infrastructure itself are designed as distributed systems, meaning that they consist of software units that execute as processes on different computers. Early distributed systems were developed independently from scratch. But today, research is revealing a common infrastructure running throughout these systems, including such things as communication and security systems. In turn, efforts have been made to produce prefabricated systems that provide this basic infrastructure and therefore allow distributed applications to be constructed by merely developing the part of the system that is unique to the application. Several types of distributed computing systems are now common. Cluster computing describes a distributed system in which many independent computers work closely together to provide computation or services comparable to a much larger machine. The cost of these individual machines, plus the high-speed network to connect them, can be less than a higher-priced supercomputer, but with higher reliability and lower maintenance costs. Such distributed systems are used to provide high-availability—because it is more likely that at least one member of the cluster will be able to answer a request, even if other cluster members break down or are unavailable—and load-balancing—because the workload can be shifted automatically from members of the cluster that have too much to do to those that may have too little. Grid computing refers to distributed systems that are more loosely coupled than clusters but that still work together to accomplish large tasks. Grid computing can involve specialized software to make it easier to distribute data and algorithms to the machines participating in a grid. Examples include University of Wisconsin’s Condor system, or Berkeley’s Open Infrastructure for Network Computing (BOINC). Both of these systems are often installed on computers that are used for other purposes, such as PCs at work or at home, that can then volunteer computing power to the grid when the machine is not otherwise being used. Enabled by the growing connectivity of the Internet, this type of voluntary, distributed grid computing has enabled millions of home PCs to work on enormously complex mathematical and scientific problems. Cloud computing, whereby huge pools of shared computers on the network can be allocated for use by clients as needed, is the latest trend in distributed systems. Much as the spread of metropolitan electrical grids in the early twentieth century eliminated the need for individual factories and businesses to maintain their own generators, the Internet is making it possible for entities to entrust their data and computations to “the Cloud,” which in this case refers to the enormous computing resources already available on the network. Services such as Amazon’s Elastic Compute Cloud allow clients to rent virtual computers by the hour, without concern for where the computer hardware is actually located. Google Drive and Google Apps allow users to collaborate on information or build Web services without needing to know how many computers are working on the problem or where the relevant data are stored. Cloud computing services provide reasonable guarantees of reliability and scalability, but also raise concerns about privacy and security in a world where we may no longer know who owns and operates the computers that we use.

M04_BROO1160_12_SE_C04.indd 178

23/07/14 10:24 am

4.2  The Internet

179

Questions & Exercises 1. What is an open network? 2. Summarize the distinction between a bridge and a switch. 3. What is a router? 4. Identify some relationships in society that conform to the client/server

model. 5. Identify some protocols used in society. 6. Summarize the distinction between cluster computing and grid computing.

4.2  The Internet The most notable example of an internet is the Internet (note the uppercase I), which originated from research projects going back to the early 1960s. The goal was to develop the ability to link a variety of computer networks so that they could function as a connected system that would not be disrupted by local disasters. Much of this work was sponsored by the U.S. government through the Defense Advanced Research Projects Agency (DARPA—pronounced “DAR–pa”). Over the years, the development of the Internet shifted from a governmentsponsored project to an academic research project, and today it is largely a commercial undertaking that links a worldwide combination of PANs, LANs, MANs, and WANs involving millions of computers.

Internet Architecture As we have already mentioned, the Internet is a collection of connected networks. In general, these networks are constructed and maintained by organizations called Internet Service Providers (ISPs). It is also customary to use the term ISP in reference to the networks themselves. Thus, we will speak of connecting to an ISP, when what we really mean is connecting to the network provided by an ISP. The system of networks operated by the ISPs can be classified in a hierarchy according to the role they play in the overall Internet structure (Figure4.7). At the top of this hierarchy are relatively few tier-1 ISPs that consist of very highspeed, high-capacity, international WANs. These networks are thought of as the backbone of the Internet. They are typically operated by large companies that are in the communications business. An example would be a company that originated as a traditional telephone company and has expanded its scope into providing other communication services. Connecting to the tier-1 ISPs are the tier-2 ISPs that tend to be more regional in scope and less potent in their capabilities. (The distinction between the tier-1 and tier-2 ISPs is often a matter of opinion.) Again, these networks tend to be operated by companies in the communications business. Tier-1 and tier-2 ISPs are essentially networks of routers that collectively provide the Internet’s communication infrastructure. As such, they can be

M04_BROO1160_12_SE_C04.indd 179

23/07/14 10:24 am

180

Chapter 4  Networking and the Internet

Figure 4.7   Internet composition

Tier-1 ISPs

Tier-2 ISPs

Access ISPs

End systems

thought of as the core of the Internet. Access to this core is usually provided by an intermediary called an access or tier-3 ISP. An access ISP is essentially an independent internet, sometimes called an intranet, operated by a single authority that is in the business of supplying Internet access to individual homes and businesses. Examples include cable and telephone companies that charge for their service as well as organizations such as universities or corporations that take it upon themselves to provide Internet access to individuals within their organizations. The devices that individual users connect to the access ISPs are known as end systems or hosts. These end systems may be laptops or PCs, but increasingly range over a multitude of other devices including telephones, video cameras, automobiles, and home appliances. After all, the Internet is essentially a communications system, and thus any device that would benefit from communicating with other devices is a potential end system. The technology by which end systems connect to larger networks is also varied. Perhaps the fastest growing are wireless connections based on WiFi technology. The strategy is to connect the AP to an access ISP and thus provide Internet access through that ISP to end systems within the AP’s broadcast range. The area within the AP or group of APs’ range is often called a hot spot, particularly when the network access is publicly available or free. Hot spots can be found in individual residences, hotel and office buildings, small businesses, parks, and in some cases span entire cities. A similar technology is used by the cellular telephone industry where hot spots are known as cells and the “routers” generating the cells are coordinated to provide continuous service as an end system moves from one cell to another.

M04_BROO1160_12_SE_C04.indd 180

23/07/14 10:24 am

4.2  The Internet

181

Internet2 Now that the Internet has shifted from a research project to a household commodity, the research community has moved on to a project called Internet2. Internet2 is intended as an academic-only system and involves numerous universities working in partnership with industry and government. The goal is to conduct research in internet applications requiring high bandwidth communication, such as remote access and control of costly state-of-the-art equipment such as telescopes and medical diagnostic devices. An example of current research involves remote surgery performed by robot hands that mimic the hands of a distant surgeon who views the patient by video. You can learn more about Internet2 at http://www.internet2.org.

Other popular techniques for connecting to access ISP’s use telephone lines or cable/satellite systems. These technologies may be used to provide direct connection to an end system or to a customer’s router to which multiple end systems are connected. This latter tactic is popular for individual residences where a local hot spot is created by a router/AP connected to an access ISP by means of existing cable or telephone lines. Telephone, cable television, and satellite wide area networks of the twentieth century were designed to carry analog communications, such as the human voice or pre-digital television signals. Modern networks can be designed to carry digital data directly between computers, but older, analog network infrastructure still comprises a significant portion of the Internet. Issues arising from these legacy analog linkages are often referred to collectively as the last mile problem. The main arteries of WANs, MANs, and many LANs are relatively easy to modernize with high-speed digital technology such as fiber optics, but it can be far costlier to replace the existing copper telephone lines and coaxial cables that connect these arteries to each individual home or office. Thus, information that originated on the Internet continents away from an end system may spend almost its entire trip on high-speed digital connections, only to traverse the “last mile” to the end system over a slow, century-old analog phone line. As alluded to in Chapter2, several clever schemes have been developed to extend these legacy analog links to accommodate transmission of digital data. DSL modems, cable modems, satellite uplinks, and even direct fiber-optic connections to the home are used to bring broadband Internet access to end users.

Internet Addressing As we learned in Section4.1, an internet needs an internet-wide addressing system that assigns a unique identifying address to each computer in the system. In the Internet these addresses are known as IP addresses. (The term IP refers to “Internet Protocol,” which is a term we will learn more about in ­Section4.4.) Originally, each IP address was a pattern of 32 bits, but to provide a larger set of addresses, the process of converting to 128-bit addresses is currently underway (see the discussion of IPv6 in Section4.4). Blocks of consecutively

M04_BROO1160_12_SE_C04.indd 181

23/07/14 10:24 am

182

Chapter 4  Networking and the Internet

numbered IP addresses are awarded to ISPs by the Internet Corporation for Assigned Names and Numbers (ICANN), which is a nonprofit corporation established to coordinate the Internet’s operation. The ISPs are then allowed to allocate the addresses within their awarded blocks to machines within their region of authority. Thus, machines throughout the Internet are assigned unique IP addresses. IP addresses are traditionally written in dotted decimal notation in which the bytes of the address are separated by periods and each byte is expressed as an integer represented in traditional base 10 notation. For example, using dotted decimal notation, the pattern 5.2 would represent the two-byte bit pattern 0000010100000010, which consists of the byte 00000101 (represented by 5) followed by the byte 00000010 (represented by 2), and the pattern 17.12.25 would represent the three-byte bit pattern consisting of the byte 00010001 (which is 17 written in binary notation), followed by the byte 00001100 (12 written in binary), followed by the byte 00011001 (25 written in binary). In summary, a 32-bit IP address might appear as 192.207.177.133 when expressed in dotted decimal notation. Addresses in bit-pattern form (even when compressed using dotted decimal notation) are rarely conducive to human consumption. For this reason the Internet has an alternative addressing system in which machines are identified by mnemonic names. This addressing system is based on the concept of a domain, which can be thought of as a “region” of the Internet operated by a single authority such as a university, club, company, or government agency. (The word region is in quotations here because, as we will soon see, such a region may not correspond to a physical area of the Internet.) Each domain must be registered with ICANN—a process handled by companies, called r­ egistrars, that have been assigned this role by ICANN. As a part of this registration process, the domain is assigned a mnemonic domain name, which is unique among all the domain names throughout the Internet. Domain names are often descriptive of the organization registering the domain, which enhances their utility for humans. As an example, the domain name of Marquette University is mu.edu. Note the suffix following the period. It is used to reflect the domain’s classification, which in this case is “educational” as indicated by the edu suffix. These suffixes are called top-level domains (TLDs). Other TLDs include com for commercial institutions, gov for U.S. government institutions, org for nonprofit organizations, museum for museums, info for unrestricted use, and net, which was originally intended for ISPs but is now used on a much broader scale. In addition to these general TLDs, there are also two-letter TLDs for specific countries (called country-code TLDs) such as au for Australia and ca for Canada. Once a domain’s mnemonic name is registered, the organization that registered the name is free to extend the name to obtain mnemonic identifiers for individual items within the domain. For example, an individual host within ­Marquette University may be identified as eagle.mu.edu. Note that domain names are extended to the left and separated by a period. In some cases multiple extensions, called subdomains, are used as a means of organizing the names within a domain. These subdomains often represent different networks within the domain’s jurisdiction. For example, if Yoyodyne Corporation was assigned the domain name yoyodyne.com, then an individual computer at Yoyodyne might have a name such as overthruster.propulsion.yoyodyne.com, meaning that

M04_BROO1160_12_SE_C04.indd 182

23/07/14 10:24 am

4.2  The Internet

183

the computer overthruster is in the subdomain propulsion within the domain yoyodyne within the TLD com. (We should emphasize that the dotted notation used in mnemonic addresses is not related to the dotted decimal notation used to represent addresses in bit pattern form.) Although mnemonic addresses are convenient for humans, messages are always transferred over the Internet by means of IP addresses. Thus, if a human wants to send a message to a distant machine and identifies the destination by means of a mnemonic address, the software being used must be able to convert that address into an IP address before transmitting the message. This conversion is performed with the aid of numerous servers, called name servers, that are essentially directories that provide address translation services to clients. Collectively, these name servers are used as an Internet-wide directory system known as the domain name system (DNS). The process of using DNS to perform a translation is called a DNS lookup. Thus, for a machine to be accessible by means of a mnemonic domain name, that name must be represented in a name server within the DNS. In those cases in which the entity establishing the domain has the resources, it can establish and maintain its own name server containing all the names within that domain. Indeed, this is the model on which the domain system was originally based. Each registered domain represented a physical region of the Internet that was operated by a local authority such as a company, university, or government agency. This authority was essentially an access ISP that provided Internet access to its members by means of its own intranet that was linked to the Internet. As part of this system, the organization maintained its own name server that provided translation services for all the names used within its domain. This model is still common today. However, many individuals or small organizations want to establish a domain presence on the Internet without committing the resources necessary to support it. For example, it might be beneficial for a local chess club to have a presence on the Internet as KingsandQueens.org, but the club would likely not have the resources to establish its own network, maintain a link from this network to the Internet, and implement its own name server. In this case, the club can contract with an access ISP to create the appearance of a registered domain using the resources already established by the ISP. Typically, the club, perhaps with the assistance of the ISP, registers the name chosen by the club and contracts with the ISP to have that name included in the ISP’s name server. This means that all DNS lookups regarding the new domain name will be directed to the ISP’s name server, from which the proper translation will be obtained. In this way, many registered domains can reside within a single ISP, each often occupying only a small portion of a single computer.

Internet Applications In the earlier days of the Internet, most applications were separate, simple programs that each followed a network protocol. A newsreader application contacted servers using the Network News Transfer Protocol (NNTP), an application for listing and copying files across the network implemented the File Transfer Protocol (FTP), or an application for accessing another computer from a great distance used the Telnet protocol, or later the Secure Shell (SSH) protocol. As webservers and browsers have become more sophisticated, more and more

M04_BROO1160_12_SE_C04.indd 183

23/07/14 10:24 am

184

Chapter 4  Networking and the Internet

of these traditional network applications have come to be handled by webpages via the powerful Hyper Text Transfer Protocol (HTTP). Nevertheless, when examining a network protocol for an Internet application for the first time, it behooves us to begin with a few simpler examples before moving on to HTTP in the next section. Electronic Mail  A wide variety of systems now exist for exchanging messages between end users over the network; instant messaging (IM), browser-based online chatting, Twitter-based “tweets”, and the Facebook “wall” are but a few. One of the oldest and most enduring uses of the Internet is the electronic mail system, or email for short. While many users now rely on their browser or a sophisticated application like Microsoft’s Outlook, Apple’s Mail, or Mozilla’s Thunderbird to read and compose their email, the actual transmission of email messages from one computer to another on the Internet remains the domain of basic network protocols like SMTP. SMTP (Simple Mail Transfer Protocol) defines a way that two computers on the network may interact when transmitting an email message from one host to the other. Consider the example case of a mail server mail.skaro.gov ­sending an email from end user “dalek” to end user “doctor” in the domain tardis.edu. First, a mail handling process on mail.skaro.gov contacts the mail server process on mail.tardis.edu. To accomplish this, it uses DNS, another network protocol, to map the human-readable destination domain name to the proper mail server name, and then to its IP address. This is not unlike looking up the phone number of an acquaintance before dialing. Similarly, when the server process at the other end answers, the protocol states that it must identify itself to the caller. The transcript of their SMTP exchange might look something like this: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

220 mail.tardis.edu SMTP Sendmail Gallifrey-1.0; Fri, 23 Aug 2413 14:34:10 HELO mail.skaro.gov 250 mail.tardis.edu Hello mail.skaro.gov, pleased to meet you MAIL From: [emailprotected] 250 2.1.0 [emailprotected] Sender ok RCPT To: [emailprotected] 250 2.1.5 [emailprotected] Recipient ok DATA 354 Enter mail, end with "." on a line by itself Subject: Extermination. EXTERMINATE! Regards, Dalek . 250 2.0.0 r7NJYAEl028071 Message accepted for delivery QUIT 221 2.0.0 mail.tardis.edu closing connection

In line 1, the remote mail server process answers the caller by announcing its name, the protocol it speaks, and other optional information, such as the version of protocol, and the date and time. In line 2, the sending mail server

M04_BROO1160_12_SE_C04.indd 184

23/07/14 10:24 am

4.2  The Internet

185

process introduces itself. In line 3, the remote server acknowledges the name of the sending server. Most Internet protocols are not necessarily transmitted in ASCII characters so easily interpreted by a human. To be sure, the quaint politeness of “pleased to meet you” in line 3 is neither appreciated by the software on either end of this connection, nor essential to SMTP’s proper function. However, this is actual behavior built into one popular SMTP mail server, held over from the early days of the Internet when human operators frequently needed to review SMTP transcripts to debug incompatibilities between mail servers. Untold millions of these exchanges occur on the network each day, known only to the software agents that transport email across the Internet. In the simplest case, the remote mail server will take mail.skaro.gov at its word in line 2, accepting that the sending server is the machine named mail from the domain skaro.gov. SMTP is an example of a protocol originally built on trust that has subsequently been abused by spammers and other Internet miscreants. Modern mail servers must use extended versions of SMTP or their equivalent to help ensure that email is transmitted securely. We discuss concerns about network security in greater detail in the final segment of this chapter. Returning to the transcript, in line 4 the sending server announces that it has a mail message to deliver, and identifies the sending user. In line 5, the remote server acknowledges that it will receive mail from this user at this domain. In line 6, the sending server announces the recipient on the remote server. In line 7, the remote server acknowledges that it will receive email destined for that user. In line 8, the sending server dispenses with the introductions, and announces that it is ready to send the DATA, the actual body of the e-mail message. In line 8, the remote server acknowledges (with code 354, in accordance with the SMTP protocol) that it is ready to receive the body of the message and includes a helpful human-readable instruction on how to conclude the message transfer. In lines 10 through 14, the sending server conveys the text of the email message to be delivered. The remote server acknowledges acceptance in line 15, and in line 17 acknowledges the sending server’s QUIT announcement from line 16. The technical documents describing SMTP define each of the allowed steps in a conversation such as the transcript above. The keywords HELO, MAIL, RCPT, DATA, and QUIT are each precisely defined in terms of how they will be sent, what options can accompany them, and how they should be interpreted. ­Similarly, the remote server’s numeric response codes for acknowledgment are enumerated and defined. Software designers use a protocol description to develop algorithms that will correctly implement sending and receiving email over the network. Other protocols come into play for other aspects of transporting email. Because SMTP was initially designed for transferring text messages encoded with ASCII, additional protocols such as MIME (Multipurpose Internet Mail Extensions) have been developed to convert non-ASCII data to SMTP compatible form. There are two popular protocols that may be used for accessing email that has arrived and accumulated at a user’s mail server. These are POP3 (Post Office Protocol version 3) and IMAP (Internet Mail Access Protocol). POP3 (pronounced “pop-THREE”) is the simpler of the two. Using POP3, a user transfers (downloads) messages to his or her local computer where they can be read, stored in various folders, edited, and otherwise manipulated as the user desires. This is done on the user’s local machine using the local machine’s mass storage.

M04_BROO1160_12_SE_C04.indd 185

23/07/14 10:24 am

186

Chapter 4  Networking and the Internet

IMAP(pronounced “EYE-map”) allows a user to store and manipulate messages and related materials on the same machine as the mail server. In this manner, a user who must access his or her email from different computers can maintain records at the mail server that are then accessible from any remote computer to which the user may have access. VoIP  As an example of a more recent Internet application, consider VoIP (Voice over Internet Protocol) in which the Internet infrastructure is used to provide voice communication similar to that of traditional telephone systems. In its simplest form, VoIP consists of two processes on different machines transferring audio data via the P2P model—a process that in itself presents no significant problems. However, tasks such as initiating and receiving calls, linking VoIP with traditional telephone systems, and providing services such as emergency 911 communication are issues that extend beyond traditional Internet applications. Moreover, governments that own their country’s traditional telephone companies view VoIP as a threat and have either taxed it heavily or outlawed it completely. Existing VoIP systems come in four different forms that are competing for popularity. VoIP soft phones consist of P2P software that allows two or more PCs to share a call with no more special hardware than a speaker and a microphone. An example of a VoIP soft phone system is Skype, which also provides its clients with links to the traditional telephone communication system. One drawback to Skype is that it is a proprietary system, and thus much of its operational structure is not publicly known. This means that Skype users must trust the integrity of the Skype software without third-party verification. For instance, to receive calls, a Skype user must leave his or her PC connected to the Internet and available to the Skype system, which means that some of the PC’s resources may be used to support other Skype communications without the PC owner’s awareness—a feature that has generated some resistance. A second form of VoIP consists of analog telephone adapters, which are devices that allow a user to connect his or her traditional telephone to phone service provided by an access ISP. This choice is frequently bundled with traditional Internet service and/or digital television service. The third type of VoIP comes in the form of embedded VoIP phones, which are devices that replace a traditional telephone with an equivalent handset connected directly to a TCP/IP network. Embedded VoIP phones are becoming increasingly common for large organizations, many of whom are replacing their traditional internal copper wire telephone systems with VoIP over Ethernet to reduce costs and enhance features. Finally, the current generation of smartphones use wireless VoIP technology. That is, earlier generations of wireless phones only communicated with the telephone company’s network using that company’s protocols. Access to the Internet was obtained by gateways between the company’s network and the Internet, at which point signals were converted to the TCP/IP system. However, the 4G phone network is an IP-based network throughout, which means a 4G telephone is essentially just another broadband-connected host computer on the global Internet. Internet Multimedia Streaming  An enormous portion of current Internet traffic is

used for transporting audio and video across the Internet in real-time, known as streaming. Netflix streamed more than 4 billion hours of programming to end users in the first three months of 2013 alone. Combined with YouTube,

M04_BROO1160_12_SE_C04.indd 186

23/07/14 10:24 am

4.2  The Internet

187

The Generations of Wireless Telephones Mobile phone technology has evolved rapidly since the first simple, handheld electronic units were introduced in the 1980s. An entirely new wave of phone technology has emerged roughly every 10 years since that time, leading up to our current complex, multifunction smartphones. The first generation wireless telephone network transmitted analog voice signals through the air, much like traditional telephones but without the copper wire running into the wall. In retrospect, we call these early phones “1G,” or first generation. The second generation used digital signals to encode voice, providing more effective use of the airwaves, and the transmission of other kinds of digital data, like text messaging. The third generation (“3G”) phone network provided higher data rates, allowing for mobile video calls and other bandwidth-intensive activities. The 4G network provides even higher data rates and a fully packet-switched IP network, which has allowed smartphones to enjoy the connectivity and flexibility previously available only to broadband-enabled PCs.

these two services will consume more than half of the bandwidth of the ­Internet in2014. On the surface, Internet streaming may not seem to require special consideration. For example, one might guess that an Internet radio station could merely establish a server that would send program messages to each of the clients who requested them. This technique is known as N-unicast. (More precisely, unicast refers to one sender sending messages to one receiver, whereas N-unicast refers to a single sender involved with multiple unicasts.) The N-unicast approach has been applied but has the drawback of placing a substantial burden on the station’s server as well as on the server’s immediate Internet neighbors. Indeed, N-unicast forces the server to send individual messages to each of its clients on a real-time basis, and all these messages must be forwarded by the server’s neighbors. Most alternatives to N-unicast represent attempts to alleviate this problem. One applies the P2P model in a manner reminiscent of file-sharing systems. That is, once a peer has received data, it begins to distribute that data to those peers that are still waiting, meaning that much of the distribution problem is transferred from the data’s source to the peers. Another alternative, called multicast, transfers the distribution problem to the Internet routers. Using multicast, a server transmits a message to multiple clients by means of a single address and relies on the routers in the Internet to recognize the significance of that address and to produce and forward copies of the message to the appropriate destinations. Note then that applications relying on multicast require that the functionality of the Internet routers be expanded beyond their original duties. Multicast support has been implemented in small networks, but has yet to expand to the global Internet. More importantly, most applications in this category are now on-demand streaming, in which the end user expects to view or listen to media at an arbitrary time of his or her choosing. This is quite a different problem from the Internet radio station example, because each end user expects to be able to start, pause, or rewind content at his or her own pace. In this case, N-unicast and multicast technologies are of little help. Each on-demand stream is effectively unicast from a media server that stores the content to the end user that wishes to retrieve it.

M04_BROO1160_12_SE_C04.indd 187

23/07/14 10:24 am

188

Chapter 4  Networking and the Internet

In order for this type of streaming to scale to thousands or even millions of simultaneous users, each with his or her own personal stream, replication of the content to many distinct servers is essential. Large-scale streaming services make use of content delivery networks (CDNs), groups of servers distributed strategically around the Internet that specialize in streaming copies of content to nearby end users in their network “neighborhood.” In many cases, CDN machines may reside in an access ISP network, allowing customers of that access ISP to stream copies of multimedia content at high speed from a nearby server that is much closer in the network than the streaming service’s central server machines. A networking technology called anycast, which enables an end user to automatically connect to the closest server out of a defined group of servers, helps to make CDNs practical. Internet streaming of high-definition, on-demand video has permeated far more than traditional PCs. A broad class of embedded devices such as televisions, DVD/Blu-ray players, smartphones, and game consoles connect directly to the TCP/IP network to select viewable content from a multitude of both free and subscription servers.

Questions & Exercises 1. What is the purpose of tier-1 and tier-2 ISPs? What is the purpose of access

ISPs? 2. What is DNS? 3. What bit pattern is represented by 3.6.9 in dotted decimal notation? Express the bit pattern 0001010100011100 using dotted decimal notation. 4. In what way is the structure of a mnemonic address of a computer on the Internet (such as overthruster.propulsion.yoyodyne.com) similar to a traditional postal address? Does this same structure occur in IP addresses? 5. Name three types of servers found on the Internet and tell what each does. 6. What aspects of network communication are described by a protocol? 7. In what way do the P2P and multicast approaches to Internet radio broadcast differ from N-unicast? 8. What criteria should one consider when choosing one of the four types of VoIP?

4.3  The World Wide Web The World Wide Web had its origins in the work of Tim Berners-Lee who realized the potential of combining internet technology with the concept of linkeddocuments, called hypertext. His first software for implementing the Web was released in December, 1990. While this early prototype did not yet support multimedia data, it included the key components of what we now recognize as the World Wide Web: a hypertext document format for embedding hyperlinks to

M04_BROO1160_12_SE_C04.indd 188

23/07/14 10:24 am

4.3  The World Wide Web

189

other documents; a protocol for transferring hypertext across the network, and a server process that supplied hypertext pages upon request. From this humble beginning, the Web quickly grew to support images, audio and video, and by the mid-1990s had become the dominant application powering the growth of the Internet.

Web Implementation Software packages that allow users to access hypertext on the Internet fall into one of two categories: browsers and webservers. A browser resides on the user’s computer and is charged with the tasks of obtaining materials requested by the user and presenting these materials to the user in an organized manner. Common Internet browsers include Firefox, Safari, and Internet Explorer. The webserver resides on a computer containing hypertext documents to be accessed. Its task is to provide access to the documents under its control as requested by clients (browsers). Hypertext documents are normally transferred between browsers and webservers using a protocol known as the Hypertext Transfer Protocol (HTTP). In order to locate and retrieve documents on the Web, each document is given a unique address called a Uniform Resource Locator (URL). Each URL contains the information needed by a browser to contact the proper server and request the desired document. Thus to view a webpage, a person first provides his or her browser with the URL of the desired document and then instructs the browser to retrieve and display the document. A typical URL is presented in Figure4.8. It consists of four segments: the protocol to use to communicate with the server controlling access to the document, the mnemonic address of the machine containing the server, the directory path needed for the server to find the directory containing the document, and the name of the document itself. In short, the URL in Figure4.8 tells a browser to contact the webserver on the computer known as eagle.mu.edu using the protocol HTTP and to retrieve the document named Julius_Caesar.html found within the subdirectory Shakespeare within the directory called authors. Sometimes a URL might not explicitly contain all the segments shown in Figure4.8. For example, if the server does not need to follow a directory path

Figure 4.8   A typical URL http://eagle.mu.edu/authors/Shakespeare/Julius_Caesar.html

Mnemonic name of host holding the document Protocol required to access the document. In this case it is hypertext transfer protocol (http).

M04_BROO1160_12_SE_C04.indd 189

Document name Directory path indicating the location of the document within the host's file system

23/07/14 10:24 am

190

Chapter 4  Networking and the Internet

to reach the document, no directory path will appear in the URL. Moreover, sometimes a URL will consist of only a protocol and the mnemonic address of a computer. In these cases, the webserver at that computer will return a predetermined document, typically called a home page, that usually describes the information available at that website. Such shortened URLs provide a simple means of contacting organizations. For example, the URL http://www.google.com will lead to the home page of Google, which contains hyperlinks to the services, products, and documents relating to the company. To further simplify locating websites, many browsers assume that the HTTP protocol should be used if no protocol is identified. These browsers correctly retrieve the Google home page when given the “URL” consisting merely of www​ .google.com.

HTML A traditional hypertext document is similar to a text file because its text is encoded character by character using a system such as ASCII or Unicode. The distinction is that a hypertext document also contains special symbols, called tags, that describe how the document should appear on a display screen, what multimedia resources (such as images) should accompany the document, and which items within the document are linked to other documents. This system of tags is known as Hypertext Markup Language (HTML). Thus, it is in terms of HTML that an author of a webpage describes the information that a browser needs in order to present the page on the user’s screen and to find any related documents referenced by the current page. The process is analogous to adding typesetting directions to a plain typed text (perhaps using a red pen) so that a typesetter will know how the material should appear in its final form. In the case of hypertext, the red markings are replaced by HTML tags, and a browser ultimately plays the role of the typesetter, reading the HTML tags to learn how the text is to be presented on the computer screen. The HTML-encoded version (called the source version) of an extremely simple webpage is shown in Figure4.9a. Note that the tags are delineated by the symbols . The HTML source document consists of two sections—a head (surrounded by the and tags) and a body (surrounded by the and tags). The distinction between the head and body of a webpage is similar to that of the head and body of an interoffice memo. In both cases, the head contains preliminary information about the document (date, subject,

The World Wide Web Consortium The World Wide Web Consortium (W3C) was formed in 1994 to promote the World Wide Web by developing protocol standards (known as W3C standards). W3C is headquartered at CERN, the high-energy particle physics laboratory in Geneva, Switzerland. CERN is where the original HTML markup language was developed as well as the HTTP protocol for transferring HTML documents over the Internet. Today W3C is the source of many standards (including standards for XML and numerous multimedia applications) that lead to compatibility over a wide range of Internet products. You can learn more about W3C via its website at http://www.w3c.org.

M04_BROO1160_12_SE_C04.indd 190

23/07/14 10:24 am

4.3  The World Wide Web

191

etc. in the case of a memo). The body contains the meat of the document, which in the case of a webpage is the material to be presented on the computer screen when the page is displayed. The head of the webpage displayed in Figure4.9a contains only the title of the document (surrounded by “title” tags). This title is only for documentation purposes; it is not part of the page that is to be displayed on the computer screen. The material that is displayed on the screen is contained in the body of the document. The first entry in the body of the document in Figure4.9a is a level-one heading (surrounded by the and tags) containing the text “My Web Page.” Being a level-one heading means that the browser should display this text prominently on the screen. The next entry in the body is a paragraph of text (surrounded by the

and

tags) containing the text “Click here for another page.” Figure4.9b shows the page as it would be presented on a computer screen by a browser. In its present form, the page in Figure4.9 is not fully functional in the sense that nothing will happen when the viewer clicks on the word here, Figure 4.9   A simple webpage a. The page encoded using HTML.

Tag indicating beginning of document

Preliminaries

demonstration page

The part of the document that will be displayed by a browser

My Web Page

Click here for another page.

Tag indicating end of document

b. The page as it would appear on a computer screen.

My Web Page Click here for another page.

M04_BROO1160_12_SE_C04.indd 191

23/07/14 10:24 am

192

Chapter 4  Networking and the Internet

even though the page implies that doing so will cause the browser to display another page. To cause the appropriate action, we must link the word here to another document. Let us suppose that, when the word here is clicked, we want the browser to retrieve and display the page at the URL http://crafty.com/demo.html. To do so, we must first surround the word here in the source version of the page with the tags and , which are called anchor tags. Inside the opening anchor tag we insert the parameter href = http://crafty.com/demo.html

(as shown in Figure4.10a) indicating that the hypertext reference (href) ­associated with the tag is the URL following the equal sign (http://crafty.com/demo.html). Having added the anchor tags, the webpage will now appear on a computer screen as shown in Figure4.10b. Note that this is identical to Figure4.9b except that the word here is highlighted by color indicating that it is a link to another webpage. Clicking on such highlighted terms will cause the browser to retrieve and display the associated webpage. Thus, it is by means of anchor tags that webpages are linked to each other. Finally, we should indicate how an image could be included in our simple webpage. For this purpose, let us suppose that a JPEG encoding of the image we want to include is stored as the file named OurPic.jpg in the directory Images at Images.com and is available via the webserver at that location. Under these conditions, we can tell a browser to display the image at the top of the webpage by inserting the image tag immediately after the tag in the HTML source document. This tells the browser that the image named OurPic.jpg should be displayed at the beginning of the document. (The term src is short for “source,” meaning that the information following the equal sign indicates the source of the image to be displayed.) When the browser finds this tag, it will send a message to the HTTP server at Images​ .com requesting the image called OurPic.jpg and then display the image appropriately. If we moved the image tag to the end of the document just before the tag, then the browser would display the image at the bottom of the webpage. There are, of course, more sophisticated techniques for positioning an image on a webpage, but these need not concern us now.

XML HTML is essentially a notational system by which a text document along with the document’s appearance can be encoded as a simple text file. In a similar manner we can also encode nontextual material as text files—an example being sheet music. At first glance the pattern of staffs, measure bars, and notes in which music is traditionally represented does not conform to the character-­bycharacter format dictated by text files. However, we can overcome this problem by developing an alternative notation system. More precisely, we could agree to represent the start of a staff by , the end of the staff by , a time signature with the form 2/4 , the beginning and ending of a measure by and , respectively, a

M04_BROO1160_12_SE_C04.indd 192

23/07/14 10:24 am

4.3  The World Wide Web

193

Figure 4.10   An enhanced simple webpage a. The page encoded using HTML.

demonstration page

My Web Page Anchor tag containing parameter Closing anchor tag

Click

here

for another page.

b. The page as it would appear on a computer screen.

My Web Page Click here for another page.

note such as an eighth note on C as egth C , and so on. Then the text C minor 2/4 egth egth G, egth G, egth G hlf E

could be used to encode the music shown in Figure4.11. Using such notation, sheet music could be encoded, modified, stored, and transferred over the Internet as text files. Moreover, software could be written to present the contents of such files in the form of traditional sheet music or even to play the music on a synthesizer.

M04_BROO1160_12_SE_C04.indd 193

23/07/14 10:24 am

194

Chapter 4  Networking and the Internet

Figure 4.11   The first two bars of Beethoven’s Fifth Symphony

Note that our sheet music encoding system encompasses the same style used by HTML. We chose to delineate the tags that identify components by the symbols . We chose to indicate the beginning and end of structures (such as a staff, string of notes, or measure) by tags of the same name—the ending tag being designated by a slash (a was terminated with the tag ). And we chose to indicate special attributes within tags by expressions such as clef = "treble". This same style could also be used to develop systems for representing other formats such as mathematical expressions and graphics. The eXtensible Markup Language (XML) is a standardized style (similar to that of our music example) for designing notational systems for representing data as text files. (Actually, XML is a simplified derivative of an older set of standards called the Standard Generalized Markup Language, better known as SGML.) Following the XML standard, notational systems called markup languages have been developed for representing mathematics, multimedia presentations, and music. In fact, HTML is the markup language based on the XML standard that was developed for representing webpages. (Actually, the original version of HTML was developed before the XML standard was solidified, and therefore some features of HTML do not strictly conform to XML. That is why you might see references to XHTML, which is the version of HTML that rigorously adheres to XML.) XML provides a good example of how standards are designed to have wideranging applications. Rather than designing individual, unrelated markup languages for encoding various types of documents, the approach represented by XML is to develop a standard for markup languages in general. With this standard, markup languages can be developed for various applications. Markup languages developed in this manner possess a uniformity that allows them to be combined to obtain markup languages for complex applications such as text documents that contain segments of sheet music and mathematical expressions. Finally, we should note that XML allows the development of new markup languages that differ from HTML in that they emphasize semantics rather than appearance. For example, with HTML the ingredients in a recipe can be marked so that they appear as a list in which each ingredient is positioned on a separate line. But if we used semantic-oriented tags, ingredients in a recipe could be marked as ingredients (perhaps using the tags and ­) rather than merely items in a list. The difference is subtle but important. The semantic approach would allow search engines (websites that assist users in locating Web material pertaining to a subject of interest) to identify recipes that contain or do not contain certain ingredients, which would be a substantial improvement over the current state of the art in which only recipes that do or do not contain certain words can be isolated. More precisely, if semantic tags are used, a search engine can identify recipes for lasagna that do not contain spinach, whereas a similar search based merely on word content would skip over a recipe that

M04_BROO1160_12_SE_C04.indd 194

23/07/14 10:24 am

4.3  The World Wide Web

195

started with the statement “This lasagna does not contain spinach.” In turn, by using an Internet-wide standard for marking documents according to semantics rather than appearance, a World Wide Semantic Web, rather than the World Wide Syntactic Web we have today, would be created.

Client-Side and Server-Side Activities Consider now the steps that would be required for a browser to retrieve the simple webpage shown in Figure4.10 and display it on the browser’s computer screen. First, playing the role of a client, the browser would use the information in a URL (perhaps obtained from the person using the browser) to contact the webserver controlling access to the page and ask that a copy of the page be transferred to it. The server would respond by sending the text document displayed in Figure4.10a to the browser. The browser would then interpret the HTML tags in the document to determine how the page should be displayed and present the document on its computer screen accordingly. The user of the browser would see an image like that depicted in Figure4.10b. If the user then clicked the mouse over the word here, the browser would use the URL in the associated anchor tag to contact the appropriate server to obtain and display another webpage. In summary, the process consists of the browser merely fetching and displaying webpages as directed by the user. But what if we wanted a webpage involving animation or one that allows a customer to fill out an order form and submit the order? These needs would require additional activity by either the browser or the webserver. Such activities are called client-side activities if they are performed by a client (such as a browser) or server-side activities if they are performed by a server (such as a webserver). As an example, suppose a travel agent wanted customers to be able to identify desired destinations and dates of travel, at which time the agent would present the customer with a customized webpage containing only the information pertinent to that customer’s needs. In this case the travel agent’s website would first provide a webpage that presents a customer with the available destinations. On the basis of this information, the customer would specify the destinations of interest and desired dates of travel (a client-side activity). This information would then be transferred back to the agent’s server where it would be used to construct the appropriate customized webpage (a server-side activity), which would then be sent to the customer’s browser. Another example occurs when using the services of a search engine. In this case a user at the client specifies a topic of interest (a client-side activity), which is then transferred to the search engine where a customized webpage identifying documents of possible interest is constructed (a server-side activity) and sent back to the client. Still another example occurs in the case of Web mail—an increasingly popular means by which computer users are able to access their email by means of Web browsers. In this case, the webserver is an intermediary between the client and the client’s mail server. Essentially, the webserver builds webpages that contain information from the mail server (a server-side activity) and sends those pages to the client where the client’s browser displays them (a client-side activity). Conversely, the browser allows the user to create messages (a client-side activity) and sends that information to the webserver, which then forwards the messages to the mail server (a server-side activity) for mailing. There are numerous systems for performing client- and server-side activities, each competing with the others for prominence. An early and still popular means

M04_BROO1160_12_SE_C04.indd 195

23/07/14 10:24 am

196

Chapter 4  Networking and the Internet

of controlling client-side activities is to include programs written in the language JavaScript (developed by Netscape Communications, Inc.) within the HTML source document for the webpage. From there a browser can extract the programs and follow them as needed. Another approach (developed by Sun Microsystems) is to first transfer a webpage to a browser and then transfer additional program units called applets (written in the language Java) to the browser as requested within the HTML source document. Still another approach is the system Flash (developed by Macromedia) by which extensive multimedia client-side presentations can be implemented. An early means of controlling server-side activities was to use a set of standards called CGI (Common Gateway Interface) by which clients could request the execution of programs stored at a server. A variation of this approach (developed by Sun Microsystems) is to allow clients to cause program units called servlets to be executed at the server side. A simplified version of the servlet approach is applicable when the requested server-side activity is the construction of a customized webpage, as in our travel agent example. In this case webpage templates called JavaServer Pages (JSP) are stored at the webserver and completed using information received from a client. A similar approach is used by Microsoft, where the templates from which customized webpages are constructed are called Active Server Pages (ASP). In contrast to these proprietary systems, PHP (originally standing for Personal Home Page but now considered to mean PHP Hypertext Preprocessor) is an open source system for implementing server-side functionality. Finally, we would be remiss if we did not recognize the security and ethical problems that arise from allowing clients and servers to execute programs on the other’s machine. The fact that webservers routinely transfer programs to clients where they are executed leads to ethical questions on the server side and security questions on the client side. If the client blindly executes any program sent to it by a webserver, it opens itself to malicious activities by the server. Likewise, the fact that clients can cause programs to be executed at the server leads to ethical questions on the client side and security questions on the server side. If the server blindly executes any program sent to it by a client, security breaches and potential damage at the server could result.

Questions & Exercises 1. What is a URL? What is a browser? 2. What is a markup language? 3. What is the difference between HTML and XML? 4. What is the purpose of each of the following HTML tags? a.

b.

c. d.

5. To what do the terms client side and server side refer?

M04_BROO1160_12_SE_C04.indd 196

23/07/14 10:24 am

4.4  Internet Protocols

197

4.4  Internet Protocols In this section we investigate how messages are transferred over the Internet. This transfer process requires the cooperation of all the computers in the system, and therefore software for controlling this process resides on every computer in the Internet. We begin by studying the overall structure of this software.

The Layered Approach to Internet Software A principal task of networking software is to provide the infrastructure required for transferring messages from one machine to another. In the Internet, this message-passing activity is accomplished by means of a hierarchy of software units, which perform tasks analogous to those that would be performed if you were to send a gift in a package from the West Coast of the United States to a friend on the East Coast (Figure4.12). You would first wrap the gift as a package and write the appropriate address on the outside of the package. Then, you would take the package to a shipping company such as the U.S. Postal Service. The shipping company might place the package along with others in a large container and deliver the container to an airline, whose services it has contracted. The airline would place the container in an aircraft and transfer it to the destination city, perhaps with intermediate stops along the way. At the final destination, the airline would remove the container from the aircraft and give it to the shipping company’s office at the destination. In turn, the shipping company would take your package out of the container and deliver it to the addressee. In short, the transportation of the gift would be carried out by a three-level hierarchy: (1) the user level (consisting of you and your friend), (2) the shipping company, and (3) the airline. Each level uses the next lower level as an abstract tool. (You are not concerned with the details of the shipping company, and the shipping company is not concerned with the internal operations of the airline.) Each level in the hierarchy has representatives at both the origin and the Figure 4.12   Package-shipping example Origin

Final destination

You

Friend

Places package in container for airline

Shipping company

Shipping company

Places container in airplane

Airline

Prepares package for shipping

Intermediate stops

Airline

Airline

Airline

Receives and opens package

Removes package from container and delivers it to addressee Sends container to shipping company

Transfers container to another airplane

M04_BROO1160_12_SE_C04.indd 197

23/07/14 10:24 am

198

Chapter 4  Networking and the Internet

destination, with the representatives at the destination tending to do the reverse of their counterparts at the origin. Such is the case with software for controlling communication over the Internet, except that the Internet software has four layers rather than three, each consisting of a collection of software routines rather than people and businesses. The four layers are known as the application layer, the transport layer, the network layer, and the link layer (Figure4.13). A message typically originates in the application layer. From there it is passed down through the transport and network layers as it is prepared for transmission, and finally it is transmitted by the link layer. The message is received by the link layer at the destination and passed back up the hierarchy until it is delivered to the application layer at the message’s destination. Let us investigate this process more thoroughly by tracing a message as it finds its way through the system (Figure4.14). We begin our journey with the application layer. The application layer consists of those software units such as clients and servers that use Internet communication to carry out their tasks. Although the names are similar, this layer is not restricted to software in the application classification presented in Section3.2, but also includes many utility packages. For example, software for transferring files using FTP or for providing remote login capabilities using SSH have become so common that they are normally considered utility software. The application layer uses the transport layer to send and receive messages over the Internet in much the same way that you would use a shipping company to send and receive packages. Just as it is your responsibility to provide an address compatible with the specifications of the shipping company, it is the application layer’s responsibility to provide an address that is compatible with the Internet infrastructure. To fulfill this need, the application layer may use the services of the name servers within the Internet to translate mnemonic addresses used by humans into Internet-compatible IP addresses.

Figure 4.13   The Internet software layers

Application

Transport

Network

Link

M04_BROO1160_12_SE_C04.indd 198

23/07/14 10:24 am

4.4  Internet Protocols

199

Figure 4.14   Following a message through the Internet

At each intermediate stop the network layer determines the direction in which the packet should be forwarded.

Prepares message and provides destination address

Application

Application

Transport

Transport

Chops message into packets

Assigns intermediate address to each packet

Transfers packet

Origin

Network

Network

Network

Network

Link

Link

Link

Link

Intermediate stops

Receives message

Collects packets and reassembles message

Detects that packet has reached its final destination

Receives packet

Final destination

An important task of the transport layer is to accept messages from the application layer and to ensure that the messages are properly formatted for transmission over the Internet. Toward this latter goal, the transport layer divides long messages into small segments, which are transmitted over the Internet as individual units. This division is necessary because a single long message can obstruct the flow of other messages at the Internet routers where numerous messages cross paths. Indeed, small segments of messages can interweave at these points, whereas a long message forces others to wait while it passes (much like cars waiting for a long train to pass at a railroad crossing). The transport layer adds sequence numbers to the small segments it produces so that the segments can be reassembled at the message’s destination. Then it hands these segments, known as packets, to the network layer. From this point, the packets are treated as individual, unrelated messages until they reach the transport layer at their final destination. It is quite possible for the packets related to a common message to follow different paths through the Internet. It is the network layer’s job to decide in which direction a packet should be sent at each step along the packet’s path through the Internet. In fact, the

M04_BROO1160_12_SE_C04.indd 199

23/07/14 10:24 am

200

Chapter 4  Networking and the Internet

combination of the network layer and the link layer below it constitutes the software residing on the Internet routers. The network layer is in charge of maintaining the router’s forwarding table and using that table to determine the direction in which to forward packets. The link layer at the router is in charge of receiving and transmitting the packets. Thus, when the network layer at a packet’s origin receives the packet from the transport layer, it uses its forwarding table to determine where the packet should be sent to get it started on its journey. Having determined the proper direction, the network layer hands the packet to the link layer for actual transmission. The link layer has the responsibility of transferring the packet. Thus the link layer must deal with the communication details particular to the individual network in which the computer resides. For instance, if that network is an Ethernet, the link layer applies CSMA/CD. If the network is a WiFi network, the link layer applies CSMA/CA. When a packet is transmitted, it is received by the link layer at the other end of the connection. There, the link layer hands the packet up to its network layer where the packet’s final destination is compared to the network layer’s forwarding table to determine the direction of the packet’s next step. With this decision made, the network layer returns the packet to the link layer to be forwarded along its way. In this manner each packet hops from machine to machine on its way to its final destination. Note that only the link and network layers are involved at the intermediate stops during this journey (see again Figure4.14), and thus these are the only layers present on routers, as previously noted. Moreover, to minimize the delay at each of these intermediate “stops,” the forwarding role of the network layer within a router is closely integrated with the link layer. In turn, the time required for a modern router to forward a packet is measured in millionths of a second. At a packet’s final destination, it is the network layer that recognizes that the packet’s journey is complete. In that case the network layer hands the packet to its transport layer rather than forwarding it. As the transport layer receives packets from the network layer, it extracts the underlying message segments and reconstructs the original message according to the sequence numbers that were provided by the transport layer at the message’s origin. Once the message is assembled, the transport layer hands it to the appropriate unit within the application layer—thus completing the message transmission process. Determining which unit within the application layer should receive an incoming message is an important task of the transport layer. This is handled by assigning unique port numbers (not related to the I/O ports discussed in Chapter2) to the various units and requiring that the appropriate port number be appended to a message’s address before starting the message on its journey. Then, once the message is received by the transport layer at the destination, the transport layer merely hands the message to the application layer software at the designated port number. Users of the Internet rarely need to be concerned with port numbers because the common applications have universally accepted port numbers. For example, if a Web browser is asked to retrieve the document whose URL is http://www​ .zoo.org/animals/frog.html, the browser assumes that it should contact the HTTP server at www.zoo.org via port number 80. Likewise, when sending email, an SMTP client assumes that it should communicate with the SMTP mail server through port number 25.

M04_BROO1160_12_SE_C04.indd 200

23/07/14 10:24 am

4.4  Internet Protocols

201

In summary, communication over the Internet involves the interaction of four layers of software. The application layer deals with messages from the application’s point of view. The transport layer converts these messages into segments that are compatible with the Internet and reassembles messages that are received before delivering them to the appropriate application. The network layer deals with directing the segments through the Internet. The link layer handles the actual transmission of segments from one machine to another. With all this activity, it is somewhat amazing that the response time of the Internet is measured in milliseconds, so that many transactions appear to take place instantaneously.

The TCP/IP Protocol Suite The demand for open networks has generated a need for published standards by which manufacturers can supply equipment and software that function properly with products from other vendors. One standard that has resulted is the Open System Interconnection (OSI) reference model, produced by the International Organization for Standardization. This standard is based on a seven-level hierarchy as opposed to the four-level hierarchy we have just described. It is an often-quoted model because it carries the authority of an international organization, but it has been slow to replace the four-level point of view, mainly because it was established after the four-level hierarchy had already become the de facto standard for the Internet. The TCP/IP protocol suite is a collection of protocol standards used by the Internet to implement the four-level communication hierarchy. Actually, the Transmission Control Protocol (TCP) and the Internet Protocol (IP) are the names of only two of the protocols in this vast collection—so the fact that the entire collection is referred to as the TCP/IP protocol suite is rather misleading. More precisely, TCP defines a version of the transport layer. We say a version because the TCP/IP protocol suite provides for more than one way of implementing the transport layer; one of the other options is defined by the User Datagram Protocol (UDP). This diversity is analogous to the fact that when shipping a package, you have a choice of different shipping companies, each of which offers the same basic service but with its own unique characteristics. Thus, depending on the particular quality of service required, a unit within the application layer might choose to send data via a TCP or UDP version of the transport layer (Figure4.15). There are several differences between TCP and UDP. One is that before sending a message as requested by the application layer, a transport layer based on TCP sends its own message to the transport layer at the destination telling it that a message is about to be sent. It then waits for this message to be acknowledged before starting to send the application layer’s message. In this manner, a TCP transport layer is said to establish a connection before sending a message. A transport layer based on UDP does not establish such a connection prior to sending a message. It merely sends the message to the address it was given and forgets about it. For all it knows, the destination computer might not even be operational. For this reason, UDP is called a connectionless protocol. Another difference between TCP and UDP is that TCP transport layers at the origin and destination work together by means of acknowledgments and packet retransmissions to assure that all segments of a message are successfully transferred to the destination. For this reason TCP is called a reliable protocol, whereas UDP, which does not offer such retransmission services, is said to be an unreliable protocol.

M04_BROO1160_12_SE_C04.indd 201

23/07/14 10:24 am

202

Chapter 4  Networking and the Internet

Figure 4.15   Choosing between TCP and UDP Application layer

? Transport layer TCP

UDP

More “reliable” but less efficient

More efficient but less “reliable”

Still another distinction between TCP and UDP is that TCP provides for both flow control, meaning that a TCP transport layer at a message’s origin can reduce the rate at which it transmits segments to keep from overwhelming its counterpart at the destination, as well as congestion control, meaning that a TCP transport layer at a message’s origin can adjust its transmission rate to alleviate congestion between it and the message’s destination. All this does not mean that UDP is a poor choice. After all, a transport layer based on UDP is more streamlined than a layer based on TCP, and thus if an application is prepared to handle the potential consequences of UDP, that option might be the better choice. For example, the efficiency of UDP makes it the protocol of choice for DNS lookups and VoIP. However, because email is less time sensitive, mail servers use TCP to transfer email. IP is the Internet’s standard for implementing the tasks assigned to the network layer. We have already observed that this task consists of forwarding, which involves relaying packets through the Internet, and routing, which involves updating the layer’s forwarding table to reflect changing conditions. For instance, a router may malfunction, meaning that traffic should no longer be forwarded in its direction, or a section of the Internet may become congested, meaning that traffic should be routed around the blockage. Much of the IP standard associated with routing deals with the protocols used for communication among neighboring network layers as they interchange routing information. An interesting feature associated with forwarding is that each time an IP network layer at a message’s origin prepares a packet, it appends a value called a hop count, or time to live, to that packet. This value is a limit to the number of times the packet should be forwarded as it tries to find its way through the Internet. Each time an IP network layer forwards a packet, it decrements that packet’s hop count by one. With this information, the network layer can protect the Internet from packets circling endlessly within the system. Although the Internet continues to grow on a daily basis, an initial hop count of 64 remains more than sufficient to allow a packet to find its way through the maze of routers within today’s ISPs. For years a version of IP known as IPv4 (IP version four) has been used for implementing the network layer within the Internet. However, the Internet is

M04_BROO1160_12_SE_C04.indd 202

23/07/14 10:24 am

4.5 Security

203

rapidly outgrowing the 32-bit internet addressing system dictated by IPv4. To solve this problem as well as to implement other improvements such as multicast, a new version of IP known as IPv6, which uses internet addresses consisting of 128 bits, has been established. The process of converting from IPv4 to IPv6 is currently underway—this is the conversion that was alluded to in our introduction of Internet addresses in Section4.2—and it is expected that the use of 32-bit addresses within the Internet will be extinct by 2025.

Questions & Exercises 1. What layers of the Internet software hierarchy are not needed at a router? 2. What are some differences between a transport layer based on the TCP

protocol and another based on the UDP protocol? 3. How does the transport layer determine which unit with the application

layer should receive an incoming message? 4. What keeps a computer on the Internet from recording copies of all the messages passing through it?

4.5  Security When a computer is connected to a network, it becomes subject to unauthorized access and vandalism. In this section we address topics associated with these problems.

Forms of Attack There are numerous ways that a computer system and its contents can be attacked via network connections. Many of these incorporate the use of malicious software (collectively called malware). Such software might be transferred to, and executed on, the computer itself, or it might attack the computer from a distance. Examples of software that is transferred to, and executed on, the computer under

The Computer Emergency Response Team In November 1988 a worm released into the Internet caused significant disruption of service. Consequently, the U.S. Defense Advanced Research Projects Agency (DARPA—pronounced “DAR–pa”) formed the Computer Emergency Response Team (CERT—pronounced “SERT”), located at the CERT Coordination Center at CarnegieMellon University. The CERT is the Internet’s security “watchdog.” Among its duties are the investigation of security problems, the issuance of security alerts, and the implementation of public awareness campaigns to improve Internet security. The CERT Coordination Center maintains a website at http://www.cert.org where it posts notices of its activities.

M04_BROO1160_12_SE_C04.indd 203

23/07/14 10:24 am

204

Chapter 4  Networking and the Internet

attack include viruses, worms, Trojan horses, and spyware, whose names reflect the primary characteristic of the software. A virus is software that infects a computer by inserting itself into programs that already reside in the machine. Then, when the “host” program is executed, the virus is also executed. When executed, many viruses do little more than try to transfer themselves to other programs within the computer. Some viruses, however, perform devastating actions such as degrading portions of the operating system, erasing large blocks of mass storage, or otherwise corrupting data and other programs. A worm is an autonomous program that transfers itself through a network, taking up residence in computers and forwarding copies of itself to other computers. As in the case of a virus, a worm can be designed merely to replicate itself or to perform more extreme vandalism. A characteristic consequence of a worm is an explosion of the worm’s replicated copies that degrades the performance of legitimate applications and can ultimately overload an entire network or internet. A Trojan horse is a program that enters a computer system disguised as a desirable program, such as a game or useful utility package, that is willingly imported by the victim. Once in the computer, however, the Trojan horse performs additional activities that might have harmful effects. Sometimes these additional activities start immediately. In other instances, the Trojan horse might lie dormant until triggered by a specific event such as the occurrence of a preselected date. Trojan horses often arrive in the form of attachments to enticing email messages. When the attachment is opened (that is, when the recipient asks to view the attachment), the misdeeds of the Trojan horse are activated. Thus, email attachments from unknown sources should never be opened. Another form of malicious software is spyware (sometimes called sniffing software), which is software that collects information about activities at the computer on which it resides and reports that information back to the instigator of the attack. Some companies use spyware as a means of building customer profiles, and in this context, it has questionable ethical merit. In other cases, spyware is used for blatantly malicious purposes such as recording the symbol sequences typed at the computer’s keyboard in search of passwords or credit card numbers. As opposed to obtaining information secretly by sniffing via spyware, phishing is a technique of obtaining information explicitly by simply asking for it. The term phishing is a play on the word fishing because the process involved is to cast numerous “lines” in hopes that someone will “take the bait.” Phishing is often carried out via email, and in this form, it is little more than an old telephone con. The perpetrator sends email messages posing as a financial institution, a government bureau, or perhaps a law enforcement agency. The email asks the potential victim for information that is supposedly needed for legitimate purposes. However, the information obtained is used by the perpetrator for hostile purposes. In contrast to suffering from such internal infections as viruses and spyware, a computer in a network can also be attacked by software being executed on other computers in the system. An example is a denial of service (DoS) attack, which is the process of overloading a computer with messages. Denial of service attacks have been launched against large commercial webservers on the Internet to disrupt the company’s business and in some cases have brought the company’s commercial activity to a halt. A denial of service attack requires the generation of a large number of messages over a brief period of time. To accomplish this, an attacker usually plants

M04_BROO1160_12_SE_C04.indd 204

23/07/14 10:24 am

4.5 Security

205

software on numerous unsuspecting computers that will generate messages when a signal is given. Then, when the signal is given, all of these computers (sometimes called a botnet) swamp the target with messages. Inherent, then, in denial of service attacks is the availability of unsuspecting computers to use as accomplices. This is why all PC users are discouraged from leaving their computers connected to the Internet when not in use. It has been estimated that once a PC is connected to the Internet, at least one intruder will attempt to exploit its existence within 20 minutes. In turn, an unprotected PC represents a significant threat to the integrity of the Internet. Another problem associated with an abundance of unwanted messages is the proliferation of unwanted junk email, called spam. However, unlike a denial of service attack, the volume of spam is rarely sufficient to overwhelm the computer system. Instead, the effect of spam is to overwhelm the person receiving the spam. This problem is compounded by the fact that, as we have already seen, spam is a widely adopted medium for phishing and instigating Trojan horses that might spread viruses and other detrimental software.

Protection and Cures The old adage “an ounce of prevention is worth a pound of cure” is certainly true in the context of controlling vandalism over network connections. A primary prevention technique is to filter traffic passing through a point in the network, usually with a program called a firewall. For instance, a firewall might be installed at the gateway of an organization’s intranet to filter messages passing in and out of the region. Such firewalls might be designed to block outgoing messages with certain destination addresses or to block incoming messages from origins that are known to be sources of trouble. This latter function is a tool for terminating a denial of service attack because it provides a means of blocking traffic from the attacking computers. Another common role of a firewall at a gateway is to block all incoming messages that have origin addresses within the region accessed through the gateway because such a message would indicate that an outsider is pretending to be a member of the inside region. Masquerading as a party other than one’s self is known as spoofing. Firewalls are also used to protect individual computers rather than entire networks or domains. For example, if a computer is not being used as a webserver, a name server, or an email server, then a firewall should be installed at that computer to block all incoming traffic addressed to such applications. Indeed, one way an intruder might gain entry to a computer is by establishing contact through a “hole” left by a nonexistent server. In particular, one method for retrieving information gathered by spyware is to establish a clandestine server on the infected computer by which malicious clients can retrieve the spyware’s findings. A properly installed firewall could block the messages from these malicious clients. Some variations of firewalls are designed for specific purposes—an example being spam filters, which are firewalls designed to block unwanted email. Many spam filters use rather sophisticated techniques to distinguish between desirable email and spam. Some learn to make this distinction via a training process in which the user identifies items of spam until the filter acquires enough examples to make decisions on its own. These filters are examples of how a variety of subject areas (probability theory, artificial intelligence, etc.) can jointly contribute to developments in other fields.

M04_BROO1160_12_SE_C04.indd 205

23/07/14 10:24 am

206

Chapter 4  Networking and the Internet

Another preventative tool that has filtering connotations is the proxy server. A proxy server is a software unit that acts as an intermediary between a client and a server with the goal of shielding the client from adverse actions of the server. Without a proxy server, a client communicates directly with a server, meaning that the server has an opportunity to learn a certain amount about the client. Over time, as many clients within an organization’s intranet deal with a distant server, that server can collect a multitude of information about the intranet’s internal structure—information that can later be used for malicious activity. To counter this, an organization can establish a proxy server for a particular kind of service (FTP, HTTP, telnet, etc.). Then, each time a client within the intranet tries to contact a server of that type, the client is actually placed in contact with the proxy server. In turn, the proxy server, playing the role of a client, contacts the actual server. From then on the proxy server plays the role of an intermediary between the actual client and the actual server by relaying messages back and forth. The first advantage of this arrangement is that the actual server has no way of knowing that the proxy server is not the true client, and in fact, it is never aware of the actual client’s existence. In turn, the actual server has no way of learning about the intranet’s internal features. The second advantage is that the proxy server is in position to filter all the messages sent from the server to the client. For example, an FTP proxy server could check all incoming files for the presence of known viruses and block all infected files. Still another tool for preventing problems in a network environment is auditing software that is similar to the auditing software we learned about in our discussion on operating system security (Section3.5). Using network auditing software, a system administrator can detect a sudden increase in message traffic at various locations within the administrator’s realm, monitor the activities of the system’s firewalls, and analyze the pattern of requests being made by the individual computers in order to detect irregularities. In effect, auditing software is an administrator’s primary tool for identifying problems before they grow out of control. Another means of defense against invasions via network connections is software called antivirus software, which is used to detect and remove the presence of known viruses and other infections. (Actually, antivirus software represents a broad class of software products, each designed to detect and remove a specific type of infection. For example, whereas many products specialize in virus control, others specialize in spyware protection.) It is important for users of these packages to understand that, just as in the case of biological systems, new computer infections are constantly coming on the scene that require updated vaccines. Thus, antivirus software must be routinely maintained by downloading updates from the software’s vendor. Even this, however, does not guarantee the safety of a computer. After all, a new virus must first infect some computers before it is discovered and a vaccine is produced. Thus, a wise computer user never opens email attachments from unfamiliar sources, does not download software without first confirming its reliability, does not respond to pop-up adds, and does not leave a PC connected to the Internet when such connection is not necessary.

Encryption In some cases the purpose of network vandalism is to disrupt the system (as in denial of service attacks), but in other cases the ultimate goal is to gain access to information. The traditional means of protecting information is to control its

M04_BROO1160_12_SE_C04.indd 206

23/07/14 10:24 am

4.5 Security

207

access through the use of passwords. However, passwords can be compromised and are of little value when data are transferred over networks and internets where messages are relayed by unknown entities. In these cases encryption can be used so that even if the data fall into unscrupulous hands, the encoded information will remain confidential. Today, many traditional Internet applications have been altered to incorporate encryption techniques, producing what are called “secure versions” of the applications. A prime example is the secure version of HTTP, known as HTTPS, which is used by most financial institutions to provide customers with secure Internet access to their accounts. The backbone of HTTPS is the protocol system known as Secure Sockets Layer (SSL), which was originally developed by Netscape to provide secure communication links between Web clients and servers. Most browsers indicate the use of SSL by displaying a tiny padlock icon on the computer screen. (Some use the presence or absence of the icon to indicate whether SSL is being used; others display the padlock in either the locked or unlocked position.) One of the more fascinating topics in the field of encryption is publickey encryption, which involves techniques by which encryption systems are designed so that having knowledge about how messages are encrypted does not allow one to decrypt messages. This characteristic is somewhat counterintuitive. After all, intuition would suggest that if a person knows how messages are encrypted, then that person should be able to reverse the encryption process and thus decrypt messages. But public-key encryption systems defy this intuitive logic. A public-key encryption system involves the use of two values called keys. One key, known as the public key, is used to encrypt messages; the other key, known as the private key, is required to decrypt messages. To use the system, the public key is first distributed to those who might need to send messages to a particular destination. The private key is held in confidence at this destination. Then, the originator of a message can encrypt the message using the public key and send the message to its destination with assurance that its contents are safe, even if it is handled by intermediaries who also know the public key. Indeed, the only party that can decrypt the message is the party at the message’s destination who holds the private key. Thus if Bob creates a public-key encryption system and gives both Alice and Carol the public key, then both Alice and Carol can encrypt messages to Bob, but they cannot spy on the other’s communication. Indeed, if Carol intercepts a message from Alice, she cannot decrypt it even though she knows how Alice encrypted it (Figure4.16). There are, of course, subtle problems lurking within public-key systems. One is to ensure that the public key being used is, in fact, the proper key for the destination party. For example, if you are communicating with your bank, you want to be sure that the public key you are using for encryption is the one for the bank and not an impostor. If an impostor presents itself as the bank (an example of spoofing) and gives you its public key, the messages you encrypt and send to the “bank” would be meaningful to the impostor and not your bank. Thus, the task of associating public keys with correct parties is significant. One approach to resolving this problem is to establish trusted Internet sites, called certificate authorities, whose task is to maintain accurate lists of parties and their public keys. These authorities, acting as servers, then provide reliable public-key information to their clients in packages known as certificates. A certificate is a package containing a party’s name and that party’s public key.

M04_BROO1160_12_SE_C04.indd 207

23/07/14 10:24 am

208

Chapter 4  Networking and the Internet

Figure 4.16   Public key encryption

Alice holds public key

Carol holds public key

Alice holds public key

Encryp

ted me

ssages

ssages

ted me

Encryp

Encryp

Bob holds private key

Both Alice and Carol can send encrypted messages to Bob.

Bob holds private key

Carol cannot decrypt Alice’s message even though she knows how Alice encrypted it.

ted me

ssage

? Carol holds public key

Many commercial certificate authorities are now available on the Internet, although it is also common for organizations to maintain their own certificate authorities in order to maintain tighter control over the security of the organization’s communication. Finally, we should comment on the role public-key encryption systems play in solving problems of authentication—making sure that the author of a message is, in fact, the party it claims to be. The critical point here is that, in some publickey encryption systems, the roles of the encryption and decryption keys can be reversed. That is, text can be encrypted with the private key, and because only one party has access to that key, any text that is so encrypted must have originated from that party. In this manner, the holder of the private key can produce a bit pattern, called a digital signature, that only that party knows how to produce. By attaching that signature to a message, the sender can mark the message as being authentic. A digital signature can be as simple as the encrypted version of the message itself. All the sender must do is encrypt the message being transmitted using his or her private key (the key typically used for decrypting). When the message is received, the receiver uses the sender’s public key to decrypt the signature. The message that is revealed is guaranteed to be authentic because only the holder of the private key could have produced the encrypted version. We will return to the topic of public-key encryption at the end of Chapter12, as an example of a complex computer algorithm.

Legal Approaches to Network Security Another way of enhancing the security of computer networking systems is to apply legal remedies. There are, however, two obstacles to this approach. The first is that making an action illegal does not preclude the action. All it does is

M04_BROO1160_12_SE_C04.indd 208

23/07/14 10:24 am

4.5 Security

209

provide a legal recourse. The second is that the international nature of networking means that obtaining recourse is often very difficult. What is illegal in one country might be legal in another. Ultimately, enhancing network security by legal means is an international project, and thus must be handled by international legal bodies—a potential player would be the International Court of Justice in The Hague. Having made these disclaimers, we must admit that, although less than perfect, legal forces still have a tremendous influence, and thus it behooves us to explore some of the legal steps that are being taken to resolve conflicts in the networking arena. For this purpose, we use examples from the federal laws of the United States. Similar examples could be drawn from other government bodies such as the European Union. We begin with the proliferation of malware. In the United States this problem is addressed by the Computer Fraud and Abuse Act, which was first passed in 1984, although it has been amended several times. It is under this act that most cases involving the introduction of worms and viruses have been prosecuted. In short, the act requires proof that the defendant knowingly caused the transmission of a program or data that intentionally caused damage. The Computer Fraud and Abuse Act also covers cases involving the theft of information. In particular, the act outlaws obtaining anything of value via the unauthorized access of a computer. Courts have tended to assign a broad interpretation to the phrase “anything of value,” and thus the Computer Fraud and Abuse Act has been applied to more than the theft of information. For instance, courts have ruled that the mere use of a computer might constitute “anything of value.” The right of privacy is another, and perhaps the most controversial, networking issue facing the legal community. Questions involving an employer’s right to monitor the communications of employees and the extent to which an Internet service provider is authorized to access the information being communicated by its clients have been given considerable thought. In the United States, many of these questions are addressed by the Electronic Communication Privacy Act (ECPA) of 1986, which has its origins in legislation to control wiretapping. Although the act is lengthy, its intent is captured in a few short excerpts. In particular, it states that Except as otherwise specifically provided in this chapter any person who intentionally intercepts, endeavors to intercept, or procures any other person to intercept or endeavor to intercept, any wire, oral, or electronic communication...shall be punished as provided in subsection (4) or shall be subject to suit as provided in subsection (5).

and ... any person or entity providing an electronic communication service to the public shall not intentionally divulge the contents of any communication...on that service to any person or entity other than an addressee or intended recipient of such communication or an agent of such addressee or intended recipient.

In brief, the ECPA confirms an individual’s right to private communication—it is illegal for an Internet service provider to release information about the communication of its clients, and it is illegal for unauthorized personnel to eavesdrop on another’s communication. But the ECPA leaves room for debate. For example, the question regarding the rights of an employer to monitor the communication of employees becomes a question of authorization, which courts have tended to grant to employers when the communication is carried out using the employer’s equipment.

M04_BROO1160_12_SE_C04.indd 209

23/07/14 10:24 am

210

Chapter 4  Networking and the Internet

Moreover, the act goes on to give some government agencies authority to monitor electronic communications under certain restrictions. These provisions have been the source of much debate. For example, in 2000 the FBI revealed the existence of its system, called Carnivore, that reports on the communication of all subscribers of an Internet service provider rather than just a court-designated target, and in 2001 in response to the terrorist attack on the World Trade Center, congress passed the controversial USA PATRIOT (Uniting and Strengthening America by Providing Appropriate Tools Required to Intercept and Obstruct Terrorism) Act that modified the restrictions under which government agencies must operate. In 2013, it was subsequently revealed that these laws had been interpreted to authorize the collection of vast amounts of telephone and Internet usage data on ordinary Americans indiscriminately. In addition to the legal and ethical controversies raised by these developments, providing monitoring rights raises some technical problems that are more pertinent to our study. One is that to provide these capabilities, a communication system must be constructed and programmed so that communications can be monitored. To establish such capabilities was the goal of the Communications Assistance for Law Enforcement Act (CALEA). It requires telecommunication carriers to modify their equipment to accommodate law enforcement taps—a requirement that has been complex and expensive to meet. Another controversial issue involves the clash between the government’s right to monitor communications and the public’s right to use encryption. If the messages being monitored are well encrypted, then tapping the communication is of limited value to law enforcement agencies. Governments in the United States, Canada, and Europe are considering systems that would require the registration of ciphering keys, but such demands are being fought by corporations. After all, due to corporate espionage it is understandable that requiring the registration of ciphering keys would make many law-abiding corporations, as well as citizens, uncomfortable. How secure can the registration system be? Finally, as a means of recognizing the scope of legal issues surrounding the Internet, we cite the Anticybersquatting Consumer Protection Act of 1999 that is designed to protect organizations from impostors who might otherwise establish look-alike domain names (a practice known as cybersquatting). The act prohibits the use of domain names that are identical or confusingly similar to another’s trademark or “common law trademark.” One effect is that although the act does not outlaw domain name speculation (the process of registering potentially desirable domain names and later selling the rights to that name), it limits the practice to generic domain names. Thus, a domain name speculator might legally register a generic name such as GreatUsedCars.com but might not be able to claim rights to the name BigAlUsedCars.com if Big Al is already in the used car business. Such distinctions are often the subject of debate in lawsuits based on the Anticybersquatting Consumer Protection Act.

Questions & Exercises 1. What is phishing? How are computers secured against it? 2. What distinction is there between the types of firewalls that can be placed

at a domain’s gateway as opposed to an individual host within the domain?

M04_BROO1160_12_SE_C04.indd 210

23/07/14 10:24 am

Chapter Review Problems

211

3. Technically, the term data refers to representations of information,

whereas information refers to the underlying meaning. Does the use of passwords protect data or information? Does the use of encryption protect data or information? 4. What advantage does public-key encryption have over more traditional encryption techniques? 5. What problems are associated with legal attempts to protect against network security problems?

Chapter Review Problems (Asterisked problems are associated with optional sections.)

1. What is a protocol? Identify three protocols

introduced in this chapter and describe the purpose of each. 2. What is interprocess communication? 3. What is meant by an intranet? 4. Describe the three types of ISP tiers. 5. What is the difference between a bus network

and a star network? 6. What happens when two nodes using the

CSMA/CD, encounter collision in the network? 7. Can collisions be completely eliminated by

using the CSMA/CA like collision avoidance protocols? 8. What is the last mile problem? Describe a

14. Encode each of the following bit patterns

15. What bit pattern is represented by each of the

10. How does a router differ from such devices as

repeaters, bridges, and switches? 11. State the distinction between the client-server

Internet is quoted as 134.48.4.122. What is the 32-bit address in hexadecimal notation? 17. What is on-demand streaming? 18. If a computer’s mnemonic Internet address

is batman.batcave.metropolis.gov what might you conjecture about the structure of the domain containing the machine? 19. Explain the components of the email address [emailprotected]

20. In the context of VoIP, what is the difference

between an analog telephone adapter and an embedded phone?

model and the P2P model. 12. What is the difference between congestion

control and flow control? 13. Using 32-bit Internet addresses was originally

thought to provide ample room for expansion, but that conjecture is not proving to be accurate. IPv6 uses 128-bit addressing. Will that prove to be adequate? Justify your answer. (For example, you might compare the number of possible addresses to the population of the world.)

M04_BROO1160_12_SE_C04.indd 211

following dotted decimal patterns? a. 0.0 b. 26.19.1 c. 8.12.20.13

16. Suppose the address of an end system on the

technique for solving it. 9. How does a hub differ from a switch?

using dotted decimal notation. a. 000001010001001000100011 b. 1000000000100000 c. 0011000000011000

21. What is the role of a name server? 22. What is the distinction between routing and

forwarding? 23. Define each of the following:

a. Cloud computing b. Hot spot c. Top-level domains d. Secure Shell

23/07/14 10:24 am

212

Chapter 4  Networking and the Internet

24. Define each of the following:

a. Content delivery networks b. Anycast c. Markup languages

25. Many “lay users” of the Internet interchange

the terms Internet and World Wide Web. To what do each of the terms correctly refer? 26. When viewing a simple webpage, ask your

browser to display the source version of the document. Then identify the basic structure of the document. In particular, identify the head and the body of the document and list some of the statements you find in each. 27. State the difference between sniffing and

phishing. 28. Modify the HTML document below so that the

word “Rover” is linked to the document whose URL is http://animals.org/pets/dogs​ .html.

Example

My Pet Dog

My dog's name is Rover.

29. Draw a sketch showing how the following

HTML document would appear when displayed on a computer screen.

Example

My Pet Dog

3 0. Using the informal XML style presented in the

indicate what text should be bold, italic, underlined, and so on? 32. Using the informal XML style presented in the

text, design a set of tags that could be used to mark motion picture reviews according to the way the text items should appear on a printed page. Then design a set of tags that could be used to mark the reviews according to the meaning of the items in the text. 33. Using the informal XML style presented in the

text, design a set of tags that could be used to mark articles about sporting events according to the way the text items should appear on a printed page. Then design a set of tags that could be used to mark the articles according to the meaning of the items in the text. 34. Identify the components of the following URL

and describe the meaning of each. http://lifeforms.com/animals/ moviestars/kermit.html

35. Identify the components of each of the

following abbreviated URLs. a. http://www.farmtools.org/windmills​ .html

b. http://castles.org/ c. www.coolstuff.com 36. How would the action of a browser differ if

you asked it to “find the document” at the URL http://stargazer.universe.org as opposed to https://stargazer.universe​ .org? 37. Give two examples of client-side activities on

the Web. Give two examples of server-side activities on the Web. *38. What is the TCP/IP protocol suite? *39. In a network based on the bus topology, the

bus is a nonsharable resource for which the machines must compete in order to transmit messages. How is deadlock (see the optional Section3.4) controlled in this context?

text, design a markup language for representing * 40. List the four layers in the Internet software simple algebraic expressions as text files. hierarchy and identify a task performed by 1. Using the informal XML style presented in the 3 each layer. text, design a set of tags that a word processor *41. Why does the transport layer chop large might use for marking the underlying text. messages into small packets? For example, how would a word processor

M04_BROO1160_12_SE_C04.indd 212

23/07/14 10:24 am

Social Issues

*42. When an application asks the transport layer to

use TCP to transmit a message, what additional messages will be sent by the transport layer in order to fulfill the application layer’s request? *43. In what way could TCP be considered a better

protocol for implementing the transport layer than UDP? In what way could UDP be considered better than TCP? *44. What does it mean to say that the TCP is a

connection-oriented protocol? *45. At what layer in the TCP/IP protocol

hierarchy could a firewall be placed to filter incoming traffic by means of a. Message content b. Source address c. Type of application

213

46. Suppose you wanted to establish a firewall to

filter out email messages containing certain terms and phrases. Would this firewall be placed at your domain’s gateway or at the domain’s mail server? Explain your answer. 47. What is SSL and what are its benefits? 48. What is the significance of using spam filters? 49. What is the significance of certificate

authorities in public-key encryption? 50. In what sense does the global nature of the

Internet limit legal solutions to Internet problems?

Social Issues The following questions are intended as a guide to the ethical/social/legal issues associated with the field of computing. The goal is not merely to answer these questions. You should also consider why you answered as you did and whether your justifications are consistent from one question to the next. 1. The ability to connect computers via networks has popularized the concept

of working at home. What are some pros and cons of this movement? Will it affect the consumption of natural resources? Will it strengthen families? Will it reduce “office politics”? Will those who work at home have the same career advancement opportunities as those who work on site? Will community ties be weakened? Will reduced personal contact with peers have a positive or negative effect? 2. Ordering merchandise over the Internet is becoming an alternative to “handson” shopping. What effect will such a shift in shopping habits have on communities? What about shopping malls? What about small shops, such as bookstores and clothing stores, in which you like to browse without buying? To what extent is buying at the lowest possible price good or bad? Is there any moral obligation to pay more for an item in order to support a local business? Is it ethical to compare products at a local store and then order your selection at a lower price via the Internet? What are the long-term consequences of such behavior? 3. To what extent should a government control its citizens’ access to the Internet (or any international network)? What about issues that involve national security? What are some security issues that might occur? 4. Electronic bulletin boards allow users of networks to post messages (often anonymously) and read messages posted by others. Should the manager of such a bulletin board be held responsible for its contents? Should a telephone company be held responsible for the contents of telephone conversations?

M04_BROO1160_12_SE_C04.indd 213

23/07/14 10:24 am

214

Chapter 4  Networking and the Internet

Should the manager of a grocery store be held responsible for the contents of a community bulletin board located in the store? 5. Should the use of the Internet be monitored? Should it be regulated? If so, by whom and to what extent? 6. How much time do you spend using the Internet? Is that time well spent? Has Internet access altered your social activities? Do you find it easier to talk to people via the Internet than in person? 7. When you buy a software package for a personal computer, the developer usually asks you to register with the developer so that you can be notified of future upgrades. This registration process is increasingly being handled via the Internet. You are usually asked to give such things as your name, address, and perhaps how you learned of the product, and then the developer’s software automatically transfers this data to the developer. What ethical issues would be raised if the developer designed the registration software so that it sent additional information to the developer during the registration process? For example, the software might scan the contents of your system and report the other software packages found. 8. When you visit a website, that site has the capability of recording data, called cookies, on your computer indicating that you have visited that site. These cookies can then be used to identify return visitors and to record their previous activities so that future visits to the site can be handled more efficiently. The cookies on your computer also provide a record of the sites you have visited. Should a website have the capability to record cookies on your computer? Should a website be allowed to record cookies on your computer without your knowledge? What are possible benefits of cookies? What problems could arise from the use of cookies? 9. If corporations are required to register their encryption keys with a government agency, will they be safe? 10. In general, etiquette tells us to avoid calling a friend at his or her place of work for personal or social matters such as making arrangements for a weekend outing. Likewise, most of us would hesitate to call a customer at his or her home to describe a new product. In a similar manner, we mail wedding invitations to the guests’ residences, whereas we mail announcements of business conferences to the attendees’ work addresses. Is it proper to send personal email to a friend via the mail server at the friend’s place of employment? 11. Suppose a PC owner leaves the PC connected to the Internet where it ultimately is used by another party to implement a denial of service attack. To what extent should the PC owner be liable? Does your answer depend on whether the owner installed proper firewalls? 12. Is it ethical for companies that produce candy or toys to provide games on

their company websites that entertain children while promoting the company’s products? What if the game is designed to collect information from the children? What are the boundaries between entertaining, advertising, and exploitation?

M04_BROO1160_12_SE_C04.indd 214

23/07/14 10:24 am

Additional Reading

215

Additional Reading Antoniou, G., P. Groth, F. van Harmelem and R. Hoekstra. A Semantic Web Primer, 3rded. Cambridge, MA: MIT Press, 2012. Bishop, M. Introduction to Computer Security. Boston, MA: Addison-Wesley, 2005. Comer, D. E. Computer Networks and Internets, 6th ed. Upper Saddle River, NJ: Prentice-Hall, 2014. Comer, D. E. Internetworking with TCP/IP, Vol. 1, 6th ed. Upper Saddle River, NJ: Prentice-Hall, 2013. Goldfarb, C. F., and P. Prescod. The XML Handbook, 5th ed. Upper Saddle River, NJ: Prentice-Hall, 2004. Halsal, F. Computer Networking and the Internet, 5th ed. Boston, MA: AddisonWesley, 2005. Harrington, J. L. Network Security: A Practical Approach. San Francisco, CA: ­Morgan Kaufmann, 2005. Kurose, J. F., and K. W. Ross. Computer Networking: A Top Down Approach Featuring the Internet, 6th ed. Boston, MA: Addison-Wesley, 2012. Peterson, L. L., and B. S. Davie. Computer Networks: A Systems Approach, 5th ed. San Francisco, CA: Morgan Kaufmann, 2011. Rosenoer, J. CyberLaw: The Law of the Internet. New York: Springer, 1997. Spinello, R. A., and H. T. Tavani. Readings in CyberEthics, 2nd ed. Sudbury, MA: Jones and Bartlett, 2004. Stallings, W. Cryptography and Network Security, 5th ed. Upper Saddle River, NJ: Prentice-Hall, 2010. Stevens, W. R. TCP/IP Illustrated, Vol. 1. Boston, MA: Addison-Wesley, 1994.

M04_BROO1160_12_SE_C04.indd 215

23/07/14 10:24 am

M04_BROO1160_12_SE_C04.indd 216

23/07/14 10:24 am

5

C H A P T E R

Algorithms In the introductory chapter we learned that the central theme of ­computer science is the study of algorithms. It is time now for us to focus on this core topic. Our goal is to explore enough of this ­foundational material so that we can truly understand and ­appreciate the science of computing.

M05_BROO1160_12_SE_C05.indd 217

5.1 The Concept of an Algorithm

5.4 Iterative Structures

An Informal Review The Formal Definition of an Algorithm The Abstract Nature of Algorithms

The Sequential Search Algorithm Loop Control The Insertion Sort Algorithm

5.2 Algorithm Representation

5.5 Recursive Structures

Primitives Pseudocode

The Binary Search Algorithm Recursive Control

5.3 Algorithm Discovery

5.6 Efficiency and Correctness

The Art of Problem Solving Getting a Foot in the Door

Algorithm Efficiency Software Verification

23/07/14 10:25 am

218

Chapter 5  Algorithms

We have seen that before a computer can perform a task, it must be given an algorithm telling it precisely what to do; consequently, the study of algorithms is the cornerstone of computer science. In this chapter we introduce many of the fundamental concepts of this study, including the issues of algorithm discovery and representation as well as the major control concepts of iteration and recursion. In so doing we also present a few well-known algorithms for searching and sorting. We begin by reviewing the concept of an algorithm.

5.1  The Concept of an Algorithm In the introductory chapter we informally defined an algorithm as a set of steps that define how a task is performed. In this section we look more closely at this fundamental concept.

An Informal Review We have encountered a multitude of algorithms in our study. We have found algorithms for converting numeric representations from one form to another, detecting and correcting errors in data, compressing and decompressing data files, controlling multiprogramming in a multitasking environment, and many more. Moreover, we have seen that the machine cycle that is followed by a CPU is nothing more than the simple algorithm As long as the halt instruction has not been executed continue to execute the following steps: a. Fetch an instruction. b. Decode the instruction. c. Execute the instruction.

As demonstrated by the algorithm describing a magic trick in Figure0.1, algorithms are not restricted to technical activities. Indeed, they underlie even such mundane activities as shelling peas: Obtain a basket of unshelled peas and an empty bowl. As long as there are unshelled peas in the basket c ­ontinue to execute the following steps: a. Take a pea from the basket. b. Break open the pea pod. c. Dump the peas from the pod into the bowl. d. Discard the pod.

In fact, many researchers believe that every activity of the human mind, i­ ncluding imagination, creativity, and decision making, is actually the result of algorithm execution—a conjecture we will revisit in our study of artificial intelligence (Chapter11). But before we proceed further, let us consider the formal definition of an algorithm.

The Formal Definition of an Algorithm Informal, loosely defined concepts are acceptable and common in everyday life, but a science must be based on well-defined terminology. Consider, then, the formal definition of an algorithm stated in Figure5.1.

M05_BROO1160_12_SE_C05.indd 218

23/07/14 10:25 am

5.1  The Concept of an Algorithm

219

Figure 5.1   The definition of an algorithm

An algorithm is an ordered set of unambiguous, executable steps that defines a terminating process.

Note that the definition requires that the set of steps in an algorithm be ordered. This means that the steps in an algorithm must have a well-established structure in terms of the order of their execution. This does not mean, however, that the steps must be executed in a sequence consisting of a first step, followed by a second, and so on. Some algorithms, known as parallel algorithms, contain more than one sequence of steps, each designed to be executed by different processors in a multiprocessor machine. In such cases the overall algorithm does not possess a single thread of steps that conforms to the first-step, second-step scenario. Instead, the algorithm’s structure is that of multiple threads that branch and reconnect as different processors perform different parts of the overall task. (We will revisit this concept in Chapter6.) Other examples include algorithms executed by circuits such as the flip-flop in Chapter1, in which each gate performs a single step of the overall algorithm. Here the steps are ordered by cause and effect, as the action of each gate propagates throughout the circuit. Next, consider the requirement that an algorithm must consist of executable steps. To appreciate this condition, consider the instruction Make a list of all the positive integers

which would be impossible to perform because there are infinitely many positive integers. Thus any set of instructions involving this instruction would not be an algorithm. Computer scientists use the term effective to capture the concept of being executable. That is, to say that a step is effective means that it is doable. Another requirement imposed by the definition in Figure5.1 is that the steps in an algorithm be unambiguous. This means that during execution of an algorithm, the information in the state of the process must be sufficient to determine uniquely and completely the actions required by each step. In other words, the execution of each step in an algorithm does not require creative skills. Rather, it requires only the ability to follow directions. (In Chapter 12 we will learn that “algorithms,” called nondeterministic algorithms, that do not conform to this restriction are an important topic of research.) The definition in Figure5.1 also requires that an algorithm define a terminating process, which means that the execution of an algorithm must lead to an end. The origin of this requirement is in theoretical computer science, where the goal is to answer such questions as “What are the ultimate limitations of algorithms and machines?” Here computer science seeks to distinguish between problems whose answers can be obtained algorithmically and problems whose answers lie beyond the capabilities of algorithmic systems. In this context, a line is drawn between processes that culminate with an answer and those that merely proceed forever without producing a result. There are, however, meaningful applications for nonterminating processes, including monitoring the vital signs of a hospital patient and maintaining

M05_BROO1160_12_SE_C05.indd 219

23/07/14 10:25 am

220

Chapter 5  Algorithms

anaircraft’s altitude in flight. Some would argue that these applications involve merely the repetition of algorithms, each of which reaches an end and then automatically repeats. Others would counter that such arguments are simply attempts to cling to an overly restrictive formal definition. In any case, the result is that the term algorithm is often used in applied, or informal, settings in reference to sets of steps that do not necessarily define terminating processes. An example is the long-division “algorithm” that does not define a terminating process for dividing 1 by 3. Technically, such instances represent misuses of the term.

The Abstract Nature of Algorithms It is important to emphasize the distinction between an algorithm and its ­representation—a distinction that is analogous to that between a story and a book. A story is abstract, or conceptual, in nature; a book is a physical representation of a story. If a book is translated into another language or republished in a different format, it is merely the representation of the story that changes—the story itself remains the same. In the same manner, an algorithm is abstract and distinct from its representation. A single algorithm can be represented in many ways. As an example, the algorithm for converting temperature readings from Celsius to Fahrenheit is traditionally represented as the algebraic formula F 5 (9⁄5)C 1 32 But it could be represented by the instruction Multiply the temperature reading in Celsius by 9⁄5 and then add 32 to the product or even in the form of an electronic circuit. In each case the underlying algorithm is the same; only the representations differ. The distinction between an algorithm and its representation presents a problem when we try to communicate algorithms. A common example involves the level of detail at which an algorithm must be described. Among ­meteorologists, the instruction “Convert the Celsius reading to its Fahrenheit equivalent” ­suffices, but a layperson, requiring a more detailed description, might argue that the instruction is ambiguous. The problem, however, is not with the underlying algorithm but that the algorithm is not represented in enough detail for the ­layperson. In the next section we will see how the concept of primitives can be used to eliminate such ambiguity problems in an algorithm’s representation. Finally, while on the subject of algorithms and their representations, we should clarify the distinction between two other related concepts—programs and processes. A program is a representation of an algorithm. (Here we are using the term algorithm in its less formal sense in that many programs are representations of nonterminating “algorithms.”) In fact, within the computing community the term program usually refers to a formal representation of an algorithm designed for computer application. We defined a process in Chapter3 to be the activity of executing a program. Note, however, that to execute a program is to execute the algorithm represented by the program, so a process could equivalently be defined as the activity of executing an algorithm. We conclude that programs, algorithms, and processes are distinct, yet related, entities. A program is the representation of an algorithm, whereas a process is the activity of executing an algorithm.

M05_BROO1160_12_SE_C05.indd 220

23/07/14 10:25 am

5.2  Algorithm Representation

221

Questions & Exercises 1. Summarize the distinctions between a process, an algorithm, and a

program. 2. Give some examples of algorithms with which you are familiar. Are they

really algorithms in the precise sense? 3. Identify some points of vagueness in our informal definition of an algo-

rithm introduced in Section0.1 of the introductory chapter. 4. In what sense do the steps described by the following list of instructions

fail to constitute an algorithm? Step 1. Take a coin out of your pocket and put it on the table. Step 2. Return to Step 1.

5.2  Algorithm Representation In this section we consider issues relating to an algorithm’s representation. Our goal is to introduce the basic concepts of primitives and pseudocode as well as to establish a representation system for our own use.

Primitives The representation of an algorithm requires some form of language. In the case of humans this might be a traditional natural language (English, Spanish, Russian, Japanese) or perhaps the language of pictures, as demonstrated in Figure5.2, which describes an algorithm for folding a bird from a square piece of paper. Often, however, such natural channels of communication lead to misunderstandings, sometimes because the terminology used has more than one meaning. (The sentence, “Visiting grandchildren can be nerve-racking,” could mean either that the grandchildren cause problems when they come to visit or that going to see them is problematic.) Problems also arise over misunderstandings regarding the level of detail required. Few readers could successfully fold a bird from the directions given in Figure5.2, yet a student of origami would probably have little difficulty. In short, communication problems arise when the language used for an algorithm’s representation is not precisely defined or when information is not given in adequate detail. Computer science approaches these problems by establishing a well-defined set of building blocks from which algorithm representations can be constructed. Such a building block is called a primitive. Assigning precise definitions to these primitives removes many problems of ambiguity, and requiring algorithms to be described in terms of these primitives establishes a uniform level of detail. A collection of primitives along with a collection of rules stating how the primitives can be combined to represent more complex ideas constitutes a programming language. Each primitive has its own syntax and semantics. Syntax refers to the primitive’s symbolic representation; semantics refers to the meaning of the primitive. The syntax of air consists of three symbols, whereas the semantics is a gaseous substance that surrounds the world. As an example, Figure5.3 presents some of the primitives used in origami.

M05_BROO1160_12_SE_C05.indd 221

23/07/14 10:25 am

222

Chapter 5  Algorithms

Figure 5.2   Folding a bird from a square piece of paper

To obtain a collection of primitives to use in representing algorithms for computer execution, we could turn to the individual instructions that the machine is designed to execute. If an algorithm is expressed at this level of detail, we will certainly have a program suitable for machine execution. However, expressing algorithms at this level is tedious, and so one normally uses a collection of “higher-level” primitives, each being an abstract tool constructed from the lower-level primitives provided in the machine’s language. The result is a formal programming language in which algorithms can be expressed at a conceptually higher level than in machine language. We will discuss such programming languages in the next chapter.

Pseudocode For now, we forgo the introduction of a formal programming language in favor of a less formal, more intuitive notational system known as pseudocode. In general, a pseudocode is a notational system in which ideas can be expressed informally during the algorithm development process.

M05_BROO1160_12_SE_C05.indd 222

23/07/14 10:25 am

5.2  Algorithm Representation

223

Figure 5.3   Origami primitives Syntax

Semantics Turn paper over as in

Shade one side of paper

Distinguishes between different sides of paper as in Represents a valley fold so that

represents

Represents a mountain fold so that

represents

Fold over so that

produces

Push in so that

produces

One way to obtain a pseudocode is simply to loosen the rules of a formal programming language, borrowing the syntax-semantic structures of the language, intermixed with less formal constucts. There are many such pseudocode variants, because there are many programming languages in existence. Two particularly popular choices are loose versions of the languages Algol and Pascal, largely because these were widely used in textbooks and academic papers for decades. More recently, pseudocode reminiscent of the Java and C languages has proliferated, again because most programmers will have at least a reading knowledge of these languages. Regardless of where a pseudocode borrows its syntax from, one essential property is required for it to serve its purpose in expressing algorithms: A pseudocode must have a consistent, concise notation for representing recurring semantic structures. For our purposes, we will use a Python-like syntax to express pseudocode throughout the remainder of the book. Some of our pseudocode semantic structures will borrow from language constructs presented in previous chapters, while others will look ahead to constructs to be formally covered in future chapters. One such recurring semantic structure is the saving of a computed value. For example, if we have computed the sum of our checking and savings account

M05_BROO1160_12_SE_C05.indd 223

23/07/14 10:25 am

224

Chapter 5  Algorithms

Algorithm Representation During Algorithm Design The task of designing a complex algorithm requires that the designer keep track of numerous interrelated concepts—a requirement that can exceed the capabilities of the human mind. Thus the designer of complex algorithms needs a way to record and recall portions of an evolving algorithm as his or her concentration requires. During the 1950s and 1960s, flowcharts (by which algorithms are represented by geometric shapes connected by arrows) were the state-of-the-art design tool. However, flowcharts often became tangled webs of crisscrossing arrows that made understanding the structure of the underlying algorithm difficult. Thus the use of flowcharts as design tools has given way to other representation techniques. An example is the pseudocode used in this text, by which algorithms are represented with well-defined textual structures. Flowcharts are still beneficial when the goal is presentation rather than design. For example, Figures5.8 and 5.9 apply flowchart notation to demonstrate the algorithmic structure represented by popular control statements. The search for better design notations is a continuing process. In Chapter7 we will see that the trend is to use graphical techniques to assist in the global design of large software systems, while pseudocode remains popular for designing the smaller procedural components within a system.

balances, we may want to save the result so we can refer to it later. In such cases we will use the form name = expression

where name is the name by which we will refer to the result and expression describes the computation whose result is to be saved. This pseudocode structure directly follows the equivalent Python assignment statement, which we introduced in Chapter1 for storing a value into a Python variable. For example, the statement RemainingFunds = CheckingBalance + SavingsBalance

is an assignment statement that assigns the sum of CheckingBalance and ­SavingsBalance to the name RemainingFunds. Thus, the term RemainingFunds can be used in future statements to refer to that sum. Another recurring semantic structure is the selection of one of two possible activities depending on the truth or falseness of some condition. Examples include: If the gross domestic product has increased, buy common stock; otherwise, sell common stock. Buy common stock if the gross domestic product has increased and sell it otherwise. Buy or sell common stock depending on whether the gross domestic product has increased or decreased, respectively.

Each of these statements could be rewritten to conform to the structure if (condition): activity else: activity

M05_BROO1160_12_SE_C05.indd 224

23/07/14 10:25 am

5.2  Algorithm Representation

225

From Pseudocode to Python Our pseudocode in this chapter closely mirrors actual Python syntax for the if and while structures, as well as function definition and calling syntax. if (condition): activity else: activity

Our pseudocode if and while structures can be converted to Python simply by being more precise with the condition and activity portions. For example, rather than the English phrase, “sales have decreased” as a condition, we would need a proper Python comparison expression, such as if (sales_current
where the sales variables had already been assigned in previous lines of the script. Similarly, informal English sentences or phrases used as the activity in our pseudocode would need to be replaced with Python statements and expressions such as those we have already seen in earlier chapters. How can you tell the difference between pseudocode and actual Python code in this book? As a rule, real Python code uses operators (like “ a) { if (d > c) { print(d) } } } else if (b > a) { if (c > b) { if (d > c) { print(d) } } }

23. Summarize the following rat’s-nest routine

with a single if-else statement:

80 90

if X > 5 then goto 80 X = X + 1 goto 90 X = X + 2 stop

24. Summarize the basic control structures found

eration and code optimization.

defined by

expressed by the following if and else conditional statements.

25. Summarize the distinction between code gen-

a while loop instead of a for loop.

22. Draw a flowchart representing the structure

in imperative and object-oriented programming languages for performing each of the following activities: a. Determining which command should be executed next b. Repeating a collection of commands c. Changing a variable’s value

M06_BROO1160_12_SE_C06.indd 325

325

If parameters are passed by value, what will be printed when the following program segment is executed? What if parameters are passed by reference? X = 5 Modify(X) print(X)

30. Suppose the Python function Modify is

defined by def Modify (Y): Y = 9 print(X) print(Y)

Also suppose that X is a global variable. If parameters are passed by value, what will be printed when the following program segment is executed? What if parameters are passed by reference? X = 5 Modify(X) print(X)

31. Sometimes an actual parameter is passed to a

function by producing a duplicate to be used by the function (as when the parameter is passed by value), but when the function is completed the value in the function’s copy is transferred to the actual parameter before the calling function continues. In such cases

23/07/14 10:25 am

326

Chapter 6  Programming Languages

the parameter is said to be passed by valueresult. What would be printed by the program segment in question 30 if parameters were passed by value-result? 32. What is the main difference between passing

parameters to a function by value and passing parameters to a function by address? Explain your answer with a proper example for each. 33. What ambiguity exists in the statement P = 9/4 – 1

34. Suppose a small company has five employees

and is planning to increase the number to six. Moreover, suppose one of the company’s programs contained the following assignment statements. DailySalary AvgSalary DailySales AvgSales

= = = =

TotalSal/5; TotalSal/5; TotalSales/5; TotalSales/5;

How would the task of updating the program be simplified if the program had originally been written using constants named NumberOfEmp and WorkWeek (both set to the value 5) so that the assignment statements could be expressed as DailySalary AvgSalary DailySales AvgSales

= = = =

TotalSal/DaysWk; TotalSal/NumEmpl; TotalSales/DaysWk; TotalSales/NumEmpl;

35. a. What is the distinction between an assembly

language and a third-generation programming language? b.  Give an example of each.

such as firstname - middlename - lastname or the reverse of it. 40. Design a set of syntax diagrams that describes

the grammatical structure of “sentences” that consist of occurrences of the word yes followed by the same number of the word no. For example, “yes yes no no” would be such a sentence, whereas “no yes,” “yes no no,” and “yes no yes” would not. 41. Give an argument to the effect that a set

of syntax diagrams cannot be designed that describes the grammatical structure of “sentences” that consist of occurrences of the word yes, followed by the same number of occurrences of the word no, followed by the same number of occurrences of the word maybe. For example, “yes no maybe” and “yes yes no no maybe maybe” would be such sentences, whereas “yes maybe,” “yes no no maybe maybe,” and “maybe no” would not. 42. Write a sentence describing the structure of

a string as defined by the following syntax diagram. Then, draw the parse tree for the stringxxyxx. String

37. Design a set of syntax diagrams to describe

the syntax of telephone numbers in your locality. For instance, in the United States telephone numbers consist of an area code, followed by a regional code, followed by a four-digit number such as (444) 555–1234. 38. Design a set of syntax diagrams to describe

simple sentences in your native language. 39. Design a set of syntax diagrams to describe

different ways of representing full names

M06_BROO1160_12_SE_C06.indd 326

String

x

y

43. Add syntax diagrams to those in question 5

of Section6.4 to obtain a set of diagrams that defines the structure Dance to be either a Chacha or a Waltz, where a Waltz consists of one or more copies of the pattern

36. Draw a syntax diagram representing the struc-

ture of the Python nested if-else statement.

x

forward diagonal close or backward diagonal close 44. Draw the parse tree for the expression

a , d * b , c + a , d * b , c based on the syntax diagrams in Figure6.15.

45. What code optimization could be performed

by a code generator when building the machine code representing the statement if (X == 5): Z = X + 2

23/07/14 8:53 pm

Social Issues else: Z = X + 4

46. What will be the output of following code? if (printf ("Hello")) { printf("World"); } else { printf("Hello"); }

47. Simplify the following program segment while (Z
48. In an object-oriented programming environ-

ment, how are types and classes similar? How are they different? 49. Describe how inheritance might be used to

develop classes describing various types of sports. 50. What is the difference between the public and

private parts of a class?

51. a. Give an example of a situation in which an

327

*55. Draw a diagram (similar to Figure6.25) rep-

resenting the resolutions needed to show that the collection of statements (Q OR ¬R), (TOR R), ¬P, (P OR ¬T), and (P OR ¬Q) are inconsistent. *56. Is the collection of statements ¬R, (T OR R), (P OR ¬Q), (Q OR ¬T), and (R OR ¬P) con-

sistent? Explain your answer. *57. Extend the Prolog program outlined in ques-

tions 3 and 4 of Section6.7 to include the additional family relationships of uncle, aunt, grandparent, and cousin. Also add a rule that defines parents (X, Y, Z) to mean that X and Y are Z’s parents. *58. Assuming that the first statement in the fol-

lowing Prolog program is intended to mean “Alice likes sports,” translate the last two statements of the program. Then, list all the things that, based on this program, Prolog would be able conclude that Alice likes. Explain your list.

likes(alice, sports). instance variable should be private. likes(alice, music). b. Give an example of a situation in which an likes(carol, music). instance variable should be public. likes(david, X) :- likes(X, sports). c. Give an example of a situation in which a likes(alice, X) :- likes(david, X). method should be private. d. Give an example of a situation in which a *59. What problem would be encountered if the method should be public. following program segment was executed on a 52. Describe some objects that might be found in computer in which values are represented in a program for simulating the pedestrian traffic the eight-bit floating-point format described in in a hotel lobby. Include explanations of the Section1.7? actions some of the objects should be able to X = 0.01 perform.

*53. What does the term type cast mean in the con-

text of a programming language? *54. What is the difference between while and

while (X != 1.00): print(X) X = X + 0.01

do-while loops in the context of a

programming language?

Social Issues The following questions are intended as a guide to the ethical/social/legal issues associated with the field of computing. The goal is not merely to answer these questions. You should also consider why you answered as you did and whether your justifications are consistent from one question to the next.

M06_BROO1160_12_SE_C06.indd 327

23/07/14 10:26 am

328

Chapter 6  Programming Languages

1. In general, copyright laws support ownership rights associated with the

expression of an idea but not for the idea itself. As a result, a paragraph in a book is copyrightable but the ideas expressed in the paragraph are not. How should this right extend to source programs and the algorithms they express? To what extent should a person who knows the algorithms used in a commercial software package be allowed to write his or her own program expressing those same algorithms and market this version of the software? 2. By using a high-level programming language a programmer is able to express algorithms using words such as if, else, and while. To what extent does the computer understand the meaning of those words? Does the ability to respond correctly to the use of words imply an understanding of the words? How do you know when another person has understood what you said? 3. Should a person who develops a new and useful programming language have a right to profit from the use of that language? If so, how can that right be protected? To what extent can a language be owned? To what extent should a company have the right to own the creative, intellectual accomplishments of its employees? 4. With a deadline approaching, is it acceptable for a programmer to forgo documentation via comment statements to get a program running on time? (Beginning students are often surprised to learn how important documentation is considered among professional software developers.) 5. Much of the research in programming languages has been to develop languages that allow programmers to write programs that can be easily read and understood by humans. To what extent should a programmer be required to use such capabilities? That is, to what extent is it good enough for the program to perform correctly even though it is not well written from a human perspective? 6. Suppose an amateur programmer writes a program for his or her own use and in doing so is sloppy in the program’s construction. The program does not use the programming language features that would make it more readable, it is not efficient, and it contains shortcuts that take advantage of the particular situation in which the programmer intends to use the program. Over time the programmer gives copies of the program to friends who want to use it themselves, and these friends give it to their friends. To what extent is the programmer liable for problems that might occur? 7. To what extent should a computer professional be knowledgeable in the various programming paradigms? Some companies insist that all software developed in that company be written in the same, predetermined programming language. Does your answer to the original question change if the professional works for such a company?

Additional Reading Aho, A. V., M. S. Lam, R. Sethi, and J. D. Ullman. Compilers: Principles, Techniques, and Tools, 2nd ed. Boston, MA: Addison-Wesley, 2007. Barnes, J. Programming in Ada 2005. Boston, MA: Addison-Wesley, 2006.

M06_BROO1160_12_SE_C06.indd 328

23/07/14 10:26 am

Additional Reading

329

Clocksin, W. F., and C. S. Mellish. Programming in Prolog, 5th ed. New York: Springer-Verlag, 2013. Friedman, D. P., and M. Felleisen. The Little Schemer, 4th ed. Cambridge, MA: MIT Press, 1995. Hamburger, H., and D. Richards. Logic and Language Models for Computer Science. Upper Saddle River, NJ: Prentice-Hall, 2002. Kernighan, B.W., and D.M. Ritchie. The C Programming Language, 2nd ed. Englewood Cliffs, NJ: Prentice Hall, 1988. Metcalf, M., and J. Reid. Fortran 90/95 Explained, 2nd ed. Oxford, England: Oxford University Press, 1999. Pratt, T. W., and M. V. Zelkowitz. Programming Languages, Design and Implementation, 4th ed. Upper Saddle River, NJ: Prentice-Hall, 2001. Savitch, W., and K. Mock. Absolute C++, 5th ed. Boston, MA: Addison-Wesley, 2012. Savitch, W., and K. Mock. Absolute Java, 5th ed. Boston, MA: Addison-Wesley, 2012. Savitch, W. Problem Solving with C++, 8th ed. Boston, MA: Addison-Wesley, 2011. Scott, M. L. Programming Language Pragmatics, 3rd ed. New York: Morgan Kaufmann, 2009. Sebesta, R. W. Concepts of Programming Languages, 10th ed. Boston, MA: Addison Wesley, 2012. Wu, C. T. An Introduction to Object-Oriented Programming with Java, 5th ed. Burr Ridge, IL: McGraw-Hill, 2009.

M06_BROO1160_12_SE_C06.indd 329

23/07/14 10:26 am

M06_BROO1160_12_SE_C06.indd 330

23/07/14 10:26 am

Software Engineering In this chapter we explore the problems that are encountered during

7

C H A P T E R

the development of large, complex software systems. The subject is called software engineering because software development is an engineering process. The goal of researchers in software engineering is to find principles that guide the software development process and lead to efficient, reliable software products.

7.1 The Software Engineering Discipline 7.2 The Software Life Cycle The Cycle as a Whole The Traditional Development Phase

7.3 Software Engineering Methodologies

M07_BROO1160_12_SE_C07.indd 331

7.4 Modularity

7.6 Quality Assurance

Modular Implementation Coupling Cohesion Information Hiding Components

The Scope of Quality Assurance Software Testing

7.5 Tools of the Trade Some Old Friends Unified Modeling Language Design Patterns

7.7 Documentation 7.8 The Human-Machine Interface 7.9 Software Ownership and Liability

01/08/14 11:18 AM

332

Chapter 7  Software Engineering

Software engineering is the branch of computer science that seeks principles to guide the development of large, complex software systems. The problems faced when developing such systems are more than enlarged versions of those problems faced when writing small programs. For instance, the development of such systems requires the efforts of more than one person over an extended period of time during which the requirements of the proposed system may be altered and the personnel assigned to the project may change. Consequently, software engineering includes topics such as personnel and project management that are more readily associated with business management than computer science. We, however, will focus on topics readily related to computer science.

7.1  The Software Engineering Discipline To appreciate the problems involved in software engineering, it is helpful to select a large complex device (an automobile, a multistory office building, or perhaps a cathedral) and imagine being asked to design it and then to supervise its construction. How can you estimate the cost in time, money, and other resources to complete the project? How can you divide the project into manageable pieces? How can you ensure that the pieces produced are compatible? How can those working on the various pieces communicate? How can you measure progress? How can you cope with the wide range of detail (the selection of the doorknobs, the design of the gargoyles, the availability of blue glass for the stained glass windows, the strength of the pillars, the design of the duct work for the heating system)? Questions of the same scope must be answered during the development of a large software system. Because engineering is a well-established field, you might think that there is a wealth of previously developed engineering techniques that can be useful in answering such questions. This reasoning is partially true, but it overlooks fundamental differences between the properties of software and those of other fields of engineering. These distinctions have challenged software engineering projects, leading to cost overruns, late delivery of products, and dissatisfied customers. In turn, identifying these distinctions has proven to be the first step in advancing the software engineering discipline. One such distinction involves the ability to construct systems from generic prefabricated components. Traditional fields of engineering have long benefited from the ability to use “off-the-shelf” components as building blocks when constructing complex devices. The designer of a new automobile does not have to design a new engine or transmission but instead uses previously designed versions of these components. Software engineering, however, lags in this regard. In the past, previously designed software components were domain specific—that is, their internal design was based on a specific application—and thus their use as generic components was limited. The result is that complex software systems have historically been built from scratch. As we will see in this chapter, significant progress is being made in this regard, although more work remains to be done. Another distinction between software engineering and other engineering disciplines is the lack of quantitative techniques, called metrics, for measuring the properties of software. For example, to project the cost of developing a software system, one would like to estimate the complexity of the proposed product, but methods for measuring the “complexity” of software are evasive. Similarly, evaluating the quality of a software product is challenging. In the case of mechanical devices, an important measure of quality is the mean time between failures,

M07_BROO1160_12_SE_C07.indd 332

01/08/14 11:18 AM

7.1  The Software Engineering Discipline

333

which is essentially a measurement of how well a device endures wear. Software, in contrast, does not wear out, so this method of measuring quality is not as applicable in software engineering. The difficulties involved in measuring software properties in a quantitative manner is one of the reasons that software engineering has struggled to find a rigorous footing in the same sense as mechanical and electrical engineering. Whereas these latter subjects are founded on the established science of physics, software engineering continues to search for its roots. Thus research in software engineering is currently progressing on two levels: Some researchers, sometimes called practitioners, work toward developing techniques for immediate application, whereas others, called theoreticians, search for underlying principles and theories on which more stable techniques can someday be constructed. Being based on a subjective foundation, many methodologies developed and promoted by practitioners in the past have been replaced by other approaches that may themselves become obsolete with time. Meanwhile, progress by theoreticians continues to be slow. The need for progress by both practitioners and theoreticians is enormous. Our society has become addicted to computer systems and their associated software. Our economy, healthcare, government, law enforcement, transportation, and defense depend on large software systems. Yet there continue to be major problems with the reliability of these systems. Software errors have caused such disasters and near disasters as the rising moon being interpreted as a nuclear attack, a one-day loss of $5 million by the Bank of New York, the loss of space probes, radiation overdoses that have killed and paralyzed, and the simultaneous disruption of telephone communications over large regions. This is not to say that the situation is all bleak. Much progress is being made in overcoming such problems as the lack of prefabricated components and metrics. Moreover, the application of computer technology to the software development process, resulting in what is called computer-aided software engineering (CASE), is continuing to streamline and otherwise simplify the software development process. CASE has led to the development of a variety of computerized systems, known as CASE tools, which include project planning systems (to assist in cost estimation, project scheduling, and personnel allocation), project management systems (to assist in monitoring the progress of the development project), documentation tools (to assist in writing and organizing documentation), prototyping and simulation systems (to assist in the development of prototypes), interface

Association for Computing Machinery The Association for Computing Machinery (ACM) was founded in 1947 as an international scientific and educational organization dedicated to advancing the arts, sciences, and applications of information technology. It is headquartered in New York and includes numerous special interest groups (SIGs) focusing on such topics as computer architecture, artificial intelligence, biomedical computing, computers and society, computer science education, computer graphics, hypertext/hypermedia, operating systems, programming languages, simulation and modeling, and software engineering. The ACM’s website is at http://www.acm.org. Its Code of Ethics and Professional Conduct can be found at http://www.acm.org/constitution/code.html.

M07_BROO1160_12_SE_C07.indd 333

01/08/14 11:18 AM

334

Chapter 7  Software Engineering

design systems (to assist in the development of GUIs), and programming systems (to assist in writing and debugging programs). Some of these tools are little more than the word processors, spreadsheet software, and email communication systems that were originally developed for generic use and adopted by software engineers. Others are quite sophisticated packages designed primarily for the software engineering environment. Indeed, systems known as integrated development environments (IDEs) combine tools for developing software (editors, compilers, debugging tools, and so on) into a single, integrated package. Prime examples of such systems are those for developing applications for smartphones. These not only provide the programming tools necessary to write and debug the software but also provide simulators that, by means of graphical displays, allow a programmer to see how the software being developed would actually perform on a phone. In addition to the efforts of researchers, professional and standardization organizations, including the ISO, the Association for Computing Machinery (ACM), and the Institute of Electrical and Electronics Engineers (IEEE), have joined the battle for improving the state of software engineering. These efforts range from adopting codes of professional conduct and ethics that enhance the professionalism of software developers and counter nonchalant attitudes toward each individual’s responsibilities to establishing standards for measuring the quality of software development organizations and providing guidelines to help these organizations improve their standings. In the remainder of this chapter we discuss some of the fundamental principles of software engineering (such as the software life cycle and modularity), look at some of the directions in which software engineering is moving (such as the identification and application of design patterns and the emergence of reusable software components), and witness the effects that the object-oriented paradigm has had on the field.

Questions & Exercises 1. Why would the number of lines in a program not be a good measure of

the complexity of the program? 2. Suggest a metric for measuring software quality. What weaknesses does

your metric have? 3. What technique can be used to determine how many errors are in a unit of software? 4. Identify two contexts in which the field of software engineering has been or currently is progressing toward improvements.

7.2  The Software Life Cycle The most fundamental concept in software engineering is the software life cycle.

The Cycle as a Whole The software life cycle is shown in Figure7.1. This figure represents the fact that once software is developed, it enters a cycle of being used and maintained—a cycle that continues for the rest of the software’s life. Such a pattern is common

M07_BROO1160_12_SE_C07.indd 334

01/08/14 11:18 AM

7.2  The Software Life Cycle

335

Figure 7.1   The software life cycle Development

Use

Maintenance

for many manufactured products as well. The difference is that, in the case of other products, the maintenance phase tends to be a repair process, whereas in the case of software, the maintenance phase tends to consist of correcting or updating. Indeed, software moves into the maintenance phase because errors are discovered, changes in the software’s application occur that require corresponding changes in the software, or changes made during a previous modification are found to induce problems elsewhere in the software. Regardless of why software enters the maintenance phase, the process requires that a person (often not the original author) study the underlying program and its documentation until the program, or at least the pertinent part of the program, is understood. Otherwise, any modification could introduce more problems than it solves. Acquiring this understanding can be a difficult task, even when the software is well-designed and documented. In fact, it is often within this phase that a piece of software is discarded under the pretense (too often true) that it is easier to develop a new system from scratch than to modify the existing package successfully. Experience has shown that a little effort during the development of software can make a tremendous difference when modifications are required. For example, in our discussion of data description statements in Chapter6 we saw how the use of constants rather than literals can greatly simplify future adjustments. In turn, most of the research in software engineering focuses on the development stage of the software life cycle, with the goal being to take advantage of this effortversus-benefit leverage.

The Traditional Development Phase The major steps in the traditional software development life cycle are requirements analysis, design, implementation, and testing (Figure7.2). Requirements Analysis  The software life cycle begins with requirements analysis—

the goal of which is to specify what services the proposed system will provide, to identify any conditions (time constraints, security, and so on) on those services, and to define how the outside world will interact with the system. Requirements analysis involves significant input from the stakeholders (future users as well as those with other ties, such as legal or financial interests) of the proposed system. In fact, in cases where the ultimate user is an entity, such as a company or government agency, that intends to hire a software developer for the actual execution of the software project, requirements analysis may start by a feasibility study conducted solely by the user. In other cases, the software

M07_BROO1160_12_SE_C07.indd 335

01/08/14 11:18 AM

336

Chapter 7  Software Engineering

Figure 7.2   The traditional development phase of the software life cycle

Requirements Analysis Design Implementation Testing

developer may be in the business of producing commercial off-the-shelf (COTS) software for the mass market, perhaps to be sold in retail stores or downloaded via the Internet. In this setting the user is a less precisely defined entity, and requirements analysis may begin with a market study by the software developer. In any case, the requirements analysis process consists of compiling and analyzing the needs of the software user; negotiating with the project’s stakeholders over trade-offs between wants, needs, costs, and feasibility; and finally developing a set of requirements that identify the features and services that the finished software system must have. These requirements are recorded in a document called a software requirements specification. In a sense, this document is a written agreement between all parties concerned, which is intended to guide the software’s development and provide a means of resolving disputes that may arise later in the development process. The significance of the software requirements specification is demonstrated by the fact that professional organizations such as IEEE and large software clients such as the U.S. Department of Defense have adopted standards for its composition. From the software developer’s perspective, the software requirements specification should define a firm objective toward which the software’s development can proceed. Too often, however, the document fails to provide this stability. Indeed, most practitioners in the software engineering field argue that poor communication and changing requirements are the major causes of cost overruns and late product delivery in the software engineering industry. Few customers would insist on major changes to a building’s floor plan once the foundation has been constructed, but instances abound of organizations that have expanded, or otherwise altered, the desired capabilities of a software system well after the software’s construction was underway. This may have been because a company decided that the system that was originally being developed for only a subsidiary should instead apply to the entire corporation or that advances in technology supplanted the capabilities available during the initial requirements analysis. In any case, software engineers have found that straightforward and frequent communication with the project’s stakeholders is mandatory. Design  Whereas requirements analysis provides a description of the proposed soft-

ware product, design involves creating a plan for the construction of the proposed

M07_BROO1160_12_SE_C07.indd 336

01/08/14 11:18 AM

7.2  The Software Life Cycle

337

system. In a sense, requirements analysis is about identifying the problem to be solved, while design is about developing a solution to the problem. From a layperson’s perspective, requirements analysis is often equated with deciding what a software system is to do, whereas design is equated with deciding how the system will do it. Although this description is enlightening, many software engineers argue that it is flawed because, in actuality, there is a lot of how considered during requirements analysis and a lot of what considered during design. It is in the design stage that the internal structure of the software system is established. The result of the design phase is a detailed description of the software system’s structure that can be converted into programs. If the project were to construct an office building rather than a software system, the design stage would consist of developing detailed structural plans for a building that meets the specified requirements. For example, such plans would include a collection of blueprints describing the proposed building at various levels of detail. It is from these documents that the actual building would be constructed. Techniques for developing these plans have evolved over many years and include standardized notational systems and numerous modeling and diagramming methodologies. Likewise, diagramming and modeling play important roles in the design of software. However, the methodologies and notational systems used by software engineers are not as stable as they are in the architectural field. When compared to the well-established discipline of architecture, the practice of software engineering appears very dynamic as researchers struggle to find better approaches to the software development process. We will explore this shifting terrain in Section7.3 and investigate some of the current notational systems and their associated diagramming/modeling methodologies in Section7.5. Implementation  Implementation involves the actual writing of programs, creation

of data files, and development of databases. It is at the implementation stage that we see the distinction between the tasks of a software analyst (sometimes

Institute of Electrical and Electronics Engineers The Institute of Electrical and Electronics Engineers (IEEE, pronounced “i-triple-e”) is an organization of electrical, electronics, and manufacturing engineers that was formed in 1963 as the result of merging the American Institute of Electrical Engineers (founded in 1884 by 25 electrical engineers, including Thomas Edison) and the Institute of Radio Engineers (founded in 1912). Today, IEEE’s operation center is located in Piscataway, New Jersey. The Institute includes numerous technical societies such as the Aerospace and Electronic Systems Society, the Lasers and Electro-Optics Society, the Robotics and Automation Society, the Vehicular Technology Society, and the Computer Society. Among its activities, the IEEE is involved in the development of standards. As an example, IEEE’s efforts led to the single-precision- floating point and double-precision floating-point standards (introduced in Chapter1), which are used in most of today’s computers. You will find the IEEE’s Web page at http://www.ieee.org, the IEEE Computer Society’s Web page at http://www.computer.org, and the IEEE’s Code of Ethics at http://www.ieee.org/about/whatis/code.html.

M07_BROO1160_12_SE_C07.indd 337

01/08/14 11:18 AM

338

Chapter 7  Software Engineering

referred to as a system analyst) and a programmer. The former is a person involved with the entire development process, perhaps with an emphasis on the requirements analysis and design steps. The latter is a person involved primarily with the implementation step. In its narrowest interpretation, a programmer is charged with writing programs that implement the design produced by a software analyst. Having made this distinction, we should note again that there is no central authority controlling the use of terminology throughout the computing community. Many who carry the title of software analyst are essentially programmers, and many with the title programmer (or perhaps senior programmer) are actually software analysts in the full sense of the term. This blurring of terminology is founded in the fact that today the steps in the software development process are often intermingled, as we will soon see. Testing  In the traditional development phase of the past, testing was essentially equated with the process of debugging programs and confirming that the final software product was compatible with the software requirements specification. Today, however, this vision of testing is considered far too narrow. Programs are not the only artifacts that are tested during the software development process. Indeed, the result of each intermediate step in the entire development process should be “tested” for accuracy. Moreover, as we will see in Section7.6, testing is now recognized as only one segment in the overall struggle for quality assurance, which is an objective that permeates the entire software life cycle. Thus, many software engineers argue that testing should no longer be viewed as a separate step in software development, but instead it, and its many manifestations, should be incorporated into the other steps, producing a three-step development process whose components might have names such as “requirements analysis and confirmation,” “design and validation,” and “implementation and testing.” Unfortunately, even with modern quality assurance techniques, large software systems continue to contain errors, even after significant testing. Many of these errors may go undetected for the life of the system, but others may cause major malfunctions. The elimination of such errors is one of the goals of software engineering. The fact that they are still prevalent indicates that a lot of research remains to be done.

Questions & Exercises 1. How does the development stage of the software life cycle affect the

maintenance stage? 2. Summarize each of the four stages (requirements analysis, design, implementation, and testing) within the development phase of the software life cycle. 3. What is the role of a software requirements specification?

7.3  Software Engineering Methodologies Early approaches to software engineering insisted on performing requirements analysis, design, implementation, and testing in a strictly sequential manner. The belief was that too much was at risk during the development of a large software

M07_BROO1160_12_SE_C07.indd 338

01/08/14 11:18 AM

7.3  Software Engineering Methodologies

339

system to allow for variations. As a result, software engineers insisted that the entire requirements specification of the system be completed before beginning the design and, likewise, that the design be completed before beginning implementation. The result was a development process now referred to as the waterfall model, an analogy to the fact that the development process was allowed to flow in only one direction. In recent years, software engineering techniques have changed to reflect the contradiction between the highly structured environment dictated by the waterfall model and the “free-wheeling,” trial-and-error process that is often vital to creative problem solving. This is illustrated by the emergence of the incremental model for software development. Following this model, the desired software system is constructed in increments—the first being a simplified version of the final product with limited functionality. Once this version has been tested and perhaps evaluated by the future user, more features are added and tested in an incremental manner until the system is complete. For example, if the system being developed is a patient records system for a hospital, the first increment may incorporate only the ability to view patient records from a small sample of the entire record system. Once that version is operational, additional features, such as the ability to add and update records, would be added in a stepwise manner. Another model that represents the shift away from strict adherence to the waterfall model is the iterative model, which is similar to, and in fact sometimes equated with, the incremental model, although the two are distinct. Whereas the incremental model carries the notion of extending each preliminary version of a product into a larger version, the iterative model encompasses the concept of refining each version. In reality, the incremental model involves an underlying iterative process, and the iterative model may incrementally add features. A significant example of iterative techniques is the rational unified process (RUP, rhymes with “cup”) that was created by the Rational Software Corporation, which is now a division of IBM. RUP is essentially a software development paradigm that redefines the steps in the development phase of the software life cycle and provides guidelines for performing those steps. These guidelines, along with CASE tools to support them, are marketed by IBM. Today, RUP is widely applied throughout the software industry. In fact, its popularity has led to the development of a nonproprietary version, called the unified process, that is available on a noncommercial basis. Incremental and iterative models sometimes make use of the trend in software development toward prototyping in which incomplete versions of the proposed system, called prototypes, are built and evaluated. In the case of the incremental model these prototypes evolve into the complete, final system— a process known as evolutionary prototyping. In a more iterative situation, the prototypes may be discarded in favor of a fresh implementation of the final design. This approach is known as throwaway prototyping. An example that normally falls within this throwaway category is rapid prototyping in which a simple example of the proposed system is quickly constructed in the early stages of development. Such a prototype may consist of only a few screen images that give an indication of how the system will interact with its users and what capabilities it will have. The goal is not to produce a working version of the product but to obtain a demonstration tool that can be used to clarify communication between the parties involved in the software development process. For example, rapid prototypes have proved advantageous in clarifying system requirements during requirements analysis or as aids during sales presentations to potential clients.

M07_BROO1160_12_SE_C07.indd 339

01/08/14 11:18 AM

340

Chapter 7  Software Engineering

A less formal incarnation of incremental and iterative ideas that has been used for years by computer enthusiasts/hobbyists is known as open-source development. This is the means by which much of today’s free software is produced. Perhaps the most prominent example is the Linux operating system whose opensource development was originally led by Linus Torvalds. The open-source development of a software package proceeds as follows: A single author writes an initial version of the software (usually to fulfill his or her own needs) and posts the source code and its documentation on the Internet. From there it can be downloaded and used by others without charge. Because these other users have the source code and documentation, they are able to modify or enhance the software to fit their own needs or to correct errors that they find. They report these changes to the original author, who incorporates them into the posted version of the software, making this extended version available for further modifications. In practice, it is possible for a software package to evolve through several extensions in a single week. Perhaps the most pronounced shift from the waterfall model is represented by the collection of methodologies known as agile methods, each of which proposes early and quick implementation on an incremental basis, responsiveness to changing requirements, and a reduced emphasis on rigorous requirements analysis and design. One example of an agile method is extreme programming (XP). Following the XP model, software is developed by a team of less than a dozen individuals working in a communal work space where they freely share ideas and assist each other in the development project. The software is developed incrementally by means of repeated daily cycles of informal requirements analysis, designing, implementing, and testing. Thus, new expanded versions of the software package appear on a regular basis, each of which can be evaluated by the project’s stakeholders and used to point toward further increments. In summary, agile methods are characterized by flexibility, which is in stark contrast to the waterfall model that conjures the image of managers and programmers working in individual offices while rigidly performing well-defined portions of the overall software development task. The contrasts depicted by comparing the waterfall model and XP reveal the breadth of methodologies that are being applied to the software development process in the hopes of finding better ways to construct reliable software in an efficient manner. Research in the field is an ongoing process. Progress is being made, but much work remains to be done.

Questions & Exercises 1. Summarize the distinction between the traditional waterfall model of soft-

ware development and the newer incremental and iterative paradigms. 2. Identify three development paradigms that represent the move away

from strict adherence to the waterfall model. 3. What is the distinction between traditional evolutionary prototyping and open-source development? 4. What potential problems do you suspect could arise in terms of ownership rights of software developed via the open-source methodology?

M07_BROO1160_12_SE_C07.indd 340

01/08/14 11:18 AM

7.4 Modularity

341

7.4  Modularity A key point in Section7.2 is that to modify software one must understand the program or at least the pertinent parts of the program. Gaining such an understanding is often difficult enough in the case of small programs and would be close to impossible when dealing with large software systems if it were not for modularity—that is, the division of software into manageable units, generically called modules, each of which deals with only a part of the software’s overall responsibility.

Modular Implementation Modules come in a variety of forms. We have already seen (Chapters5 and6) that in the context of the imperative paradigm, modules appear as functions. In contrast, the object-oriented paradigm uses objects as the basic modular constituents. These distinctions are important because they determine the underlying goal during the initial software design process. Is the goal to represent the overall task as individual, manageable processes or to identify the objects in the system and understand how they interact? To illustrate, let us consider how the process of developing a simple modular program to simulate a tennis game might progress in the imperative and the object-oriented paradigms. In the imperative paradigm we begin by considering the actions that must take place. Because each volley begins with a player serving the ball, we might start by considering a function named Serve that (based on the player’s characteristics and perhaps a bit of probability) would compute the initial speed and direction of the ball. Next we would need to determine the path of the ball (Will it hit the net? Where will it bounce?). We might plan on placing these computations in another function named ComputePath. The next step might be to determine if the other player is able to return the ball, and if so we must compute the ball’s new speed and direction. We might plan on placing these computations in a function named Return. Continuing in this fashion, we might arrive at the modular structure depicted by the structure chart shown in Figure7.3, in which functions are represented by rectangles and function dependencies (implemented by function calls) are represented by arrows. In particular, the chart indicates that the entire game is overseen by a function named ControlGame, and to perform its task, ­ControlGame calls on the services of the functions Serve, Return, ComputePath, and UpdateScore.

Figure 7.3   A simple structure chart ControlGame

Serve

M07_BROO1160_12_SE_C07.indd 341

Return

ComputePath

UpdateScore

01/08/14 11:18 AM

342

Chapter 7  Software Engineering

Note that the structure chart does not indicate how each function is to p ­ erform its task. Rather, it merely identifies the functions and indicates the dependencies among the functions. In reality, the function ControlGame might perform its task by first calling the Serve function, then repeatedly calling on the functions ­ComputePath and Return until one reports a miss, and finally calling on the services of UpdateScore before repeating the whole process by again calling on Serve. At this stage we have obtained only a very simplistic outline of the desired program, but our point has already been made. In accordance with the imperative paradigm, we have been designing the program by considering the activities that must be performed and are therefore obtaining a design in which the modules are functions. Let us now reconsider the program’s design—this time in the context of the object-oriented paradigm. Our first thought might be that there are two players that we should represent by two objects: PlayerA and PlayerB. These objects will have the same functionality but different characteristics. (Both should be able to serve and return volleys but may do so with different skill and strength.) Thus, these objects will be instances of the same class. (Recall that in Chapter6 we introduced the concept of a class: a template that defines the functions (called methods) and attributes (called instance variables) that are to be associated with each object.) This class, which we will call PlayerClass, will contain the methods serve and return that simulate the corresponding actions of the player. It will also contain attributes (such as skill and endurance) whose values reflect the player’s characteristics. Our design so far is represented by the diagram in Figure7.4. There we see that PlayerA and PlayerB are instances of the class PlayerClass and that this class contains the attributes skill and endurance as well as the methods serve and returnVolley. (Note that in Figure7.4 we have underlined the names of objects to distinguish them from names of classes.) Next we need an object to play the role of the official who determines whether the actions performed by the players are legal. For example, did the serve clear the net and land in the appropriate area of the court? For this purpose we might establish an object called Judge that contains the methods evaluateServe and evaluateReturn. If the Judge object determines a serve or return to be acceptable, play continues. Otherwise, the Judge sends a message to another object named Score to record the results accordingly. Figure 7.4   The structure of PlayerClass and its instances Class Class name

Attributes

PlayerClass skill endurance

Objects instance of

PlayerA

instance o

PlayerB

f

Methods

M07_BROO1160_12_SE_C07.indd 342

serve returnVolley

01/08/14 11:18 AM

7.4 Modularity

343

At this point the design for our tennis program consists of four objects: ­P layerA , PlayerB , Judge , and Score . To clarify our design, consider the

sequences of events that may occur during a volley as depicted in Figure7.5 where we have represented the objects involved as rectangles. The figure is intended to present the communication between these objects as the result of calling the serve method within the object PlayerA. Events appear chronologically as we move down the figure. As depicted by the first horizontal arrow, PlayerA reports its serve to the object Judge by calling the method evaluateServe. The Judge then determines that the serve is good and asks PlayerB to return it by calling ­PlayerB’s returnVolley method. The volley terminates when the Judge determines that PlayerA erred and asks the object Score to record the results. As in the case of our imperative example, our object-oriented program is very simplistic at this stage. However, we have progressed enough to see how the object-oriented paradigm leads to a modular design in which fundamental components are objects.

Coupling We have introduced modularity as a way of producing manageable software. The idea is that any future modification will likely apply to only a few of the modules, allowing the person making the modification to concentrate on that portion of the system rather than struggling with the entire package. This, of course, depends on the assumption that changes in one module will not unknowingly affect other modules in the system. Consequently, a goal when designing a modular system should be to maximize independence among modules or, in other words, to minimize the linkage between modules (known as intermodule coupling). Indeed, one metric that has been used to measure the complexity of a software system (and thus obtain a means of estimating the expense of maintaining the software) is to measure its intermodule coupling. Intermodule coupling occurs in several forms. One is control coupling, which occurs when a module passes control of execution to another, as in a function call. The structure chart in Figure7.3 represents the control coupling that exists between functions. In particular, the arrow from the module ControlGame Figure 7.5   The interaction between objects resulting from PlayerA’s serve PlayerA

PlayerB

Judge

Score

evaluateServe PlayerA calls the method evaluateServe in Judge.

returnVolley evaluateReturn

returnVolley evaluateReturn updateScore

M07_BROO1160_12_SE_C07.indd 343

01/08/14 11:18 AM

344

Chapter 7  Software Engineering

to Serve indicates that the former passes control to the latter. It is also control coupling that is represented in Figure7.5, where the arrows trace the path of control as it is passed from object to object. Another form of intermodule coupling is data coupling, which refers to the sharing of data between modules. If two modules interact with the same item of data, then modifications made to one module may affect the other, and modifications to the format of the data itself could have repercussions in both modules. Data coupling between functions can occur in two forms. One is by explicitly passing data from one function to another in the form of parameters. Such coupling is represented in a structure chart by an arrow between the functions that is labeled to indicate the data being passed. The direction of the arrow indicates the direction in which the item is transferred. For example, Figure7.6 is an extended version of Figure7.3 in which we have indicated that the function ControlGame will tell the function Serve which player’s characteristics are to be simulated when it calls Serve and that the function Serve will report the ball trajectory to ControlGame when Serve has completed its task. Similar data coupling occurs between objects in an object-oriented design. For example, when PlayerA asks the object Judge to evaluate its serve (see ­Figure7.5), it must pass the trajectory information to Judge. On the other hand, one of the benefits of the object-oriented paradigm is that it inherently tends to reduce data coupling between objects to a minimum. This is because the methods within an object tend to include all those functions that manipulate the object’s internal data. For example, the object PlayerA will contain information regarding that player’s characteristics as well as all the methods that require that information. In turn, there is no need to pass that information to other objects and thus interobject data coupling is minimized. In contrast to passing data explicitly as parameters, data can be shared among modules implicitly in the form of global data, which are data items that are automatically available to all modules throughout the system, as opposed to local data items that are accessible only within a particular module unless explicitly passed to another. Most high-level languages provide ways of implementing both global and local data, but the use of global data should be employed with caution. The problem is that a person trying to modify a module that is dependent on global data may find it difficult to identify how the module in question interacts with other modules. In short, the use of global data can degrade the module’s usefulness as an abstract tool.

Figure 7.6   A structure chart including data coupling ControlGame

r Id

ye

Pla

Serve

M07_BROO1160_12_SE_C07.indd 344

y

tor

ec

j Tra

Return

ComputePath

UpdateScore

01/08/14 11:18 AM

7.4 Modularity

345

Cohesion Just as important as minimizing the coupling between modules is maximizing the internal binding within each module. The term cohesion refers to this internal binding or, in other words, the degree of relatedness of a module’s internal parts. To appreciate the importance of cohesion, we must look beyond the initial development of a system and consider the entire software life cycle. If it becomes necessary to make changes in a module, the existence of a variety of activities within it can confuse what would otherwise be a simple process. Thus, in addition to seeking low intermodule coupling, software designers strive for high intramodule cohesion. A weak form of cohesion is known as logical cohesion. This is the cohesion within a module induced by the fact that its internal elements perform activities logically similar in nature. For example, consider a module that performs all of a system’s communication with the outside world. The “glue” that holds such a module together is that all the activities within the module deal with communication. However, the topics of the communication can vary greatly. Some may deal with obtaining data, whereas others deal with reporting results. A stronger form of cohesion is known as functional cohesion, which means that all the parts of the module are focused on the performance of a single activity. In an imperative design, functional cohesion can often be increased by isolating subtasks in other modules and then using these modules as abstract tools. This is demonstrated in our tennis simulation example (see again Figure7.3) where the module ControlGame uses the other modules as abstract tools so that it can concentrate on overseeing the game rather than being distracted by the details of serving, returning, and maintaining the score. In object-oriented designs, entire objects are usually only logically cohesive because the methods within an object often perform loosely related activities—the only common bond being that they are activities performed by the same object. For example, in our tennis simulation example, each player object contains methods for serving as well as returning the ball, which are significantly different activities. Such an object would therefore be only a logically cohesive module. However, software designers should strive to make each individual method within an object functionally cohesive. That is, even though the object in its entirety is only logically cohesive, each method within an object should perform only one functionally cohesive task (Figure7.7).

Information Hiding One of the cornerstones of good modular design is captured in the concept of information hiding, which refers to the restriction of information to a specific portion of a software system. Here the term information should be interpreted in a broad sense, including any knowledge about the structure and contents of a program unit. As such, it includes data, the type of data structures used, encoding systems, the internal compositional structure of a module, the logical structure of a procedural unit, and any other factors regarding the internal properties of a module. The point of information hiding is to keep the actions of modules from having unnecessary dependencies or effects on other modules. Otherwise, the validity of a module may be compromised, perhaps by errors in the development of other modules or by misguided efforts during software maintenance. If, for example, a module does not restrict the use of its internal data from other modules, then that data may become corrupted by other modules. Or, if one module is designed

M07_BROO1160_12_SE_C07.indd 345

01/08/14 11:18 AM

346

Chapter 7  Software Engineering

Figure 7.7   Logical and functional cohesion within an object

Object Each method within the object is functionally cohesive

Perform action A

Perform action B

Perform action C

Each object is only logically cohesive

to take advantage of another’s internal structure, it could malfunction later if that internal structure is altered. It is important to note that information hiding has two incarnations—one as a design goal, the other as an implementation goal. A module should be designed so that other modules do not need access to its internal information, and a module should be implemented in a manner that reinforces its boundaries. Examples of the former are maximizing cohesion and minimizing coupling. Examples of the latter involve the use of local variables, applying encapsulation, and using welldefined control structures. Finally we should note that information hiding is central to the theme of abstraction and the use of abstract tools. Indeed, the concept of an abstract tool is that of a “black box” whose interior features can be ignored by its user, allowing the user to concentrate on the larger application at hand. In this sense then, information hiding corresponds to the concept of sealing the abstract tool in much the same way as a tamperproof enclosure can be used to safeguard complex and potentially dangerous electronic equipment. Both protect their users from the dangers inside as well as protect their interiors from intrusion from their users.

Components We have already mentioned that one obstacle in the field of software engineering is the lack of prefabricated “off-the-shelf” building blocks from which large software systems can be constructed. The modular approach to software development promises hope in this regard. In particular, the object-oriented programming paradigm is proving especially useful because objects form complete, self-contained units that have clearly defined interfaces with their environments. Once an object, or more correctly a class, has been designed to fulfill a certain role, it can be used to fulfill that role in any program requiring that service. Moreover, inheritance provides a means of refining prefabricated object definitions

M07_BROO1160_12_SE_C07.indd 346

01/08/14 11:18 AM

7.4 Modularity

347

in those cases in which the definitions must be customized to conform to the needs of a specific application. It is not surprising, then, that the object-oriented programming languages C++, Java, and C# are accompanied by collections of prefabricated “templates” from which programmers can easily implement objects for performing certain roles. In particular, C++ is associated with the C++ Standard Template Library, the Java programming environment is accompanied by the Java Application Programmer Interface (API), and C# programmers have access to the .NET Framework Class Library. The fact that objects and classes have the potential of providing prefabricated building blocks for software design does not mean that they are ideal. One problem is that they provide relatively small blocks from which to build. Thus, an object is actually a special case of the more general concept of a component, which is, by definition, a reusable unit of software. In practice, most components are based on the object-oriented paradigm and take the form of a collection of one or more objects that function as a self-contained unit. Research in the development and use of components has led to the emerging field known as component architecture (also known as component-based software engineering) in which the traditional role of a programmer is replaced by a component assembler who constructs software systems from prefabricated components that, in many development environments, are displayed as icons in a graphical interface. Rather than be involved with the internal programming of the components, the methodology of a component assembler is to select pertinent components from collections of predefined components and then connect them, with minimal customization, to obtain the desired functionality. Indeed, a property of a well-designed component is that it can be extended to encompass features of a particular application without internal modifications. An area where component architectures have found fertile ground is in smartphone systems. Due to the resource constraints of these devices, applications are actually a set of collaborating components, each of which provides some discrete

Software Engineering in the Real World The following scenario is typical of the problems encountered by real-world software engineers. Company XYZ hires a software-engineering firm to develop and install a company-wide integrated software system to handle the company’s data processing needs. As a part of the system produced by Company XYZ, a network of PCs is used to provide employees access to the company-wide system. Thus each employee finds a PC on his or her desk. Soon these PCs are used not only to access the new data management system but also as customizable tools with which each employee increases his or her productivity. For example, one employee may develop a spreadsheet program that streamlines that employee’s tasks. Unfortunately, such customized applications may not be well designed or thoroughly tested and may involve features that are not completely understood by the employee. As the years go by, the use of these ad hoc applications becomes integrated into the company’s internal business procedures. Moreover, the employees who developed these applications may be promoted, transferred, or quit the company, leaving others behind using a program they do not understand. The result is that what started out as a well-designed, coherent system can become dependent on a patchwork of poorly designed, undocumented, and error-prone applications.

M07_BROO1160_12_SE_C07.indd 347

01/08/14 11:18 AM

348

Chapter 7  Software Engineering

function for the application. For example, each display screen within an application is usually a separate component. Behind the scenes, there may exist other service components to store and access information on a memory card, perform some continuous function (such as playing music), or access information over the Internet. Each of these components is individually started and stopped as needed to service the user efficiently; however, the application appears as a seamless series of displays and actions. Aside from the motivation to limit the use of system resources, the component architecture of smartphones pays dividends in integration between applications. For example, Facebook (a well-known social networking system) when executed on a smartphone may use the components of the contacts application to add all Facebook friends as contacts. Furthermore, the telephony application (the one that handles the functions of the phone), may also access the contacts’ components to lookup the caller of an incoming call. Thus, upon receiving a call from a Facebook friend, the friend’s picture can be displayed on the phone’s screen (along with his or her last Facebook post).

Questions & Exercises 1. How does a novel differ from an encyclopedia in terms of the degree of

coupling between its units such as chapters, sections, or entries? What about cohesion? 2. A sporting event is often divided into units. For example, a baseball game is divided into innings and a tennis match is divided into sets. Analyze the coupling between such “modules.” In what sense are such units cohesive? 3. Is the goal of maximizing cohesion compatible with minimizing coupling? That is, as cohesion increases, does coupling naturally tend to decrease? 4. Define coupling, cohesion, and information hiding. 5. Extend the structure chart in Figure 7.3 to include the data coupling between the modules ControlGame and UpdateScore. 6. Draw a diagram similar to that of Figure7.5 to represent the sequence that would occur if PlayerA’s serve is ruled invalid. 7. What is the difference between a traditional programmer and a component assembler? 8. Assuming most smartphones have a number of personal organization applications (calendars, contacts, clocks, social networking, email systems, maps, etc.), what combinations of component functions would you find useful and interesting?

7.5  Tools of the Trade In this section we investigate some of the modeling techniques and notational systems used during the analysis and design stages of software development. Several of these were developed during the years that the imperative paradigm dominated the software engineering discipline. Of these, some have found useful roles in the context of the object-oriented paradigm whereas others, such as the

M07_BROO1160_12_SE_C07.indd 348

01/08/14 11:18 AM

7.5  Tools of the Trade

349

structure chart (see again Figure7.3), are specific to the imperative paradigm. We begin by considering some of the techniques that have survived from their imperative roots and then move on to explore newer object-oriented tools as well as the expanding role of design patterns.

Some Old Friends Although the imperative paradigm seeks to build software in terms of procedures or functions, a way of identifying those functions is to consider the data to be manipulated rather than the functions themselves. The theory is that by studying how data moves through a system, one identifies the points at which either data formats are altered or data paths merge and split. In turn, these are the locations at which processing occurs, and thus dataflow analysis leads to the identification of functions. A dataflow diagram is a means of representing the information gained from such dataflow studies. In a dataflow diagram, arrows represent data paths, ovals represent points at which data manipulation occurs, and rectangles represent data sources and stores. As an example, Figure7.8 displays an elementary dataflow diagram representing a hospital’s patient billing system. Note that the diagram shows that Payments (flowing from patients) and PatientRecords (flowing from the hospital’s files) merge at the oval ProcessPayments from which UpdatedRecords flow back to the hospital’s files. Dataflow diagrams not only assist in identifying procedures during the design stage of software development, but they are also useful when trying to gain an understanding of the proposed system during the analysis stage. Indeed, constructing dataflow diagrams can serve as a means of improving communication between clients and software engineers (as the software engineer struggles to understand what the client wants and the client struggles to describe his or her expectations), and thus these diagrams continue to find applications even though the imperative paradigm has faded in popularity. Another tool that has been used for years by software engineers is the data dictionary, which is a central repository of information about the data items appearing throughout a software system. This information includes the identifier used to reference each item, what constitutes valid entries in each item (Will the item always be numeric or perhaps always alphabetic? What will be the range of values that might be assigned to this item?), where the item is stored (Will the item be stored in a file or a database and, if so, which one?), and where the item is referenced in the software (Which modules will require the item’s information?). Figure 7.8   A simple dataflow diagram

p

tient records pa

ay

me

nts

Hospital Files

Process Payments

u

pd

a t e d re c o r d

s

ds

Patient

b ill

M07_BROO1160_12_SE_C07.indd 349

s

Process Bills

t p a ti e n

re

co

r

01/08/14 11:18 AM

350

Chapter 7  Software Engineering

One goal of constructing a data dictionary is to improve communication between the stakeholders of a software system and the software engineer charged with the task of converting all of the stakeholder needs into a requirements specification. In this context the construction of a data dictionary helps ensure that the fact that part numbers are not really numeric will be revealed during the analysis stage rather than being discovered late in the design or implementation stages. Another goal associated with the data dictionary is to establish uniformity throughout the system. It is usually by means of constructing the dictionary that redundancies and contradictions surface. For example, the item referred to as PartNumber in the inventory records may be the same as the PartId in the sales records. Moreover, the personnel department may use the item Name to refer to an employee while inventory records may contain the term Name in reference to a part.

Unified Modeling Language Dataflow diagrams and data dictionaries were tools in the software engineering arsenal well before the emergence of the object-oriented paradigm and have continued to find useful roles even though the imperative paradigm, for which they were originally developed, has faded in popularity. We turn now to the more modern collection of tools known as Unified Modeling Language (UML) that has been developed with the object-oriented paradigm in mind. The first tool that we consider within this collection, however, is useful regardless of the underlying paradigm because it attempts merely to capture the image of the proposed system from the user’s point of view. This tool is the use case diagram—an example of which appears in Figure7.9. A use case diagram depicts the proposed system as a large rectangle in which interactions (called use cases) between the system and its users are represented as ovals and users of the system (called actors) are represented as stick figures (even though an actor may not be a person). Thus, the diagram in Figure7.9 indicates that the proposed Hospital Records System will be used by both Physicians and Nurses to Retrieve Medical Records. Whereas use case diagrams view a proposed software system from the outside, UML offers a variety of tools for representing the internal object-oriented design of a system. One of these is the class diagram, which is a notational system for representing the structure of classes and relationships between classes (called associations in UML vernacular). As an example, consider the relationships between physicians, patients, and hospital rooms. We assume that objects representing these entities are constructed from the classes Physician, Patient, and Room, respectively. Figure7.10 shows how the relationships among these classes could be represented in a UML class diagram. Classes are represented by rectangles and associations are represented by lines. Association lines may or may not be labeled. If they are labeled, a bold arrowhead can be used to indicate the direction in which the label should be read. For example, in Figure7.10 the arrowhead following the label cares for indicates that a physician cares for a patient rather than a patient cares for a physician. Sometimes association lines are given two labels to provide terminology for reading the association in either direction. This is exemplified in Figure7.10 in the association between the classes Patient and Room.

M07_BROO1160_12_SE_C07.indd 350

01/08/14 11:18 AM

7.5  Tools of the Trade

351

Figure 7.9   A simple use case diagram Hospital Records System

Retrieve Medical Record

Update Medical Record

Physician

Nurse

Retrieve Laboratory Results

Update Laboratory Results Laboratory Technician

Retrieve Financial Records

Update Financial Records

Administrator

In addition to indicating associations between classes, a class diagram can also convey the multiplicities of those associations. That is, it can indicate how many instances of one class may be associated with instances of another. This information is recorded at the ends of the association lines. In particular, Figure7.10 indicates that each patient can occupy one room and each room can host zero or one patient. (We are assuming that each room is a private room.) An asterisk is used to indicate an arbitrary nonnegative number. Thus, the asterisk in Figure7.10 indicates that each physician may care for many patients, whereas the 1 at the physician end of the association means that each patient is cared for by only one physician. (Our design considers only the role of primary physicians.) For the sake of completeness, we should note that association multiplicities occur in three basic forms: one-to-one relationships, one-to-many relationships, Figure 7.10   A simple class diagram Physician

M07_BROO1160_12_SE_C07.indd 351

1

* cares for

Patient

0 or 1 occupies hosts

1

Room

01/08/14 11:18 AM

352

Chapter 7  Software Engineering

and many-to-many relationships as summarized in Figure7.11. A one-to-one relationship is exemplified by the association between patients and occupied private rooms in that each patient is associated with only one room and each room is associated with only one patient. A one-to-many relationship is exemplified by the association between physicians and patients in that one physician is associated with many patients and each patient is associated with one (primary) physician. A many-to-many relationship would occur if we included consulting physicians in the physician–patient relationship. Then each physician could be associated with many patients and each patient could be associated with many physicians. In an object-oriented design it is often the case that one class represents a more specific version of another. In those situations we say that the latter class is a generalization of the former. UML provides a special notation for representing generalizations. An example is given in Figure 7.12, which depicts the generalizations among the classes MedicalRecord, SurgicalRecord, and ­OfficeVisitRecord. There the associations between the classes are represented by arrows with hollow arrowheads, which is the UML notation for associations that are generalizations. Note that each class is represented by a rectangle containing the name, attributes, and methods of the class in the format introduced in Figure7.4. This is UML’s way of representing the internal characteristics of a class in a class diagram. The information portrayed in Figure7.12 is that the class MedicalRecord is a generalization of the class SurgicalRecord as well as a generalization of ­OfficeVisitRecord. That is, the classes SurgicalRecord and ­OfficeVisitRecord contain all the features of the class MedicalRecord plus those features explicitly listed inside their appropriate rectangles. Thus, both the SurgicalRecord and the ­OfficeVisitRecord classes contain patient, doctor, and date of record, but the SurgicalRecord class also contains surgical procedure, hospital, discharge date, and the ability to discharge a patient, whereas the OfficeVisitRecord class contains symptoms and diagnosis. All three Figure 7.11   One-to-one, one-to-many, and many-to-many relationships between entities of types X and Y One-to-one Entities of type x

M07_BROO1160_12_SE_C07.indd 352

Entities of type y

One-to-many Entities of type x

Entities of type y

Many-to-many Entities of type x

Entities of type y

01/08/14 11:18 AM

7.5  Tools of the Trade

353

Figure 7.12   A class diagram depicting generalizations MedicalRecord dateOfRecord patient doctor printRecord

SurgicalRecord

OfficeVisitRecord

surgicalProcedure hospital dateOfDischarge

symptoms diagnosis

dischargePatient printRecord

printRecord

classes have the ability to print the medical record. The printRecord method in ­SurgicalRecord and OfficeVisitRecord are specializations of the printRecord method in MedicalRecord, each of which will print the information specific to its class. Recall from Chapter6 (Section6.5) that a natural way of implementing generalizations in an object-oriented programming environment is to use inheritance. However, many software engineers caution that inheritance is not appropriate for all cases of generalization. The reason is that inheritance introduces a strong degree of coupling between the classes—a coupling that may not be desirable later in the software’s life cycle. For example, because changes within a class are reflected automatically in all the classes that inherit from it, what may appear to be minor modifications during software maintenance can lead to unforeseen consequences. As an example, suppose a company opened a recreation facility for its employees, meaning that all people with membership in the recreation facility are employees. To develop a membership list for this facility, a programmer could use inheritance to construct a RecreationMember class from a previously defined Employee class. But, if the company later prospers and decides to open the recreation facility to dependents of employees or perhaps company retirees, then the embedded coupling between the Employee class and the ­RecreationMember class would have to be severed. Thus, inheritance should not be used merely for convenience. Instead, it should be restricted to those cases in which the generalization being implemented is immutable. Class diagrams represent static features of a program’s design. They do not represent sequences of events that occur during execution. To express such dynamic features, UML provides a variety of diagram types that are collectively known as interaction diagrams. One type of interaction diagram is the sequence diagram that depicts the communication between the individuals (such as actors,

M07_BROO1160_12_SE_C07.indd 353

01/08/14 11:18 AM

354

Chapter 7  Software Engineering

complete software components, or individual objects) that are involved in performing a task. These diagrams are similar to Figure7.5 in that they represent the individuals by rectangles with dashed lines extending downward. Each rectangle together with its dashed line is called a life line. Communication between the individuals is represented by labeled arrows connecting the appropriate life line, where the label indicates the action being requested. These arrows appear chronologically as the diagram is read from top to bottom. The communication that occurs when an individual completes a requested task and returns control back to the requesting individual, as in the traditional return from a procedure, is represented by an unlabeled arrow pointing back to the original life line. Thus, Figure7.5 is essentially a sequence diagram. However, the syntax of Figure7.5 alone has several shortcomings. One is that it does not allow us to capture the symmetry between the two players. We must draw a separate diagram to represent a volley starting with a serve from PlayerB, even though the interaction sequence is very similar to that when PlayerA serves. Moreover, whereas Figure7.5 depicts only a specific volley, a general volley may extend indefinitely. Formal sequence diagrams have techniques for capturing these variations in a single diagram, and although we do not need to study these in detail, we should still take a brief look at the formal sequence diagram shown in Figure7.13, which depicts a general volley based on our tennis game design. Note also that Figure7.13 demonstrates that an entire sequence diagram is enclosed in a rectangle (called a frame). In the upper left-hand corner of the frame is a pentagon containing the characters sd (meaning “sequence diagram”) Figure 7.13   A sequence diagram depicting a generic volley sd serve

self : PlayerClass

Judge

: PlayerClass

Score

evaluateServe loop

[validPlay == true]

[fromServer == true]

alt

returnVolley Designates the interaction fragment type

Designates the condition controlling the interaction fragment

evaluateReturn [fromServer == false] returnVolley evaluateReturn updateScore

M07_BROO1160_12_SE_C07.indd 354

01/08/14 11:18 AM

7.5  Tools of the Trade

355

followed by an identifier. This identifier may be a name identifying the overall sequence or, as in Figure7.13, the name of the method that is called to initiate the sequence. Note that in contrast to Figure7.5, the rectangles representing the players in Figure7.13 do not refer to specific players but merely indicate that they represent objects of the “type” PlayerClass. One of these is designated self, meaning that it is the one whose serve method is activated to initiate the sequence. The other point to make regarding Figure7.13 deals with the two inner rectangles. These are interaction fragments, which are used to represent alternative sequences within one diagram. Figure7.13 contains two interaction fragments. One is labeled “loop,” the other is labeled “alt.” These are essentially the while and if-else structures that we first encountered in Python in Section5.2. The “loop” interaction fragment indicates that the events within its boundaries are to be repeated as long as the Judge object determines that the value of validPlay is true. The “alt” interaction fragment indicates that one of its alternatives is to be performed depending on whether the value of fromServer is true or false. Finally, although they are not a part of UML, it is appropriate at this point to introduce the role of CRC (class-responsibility-collaboration) cards because they play an important role in validating object-oriented designs. A CRC card is simply a card, such as an index card, on which the description of an object is written. The methodology of CRC cards is for the software designer to produce a card for each object in a proposed system and then to use the cards to represent the objects in a simulation of the system—perhaps on a desktop or via a “theatrical” experiment in which each member of the design team holds a card and plays the role of the object as described by that card. Such simulations (often called structured walkthroughs) have been found useful in identifying flaws in a design prior to the design’s implementation.

Design Patterns An increasingly powerful tool for software engineers is the growing collection of design patterns. A design pattern is a predeveloped model for solving a recurring problem in software design. For example, the Adapter pattern provides a solution to a problem that often occurs when constructing software from prefabricated modules. In particular, a prefabricated module may have the functionality needed to solve the problem at hand but may not have an interface that is compatible with the current application. In such cases the Adapter pattern provides a standard approach to “wrapping” that module inside another module that translates between the original module’s interface and the outside world, thus allowing the original, prefabricated module to be used in the application. Another well-established design pattern is the Decorator pattern. It provides a means of designing a system that performs different combinations of the same activities depending on the situation at the time. Such systems can lead to an explosion of options that, without careful design, can result in enormously complex software. However, the Decorator pattern provides a standardized way of implementing such systems that leads to a manageable solution. The identification of recurring problems as well as the creation and cataloging of design patterns for solving them is an ongoing process in software engineering. The goal, however, is not merely to find solutions to design problems but to find high-quality solutions that provide flexibility later in the software life cycle. Thus,

M07_BROO1160_12_SE_C07.indd 355

01/08/14 11:18 AM

356

Chapter 7  Software Engineering

considerations of good design principles such as minimizing coupling and maximizing cohesion play an important role in the development of design patterns. The results of progress in design pattern development are reflected in the library of tools provided in today’s software development packages such as the Java programming environments provided by Oracle and the .NET Framework provided by Microsoft. Indeed, many of the templates found in these tool kits are essentially design pattern skeletons that lead to ready-made, high-quality solutions to design problems. In closing, we should mention that the emergence of design patterns in software engineering is an example of how diverse fields can contribute to each other. The origins of design patterns lie in the research of Christopher Alexander in traditional architecture. His goal was to identify features that contribute to high-quality architectural designs for buildings or building complexes and then to develop design patterns that incorporated those features. Today, many of his ideas have been incorporated into software design and his work continues to be an inspiration for many software engineers.

Questions & Exercises 1. Draw a dataflow diagram representing the flow of data that occurs when

a patron checks a book out of a library. 2. Draw a use case diagram of a library records system. 3. Draw a class diagram representing the relationship between travelers and the hotels in which they stay. 4. Draw a class diagram representing the fact that a person is a generalization of an employee. Include some attributes that might belong to each. 5. Convert Figure7.5 into a complete sequence diagram. 6. What role in the software engineering process do design patterns play?

7.6  Quality Assurance The proliferation of software malfunctions, cost overruns, and missed deadlines demands that methods of software quality control be improved. In this section we consider some of the directions being pursued in this endeavor.

The Scope of Quality Assurance In the early years of computing, the problem of producing quality software focused on removing programming errors that occurred during implementation. Later in this section we will discuss the progress that has been made in this direction. However, today, the scope of software quality control extends far beyond the debugging process, with branches including the improvement of software engineering procedures, the development of training programs that in many cases lead to certification, and the establishment of standards on which sound software engineering can be based. In this regard, we have already noted

M07_BROO1160_12_SE_C07.indd 356

01/08/14 11:18 AM

7.6  Quality Assurance

357

the role of organizations such as ISO, IEEE, and ACM in improving professionalism and establishing standards for assessing quality control within software development companies. A specific example is the ISO 9000 series of standards, which address numerous industrial activities such as design, production, installation, and servicing. Another example is ISO/IEC 15504, which is a set of standards developed jointly by the ISO and the International Electrotechnical Commission (IEC). Many major software contractors now require that the organizations they hire to develop software meet such standards. As a result, software development companies are establishing software quality assurance (SQA) groups, which are charged with overseeing and enforcing the quality control systems adopted by the organization. Thus, in the case of the traditional waterfall model, the SQA group would be charged with the task of approving the software requirements specification before the design stage began or approving the design and its related documents before implementation was initiated. Several themes underlie today’s quality control efforts. One is record keeping. It is paramount that each step in the development process be accurately documented for future reference. However, this goal conflicts with human nature. At issue is the temptation to make decisions or change decisions without updating the related documents. The result is the chance that records will be incorrect and hence their use at future stages will be misleading. Herein lies an important benefit of CASE tools. They make such tasks as redrawing diagrams and updating data dictionaries much easier than with manual methods. Consequently, updates are more likely to be made and the final documentation is more likely to be accurate. (This example is only one of many instances in which software engineering must cope with the faults of human nature. Others include the inevitable personality conflicts, jealousies, and ego clashes that arise when people work together.) Another quality-oriented theme is the use of reviews in which various parties involved in a software development project meet to consider a specific topic. Reviews occur throughout the software development process, taking the form of requirements reviews, design reviews, and implementation reviews. They may appear as a prototype demonstration in the early stages of requirements analysis,

System Design Tragedies The need for good design disciplines is exemplified by the problems encountered in the Therac-25, which was a computer-based electron-accelerator radiation-therapy system used by the medical community in the middle 1980s. Flaws in the machine’s design contributed to six cases of radiation overdose—three of which resulted in death. The flaws included (1) a poor design for the machine’s interface that allowed the operator to begin radiation before the machine had adjusted for the proper dosage, and (2) poor coordination between the design of the hardware and software that resulted in the absence of certain safety features. In more recent cases, poor design has led to widespread power outages, severance of telephone service, major errors in financial transactions, loss of space probes, and disruption of the Internet. You can learn more about such problems through the Risks Forum at http://catless.ncl.ac.uk/Risks.

M07_BROO1160_12_SE_C07.indd 357

01/08/14 11:18 AM

358

Chapter 7  Software Engineering

as a structured walkthrough among members of the software design team, or as coordination among programmers who are implementing related portions of the design. Such reviews, on a recurring basis, provide communication channels through which misunderstandings can be avoided and errors can be corrected before they grow into disasters. The significance of reviews is exemplified by the fact that they are specifically addressed in the IEEE Standard for Software Reviews, known as IEEE 1028. Some reviews are pivotal in nature. An example is the review between representatives of a project’s stakeholders and the software development team at which the final software requirements specification is approved. Indeed, this approval marks the end of the formal requirements analysis phase and is the basis on which the remaining development will progress. However, all reviews are significant, and for the sake of quality control, they should be documented as part of the ongoing record maintenance process.

Software Testing Whereas software quality assurance is now recognized as a subject that permeates the entire development process, testing and verification of the programs themselves continues to be a topic of research. In Section5.6 we discussed techniques for verifying the correctness of algorithms in a mathematically rigorous manner but concluded that most software today is “verified” by means of testing. Unfortunately, such testing is inexact at best. We cannot guarantee that a piece of software is correct via testing unless we run enough tests to exhaust all possible scenarios. But, even in simple programs, there may be billions of different paths that could potentially be traversed. Thus, testing all possible paths within a complex program is an impossible task. On the other hand, software engineers have developed testing methodologies that improve the odds of revealing errors in software with a limited number of tests. One of these is based on the observation that errors in software tend to be clumped. That is, experience has shown that a small number of modules within a large software system tend to be more problematic than the rest. Thus, by identifying these modules and testing them more thoroughly, more of the system’s errors can be discovered than if all modules were tested in a uniform, less-thorough manner. This is an instance of the proposition known as the Pareto principle, in reference to the economist and sociologist Vilfredo Pareto (1848−1923) who observed that a small part of Italy’s population controlled most of Italy’s wealth. In the field of software engineering, the Pareto principle states that results can often be increased most rapidly by applying efforts in a concentrated area. Another software testing methodology, called basis path testing, is to develop a set of test data that insures that each instruction in the software is executed at least once. Techniques using an area of mathematics known as graph theory have been developed for identifying such sets of test data. Thus, although it may be impossible to ensure that every path through a software system is tested, it is possible to ensure that every statement within the system is executed at least once during the testing process. Techniques based on the Pareto principle and basis path testing rely on knowledge of the internal composition of the software being tested. They therefore fall within the category called glass-box testing—meaning that the software tester is aware of the interior structure of the software and uses this knowledge

M07_BROO1160_12_SE_C07.indd 358

01/08/14 11:18 AM

7.6  Quality Assurance

359

when designing the test. In contrast is the category called black-box testing, which refers to tests that do not rely on knowledge of the software’s interior composition. In short, black-box testing is performed from the user’s point of view. In black-box testing, one is not concerned with how the software goes about its task but merely with whether the software performs correctly in terms of accuracy and timeliness. An example of black-box testing is the technique, called boundary value analysis, that consists of identifying ranges of data, called equivalence classes, over which the software should perform in a similar manner and then testing the software on data close to the edge of those ranges. For example, if the software is supposed to accept input values within a specified range, then the software would be tested at the lowest and highest values in that range, or if the software is supposed to coordinate multiple activities, then the software would be tested on the largest possible collection of activities. The underlying theory is that by identifying equivalence classes, the number of test cases can be minimized because correct operation for a few examples within an equivalence class tends to validate the software for the entire class. Moreover, the best chance of identifying an error within a class is to use data at the class edges. Another methodology that falls within the black-box category is beta testing in which a preliminary version of the software is given to a segment of the intended audience with the goal of learning how the software performs in real-life situations before the final version of the product is solidified and released to the market. (Similar testing performed at the developer’s site is called alpha testing.) The advantages of beta testing extend far beyond the traditional discovery of errors. General customer feedback (both positive and negative) is obtained that may assist in refining market strategies. Moreover, early distribution of beta software assists other software developers in designing compatible products. For example, in the case of a new operating system for the PC market, the distribution of a beta version encourages the development of compatible utility software so that the final operating system ultimately appears on store shelves surrounded by companion products. Moreover, the existence of beta testing can generate a feeling of anticipation within the marketplace—an atmosphere that increases publicity and sales.

Questions & Exercises 1. What is the role of the SQA group within a software development

organization? 2. In what ways does human nature work against quality assurance? 3. Identify two themes that are applied throughout the development process

to enhance quality. 4. When testing software, is a successful test one that does or does not find

errors? 5. What techniques would you propose using to identify the modules within a system that should receive more thorough testing than others? 6. What would be a good test to perform on a software package that was designed to sort a list of no more than 100 entries?

M07_BROO1160_12_SE_C07.indd 359

01/08/14 11:18 AM

360

Chapter 7  Software Engineering

7.7  Documentation A software system is of little use unless people can learn to use and maintain it. Hence, documentation is an important part of a final software package, and its development is, therefore, an important topic in software engineering. Software documentation serves three purposes, leading to three categories of documentation: user documentation, system documentation, and technical documentation. The purpose of user documentation is to explain the features of the software and describe how to use them. It is intended to be read by the user of the software and is therefore expressed in the terminology of the application. Today, user documentation is recognized as an important marketing tool. Good user documentation combined with a well-designed user interface makes a software package accessible and thus increases its sales. Recognizing this, many software developers hire technical writers to produce this part of their product, or they provide preliminary versions of their products to independent authors so that howto books are available in book stores when the software is released to the public. User documentation traditionally takes the form of a physical book or booklet, but in many cases the same information is included as part of the software itself. This allows a user to refer to the documentation while using the software. In this case the information may be broken into small units, sometimes called help packages, that may appear on the display screen automatically if the user dallies too long between commands. The purpose of system documentation is to describe the software’s internal composition so that the software can be maintained later in its life cycle. A major component of system documentation is the source version of all the programs in the system. It is important that these programs be presented in a readable format, which is why software engineers support the use of well-designed, high-level programming languages, the use of comment statements for annotating a program, and a modular design that allows each module to be presented as a coherent unit. In fact, most companies that produce software products have adopted conventions for their employees to follow when writing programs. These include indentation conventions for organizing a program on the written page; naming conventions that establish a distinction between names of different program constructs such as variables, constants, objects, and classes; and documentation conventions to ensure that all programs are sufficiently documented. Such conventions establish uniformity throughout a company’s software, which ultimately simplifies the software maintenance process. Another component of system documentation is a record of the design documents including the software requirements specification and records showing how these specifications were obtained during design. This information is useful during software maintenance because it indicates why the software was implemented as it was—information that reduces the chance that changes made during maintenance will disrupt the integrity of the system. The purpose of technical documentation is to describe how a software system should be installed and serviced (such as adjusting operating parameters, installing updates, and reporting problems back to the software’s developer). Technical documentation of software is analogous to the documentation provided to mechanics in the automobile industry. This documentation does not discuss how the car was designed and constructed (analogous to system documentation), nor does it explain how to drive the car and operate its heating/cooling system

M07_BROO1160_12_SE_C07.indd 360

01/08/14 11:18 AM

7.8  The Human-Machine Interface

361

(analogous to user documentation). Instead, it describes how to service the car’s components—for example, how to replace the transmission or how to track down an intermittent electrical problem. The distinction between technical documentation and user documentation is blurred in the PC arena because the user is often the person who also installs and services the software. However, in multiuser environments, the distinction is sharper. Therefore, technical documentation is intended for the system administrator who is responsible for servicing all the software under his or her jurisdiction, allowing the users to access the software packages as abstract tools.

Questions & Exercises 1. In what forms can software be documented? 2. At what phase (or phases) in the software life cycle is system documenta-

tion prepared? 3. Which is more important, a program or its documentation?

7.8  The Human-Machine Interface Recall from Section7.2 that one of the tasks during requirements analysis is to define how the proposed software system will interact with its environment. In this section we consider topics associated with this interaction when it involves communicating with humans—a subject with profound significances. After all, humans should be allowed to use a software system as an abstract tool. This tool should be easy to apply and designed to minimize (ideally eliminate) communication errors between the system and its human users. This means that the system’s interface should be designed for the convenience of humans rather than merely the expediency of the software system. The importance of good interface design is further emphasized by the fact that a system’s interface is likely to make a stronger impression on a user than any other system characteristic. After all, a human tends to view a system in terms of its usability, not in terms of how cleverly it performs its internal tasks. From a human’s perspective, the choice between two competing systems is likely to be based on the systems’ interfaces. Thus, the design of a system’s interface can ultimately be the determining factor in the success or failure of a software engineering project. For these reasons, the human-machine interface has become an important concern in the requirements stage of software development projects and is a growing subfield of software engineering. In fact, some would argue that the study of human-machine interfaces is an entire field in its own right. A beneficiary of research in this field is the smartphone interface. In order to attain the goal of a convenient pocket-sized device, elements of the traditional human-machine interface (full-sized keyboard, mouse, scroll bars, menus) are being replaced with new approaches; such as gestures performed on a touch screen, voice commands, and virtual keyboards with advanced autocompletion of words and phrases. While these represent significant progress, most smartphone users would argue that there is plenty of room for further innovation.

M07_BROO1160_12_SE_C07.indd 361

01/08/14 11:18 AM

362

Chapter 7  Software Engineering

Research in human-machine interface design draws heavily from the areas of engineering called ergonomics, which deals with designing systems that harmonize with the physical abilities of humans, and cognetics, which deals with designing systems that harmonize with the mental abilities of humans. Of the two, ergonomics is the better understood, largely because humans have been interacting physically with machines for centuries. Examples are found in ancient tools, weaponry, and transportation systems. Much of this history is self-evident; however, at times the application of ergonomics has been counterintuitive. An often-cited example is the design of the typewriter keyboard (now reincarnated as the computer keyboard) in which the keys were intentionally arranged to reduce a typist’s speed so that the mechanical system of levers used in the early machines would not jam. Mental interaction with machines, in contrast, is a relatively new phenomenon, and thus, it is cognetics that offers the higher potential for fruitful research and enlightening insights. Often the findings are interesting in their subtlety. For example, humans form habits—a trait that, on the surface, is good because it can increase efficiency. But, habits can also lead to errors, even when the design of an interface intentionally addresses the problem. Consider the process of a human asking a typical operating system to delete a file. To avoid unintentional deletions, most interfaces respond to such a request by asking the user to confirm the request—perhaps via a message such as, “Do you really want to delete this file?” At first glance, this confirmation requirement would seem to resolve any problem of unintentional deletions. However, after using the system for an extended period, a human develops the habit of automatically answering the question with “yes.” Thus, the task of deleting a file ceases to be a two-step process consisting of a delete command followed by a thoughtful response to a question. Instead, it becomes a one-step “delete-yes” process, meaning that by the time the human realizes that an incorrect delete request has been submitted, the request has already been confirmed and the deletion has occurred. The formation of habits may also cause problems when a human is required to use several application software packages. The interfaces of such packages may be similar yet different. Similar user actions may result in different system responses or similar system responses may require different user actions. In these cases habits developed in one application may lead to errors in the other applications. Another human characteristic that concerns researchers in human-machine interface design is the narrowness of a human’s attention, which tends to become more focused as the level of concentration increases. As a human becomes more engrossed in the task at hand, breaking that focus becomes more difficult. In 1972, a commercial aircraft crashed because the pilots became so absorbed with a landing gear problem (actually, with the process of changing the landing gear indicator light bulb) that they allowed the plane to fly into the ground, even though warnings were sounding in the cockpit. Less critical examples appear routinely in PC interfaces. For example, a “Caps Lock” light is provided on most keyboards to indicate that the keyboard is in “Caps Lock” mode (i.e., the “Caps Lock” key has been pressed). However, if the key is accidentally pressed, a human rarely notices the status of the light until strange characters begin to appear on the display screen. Even then, the user often puzzles over the predicament for a while until realizing the cause of the problem. In a sense, this is not surprising—the light on the keyboard is not in the user’s field of view. However, users often fail to notice indicators placed directly in their

M07_BROO1160_12_SE_C07.indd 362

01/08/14 11:18 AM

7.8  The Human-Machine Interface

363

line of sight. For example, users can become so engaged in a task that they fail to observe changes in the appearance of the cursor on the display screen, even though their task involves watching the cursor. Still another human characteristic that must be anticipated during interface design is the mind’s limited capacity to deal with multiple facts simultaneously. In an article in Psychological Review in 1956, George A. Miller reported research indicating that the human mind is capable of dealing with only about seven details at once. Thus, it is important that an interface be designed to present all the relevant information when a decision is required rather than to rely on the human user’s memory. In particular, it would be poor design to require that a human remember precise details from previous screen images. Moreover, if an interface requires extensive navigation among screen images, a human can get lost in the maze. Thus, the content and arrangement of screen images becomes an important design issue. Although applications of ergonomics and cognetics give the field of humanmachine interface design a unique flavor, the field also encompasses many of the more traditional topics of software engineering. In particular, the search for metrics is just as important in the field of interface design as it is in the more traditional areas of software engineering. Interface characteristics that have been subjected to measurement include the time required to learn an interface, the time required to perform tasks via the interface, the rate of user-interface errors, the degree to which a user retains proficiency with the interface after periods of nonuse, and even such subjective traits as the degree to which users like the interface. The GOMS (rhymes with “Toms”) model, originally introduced in 1954, is representative of the search for metrics in the field of human-machine interface design. The model’s underlying methodology is to analyze tasks in terms of user goals (such as delete a word from a text), operators (such as click the mouse button), methods (such as double-click the mouse button and press the delete key), and selection rules (such as choose between two methods of accomplishing the same goal). This, in fact, is the origin of the acronym GOMS—goals, operators, methods, and selection rules. In short, GOMS is a methodology that allows the actions of a human using an interface to be analyzed as sequences of elementary steps (press a key, move the mouse, make a decision). The performance of each elementary step is assigned a precise time period, and thus, by adding the times assigned to the steps in a task, GOMS provides a means of comparing different proposed interfaces in terms of the time each would require when performing similar tasks. Understanding the technical details of systems such as GOMS is not the purpose of our current study. The point in our case is that GOMS is founded on features of human behavior (moving hands, making decisions, and so on). In fact, the development of GOMS was originally considered a topic in psychology. Thus, GOMS reemphasizes the role that human characteristics play in the field of human-machine interface design, even in the topics that are carryovers from traditional software engineering. The design of human-machine interfaces promises to be an active field of research in the foreseeable future. Many issues dealing with today’s GUIs are yet unresolved, and a multitude of additional problems lurk in the use of three-dimensional interfaces that are now on the horizon. Indeed, because these interfaces promise to combine audio and tactile communication with threedimensional vision, the scope of potential problems is enormous.

M07_BROO1160_12_SE_C07.indd 363

01/08/14 11:18 AM

364

Chapter 7  Software Engineering

Questions & Exercises 1. a.  Identify an application of ergonomics in the field of human-computer

interface design. b.  Identify an application of cognetics in the field of human-computer interface design. 2. A notable difference in the human-computer interface of a smartphone from that of a desktop computer are the techniques used to scroll a portion of the display. On a desktop, scroll is typically achieved by dragging the mouse on scrollbars displayed on the right and bottom sides of the scrolling region, or by using scroll wheels built into the mouse. On the other hand, scroll bars are often not used on a smartphone. (If used, they appear as thin lines to indicate what portion of the underlying display is currently visible.) Scrolling is thus achieved by the gesture of a sliding touch across the display screen. a.  Based on ergonomics, what arguments can be made in support of this

difference? b.  Based on cognetics, what arguments can be made in support of this

difference? 3. What distinguishes the field of human-machine interface design from the

more traditional field of software engineering? 4. Identify three human characteristics that should be considered when designing a human-machine interface.

7.9  Software Ownership and Liability Most would agree that a company or individual should be allowed to recoup, and profit from, the investment needed to develop quality software. Otherwise, it is unlikely that many would be willing to undertake the task of producing the software our society desires. In short, software developers need a level of ownership over the software they produce. Legal efforts to provide such ownership fall under the category of intellectual property law, much of which is based on the well-established principles of copyright and patent law. Indeed, the purpose of a copyright or patent is to allow the developer of a product to release that product (or portions thereof) to intended parties while protecting his or her ownership rights. As such, the developer of a product (whether an individual or a corporation) will assert his or her ownership by including a copyright statement in all produced works; including requirement specifications, design documents, source code, test plans, and in some visible place within the final product. A copyright notice clearly identifies ownership, the personnel authorized to use the work, and other restrictions. Furthermore, the rights of the developer are formally expressed in legal terms in a software license. A software license is a legal agreement between the owner and user of a software product that grants the user certain permissions to use the product without

M07_BROO1160_12_SE_C07.indd 364

01/08/14 11:18 AM

7.9  Software Ownership and Liability

365

transferring ownership rights to the intellectual property. These agreements spell out, to a fine level of detail, the rights and obligations of both parties. Thus, it is important to carefully read and understand the terms of the software license before installing and using a software product. While copyrights and software license agreements provide legal avenues to inhibit outright copying and unauthorized use of software, they are generally insufficient to prevent another party from independently developing a product with a nearly identical function. It is sad that over the years there have been many occasions where the developer of a truly revolutionary software product was unable to capitalize fully on his or her invention (two notable examples are spreadsheets and web browsers). In most of these cases, another company was successful in developing a competitive product that secured a dominant share of the market. A legal path to prevent this intrusion by a competitor is found in patent law. Patent laws were established to allow an inventor to benefit commercially from an invention. To obtain a patent, the inventor must disclose the details of the invention and demonstrate that it is new, useful, and not obvious to others with similar backgrounds (a requirement that can be quite challenging for software). If a patent is granted, the inventor is given the right to prevent others from making, using, selling, or importing the invention for a limited period of time, which is typically 20 years from the date the patent application was filed. One drawback to the use of patents is that the process to obtain a patent is expensive and time-consuming, often involving several years. During this time a software product could become obsolete, and until the patent is granted the applicant has only questionable authority to exclude others from appropriating the product. The importance of recognizing copyrights, software licenses, and patents is paramount in the software engineering process. When developing a software product, software engineers often choose to incorporate software from other products, whether it be an entire product, subset of components, or even portions of source code downloaded over the Internet. However, failure to honor intellectual property rights during this process may lead to huge liabilities and consequences. For example, in 2004, a little-known company, NPT Inc., successfully won a lawsuit against Research In Motion (RIM—the makers of the BlackBerry smartphones) for patent infringement of a few key technologies embedded in RIM’s email systems. The judgment included an injunction to suspend email services to all BlackBerry users in the United States! RIM eventually reached an agreement to pay NPT a total of $612.5 million, thereby averting a shutdown. Finally, we should address the issue of liability. To protect themselves against liability, software developers often include disclaimers in the software licenses that state the limitations of their liability. Such statements as “In no event will Company X be liable for any damages arising out of the use of this software” are common. Courts, however, rarely recognize a disclaimer if the plaintiff can show negligence on the part of the defendant. Thus liability cases tend to focus on whether the defendant used a level of care compatible with the product being produced. A level of care that might be deemed acceptable in the case of developing a word processing system may be considered negligent when developing software to control a nuclear reactor. Consequently, one of the best defenses against software liability claims is to apply sound software engineering principles during the software’s development, to use a level of care compatible with the software’s application, and to produce and maintain records that validate these endeavors.

M07_BROO1160_12_SE_C07.indd 365

01/08/14 11:18 AM

366

Chapter 7  Software Engineering

Questions & Exercises 1. What is the significance of a copyright notice in requirement specifica-

tions, design documents, source code, and the final product? 2. In what ways are copyright and patent laws designed to benefit society? 3. To what extent are disclaimers not recognized by the courts?

Chapter Review Problems (Asterisked problems are associated with optional sections.)

1. Give an example of how efforts in the devel-

10. What is the difference between coupling and

opment of software can pay dividends later in software maintenance. 2. What is throwaway prototyping?

cohesion? Which should be minimized and which should be maximized? Why? 11. Select an object from everyday life and ana-

lyze its components in terms of functional or logical cohesion.

3. Explain how the lack of metrics for measuring

certain software properties affects the software engineering discipline.

12. Contrast the coupling between two program

units obtained by a simple goto statement with the coupling obtained by a function call.

4. Would you expect a metric for measuring the

complexity of a software system to be cumulative in the sense that the complexity of a complete system would be the sum of the complexities of its parts? Explain your answer.

13. In Chapter6 we learned that parameters can

be passed to functions by value or by reference. Which provides the more complex form of data coupling? Explain your answer.

5. Would you expect a metric for measuring the

complexity of a software system to be commutative in the sense that the complexity of a complete system would be the same if it were originally developed with feature X and had feature Y added later or if it were originally developed with feature Y and had feature X added later? Explain your answer.

14. What problems could arise during main-

tenance if a large software system were designed in such a way that all of its data elements were global? 15. In an object-oriented program, what does

declaring an instance variable to be public or private indicate about data coupling? What would be the rationale behind a preference toward declaring instance variables as private?

6. How does software engineering differ from

other, more traditional fields of engineering such as electrical and mechanical engineering? 7. a.  Identify a disadvantage of the traditional

waterfall model for software development. b.  Identify an advantage of the traditional waterfall model for software development.

8. Is open-source development a top-down or

bottom-up methodology? Explain your answer. 9. Describe how the use of constants rather than

literals can simplify software maintenance.

M07_BROO1160_12_SE_C07.indd 366

*16. Identify a problem involving data coupling

that can occur in the context of parallel processing. 17. Answer the following questions in relation to

the accompanying structure chart: a.  To which module does module Y return control? b.  To which module does module Z return control?

01/08/14 11:18 AM

Chapter Review Problems

c.  Are modules W and X linked via control coupling? d.  Are modules W and X linked via data coupling? e.  What data is shared by both module W and module Y? f.  In what way are modules W and Z related? a

V

367

27. Give an example of a one-to-many relation-

ship that is not mentioned in this chapter. Give an example of a many-to-many relationship that is not mentioned in this chapter. 28. Based on the information in Figure7.10, imag-

ine an interaction sequence that might occur between a physician and a patient during a visit with the patient. Draw a sequence diagram representing that sequence.

a

29. Draw a class diagram representing the relaW

X

Y

Z

a

tionships between the servers and customers in a restaurant. 30. Draw a class diagram representing the rela-

tionships between magazines, publishers of magazines, and subscribers to magazines. Include a set of instance variables and methods for each class.

18. Using a structure chart, represent the proce-

dural structure of a simple inventory/accounting system for a small store (perhaps a privately owned curio shop in a resort community). What modules in your system must be modified because of changes in sales tax laws? What modules would need to be changed if the decision is made to maintain a record of past customers so that advertising can be mailed to them?

31. Extend the sequence diagram in Figure7.5

to show the interaction sequence that would occur if PlayerA successfully returns PlayerB’s ­volley, but PlayerB fails to return that volley. 32. Answer the following questions based on the

accompanying class diagram that represents the associations between tools, their users, and their manufacturers.

19. Using a class diagram, design an object-ori-

ented solution for the previous problem. 20. Draw a simple class diagram representing the

X

relationships between magazine publishers, magazines, and subscribers. It is sufficient to depict only the class name within each box representing a class. 21. How is the relationship between the system

and the user represented in a use case diagram?

*

23. Draw a sequence diagram representing the

interaction sequence that would ensue when a utility company sends a bill to a customer. 24. Draw a simple dataflow diagram depicting

the flow of data that occurs in an automated inventory system when a sale is made. 25. Contrast the information represented in

26. Provide at least two examples of a one-to-one

M07_BROO1160_12_SE_C07.indd 367

Y

*

Z *

1

a.  Which classes (X, Y, and Z) represent tools, users, and manufacturers? Justify your answer. b.  Can a tool be used by more than one user? c.  Can a tool be manufactured by more than one manufacturer? d.  Does each user use tools manufactured by many manufacturers?

33. In each of the following cases, identify

a class diagram with that represented in a sequence diagram. relationship and a many-to-many relationship.

uses used by

*

22. Draw a simple use case diagram depicting

the ways in which a traveler uses an airline ­reservation system.

1

whether the activity relates to a sequence diagram, a use case diagram, or a class diagram. a.  Represents the way in which users will interact with the system b.  Represents the relationship between classes in the system c.  Represents the manner in which objects will interact to accomplish a task

01/08/14 11:18 AM

368

Chapter 7  Software Engineering

34. Answer the following questions based on the

accompanying sequence diagram. sd ww

self : X

:Y

:Z

b.  Each radio station concentrates on a particular format such as hard rock music, classical music, or talk. c.  In an election, candidates are wise to focus their campaigns on the segment of the electorate that has voted in the past.

44. Do software engineers expect large software

xx

systems to be homogeneous or heterogeneous in error content? Explain your answer.

yy zz

45. What is the difference between black-box test-

ing and glass-box testing?

a.  What class contains a method named ww? b.  What class contains a method named xx? c.  During the sequence, does the object of type Z ever communicate directly with the object of type Y?

46. Give some analogies of black-box and glass-

box testing that occur in fields other than software engineering. 47. How does open-source development differ

from beta testing? (Consider glass-box testing versus black-box testing.)

35. Draw a sequence diagram indicating that

object A calls the method bb in object B, B performs the requested action and returns control to A, and then A calls the method cc in object B.

48. Suppose that 100 errors were intentionally

placed in a large software system before the system was subjected to final testing. Moreover, suppose that 200 errors were discovered and corrected during this final testing, of which 50 errors were from the group intentionally placed in the system. If the remaining 50 known errors are then corrected, how many unknown errors would you estimate are still in the system? Explain why.

36. Extend your solution to the previous problem

to indicate that A calls the method bb only if the variable “continue” is true and continues calling bb as long as “continue” remains true after B returns control. 37. Draw a class diagram depicting the fact that

the classes Truck and Automobile are generalizations of the class Vehicle. 38. Based on Figure7.12, what additional

instance variables would be contained in an object of type SurgicalRecord? Of type OfficeVisitRecord?

49. What is boundary value analysis? 50. What is alpha testing and beta testing? 51. One difference between the human-computer

interface of a smartphone and that of a desktop computer involves the technique used to alter the scale of an image on the display screen to obtain more or less detail (a process called “zooming”). On a desktop, zooming is typically achieved by dragging a slider that is separate from the area being displayed, or by using a menu or toolbar item. On a smartphone, zooming is performed by simultaneously touching the display screen with the thumb and index finger and then modifying the space between both touch points (a process called “double touch— spread” to “zoom in” or “double touch—pinch” to “zoom out”).

39. Explain why inheritance is not always the

best way to implement class generalizations. 40. What is the significance of using the interac-

tion diagrams provided by UML? 41. Summarize the process of software quality

assurance (SQA). 42. To what extent are the control structures in a

typical high-level programming language (ifelse, while, and so on) small-scale design patterns? 43. Which of the following involve the Pareto

principle? Explain your answers. a.  One obnoxious person can spoil the party for everyone.

M07_BROO1160_12_SE_C07.indd 368

a.  Based on ergonomics, what arguments can be made in support of this difference? b.  Based on cognetics, what arguments can be made in support of this difference?

01/08/14 11:18 AM

Social Issues

52. In what way do traditional copyright laws

fail to safeguard the investments of software developers?

369

53. In what ways can a software developer be

unsuccessful in obtaining a patent?

Social Issues The following questions are intended as a guide to the ethical/social/legal issues associated with the field of computing. The goal is not merely to answer these questions. You should also consider why you answered as you did and whether your justifications are consistent from one question to the next. 1. a.  Mary Analyst has been assigned the task of implementing a system with

which medical records will be stored on a computer that is connected to a large network. In her opinion the design for the system’s security is flawed but her concerns have been overruled for financial reasons. She has been told to proceed with the project using the security system that she feels is inadequate. What should she do? Why? b.  Suppose that Mary Analyst implemented the system as she was told, and now she is aware that the medical records are being observed by unauthorized personnel. What should she do? To what extent is she liable for the breach of security? c.  Suppose that instead of obeying her employer, Mary Analyst refuses to proceed with the system and blows the whistle by making the flawed design public, resulting in a financial hardship for the company and the loss of many innocent employees’ jobs. Were Mary Analyst’s actions correct? What if it turns out that, being only a part of the overall team, Mary Analyst was unaware that sincere efforts were being made elsewhere within the company to develop a valid security system that would be applied to the system on which Mary was working? How does this change your judgment of Mary’s actions? (Remember, Mary’s view of the situation is the same as before.) 2. When large software systems are developed by many people, how should liabilities be assigned? Is there a hierarchy of responsibility? Are there degrees of liability? 3. We have seen that large, complex software systems are often developed by many individuals, few of which may have a complete picture of the entire project. Is it ethically proper for an employee to contribute to a project without full knowledge of its function? 4. To what extent is someone responsible for how his or her accomplishments are ultimately applied by others? 5. In the relationship between a computer professional and a client, is it the professional’s responsibility to implement the client’s desires or to direct the client’s desires? What if the professional foresees that a client’s desires could lead to unethical consequences? For example, the client may wish to cut corners for the sake of efficiency, but the professional may foresee a potential source of erroneous data or misuse of the system if those shortcuts are taken. If the client insists, is the professional free of responsibility?

M07_BROO1160_12_SE_C07.indd 369

01/08/14 11:18 AM

370

Chapter 7  Software Engineering

6. What happens if technology begins to advance so rapidly that new inventions

are superseded before the inventor has time to profit from the invention? Is profit necessary to motivate inventors? How does the success of open-source development relate to your answer? Is free quality software a sustainable reality? 7. Is the computer revolution contributing to, or helping to solve, the world’s energy problems? What about other large-scale problems such as hunger and poverty? 8. Will advances in technology continue indefinitely? What, if anything, would reverse society’s dependency on technology? What would be the result of a society that continues to advance technology indefinitely? 9. If you had a time machine, in which period of history would you like to live? Are there current technologies that you would like to take with you? Can one technology be separated from another? Is it realistic to protest against global warming yet accept modern medical treatment? 10. Many applications on a smartphone automatically integrate with services provided by other applications. This integration may share information entered to one application with another. What are the benefits of this integration? Are there any concerns with “too much” integration?

Additional Reading Alexander, C., S. Ishikawa, and M. Silverstein. A Pattern Language. New York: Oxford University Press, 1977. Beck, K. Extreme Programming Explained: Embrace Change, 2nd ed. Boston, MA: Addison-Wesley, 2004. Bowman, D. A., E. Kruijff, J. J. LaViola, Jr., and I. Poupyrev. 3D User Interfaces Theory and Practice. Boston, MA: Addison-Wesley, 2005. Braude, E. Software Design: From Programming to Architecture. New York: Wiley, 2004. Bruegge, B., and A. Dutoit. Object-Oriented Software Engineering Using UML, Patterns, and Java, 3rd ed. Boston, MA: Addison-Wesley, 2010. Cockburn, A. Agile Software Development: The Cooperative Game, 2nd ed. Boston, MA: Addison-Wesley, 2006. Fox, C. Introduction to Software Engineering Design: Processes, Principles and Patterns with UML2. Boston, MA: Addison-Wesley, 2007. Gamma, E., R. Helm, R. Johnson, and J. Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Boston, MA: Addison-Wesley, 1995. Maurer, P. M. Component-Level Programming. Upper Saddle River, NJ: Prentice Hall, 2003. Pfleeger, S. L., and J. M. Atlee. Software Engineering: Theory and Practice, 4th ed. Upper Saddle River, NJ: Prentice-Hall, 2010.

M07_BROO1160_12_SE_C07.indd 370

01/08/14 11:18 AM

Additional Reading

371

Pilone, D., and N. Pitman. UML 2.0 in a Nutshell. Cambridge, MA: O’Reilly Media, 2005. Pressman, R. S., and B. Maxim. Software Engineering: A Practitioner’s Approach, 8th ed. New York: McGraw-Hill, 2014. Schach, S. R. Classical and Object-Oriented Software Engineering, 8th ed. New York: McGraw-Hill, 2010. Shalloway, A., and J. R. Trott. Design Patterns Explained, 2nd ed. Boston, MA: Addison-Wesley, 2005. Shneiderman, B., C. Plaisant, M. Cohen, and S. Jacobs. Designing the User Interface: Strategies for Effective Human-Computer Interaction, 5th ed. Boston, MA: AddisonWesley, 2009. Sommerville, I. Software Engineering, 9th ed. Boston, MA: Addison-Wesley, 2010.

M07_BROO1160_12_SE_C07.indd 371

01/08/14 11:18 AM

M07_BROO1160_12_SE_C07.indd 372

01/08/14 11:18 AM

8

C H A P T E R

Data Abstractions In this chapter we investigate how data arrangements other than the cell-by-cell organization provided by a computer’s main memory can be simulated—a subject known as data structures. The goal is to allow the data’s user to access collections of data as abstract tools rather than force the user to think in terms of the computer’s main memory organization. Our study will show how the desire to construct such abstract tools leads to the concept of objects and object-oriented programming.

8.1 Basic Data Structures Arrays and Aggregates Lists, Stacks, and Queues Trees

8.2 Related Concepts Abstraction Again Static Versus Dynamic Structures Pointers

M08_BROO1160_12_SE_C08.indd 373

8.3 Implementing Data Structures Storing Arrays Storing Aggregates Storing Lists Storing Stacks and Queues Storing Binary Trees Manipulating Data Structures

8.4 A Short Case Study

8.5 Customized Data Types User-Defined Data Types Abstract Data Types

8.6 Classes and Objects *8.7 Pointers in Machine Language *Asterisks indicate suggestions for optional sections.

23/07/14 10:26 am

374

Chapter 8  Data Abstractions

We introduced the concept of data structure in Chapter6, where we learned that high-level programming languages provide techniques by which p ­ rogrammers can express algorithms as though the data being manipulated were stored in ways other than the cell-by-cell arrangement provided by a computer’s main memory. We also learned that the data structures supported by a programming language are known as primitive structures. In this chapter we will explore techniques by which data structures other than a language’s primitive structures can be constructed and manipulated—a study that will lead us from traditional data structures to the object-oriented paradigm. An underlying theme throughout this progression is the construction of abstract tools.

8.1  Basic Data Structures We begin our study by introducing some basic data structures that will serve as examples in future sections.

Arrays and Aggregates In Section6.2, we learned about the data structures known as arrays and aggregate types. Recall that an array is a “rectangular” block of data whose entries are of the same type. The simplest form of array is the one-dimensional array, a single row of elements with each position identified by an index. A one-dimensional array with 26 elements could be used to store the number of times each alphabet letter occurs in a page of text, for example. A two-dimensional array consists of multiple rows and columns in which positions are identified by pairs of indices—the first index identifies the row associated with the position, the second index identifies the column. An example would be a rectangular array of numbers representing the monthly sales made by members of a sales force—the entries across each row representing the monthly sales made by a particular member and the entries down each column representing the sales by each member for a particular month. Thus, the entry in the third row and first column would represent the sales made by the third salesperson in January. In contrast to an array, recall that an aggregate type is a block of data items that might be of different types and sizes. The items within the block are ­usually called fields. An example of an aggregate type would be the block of data relating to a single employee, the fields of which might be the employee’s name (an array of type character), age (of type integer), and skill rating (of type float). Fields in an aggregate type are usually accessed by field name, rather than by a numerical index number.

Lists, Stacks, and Queues Another basic data structure is a list, which is a collection whose entries are arranged sequentially (Figure8.1a). The beginning of a list is called the head of the list. The other end of a list is called the tail. Almost any collection of data can be envisioned as a list. For example, text can be envisioned as a list of symbols, a two-dimensional array can be envisioned as a list of rows, and music recorded on a CD can be envisioned as a list of sounds. More traditional examples include guest lists, shopping lists, class enrollment lists, and inventory lists. Activities associated with a list vary depending on the situation.

M08_BROO1160_12_SE_C08.indd 374

23/07/14 10:26 am

375

8.1  Basic Data Structures

Figure 8.1   Lists, stacks, and queues Queue Jill List

TICK

ETS

Head

Top

Bob Stack

Devon Maurice

a. A list of names

Tail

Bottom b. A stack of books

Tail

Head

c. A queue of people

Insome cases we may need to remove entries from a list, add new entries to a list, “process” the entries in a list one at a time, change the arrangement of the entries in a list, or perhaps search to see if a particular item is in a list. We will investigate such operations later in this chapter. By restricting the manner in which the entries of a list are accessed, we obtain two special types of lists known as stacks and queues. A stack is a list in which entries are inserted and removed only at the head. An example is a stack of books where physical restrictions dictate that all additions and deletions occur at the top (Figure8.1b). Following colloquial terminology, the head of a stack is called the top of the stack. The tail of a stack is called its bottom or base. Inserting a new entry at the top of a stack is called pushing an entry. Removing an entry from the top of a stack is called popping an entry. Note that the last entry placed on a stack will always be the first entry removed—an observation that leads to a stack being known as a last-in, first-out, or LIFO (pronounced “LIE-foe”) structure. This LIFO characteristic means that a stack is ideal for storing items that must be retrieved in the reverse order from which they were stored, and thus a stack is often used as the underpinning of backtracking activities. (The term backtracking refers to the process of backing out of a system in the opposite order from which the system was entered. A classic example is the process of retracing one’s steps in order to find one’s way out of a forest.) For instance, consider the underlying structure required to support a recursive process. As each new activation is started, the previous activation must be set aside. Moreover, as each activation is completed, the last activation that was set aside must be retrieved. Thus, if the activations are pushed on a stack as they are set aside, then the proper activation will be on the top of the stack each time an activation needs to be retrieved. A queue is a list in which the entries are removed only at the head and new entries are inserted only at the tail. An example is a line, or queue, of people waiting to buy tickets at a theater (Figure8.1c)—the person at the head of the queue is served while new arrivals step to the rear (or tail) of the queue. We have already met the queue structure in Chapter3 where we saw that a batch processing operating system stores the jobs waiting to be executed in a queue called the job queue. There we also learned that a queue is a first-in, first-out, or FIFO (pronounced “FIE-foe”) structure, meaning that the entries are removed from a queue in the order in which they were stored. Queues are often used as the underlying structure of a buffer, introduced in Chapter1,which is a storage area for the temporary placement of data being

M08_BROO1160_12_SE_C08.indd 375

23/07/14 10:26 am

376

Chapter 8  Data Abstractions

transferred from one location to another. As the items of data arrive at the buffer, they are placed at the tail of the queue. Then, when it comes time to forward items to their final destination, they are forwarded in the order in which they appear at the head of the queue. Thus, items are forwarded in the same order in which they arrived.

Trees A tree is a collection whose entries have a hierarchical organization similar to that of an organization chart of a typical company (Figure8.2). The president is represented at the top, with lines branching down to the vice presidents, who are followed by regional managers, and so on. To this intuitive definition of a tree structure we impose one additional constraint, which (in terms of an organization chart) is that no individual in the company reports to two different superiors. That is, different branches of the organization do not merge at a lower level. (We have already seen examples of trees in Chapter6 where they appeared in the form of parse trees.) Each position in a tree is called a node (Figure8.3). The node at the top is called the root node (if we turned the drawing upside down, this node would represent the base or root of the tree). The nodes at the other extreme are called terminal nodes (or sometimes leaf nodes). We often refer to the number of nodes in the longest path from the root to a leaf as the depth of the tree. In other words, the depth of a tree is the number of horizontal layers within it. At times we refer to tree structures as though each node gives birth to those nodes immediately below it. In this sense, we often speak of a node’s ancestors or descendants. We refer to its immediate descendants as its children and its immediate ancestor as its parent. Moreover, we speak of nodes with the same parent as being siblings. A tree in which each parent has no more than two children is called a binary tree. If we select any node in a tree, we find that that node together with the nodes below it also have the structure of a tree. We call these smaller structures subtrees. Thus, each child node is the root of a subtree below the child’s parent. Each such subtree is called a branch from the parent. In a binary tree, we often speak of a node’s left branch or right branch in reference to the way the tree is displayed. Figure 8.2   An example of an organization chart President

Vice-President of Sales

Regional Sales Manager

M08_BROO1160_12_SE_C08.indd 376

Regional Sales Manager

Vice-President of Finance

Regional Sales Manager

Vice-President of Services

Regional Service Manager

Regional Service Manager

23/07/14 10:26 am

8.2  Related Concepts

377

Figure 8.3   Tree terminology Root node

Siblings

Subtree

Terminal (or leaf) nodes

Questions & Exercises 1. Give examples (outside of computer science) of each of the following

structures: list, stack, queue, and tree. 2. Summarize the distinction between lists, stacks, and queues. 3. Suppose the letter A is pushed onto an empty stack, followed by the let-

ters B and C, in that order. Then suppose that a letter is popped off the stack and the letters D and E are pushed on. List the letters that would be on the stack in the order they would appear from top to bottom. If a letter is popped off the stack, which letter will be retrieved? 4. Suppose the letter A is placed in an empty queue, followed by the letters B and C, in that order. Then suppose that a letter is removed from the queue and the letters D and E are inserted. List the letters that would be in the queue in the order they would appear from head to tail. If a letter is now removed from the queue, which letter will it be? 5. Suppose a tree has four nodes A, B, C, and D. If A and C are siblings and D’s parent is A, which nodes are leaf nodes? Which node is the root?

8.2  Related Concepts In this section we isolate three topics that are closely associated with the subject of data structures: abstraction, the distinction between static and dynamic structures, and the concept of a pointer.

M08_BROO1160_12_SE_C08.indd 377

23/07/14 10:26 am

378

Chapter 8  Data Abstractions

Abstraction Again The structures presented in the previous section are often associated with data. However, a computer’s main memory is not organized as arrays, lists, stacks, queues, and trees but is instead organized as a sequence of addressable m ­ emory cells. Thus, all other structures must be simulated. How this simulation is ­accomplished is the subject of this chapter. For now we merely point out that organizations such as arrays, lists, stacks, queues, and trees are abstract tools that are created so that users of the data can be shielded from the details of actual data storage and can be allowed to access information as though it were stored in a more convenient form. The term user in this context does not necessarily refer to a human. Instead, the meaning of the word depends on our perspective at the time. If we are thinking in terms of a person using a PC to maintain bowling league records, then the user is a human. In this case, the application software (perhaps a spreadsheet software package) would be responsible for presenting the data in an abstract form convenient to the human—most likely as an array. If we are thinking in terms of a server on the Internet, then the user might be a client. In this case, the server would be responsible for presenting data in an abstract form convenient to the client. If we are thinking in terms of the modular structure of a program, then the user would be any module requiring access to the data. In this case, the module containing the data would be responsible for presenting the data in an abstract form convenient to the other modules. In each of these scenarios, the common thread is that the user has the privilege of accessing data as an abstract tool.

Static Versus Dynamic Structures An important distinction in constructing abstract data structures is whether the structure being simulated is static or dynamic, that is, whether the shape or size of the structure changes over time. For example, if the abstract tool is a list of names, it is important to consider whether the list will remain a fixed size throughout its existence or expand and shrink as names are added and deleted. As a general rule, static structures are more easily managed than dynamic ones. If a structure is static, we need merely to provide a means of accessing the various data items in the structure and perhaps a means of changing the values at designated locations. But, if the structure is dynamic, we must also deal with the problems of adding and deleting entries as well as finding the memory space required by a growing data structure. In the case of a poorly designed structure, adding a single new entry could result in a massive rearrangement of the structure, and excessive growth could dictate that the entire structure be transferred to another memory area where more space is available.

Pointers Recall that the various cells in a machine’s main memory are identified by numeric addresses. Being numeric values, these addresses themselves can be encoded and stored in memory cells. A pointer is a storage area that contains such an encoded address. In the case of data structures, pointers are used to record the location where data items are stored. For example, if we must repeatedly move an item of data from one location to another, we might designate a fixed location to serve as a pointer. Then, each time we move the item, we can

M08_BROO1160_12_SE_C08.indd 378

23/07/14 10:26 am

8.2  Related Concepts

379

Figure 8.4   Novels arranged by title but linked according to authorship

A Farewell to Arms by Ernest Hemingway Pointer

For Whom the Bell Tolls by Ernest Hemingway

The Sun Also Rises by Ernest Hemingway

Pointer

Pointer

update the pointer to reflect the new address of the data. Later, when we need to access the item of data, we can find it by means of the pointer. Indeed, the pointer will always “point” to the data. We have already encountered the concept of a pointer in our study of CPUs in Chapter2. There we found that a register called a program counter is used to hold the address of the next instruction to be executed. Thus, the program counter plays the role of a pointer. In fact, another name for a program counter is instruction pointer. As an example of the application of pointers, suppose we have a list of novels stored in a computer’s memory alphabetically by title. Although convenient in many applications, this arrangement makes it difficult to find all the novels by a particular author—they are scattered throughout the list. To solve this problem, we can reserve an additional memory cell within each block of cells representing a novel and use this cell as a pointer to another block representing a book by the same author. In this manner the novels with common authorship can be linked in a loop (Figure8.4). Once we find one novel by a given author, we can find all the others by following the pointers from one book to another. Many modern programming languages include pointers as a primitive data type. That is, they allow the declaration, allocation, and manipulation of pointers in ways reminiscent of integers and character strings. Using such a language, a programmer can design elaborate networks of data within a machine’s memory where pointers are used to link related items to each other.

Questions & Exercises 1. In what sense are data structures such as arrays, lists, stacks, queues, and

trees abstractions? 2. Describe an application that you would expect to involve a static data

structure. Then describe an application that you would expect to involve a dynamic data structure. 3. Describe contexts outside of computer science in which the pointer con-

cept occurs.

M08_BROO1160_12_SE_C08.indd 379

23/07/14 10:26 am

380

Chapter 8  Data Abstractions

8.3  Implementing Data Structures Let us now consider ways in which the data structures discussed in the previous section can be stored in a computer’s main memory. As we saw in Chapter6, these structures are often provided as primitive structures in high-level programming languages. Our goal here is to understand how programs that deal with such structures are translated into machine-language programs that manipulate data stored in main memory.

Storing Arrays We begin with techniques for storing arrays. Suppose we want to store a sequence of 24 hourly temperature readings, each of which requires one memory cell of storage space. Moreover, suppose we want to identify these readings by their positions in the sequence. That is, we want to be able to access the first reading or the fifth reading. In short, we want to manipulate the sequence as though it were a one-dimensional array. We can obtain this goal merely by storing the readings in a sequence of 24 memory cells with consecutive addresses. Then, if the address of the first cell in the sequence is x, the location of any particular temperature reading can be computed by subtracting one from the index of the desired reading and then adding the result to x. In particular, the fourth reading would be located at address x + (4 - 1), as shown in Figure8.5. This technique is used by most translators of high-level programming languages to implement one-dimensional arrays. When the translator encounters a declaration statement such as int Readings[24];

declaring that the term Readings is to refer to a one-dimensional array of 24 integer values, the translator arranges for 24 consecutive memory cells to be set aside. Later in the program, if it encounters the assignment statement Readings[4] = 67;

requesting that the value 67 be placed in the fourth entry of the array Readings, the translator builds the sequence of machine instructions required to place the Figure 8.5   The array of temperature readings stored in memory starting at address x Addresses

x

x+1

x+2

x+3

x+4

x+5

x+6

Memory cells

Readings[1] Readings[2] Readings[3] Readings[4]

M08_BROO1160_12_SE_C08.indd 380

23/07/14 10:26 am

8.3  Implementing Data Structures

381

value 67 in the memory cell at address x + (4 - 1), where x is the address of the first cell in the block associated with the array Readings. In this manner, the programmer is allowed to write the program as though the temperature readings were actually stored in a one-dimensional array. (Caution: In the languages Python, C, C++, C#, and Java, array indices start at 0 rather than 1, so the fourth reading would be referenced by Readings[3]. See question 3 at the end of this section.) Now suppose we want to record the sales made by a company’s sales force during a one-week period. In this case, we might envision the data arranged in a two-dimensional array, where the values across each row indicate the sales made by a particular employee, and the values down a column represent all the sales made during a particular day. To accommodate this need, we first recognize that the array is static in the sense that its size does not vary as updates are made. We can therefore calculate the amount of storage area needed for the entire array and reserve a block of contiguous memory cells of that size. Next, we store the data in the array row by row. Starting at the first cell of the reserved block, we store the values from the first row of the array into consecutive memory locations; following this, we store the next row, then the next, and so on (Figure8.6). Such a storage system is said to use row major order in contrast to column major order in which the array is stored column by column. With the data stored in this manner, let us consider how we could find the value in the third row and fourth column of the array. Envision that we are at the first location in the reserved block of the machine’s memory. Starting at this location, we find the data in the first row of the array followed by the second, then the third, and so on. To get to the third row, we must move beyond both the first and second rows. Since each row contains five entries (one for each day of the week from Monday through Friday), we must move beyond a total of 10 entries to reach the first entry of the third row. From there, we must move beyond another three entries to reach the entry in the fourth column of the row. Altogether, to reach the entry in the third row and fourth column, we must move beyond 13entries from the beginning of the block.

Figure 8.6   A two-dimensional array with four rows and five columns stored in row major order Conceptual array Row 1 Row 2 Row 3 Row 4 Machine’s memory Row 1

Row 2

Row 3

Row 4

Entry from 4th column in Row 3

M08_BROO1160_12_SE_C08.indd 381

23/07/14 10:26 am

382

Chapter 8  Data Abstractions

Implementing Contiguous Lists The primitives for constructing and manipulating arrays that are provided in most high-level programming languages are convenient tools for constructing and manipulating contiguous lists. If the entries of the list are all the same primitive data type, then the list is nothing more than a one-dimensional array. A slightly more involved example is a list of ten names, each of which is no longer than eight characters, as discussed in the text. In this case, a programmer could construct the contiguous list as a two-dimensional array of characters with ten rows and eight columns, which would produce the structure represented in Figure 8.6 (assuming that the array is stored in row major order). Many high-level languages incorporate features that encourage such implementations of lists. For example, suppose the two-dimensional array of characters proposed above was called MemberList. Then in addition to the traditional notation in which the expression MemberList[3,5] refers to the single character in the third row and fifth column, some languages adopt the expression MemberList[3] to refer to the entire third row, which would be the third entry in the list.

The preceding calculation can be generalized to obtain a formula for converting references in terms of row and column positions into actual memory addresses. In particular, if we let c represent the number of columns in an array (which is the number of entries in each row), then the address of the entry in the ith row and jth column will be x + (c * (i - 1)) + (j - 1) where x is the address of the cell containing the entry in the first row and first column. That is, we must move beyond i - 1 rows, each of which contains c entries, to reach the ith row and then j - 1 more entries to reach the jth entry in this row. In our prior example c = 5, i = 3, and j = 4, so if the array were stored starting at address x, then the entry in the third row, fourth column would be at address x + (5 * (3 - 1)) + (4 - 1) = x + 13. The expression (c * (i - 1)) + (j - 1) is sometimes called the address polynomial. Once again, this is the technique used by most translators of high-level programming languages. When faced with the declaration statement int Sales[8, 5];

declaring that the term Sales is to refer to a two-dimensional array of integer values with 8 rows and 5 columns, the translator arranges for 40 consecutive memory cells to be set aside. Later, if it encounters the assignment statement Sales[3, 4] = 5;

requesting that the value 5 be placed in the entry at the third row and fourth column of the array Sales, it builds the sequence of machine instructions required toplace the value 5 in the memory cell whose address is x + 5 * (3 - 1) + (4 - 1), where x is the address of the first cell in the block associated with the array Sales. In this manner, the programmer is allowed to write the program as though the sales were actually stored in a two-dimensional array.

M08_BROO1160_12_SE_C08.indd 382

23/07/14 10:26 am

8.3  Implementing Data Structures

383

Storing Aggregates Now suppose we want to store an aggregate called Employee consisting of the three fields: Name of type character array, Age of type integer, and SkillRating of type float. If the number of memory cells required by each field is fixed, then we can store the aggregate in a block of contiguous cells. For example, suppose the field Name required at most 25 cells, Age required only one cell, and ­SkillRating required only one cell. Then, we could set aside a block of 27 contiguous cells, store the name in the first 25 cells, store the age in the 26th cell, and store the skill rating in the last cell (Figure8.7a). With this arrangement, it would be easy to access the different fields within the aggregate. A reference to a field can be translated to a memory cell by knowing the address where the aggregate begins, and the offset of the desired field within that aggregate. If the address of the first cell were x, then any reference to Employee.Name (meaning the Name field within the aggregate Employee) would translate to the 25 cells starting at address x and a reference to Employee.Age (the Age field within Employee) would translate to the cell at address x + 25. In particular, if a translator found a statement such as Employee.Age = 22;

in a high-level program, then it would merely build the machine language instructions required to place the value 22 in the memory cell whose address is x + 25. Figure 8.7   Storing the aggregate type Employee Employee Employee.Name

Addresses:

Employee.Age

x

Employee.SkillRating

x + 25

x + 26

a. Aggregate stored in a contiguous block

Employee.Name

Pointers

Employee.Age

Employee.SkillRating b. Aggregate fields stored in separate locations

M08_BROO1160_12_SE_C08.indd 383

23/07/14 10:26 am

384

Chapter 8  Data Abstractions

An alternative to storing an aggregate in a block of contiguous memory cells is to store each field in a separate location and then link them together by means of pointers. More precisely, if the aggregate contains three fields, then we find a place in memory to store three pointers, each of which points to one of the fields (Figure8.7b). If these pointers are stored in a block starting at address x, then the first field can be found by following the pointer stored at location x, the second field can be found by following the pointer at location x + 1, and so forth. This arrangement is especially useful in those cases in which the size of the aggregate’s fields is dynamic. For instance, by using the pointer system the size of the first field can be increased merely by finding an area in memory to hold the larger field and then adjusting the appropriate pointer to point to the new location. But if the aggregate were stored in a contiguous block, the entire structure would have to be altered.

Storing Lists Let us now consider techniques for storing a list of names in a computer’s main memory. One strategy is to store the entire list in a single block of memory cells with consecutive addresses. Assuming that each name is no longer than eight letters, we can divide the large block of cells into a collection of subblocks, each containing eight cells. Into each subblock we can store a name by recording its ASCII code using one cell per letter. If the name alone does not fill all the cells in the subblock allocated to it, we can merely fill the remaining cells with the ASCII code for a space. Using this system requires a block of 80 consecutive memory cells to store a list of 10 names. The storage system just described is summarized in Figure8.8. The significant point is that the entire list is stored in one large block of memory, with successive entries following each other in contiguous memory cells. Such an organization is referred to as a contiguous list. A contiguous list is a convenient storage structure for implementing static lists, but it has disadvantages in the case of dynamic lists where the deletion and insertion of names can lead to a time-consuming shuffling of entries. In a worst-case scenario, the addition of entries could create the need to move the entire list to a new location to obtain an available block of cells large enough for the expanded list. These problems can be simplified if we allow the individual entries in a list to be stored in different areas of memory rather than together in one large, contiguous block. To explain, let us reconsider our example of storing a list of names Figure 8.8   Names stored in memory as a contiguous list Contiguous block of memory cells

...

First name stored here

M08_BROO1160_12_SE_C08.indd 384

Second name stored here

Last name stored here

23/07/14 10:26 am

8.3  Implementing Data Structures

385

(where each name is no more than eight characters long). This time we store each name in a block of nine contiguous memory cells. The first eight of these cells are used to hold the name itself, and the last cell is used as a pointer to the next name in the list. Following this lead, the list can be scattered among several small nine-cell blocks linked together by pointers. Because of this linkage system, such an organization is called a linked list. To keep track of the beginning of a linked list, we set aside another pointer in which we save the address of the first entry. Since this pointer points to the beginning, or head, of the list, it is called the head pointer. To mark the end of a linked list, we use a null pointer (also known as a NIL pointer in some languages, or the None object in Python), which is merely a special bit pattern placed in the pointer cell of the last entry to indicate that no further entries are in the list. For example, if we agree never to store a list entry at address 0, the value zero will never appear as a legitimate pointer value and can therefore be used as the null pointer. The final linked list structure is represented by the diagram in Figure8.9, in which we depict the scattered blocks of memory used for the list by individual rectangles. Each rectangle is labeled to indicate its composition. Each pointer is represented by an arrow that leads from the pointer itself to the pointer’s addressee. Traversing the list involves following the head pointer to find the first entry. From there, we follow the pointers stored with the entries to hop from one entry to the next until the null pointer is reached. To appreciate the advantages of a linked list over a contiguous one, consider the task of deleting an entry. In a contiguous list this would create a hole, meaning that those entries following the deleted one would have to be moved forward to keep the list contiguous. However, in the case of a linked list, an entry can be deleted by changing a single pointer. This is done by changing the pointer that formerly pointed to the deleted entry so that it points to the entry following the deleted entry (Figure8.10). From then on, when the list is traversed, the deleted entry is passed by because it no longer is part of the chain. Inserting a new entry in a linked list is only a little more involved. We first find an unused block of memory cells large enough to hold the new entry and a pointer. Here we store the new entry and fill in the pointer with the address of the entry in the list that should follow the new entry. Finally, we change the pointer associated with the entry that should precede the new entry so that it points to Figure 8.9   The structure of a linked list Head pointer

Name

Name

Pointer

Name

Pointer

Pointer

null

M08_BROO1160_12_SE_C08.indd 385

23/07/14 10:26 am

386

Chapter 8  Data Abstractions

A Problem with Pointers Just as the use of flowcharts led to tangled algorithm designs (Chapter 5), and the haphazard use of goto statements led to poorly designed programs (Chapter 6), undisciplined use of pointers has been found to produce needlessly complex and error-prone data structures. To bring order to this chaos, many programming languages restrict the flexibility of pointers. For example, Java does not allow pointers in their general form. Instead, it allows only a restricted form of pointers called references. One distinction is that a reference cannot be modified by an arithmetic operation. For example, if a Java programmer wanted to advance the reference Next to the next entry in a contiguous list, he or she would use a statement equivalent to redirect Next to the next list entry

whereas a C programmer would use a statement equivalent to assign Next the value Next + 1

Note that the Java statement better reflects the underlying goal. Moreover, to execute the Java statement, there must be another list entry, but if Next already pointed to the last entry in the list, the C statement would result in Next pointing to something outside the list—a common error for beginning, and even seasoned, C programmers.

the new entry (Figure8.11). After we make this change, the new entry will be found in the proper place each time the list is traversed.

Storing Stacks and Queues For storing stacks and queues, an organization similar to a contiguous list is often used. In the case of a stack, a block of memory, large enough to accommodate the stack at its maximum size, is reserved. (Determining the size of this block can often be a critical design decision. If too little room is reserved, the stack will ultimately exceed the allotted storage space; however, if too much room is reserved, memory space will be wasted.) One end of this block is designated as Figure 8.10   Deleting an entry from a linked list Head pointer Deleted entry Name Pointer Old pointer Name

Pointer

Name New pointer

M08_BROO1160_12_SE_C08.indd 386

Pointer null

23/07/14 10:26 am

8.3  Implementing Data Structures

387

Figure 8.11   Inserting an entry into a linked list Head pointer New entry Name

Pointer

New pointer Name

New pointer

Pointer

Name

Pointer

Name

Pointer

Old pointer

null

the stack’s base. It is here that the first entry to be pushed onto the stack is stored. Then each additional entry is placed next to its predecessor as the stack grows toward the other end of the reserved block. Observe that as entries are pushed and popped, the location of the top of the stack will move back and forth within the reserved block of memory cells. To keep track of this location, its address is stored in an additional memory cell known as the stack pointer. That is, the stack pointer is a pointer to the top of the stack. The complete system, as illustrated in Figure8.12, works as follows: To push a new entry on the stack, we first adjust the stack pointer to point to the vacancy just beyond the top of the stack and then place the new entry at this location. To pop an entry from the stack, we read the data pointed to by the stack pointer and then adjust the stack pointer to point to the next entry down on the stack. The traditional implementation of a queue is similar to that of a stack. Again we reserve a block of contiguous cells in main memory large enough to hold the queue at its projected maximum size. However, in the case of a queue we need to perform operations at both ends of the structure, so we set aside two memory cells to use as pointers instead of only one as we did for a stack. One of these Figure 8.12   A stack in memory Stack’s base

Reserved block of memory cells Stack entries Space for growth

Stack pointer

M08_BROO1160_12_SE_C08.indd 387

23/07/14 10:26 am

388

Chapter 8  Data Abstractions

pointers, called the head pointer, keeps track of the head of the queue; the other, called the tail pointer, keeps track of the tail. When the queue is empty, both of these pointers point to the same location (Figure8.13). Each time an entry is inserted into the queue, it is placed in the location pointed to by the tail pointer, and then the tail pointer is adjusted to point to the next unused location. In this manner, the tail pointer is always pointing to the first vacancy at the tail of the queue. Removing an entry from the queue involves extracting the entry pointed to by the head pointer and then adjusting the head pointer to point to the next entry in the queue. A problem with the storage system as described thus far is that, as entries are inserted and removed, the queue crawls through memory like a glacier (see again Figure8.13). Thus we need a mechanism for confining the queue to its reserved block of memory. The solution is simple. We let the queue migrate through the block. Then, when the tail of the queue reaches the end of the block, we start inserting additional entries back at the original end of the block, which by this time is vacant. Likewise, when the last entry in the block finally becomes the head of the queue and this entry is removed, the head pointer is adjusted back to the beginning of the block where other entries are, by this time, waiting. In this manner, the queue chases itself around within the block as though the ends of the Figure 8.13   A queue implementation with head and tail pointers. Note how the queue crawls through memory as entries are inserted and removed

A Head pointer

Head pointer

Tail pointer

Tail pointer

B C

b. After inserting entries A, B, and C

a. Empty queue

B Head pointer

C

Head pointer

D

M08_BROO1160_12_SE_C08.indd 388

C D

Tail pointer

Tail pointer

c. After removing A and inserting D

d. After removing B and inserting E

E

23/07/14 10:26 am

8.3  Implementing Data Structures

389

Figure 8.14   A circular queue containing the letters P through V First cell in block

T U

First cell in block

U

V

V

T Head pointer

Head pointer

Tail pointer

S

Tail pointer

R

P Q

Q P

R S

Last cell in block

b. Conceptual storage with last cell “adjacent” to first cell

Last cell in block a. Queue as actually stored

block were connected to form a loop (Figure8.14). The result is an implementation called a circular queue.

Storing Binary Trees For the purpose of discussing tree storage techniques, we restrict our attention to binary trees, which we recall are trees in which each node has at most two children. Such trees normally are stored in memory using a linked structure similar to that of linked lists. However, rather than each entry consisting of two components (the data followed by a next-entry pointer), each entry (or node) of the binary tree contains three components: (1) the data, (2) a pointer to the node’s first child, and (3) a pointer to the node’s second child. Although there is no left or right inside a machine, it is helpful to refer to the first pointer as the left child pointer and the other pointer as the right child pointer in reference to the way we would draw the tree on paper. Thus each node of the tree is ­represented by a short, contiguous block of memory cells with the format shown in Figure8.15.

Figure 8.15   The structure of a node in a binary tree Cells containing the data

M08_BROO1160_12_SE_C08.indd 389

Left child pointer

Right child pointer

23/07/14 10:26 am

390

Chapter 8  Data Abstractions

Storing the tree in memory involves finding available blocks of memory cells to hold the nodes and linking these nodes according to the desired tree structure. Each pointer must be set to point to the left or right child of the pertinent node or assigned the null value if there are no more nodes in that direction of the tree. (This means that a terminal node is characterized by having both of its pointers assigned null.) Finally, we set aside a special memory location, called a root pointer, where we store the address of the root node. It is this root pointer that provides initial access to the tree. An example of this linked storage system is presented in Figure8.16, where a conceptual binary tree structure is exhibited along with a representation of how that tree might actually appear in a computer’s memory. Note that the actual arrangement of the nodes within main memory might be quite different from the conceptual arrangement. However, by following the root pointer, one can find the root node and then trace any path down the tree by following the appropriate pointers from node to node. An alternative to storing a binary tree as a linked structure is to use a single, contiguous block of memory cells for the entire tree. Using this approach, we store the tree’s root node in the first cell of the block. (For simplicity, we assume that each node of the tree requires only one memory cell.) Then we store the left child of the root in the second cell, store the right child of the root in the third cell, and in general, continue to store the left and right children of the node found in cell n in the cells 2n and 2n + 1, respectively. Cells within the block that represent locations not used by the tree are marked with a unique bit pattern that indicates the absence of data. Using this technique, the same tree shown in Figure8.16 would be stored as shown in Figure8.17. Note that the system is essentially that of storing the nodes across successively lower Figure 8.16   The conceptual and actual organization of a binary tree using a linked storage system Conceptual tree A

B

C

D

E

F

Actual storage organization Root pointer A

B

M08_BROO1160_12_SE_C08.indd 390

C

D

null

null

E

null

null

null

F

null

null

23/07/14 10:26 am

8.3  Implementing Data Structures

391

Figure 8.17   A tree stored without pointers Conceptual tree A

B D

C E

F

Actual storage organization 1

2

3

4

5

A

B

C

D

E

6

7 F

Root node Nodes in 2nd level of tree

Nodes in 3rd level of tree

levels of the tree as segments, one after the other. That is, the first entry in the block is the root node, followed by the root’s children, followed by the root’s grandchildren, and so on. In contrast to the linked structure described earlier, this alternative storage system provides an efficient method for finding the parent or sibling of any node. The location of a node’s parent can be found by dividing the node’s position in the block by 2 while discarding any remainder (the parent of the node in position 7 would be the node in position 3). The location of a node’s sibling can be found by adding 1 to the location of a node in an even-numbered position or subtracting 1 from the location of a node in an odd-numbered position. For example, the sibling of the node in position 4 is the node in position 5, while the sibling of the node in position 3 is the node in position 2. Moreover, this ­storage system makes efficient use of space when the binary tree is approximately balanced (in the sense that both subtrees below the root node have the same depth) and full (in the sense that it does not have long, thin branches). For trees without thesecharacteristics, though, the system can become quite inefficient, as shown in Figure8.18.

Manipulating Data Structures We have seen that the way data structures are actually stored in a computer’s memory is not the same as the conceptual structure envisioned by the user. A two-dimensional array is not actually stored as a two-dimensional rectangular block, and a list or a tree might actually consist of small pieces scattered over a large area of memory. Hence, to allow the user to access the structure as an abstract tool, we must shield the user from the complexities of the actual storage system. This means that instructions given by the user (and stated in terms of the abstract tool) must be converted into steps that are appropriate for the actual storage system. In the

M08_BROO1160_12_SE_C08.indd 391

23/07/14 10:26 am

392

Chapter 8  Data Abstractions

Figure 8.18   A sparse, unbalanced tree shown in its conceptual form and as it would be stored without pointers Conceptual tree A

B

C D E

Actual storage organization 1

2

3

A

B

C

root

2nd level

4

5

6

7

8

9

10

11

D

3rd level

12

13

14

15 E

4th level

case of arrays, we have seen how this can be done by using an address polynomial to convert row and column indices into memory cell addresses. In particular, we have seen how the statement Sales[3, 4] = 5;

written by a programmer who is thinking in terms of an abstract array can be converted into steps that perform the correct modifications to main memory. Likewise, we have seen how statements such as Employee.Age = 22;

referring to an abstract aggregate type can be translated into appropriate actions depending on how the aggregate is actually stored. In the case of lists, stacks, queues, and trees, instructions stated in terms of the abstract structure are usually converted into the appropriate actions by means of functions that perform the required task while shielding the user from the details of the underlying storage system. For example, if the function insert were provided for inserting new entries into a linked list, then J. W. Brown could be inserted in the list of students enrolled in Physics 208 merely by executing a function call such as insert("Brown, J.W.", Physics208)

Note that the function call is stated entirely in terms of the abstract structure—the manner in which the list is actually implemented is hidden. As a more detailed example, Figure8.19 presents a function named ­printList for printing a linked list of values. This function assumes that the first entry of the list is pointed to by a field called Head within the aggregate called List, and that each entry in the list consists of two pieces: a value (“Value”) and a pointer

M08_BROO1160_12_SE_C08.indd 392

23/07/14 10:26 am

8.3  Implementing Data Structures

393

Figure 8.19   A function for printing a linked list def PrintList(List): CurrentPointer = List.Head while (CurrentPointer != None): print(CurrentPointer.Value) CurrentPointer = CurrentPointer.Next

to the next entry (“Next”). In the figure, the special Python value None is used as the null pointer. Once this function has been developed, it can be used to print a linked list as an abstract tool without being concerned for the steps actually required to print the list. For example, to obtain a printed class list for Economics 301, a user need only perform the function call printList(Economics301ClassList)

to obtain the desired results. Moreover, if we should later decide to change the manner in which the list is actually stored, then only the internal actions of the function printList must be changed—the user would continue to request the printing of the list with the same function call as before.

Questions & Exercises 1. Show how the array below would be arranged in main memory when

stored in row major order. 5

3

7

4

2

8

1

9

6

2. Give a formula for finding the entry in the ith row and jth column of a

two-dimensional array if it is stored in column major order rather than row major order. 3. In the Python, C, C++, Java, and C# programming languages, indices of

arrays start at 0 rather than at 1. Thus the entry in the first row, fourth column of an array named Array is referenced by Array[0][3]. In this case, what address polynomial is used by the translator to convert references of the form Array[i][j] into memory addresses? 4. What condition indicates that a linked list is empty? 5. Modify the function in Figure8.19 so that it stops printing once a particu-

lar name has been printed. 6. Based on the technique of this section for implementing a stack in a con-

tiguous block of cells, what condition indicates that the stack is empty?

M08_BROO1160_12_SE_C08.indd 393

23/07/14 10:26 am

394

Chapter 8  Data Abstractions

7. Describe how a stack can be implemented in a high-level language in

terms of a one-dimensional array. 8. When a queue is implemented in a circular fashion as described in this

section, what is the relationship between the head and tail pointers when the queue is empty? What about when the queue is full? How can one detect whether a queue is full or empty? 9. Draw a diagram representing how the tree below appears in memory

when stored using the left and right child pointers, as described in this section. Then, draw another diagram showing how the tree would appear in contiguous storage using the alternative storage system described in this section. Y X

Z

W

8.4  A Short Case Study Let us consider the task of storing a list of names in alphabetical order. We assume that the operations to be performed on this list are the following: search for the presence of an entry, print the list in alphabetical order, and insert a new entry Our goal is to develop a storage system along with a collection of functions to perform these operations—thus producing a complete abstract tool. We begin by considering options for storing the list. If the list were stored according to the linked list model, we would need to search the list in a sequential fashion, a process that, as we discussed in Chapter5, could be very inefficient if the list becomes long. We will therefore seek an implementation that allows us to use the binary search algorithm (Section5.5) for our search procedure. To apply this algorithm, our storage system must allow us to find the middle entry of successively smaller portions of the list. Our solution is to store the list as a binary tree. We make the middle list entry the root node. Then we make the middle of the remaining first half of the list the root’s left child, and we make the middle of the remaining second half the root’s right child. The middle entries of each remaining fourth of the list become the children of the root’s children and so forth. For example, the tree in Figure8.20 represents the list of letters A, B, C, D, E, F, G, H, I, J, K, L, and M. (We consider the larger of the middle two entries as the middle when the part of the list in question contains an even number of entries.)

M08_BROO1160_12_SE_C08.indd 394

23/07/14 10:26 am

8.4  A Short Case Study

395

Figure 8.20   The letters A through M arranged in an ordered tree G K

D F

B A

C

E

I H

M J

L

To search the list stored in this manner, we compare the target value to the root node. If the two are equal, our search has succeeded. If they are not equal, we move to the left or right child of the root, depending on whether the target is less than or greater than the root, respectively. There we find the middle of the portion of the list that is necessary to continue the search. This process of comparing and moving to a child continues until we find the target value (meaning that our search was successful) or we reach a null pointer (None) without finding the target value (meaning that our search was a failure). Figure8.21 shows how this search process can be expressed in the case of a linked tree structure. The Python elif keyword is a shortcut for “else: if...”. Note that this function is merely a refinement of the function in ­Figure5.14, which is our original statement of the binary search. The distinction is largely cosmetic. Instead of stating the algorithm in terms of searching successively smaller segments of the list, we now state the algorithm in terms of searching successively smaller subtrees (Figure8.22). Having stored our “list” as a binary tree, you might think that the process of printing the list in alphabetical order would now be difficult. However, to print the list in alphabetical order, we merely need to print the left subtree in alphabetical order, print the root node, and then print the right subtree in alphabetical

Figure 8.21   The binary search as it would appear if the list were implemented as a linked binary tree def Search(Tree, TargetValue): if (Tree is None): return None # Search failed elif (TargetValue == Tree.Value): return Tree # Search succeeded elif (TargetValue Tree.Value): # Continue search in right subtree. return Search(Tree.Right, TargetValue)

M08_BROO1160_12_SE_C08.indd 395

23/07/14 10:26 am

396

Chapter 8  Data Abstractions

Garbage Collection As dynamic data structures grow and shrink, storage space is used and released. The process of reclaiming unused storage space for future use is known as garbage collection. Garbage collection is required in numerous settings. The memory manager within an operating system must perform garbage collection as it allocates and retrieves memory space. The file manager performs garbage collection as files are stored in and deleted from the machine’s mass storage. Moreover, any process running under the control of the dispatcher might need to perform garbage collection within its own allotted memory space. Garbage collection involves some subtle problems. In the case of linked structures, each time a pointer to a data item is changed, the garbage collector must decide whether to reclaim the storage space to which the pointer originally pointed. The problem becomes especially complex in intertwined data structures involving multiple paths of pointers. Inaccurate garbage collection routines can lead to loss of data or to inefficient use of storage space. For example, if garbage collection fails to reclaim storage space, the available space will slowly dwindle away, a phenomenon known as a memory leak.

order (Figure8.23). After all, the left subtree contains all the elements that are less than the root node, while the right subtree contains all the elements that are greater than the root. A sketch of our logic so far looks like this: if (tree not empty): print the left subtree in alphabetical order print the root node print the right subtree in alphabetical order

Figure 8.22   The successively smaller trees considered by the function in Figure8.21 whensearching for the letter J

G

D B A

M08_BROO1160_12_SE_C08.indd 396

K

C

M

I

E H

J

L

23/07/14 10:26 am

8.4  A Short Case Study

397

Figure 8.23   Printing a search tree in alphabetical order F D

H

B

E C

A

I

1. Print the left branch in alphabetical order

A,

J

G

B,

C,

D,

2. Print the root node

E,

F,

3. Print the right branch in alphabetical order

G,

H,

I,

J

This outline involves the tasks of printing the left subtree and the right subtree in alphabetical order, both of which are essentially smaller versions of our original task. That is, solving the problem of printing a tree involves the smaller task of printing subtrees, which suggests a recursive approach to our tree printing problem. Following this lead, we can expand our initial idea into a complete Python function for printing our tree as shown in Figure8.24. We have assigned the function the name PrintTree and then requested the services of PrintTree for printing the left and right subtrees. Note that the termination condition of the recursive process (reaching a null subtree, “None”) is guaranteed to be reached, because each successive activation of the function operates on a smaller tree than the one causing the activation. The task of inserting a new entry in the tree is also easier than it might appear at first. Your intuition might lead you to believe that insertions might require cutting the tree open to allow room for new entries, but actually the node being added can always be attached as a new leaf, regardless of the value involved. To find the proper place for a new entry, we move down the tree along the path that we would follow if we were searching for that entry. Since the entry is not in

Figure 8.24   A function for printing the data in a binary tree def PrintTree(Tree): if (Tree != None): PrintTree(Tree.Left) print(Tree.Value) PrintTree(Tree.Right)

M08_BROO1160_12_SE_C08.indd 397

23/07/14 10:26 am

398

Chapter 8  Data Abstractions

the tree, our search will lead to a null pointer. At this point we will have found the proper location for the new node (Figure8.25). Indeed, this is the location to which a search for the new entry would lead. A function expressing this process in the case of a linked tree structure is shown in Figure8.26. It searches the tree for the value being inserted (called NewValue) and then places a new leaf node containing NewValue at the proper location. Note that if the entry being inserted is actually found in the tree during the search, no insertion is made. The Python code in Figure8.26 uses the function call TreeNode() to create a new aggregate to serve as a fresh leaf in the linked tree structure. This requires additional code outside of the figure to identify TreeNode as user-defined type, as we will see in the next section. We conclude that a software package consisting of a linked binary tree structure together with our functions for searching, printing, and inserting provides a complete package that could be used as an abstract tool by our hypothetical application. Indeed, when properly implemented, this package could be used without concern for the actual underlying storage structure. By using the procedures in the package, the user could envision a list of names stored in alphabetical order, whereas the reality would be that the “list” entries are actually scattered among blocks of memory cells that are linked as a binarytree.

Figure 8.25   Inserting the entry M into the list B, E, G, H, J, K, N, P stored as a tree a. Search for the new entry until its absence is detected H

E

N G

B

P

K J

?

b. This is the position in which the new entry should be attached H

E B

N G J

M08_BROO1160_12_SE_C08.indd 398

P

K M

23/07/14 10:26 am

8.5  Customized Data Types

399

Figure 8.26   A function for inserting a new entry in a list stored as a binary tree def Insert(Tree, NewValue): if (Tree is None): # Create a new leaf with NewValue Tree = TreeNode() Tree.Value = NewValue elif (NewValue Tree.Value): # Insert NewValue into the right subtree Tree.Right = Insert(Tree.Right, NewValue) else: # Make no change. return Tree

Questions & Exercises 1. Draw a binary tree that you could use to store the list R, S, T, U, V, W, X,

Y, and Z for future searching. 2. Indicate the path traversed by the binary search algorithm in Figure8.21

when applied to the tree in Figure8.20 in searching for the entry J. What about the entry P? 3. Draw a diagram representing the status of activations of the recursive

tree-printing algorithm in Figure8.24 at the time node K is printed within the ordered tree in Figure8.20. 4. Describe how a tree structure in which each node has as many as 26 chil-

dren could be used to encode the correct spelling of words in the English language.

8.5  Customized Data Types In Chapter6 we introduced the concept of a data type and discussed such elementary types as integer, float, character, and Boolean. These data types are provided in most programming languages as primitive data types. In this section we consider ways in which a programmer can define his or her own data types to fit more closely the needs of a particular application.

User-Defined Data Types Expressing an algorithm is often easier if data types other than those provided as primitives in the programming language are available. For this reason, many modern programming languages allow programmers to define additional data types,

M08_BROO1160_12_SE_C08.indd 399

23/07/14 10:26 am

400

Chapter 8  Data Abstractions

using the primitive types as building blocks. The most elementary examples of such “home-made” data types are known as user-defined data types, which are essentially conglomerates of primitive types collected under a single name. To explain, suppose we wanted to develop a program involving numerous variables, each with the same aggregate structure consisting of a name, age, and skill rating. One approach would be to define each variable separately as an aggregate type (Section6.2). A better approach, however, would be to define the aggregate to be a new (user-defined) data type and then to use that new type as though it were a primitive. Recalling the example from Section6.2, in C the statement struct { char Name[25]; int Age; float SkillRating; } Employee;

defines a new aggregate, called Employee, containing fields called Name (of type character), Age (of type integer), and SkillRating (of type float). In contrast, the C statement struct EmployeeType { char Name[25]; int Age; float SkillRating; };

does not define a new aggregate variable, but defines a new aggregate type, EmployeeType. This new data type could then be used to declare variables in the same way as a primitive data type. That is, in the same way that C allows the variable x to be declared as an integer using the statement int x;

the variable Employee1 could be declared to be of the type Employee with the statement struct EmployeeType Employee1;

Then, later in the program, the variable Employee1 would refer to an entire block of memory cells containing the name, age, and skill rating of an employee. Individual items within the block could be referenced by ­expressions such as Employee1.Name and Employee1.Age. Thus, a statement such as Employee1.Age = 26;

might be used to assign the value 26 to the Age field within the block known as Employee1. Moreover, the statement struct EmployeeType DistManager, SalesRep1, SalesRep2;

could be used to declare the three variables DistManager, SalesRep1, and ­SalesRep2 to be of type EmployeeType just as a statement of the form

M08_BROO1160_12_SE_C08.indd 400

23/07/14 10:26 am

8.5  Customized Data Types

401

float Sleeve, Waist, Neck;

is normally used to declare the variables Sleeve, Waist, and Neck to be of the primitive type float. It is important to distinguish between a user-defined data type and an actual item of that type. The latter is referred to as an instance of the type. A userdefined data type is essentially a template that is used in constructing instances of the type. It describes the properties that all instances of that type have but does not itself constitute an occurrence of that type (just as a cookie-cutter is a template from which cookies are made but is not itself a cookie). In the preceding example, the user-defined data type EmployeeType was used to construct three instances of that type, known as DistManager, SalesRep1, and SalesRep2.

Abstract Data Types User-defined data types such as C’s structs and Pascal’s records play an important role in many programming languages, helping the software designer to tailor the representation of data to the needs for a particular program. Traditional userdefined data types, however, merely allow programmers to define new storage systems. They do not also provide operations to be performed on data with these structures. An abstract data type (ADT) is a user-defined data type that can include both data (representation) and functions (behavior). Programming languages that support creation of ADTs generally provide two features: (1) syntax for defining the ADT as single unit, and (2) a mechanism for hiding the internal structure of the ADT from other parts of the program that will make use of it. The first feature is an important organizational tool for keeping the data and functions of an ADT together, which simplifies maintenance and debugging. The second feature provides reliability, by preventing other code outside of the ADT from accessing its data without going through the functions that have been provided for that purpose. To clarify, suppose we wanted to create and use several stacks of integer values within a program. Our approach might be to implement each stack as an array of 20 integer values. The bottom entry in the stack would be placed (pushed) into the first array position, and additional stack entries would be placed (pushed) into successively higher entries in the array (see question 7 in Section8.3). An additional integer variable would be used as the stack pointer. It would hold the index of the array entry into which the next stack entry should be pushed. Thus each stack would consist of an array containing the stack itself and an integer playing the role of the stack pointer. To implement this plan, we could first establish a user-defined type called StackType with a C statement of the form struct StackType { int StackEntries[20]; int StackPointer = 0; };

(Recall that in languages such as C, C++, C#, and Java, indices for the array StackEntries range from 0 to 19, so we have initialized StackPointer to the

M08_BROO1160_12_SE_C08.indd 401

23/07/14 10:26 am

402

Chapter 8  Data Abstractions

value 0.) Having made this declaration, we could then declare stacks called StackOne, StackTwo, and StackThree via the statement struct StackType StackOne, StackTwo, StackThree;

At this point, each of the variables StackOne, StackTwo, and StackThree would reference a unique block of memory cells used to implement an individual stack. But what if we now want to push the value 25 onto StackOne? We would like to avoid the details of the array structure underlying the stack’s implementation and merely use the stack as an abstract tool—perhaps by using a function call similar to push(25, StackOne);

But such a statement would not be available unless we also defined an appropriate function named push. Other operations we would like to perform on variables of type StackType would include popping entries off the stack, checking to see if the stack is empty, and checking to see if the stack is full—all of which would require definitions of additional functions. In short, our definition of the data type StackType has not included all the properties we would like to have associated with the type. Moreover, any function in the program can potentially access the StackPointer and StackEntries fields of our StackType variables, bypassing the careful checks we would design into our push and pop functions. A sloppy assignment statement in another part of the program could overwrite a data element stored in the middle of the stack data structure, or even destroy the LIFO behavior that is characteristic of all stacks. What is needed is a mechanism for defining the operations that are allowed on our StackType, as well as for protecting the internal variables from outside interference. One such mechanism is the Java language’s interface syntax. For example, in Java, we could write interface StackType { public int pop(); /* Return the item at top of stack public void push(int item); /* Add a new item to stack public boolean isEmpty(); /* Check if stack is emtpy public boolean isFull(); /* Check if stack is full

*/ */ */ */

}

Alone, this abstract data type does not specify how the stack will be stored, or what algorithms will be used to execute the push, pop, isEmpty, and isFull functions. Those details (which have been abstracted away in this interface) will be specified in other Java code elsewhere. However, like our user-defined data type before, programmers are able to declare variables or function parameters to be of type StackType. We could declare StackOne, StackTwo, and StackThree to be stacks with the statement StackType StackOne, StackTwo, StackThree;

Later in the program (these three variables start out as null references and must be instantiated with concrete Java classes before use—but we are not concerned with those details here), we could push entries onto these stacks with statements such as StackOne.push(25);

M08_BROO1160_12_SE_C08.indd 402

23/07/14 10:26 am

8.6  Classes and Objects

403

which means to execute the push function associated with StackOne using the value 25 as the actual parameter. As opposed to the more elementary user-defined data types, abstract data types are complete data types, and their appearance in such languages as Ada in the 1980s represented a significant step forward in programming language design. Today, object-oriented languages provide for extended versions of abstract data types called classes, as we will see in the next section.

Questions & Exercises 1. What is the difference between a data type and an instance of that type? 2. What is the difference between a user-defined data type and an abstract

data type? 3. Describe an abstract data type for implementing a list. 4. Describe an abstract data type for implementing checking accounts.

8.6  Classes and Objects As we learned in Chapter6, the object-oriented paradigm leads to systems composed of units called objects that interact with each other to accomplish tasks. Each object is an entity that responds to messages received from other objects. Objects are described by templates known as classes. In many respects, these classes are actually descriptions of abstract data types (whose instances are called objects). For example, Figure8.27 shows how a class known as StackOfIntegers can be defined in the languages Java and C#. (The equivalent class definition in C++ has the same structure but slightly different syntax.) Note that this class provides a body for each of the functions declared in the abstract data type StackType. In addition, this class contains an array of integers called StackEntries, and an integer used to identify the top of the stack within the array called StackPointer. Using this class as a template, an object named StackOne can be created in a Java or C# program by the statement StackType StackOne = new StackOfIntegers();

or in a C++ program by the statement StackOfIntegers StackOne();

Later in the programs, the value 106 can be pushed onto StackOne using the statement StackOne.push(106);

or the top entry from StackOne can be retrieved and placed in the variable ­OldValue using the statement OldValue = StackOne.pop();

M08_BROO1160_12_SE_C08.indd 403

23/07/14 10:26 am

404

Chapter 8  Data Abstractions

Figure 8.27   A stack of integers implemented in Java and C# class StackOfIntegers implements StackType { private int[] StackEntries = new int[20]; private int StackPointer = 0; public void push(int NewEntry) { if (StackPointer 0) return StackEntries[--StackPointer]; else return 0; } public boolean isEmpty() { return (StackPointer == 0); public boolean isFull() { return (StackPointer >= MAX);

} }

}

These features are essentially the same as those associated with abstract data types. There are, however, distinctions between classes and abstract data types. The former is an extension of the latter. For instance, as we learned in ­Section6.5, object-oriented languages allow classes to inherit properties from other classes and to contain special methods called constructors that customize individual objects when they are created. Moreover, classes can be associated with varying degrees of encapsulation (Section6.5), allowing the internal properties of their instances to be protected from misguided shortcuts, while exposing other fields to be available externally. We conclude that the concepts of classes and objects represent another step in the evolution of techniques for representing data abstractions in programs. It is, in fact, the ability to define and use abstractions in a convenient manner that has led to the popularity of the object-oriented programming paradigm.

The Standard Template Library The data structures discussed in this chapter have become standard programming structures—so standard, in fact, that many programming environments treat them very much like primitives. One example is found in the C++ programming environment, which is enhanced by the Standard Template Library (STL). The STL contains a collection of predefined classes that describe popular data structures. Consequently, by incorporating the STL into a C++ program, the programmer is relieved from the task of describing these structures in detail. Instead, he or she needs merely to declare identifiers to be of these types in the same manner that we declared StackOne to be of type StackOfIntegers in Section 8.6.

M08_BROO1160_12_SE_C08.indd 404

23/07/14 10:26 am

8.7  Pointers in Machine Language

405

Questions & Exercises 1. In what ways are abstract data types and classes similar? In what ways

are they different? 2. What is the difference between a class and an object? 3. Describe a class that would be used as a template for constructing objects

of type queue-of-integers.

8.7  Pointers in Machine Language In this chapter we have introduced pointers and have shown how they are used in constructing data structures. In this section we consider how pointers are handled in machine language. Suppose that we want to write a program in the machine language described in AppendixC to pop an entry off the stack as described in Figure8.12 and place that entry in a general-purpose register. In other words, we want to load a register with the contents of the memory cell that contains the entry on top of the stack. Our machine language provides two instructions for loading registers: one with op-code 2, the other with op-code 1. Recall that in the case of op-code 2, the operand field contains the data to be loaded, and in the case of op-code 1, the operand field contains the address of the data to be loaded. We do not know what the contents will be, so we cannot use op-code 2 to obtain our goal. Moreover, we cannot use op-code 1, because we do not know what the address will be. After all, the address of the top of the stack will vary as the program is executed. However, we do know the address of the stack pointer. That is, we know the location of the address of the data we want to load. What we need, then, is a third op-code for loading a register, in which the operand contains the address of a pointer to the data to be loaded. To accomplish this goal we could extend the language in Appendix C to include an op-code D. An instruction with this op-code could have the form DRXY, which would mean to load register R with the contents of the memory cell whose address is found at address XY (Figure8.28). Thus if the stack pointer is in the memory cell at address AA, then the instruction D5AA would cause the data at the top of the stack to be loaded into register 5. This instruction, however, does not complete the pop operation. We must also subtract one from the stack pointer so that it points to the new top of the stack. This means that, following the load instruction, our machine language program would have to load the stack pointer into a register, subtract one from it, and store the result back in memory. By using one of the registers as the stack pointer instead of a memory cell, we could reduce this movement of the stack pointer back and forth between registers and memory. But this would mean that we must redesign the load instruction so that it expects the pointer to be in a register rather than in main memory. Thus, instead of the earlier approach, we might define an instruction with op-code D to have the form DR0S, which would mean to load register R

M08_BROO1160_12_SE_C08.indd 405

23/07/14 10:26 am

406

Chapter 8  Data Abstractions

Figure 8.28   Our first attempt at expanding the machine language in AppendixC to take advantage of pointers

CPU Register 5 Data

Instruction in instruction register

Address in instruction tells where pointer is stored in memory

Main memory Pointer stored at address AA AA

Bus

D5 AA

Pointer indicates location of Data

Data Data transferred to register during execute phase of machine cycle

with the contents of the memory cell pointed to by register S (Figure8.29). Then, a complete pop operation could be performed by following this instruction with an instruction (or instructions) to subtract one from the value stored in register S. Note that a similar instruction is needed to implement a push operation. We might therefore extend the language described in AppendixC further by introducing the op-code E so that an instruction of the form ER0S would mean to store the contents of register R in the memory cell pointed to by register S. Again, to complete the push operation, this instruction would be followed by an instruction (or instructions) to add one to the value in register S.

Figure 8.29   Loading a register from a memory cell that is located by means of a pointer stored in a register Main memory

CPU

Register 4

Instruction in instruction register

D5 04 Register 5 Data

Instruction indicates which register contains pointer

Data transferred to register during execute phase of machine cycle

Bus Data

Pointer indicates location of Data

M08_BROO1160_12_SE_C08.indd 406

23/07/14 10:26 am

8.7  Pointers in Machine Language

407

These new op-codes D and E that we have proposed not only demonstrate how machine languages are designed to manipulate pointers, they also d ­ emonstrate an addressing technique that was not present in the original machine language. As presented in AppendixC, the machine language uses two means of identifying the data involved in an instruction. The first of these is demonstrated by an instruction whose op-code is 2. Here, the operand field contains the data involved explicitly. This is called immediate addressing. The second means of identifying data is demonstrated by instructions with op-codes 1 and 3. Here the operand fields contain the address of the data involved. This is called direct addressing. However, our proposed new op-codes D and E demonstrate yet another form of identifying data. The operand fields of these instructions contain the address of the address of the data. This is called indirect addressing. All three are common in today’s machine languages.

Questions & Exercises 1. Suppose the machine language described in Appendix C has been

extended as suggested at the end of this section. Moreover, suppose register 8 contains the pattern DB, the memory cell at address DB contains the pattern CA, and the cell at address CA contains the pattern A5. What bit pattern will be in register 5 immediately after executing each of the following instructions? a.  25A5 b.  15CA c.  D508 2. Using the extensions described at the end of this section, write a complete

machine language routine to perform a pop operation. Assume that the stack is implemented as shown in Figure8.12, the stack pointer is in register F, and the top of the stack is to be popped into register 5. 3. Using the extensions described at the end of this section, write a program

to copy the contents of five contiguous memory cells starting at address A0 to the five cells starting at address B0. Assume your program starts at address 00. 4. In the chapter, we introduced a machine instruction of the form DR0S.

S­ uppose we extended this form to DRXS, meaning “Load register R with the data pointed to by the value in register S plus the value X.” Thus the pointer to the data is obtained by retrieving the value in register S and then incrementing that value by X. The value in register S is not altered. (If register F contained 04, then the instruction DE2F would load register E with the contents of the memory cell at address 06. The value of register F would remain 04.) What advantages would this instruction have? What about an instruction of the form DRTS—meaning “Load register R with the data pointed to by the value in register S incremented by the value in register T”?

M08_BROO1160_12_SE_C08.indd 407

23/07/14 10:26 am

408

Chapter 8  Data Abstractions

Chapter Review Problems (Asterisked problems are associated with optional sections.)

1. Draw pictures showing how the array below

appears in a machine’s memory when stored in row major order and in column major order: A

B

C

D

E

F

G

H

I

J

K

L

2. Suppose an array with six rows and eight

columns is stored in row major order starting at address −50 (base 10). If each entry in the array requires two memory cells, what is the address of the entry in the fifth row and seventh column? What if each entry requires three memory cells? 3. Rework question 2 assuming column major

order rather than row major order. 4. Write a function such that if an element in an

M × N matrix is 0, its entire row and column are set to 0. 5. Why is a contiguous list considered to be a

convenient storage structure for implementing static lists, but not for implementing dynamic lists? Explain your answer. 6. Suppose you want to insert the number 3 in

the list of numbers 1, 2, 4, 5, 6, 7, 8. What activities are required to insert the number 3 in the list, assuming that the order of the list is to be maintained? 7. The following table represents the contents

of some cells in a computer’s main memory along with the address of each cell represented. Note that some of the cells contain letters of the alphabet, and each such cell is followed by an empty cell. Place addresses in these empty cells so that each cell containing a letter together with the following cell form an entry in a linked list in which the letters appear in alphabetical order. (Use zero for the null pointer.) What address should the head pointer contain?

M08_BROO1160_12_SE_C08.indd 408

Address 11 12 13 14 15 16 17 18 19 20 21 22

Contents C G E B U F

8. The following table represents a portion of a

linked list in a computer’s main memory. Each entry in the list consists of two cells: Thefirst contains a letter of the alphabet; the second contains a pointer to the next listentry. Alter the pointers so that the ­letterN is no longer in the list. Then replacethe l­etter N with the letter G and alter the ­pointers so that the new letter appears in the list in its proper place in alphabetical order. Address 30 31 32 33 34 35 36 37 38 39 40 41

Contents J 38 B 30 X 46 N 40 K 36 P 34

9. The following table represents a linked list

using the same format as in the preceding problems. If the head pointer contains the value 44, what name is represented by

23/07/14 10:26 am

Chapter Review Problems

409

the list? Change the pointers so that the list ­contains the nameJean.

Address 40 41 42 43 44 45 46 47 48 49 50 51

15. Sometimes a single linked list is given two

Contents N 46 I 40 J 50 E 00 M 42 A 40

10. Which of the following routines correctly

inserts NewEntry immediately after the entry called PreviousEntry in a linked list? What is wrong with the other routine? Routine 1: 1. Copy the value in the pointer field of PreviousEntry into the pointer field of NewEntry. 2. Change the value in the pointer field of PreviousEntry to the address of NewEntry.

Routine 2: 1. Change the value in the pointer field of PreviousEntry to the address of NewEntry. 2. Copy the value in the pointer field of PreviousEntry into the pointer field of NewEntry.

11. Design a function to find the Kth element in a

single linked list with n elements. 12. Design a function to check whether the ele-

ments of a single linked list with n elements, form a palindrome. 13. Design a function for counting the nodes of a

linked list. 14. a. Suppose you were given a linked list with n elements. Design an algorithm to remove duplicates from an unsorted linked list.

M08_BROO1160_12_SE_C08.indd 409

b. If the use of a temporary buffer is not permitted to solve part (a), how would you solve the problem? different orders by attaching two pointers to each entry rather than one. Fill in the table below so that by following the first pointer after each letter one finds the name Carol, but by following the second pointer after each letter one finds the letters in alphabetical order. What values belong in the head pointer of each of the two lists represented? Address 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74

Contents O C A L R

16. The table below represents a stack stored in

a contiguous block of memory cells, as discussed in the text. If the base of the stack is at address 10 and the stack pointer contains the value 12, what value is retrieved by a pop instruction? What value is in the stack pointer after the pop operation? Address 10 11 12 13 14

Contents F C A B E

17. Draw a table showing the final contents of the

memory cells if the instruction in question 16 had been to push the letter D on the stack rather than to pop a letter. What would the value in the stack pointer be after the push instruction?

23/07/14 10:26 am

410

Chapter 8  Data Abstractions

18. How would you design a stack which, in addi-

ascending order from top to bottom. It has the following constraints:

tion to the traditional push and pop operations, also supports an operation called min which returns the element having the minimum value in the stack? push, pop, and min should all operate in O(1) time.

a. Only one disk can be moved at a time.   b. A disk is moved from the top of one tower onto the next tower.    c. A disk can only be placed on top of a larger disk.

19. Describe how a single array can be used to

implement three stacks. 20. Suppose you were given a stack and you were

allowed to use one additional stack, without copying the elements into any other data structure. Write a program to sort the stack in ascending order (biggest items on the top). The stack supports push, pop, peek, and isEmpty operations. 21. Suppose you were given three stacks and you

were only allowed to move entries one at a time from one stack to another. Design an algorithm for reversing two adjacent entries on one of the stacks. 22. Suppose we want to create a stack of names

that vary in length. Why is it advantageous to store the names in separate areas of memory and then build the stack out of pointers to these names rather than allowing the stack to contain the names themselves?

Write a program to move the disks from the first tower to the last using stacks.

27. Design a method that counts all the possible

ways in which a person can run up the stairs, if he can jump one, two or three steps at a time. 28. Suppose you were given two queues and you

were only allowed to move one entry at a time from the head of a queue to the tail of either. Design an algorithm for reversing two adjacent entries in one of the queues. 29. The table below represents a tree stored in

a machine’s memory. Each node of the tree consists of three cells. The first cell contains the data (a letter), the second contains a pointer to the node’s left child, and the third contains a pointer to the node’s right child. A value of 0 represents a null pointer. If the value of the root pointer is 55, draw a picture of the tree.

23. Design a function called TwoStacks which

implements a queue by using two stacks. 24. Suppose a stack consists of boxes of spe-

cific width, height, and depth. Boxes can be stacked on the top if the underlying box is larger in all dimensions, but cannot be rotated. Try to implement the tallest stack, where the height of a stack is the sum of the heights of each box. 25. Suppose the entries in a queue require one

memory cell each, the head pointer contains the value 11, and the tail pointer contains the value 17. What are the values of these pointers after one entry is inserted and two are removed? 26. The Towers of Hanoi is a classic puzzle

consisting of 3 towers, and N disks of different sizes which can slide onto any tower. The puzzle starts with the disks sorted in an

M08_BROO1160_12_SE_C08.indd 410

Address 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Contents G 0 0 X 0 0 J 49 0 M 0 0 F 43 40 W 46 52

23/07/14 10:26 am

Chapter Review Problems

30. The table below represents the contents of a

block of cells in a computer’s main memory. Note that some of the cells contain letters of the alphabet, and each of those cells is followed by two blank cells. Fill in the blank cells so that the memory block represents the tree that follows. Use the first cell following a letter as the pointer to that node’s left child and the next cell as the pointer to the

411

33. Apply the recursive tree-printing algorithm of

Figure8.24. Draw a diagram representing the nested activations of the algorithm (and the current position in each) at the time node X is printed. 34. Implement a function to check if a binary tree

is balanced. A balanced tree is defined to be a tree in which the heights of two subtrees of any node never differ by more than one. 35. Draw a diagram showing how the binary

Address 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

Contents C

H

Z T

K

W R

P

E

H

G

J

36. Suppose each node in a binary tree contains

a value. Design a method that prints all the paths which sum to a specified value. The path can start at an arbitrary node.

P

37. Give an example in which you might want G C

K E

H

P

right child. Use 0 for null pointers. What value should be in the root pointer? 31. Write an algorithm to create a binary search

tree with minimal height, for a given sorted array of integers. 32. Design a nonrecursive algorithm to replace

the recursive one represented in Figure8.24. Use a stack to control any backtracking that might be necessary.

M08_BROO1160_12_SE_C08.indd 411

tree below appears in memory when stored without pointers using a block of contiguous memory cells as described in Section8.3.

to implement a list (the conceptual structure) as a tree (the actual underlying structure). Give an example in which you might want to implement a tree (the conceptual structure) as a list (the actual underlying structure). 38. Suppose a binary tree Tl has millions of

nodes, and another tree T2, has hundreds of nodes. Create an algorithm to decide whether T2 is a subtree of Tl. T2 would be a subtree of Tl if there is a node “n” in Tl whose subtree is identical to T2. 39. Design an algorithm to check whether a

route between two nodes exists in a directed graph.

23/07/14 10:26 am

412

Chapter 8  Data Abstractions

40. Identify the trees below whose nodes would

be printed in alphabetical order by the algorithm in Figure8.24.

X

Z

W

W

syntax of Figure8.27, sketch a definition of an abstract data type representing a queue. Then give pseudocode statements showing how instances of that type could be created and how entries could be inserted in and deleted from those instances.

Y

Z X

47. Using pseudocode similar to the Java class

W

Y

Y

need to include detailed descriptions of the functions.)

X

Z

41. Modify the function in Figure8.24 to print the

“list” in reverse order. 42. Suppose a call center has three levels of

employees—respondent, manager, and ­director. An incoming telephone call must first be allocated to a respondent who is free. If the respondent cannot handle the call, the call must be escalated to a manager. If the manager is occupied, then the call should be escalated to a director. Design the classes and data structures for this problem. Implement a method dispatchCall() which assigns a call to the first available employee. 43. Design a procedure for finding and deleting a

given value from a tree stored in the fashion of Figure8.20. 44. In the traditional implementation of a tree,

each node is constructed with a separate pointer for each possible child. The number of such pointers is a design decision and represents the maximum number of children any node can have. If a node has fewer children than pointers, some of its pointers are simply set to null. But such a node can never have more children than pointers. Describe how a tree could be implemented without limiting the number of children a node could have. 45. Using pseudocode modeled on the C struct

statement introduced in Section8.5, define a user-defined data type representing data regarding an employee of a company (such as name, address, job assignment, pay scale, and so on). 46. Using pseudocode similar to the Java class

syntax of Figure8.27, sketch a definition of an abstract data type representing a list of names. In particular, what structure would contain the list and what functions would be provided to manipulate the list? (You do not

M08_BROO1160_12_SE_C08.indd 412

48. a. What is the difference between a user-

defined data type and a primitive data type? b. What is the difference between an abstract data type and a user-defined data type?

49. Identify the data structures and procedures

that might appear in an abstract data type representing an address book. 50. Identify the data structures and procedures

that might appear in an abstract data type representing a simple spacecraft in a video game. 51. Modify Figure8.27 and the StackType inter-

face from Section8.5 so that the class defines a queue rather than a stack. 52. In what way is a class more general than a tra-

ditional abstract data type? *53. Using instructions of the form DR0S and ER0S

as described at the end of Section8.7, write a complete machine language routine to push an entry onto a stack implemented as shown in Figure8.12. Assume that the stack pointer is in register F and that the entry to be pushed is in register 5. *54. Suppose a Boolean expression consisting of

the symbols 0, 1, &, |, and A, and a desired Boolean result value is given. Implement a function to count the number of ways to parenthesize the expression, such that it evaluates to the result. For example, if the expression is 1 A 01011 and the desired result is false (0), the output will be 1A( (010) 11) and 1 A (91 (011)). *55. What advantages does an instruction of the

form DR0S as described in Section8.7 have over an instruction of the form DRXY? What advantage does the form DRXS as described in question 4 of Section8.7 have over the form DR0S?

23/07/14 10:26 am

Social Issues

413

Social Issues The following questions are intended as a guide to the ethical/social/legal issues associated with the field of computing. The goal is not merely to answer these questions. You should also consider why you answered as you did and whether your justifications are consistent from one question to the next. 1. Suppose a software analyst designs a data organization that allows for effi-

cient manipulation of data in a particular application. How can the rights to that data structure be protected? Is a data structure the expression of an idea (like a poem) and therefore protected by copyright or do data structures fall through the same legal loopholes as algorithms? What about patent law? 2. To what extent is incorrect data worse than no data? 3. In many application programs, the size to which a stack can grow is determined by the amount of memory available. If the available space is consumed, then the software is designed to produce a message such as “stack overflow” and terminate. In most cases this error never occurs, and the user is never aware of it. Who is liable if such an error occurs and sensitive information is lost? How could the software developer minimize his or her liability? 4. In a data structure based on a pointer system, the deletion of an item usually consists of changing a pointer rather than erasing memory cells. Thus when an entry in a linked list is deleted, the deleted entry actually remains in memory until its memory space is required by other data. What ethical and security issues result from this persistence of deleted data? 5. It is easy to transfer data and programs from one computer to another. Thus it is easy to transfer the knowledge held by one machine to many machines. In contrast, it sometimes takes a long time for a human to transfer knowledge to another human. For example, it takes time for a human to teach another human a new language. What implications could this contrast in knowledge transfer rate have if the capabilities of machines begin to challenge the capabilities of humans? 6. The use of pointers allows related data to be linked in a computer’s memory in a manner reminiscent of the way many believe information is associated in the human mind. How are such links in a computer’s memory similar to links in a brain? How are they different? Is it ethical to attempt to build computers that more closely mimic the human mind? 7. Has the popularization of computer technology produced new ethical issues or simply provided a new context in which previous ethical theories are applicable? 8. Suppose the author of an introductory computer science textbook wants to include program examples to demonstrate concepts in the text. However, to obtain clarity, many of the examples must be simplified versions of what would actually be used in professional-quality software. The author knows that the examples could be used by unsuspecting readers and ultimately could find their way into significant software applications in which more robust techniques would be more appropriate. Should the author use the simplified examples, insist that all examples be robust even if doing so decreases their demonstrative value, or refuse to use such examples unless clarity and robustness can both be obtained?

M08_BROO1160_12_SE_C08.indd 413

23/07/14 10:26 am

414

Chapter 8  Data Abstractions

Additional Reading Carrano, F. M., and T. Henry. Data Abstraction and Problem Solving with C11: Walls and Mirrors, 6th ed. Boston, MA: Addison-Wesley, 2012. Gray, S. Data Structures in Java: From Abstract Data Types to the Java Collections Framework. Boston, MA: Addison-Wesley, 2007. Main, M. Data Structures and Other Objects Using Java, 4th ed. Boston, MA: Addison-Wesley, 2011. Main, M., and W. Savitch. Data Structures and Other Objects Using C11, 4th ed. Boston, MA: Addison-Wesley, 2010. Prichard, J., and F.M. Carrano. Data Abstraction and Problem Solving with Java: Walls and Mirrors, 3rd ed. Boston, MA: Addison-Wesley, 2010. Shaffer, C. A. Practical Introduction to Data Structures and Algorithm Analysis, 2nded. Upper Saddle River, NJ: Prentice Hall, 2001. Weiss, M. A. Data Structures and Problem Solving Using Java, 4th ed. Boston, MA: ­Addison-Wesley, 2011. Weiss, M. A. Data Structures and Algorithm Analysis in C11, 4th ed. Boston, MA: Addison-Wesley, 2013. Weiss, M. A. Data Structures and Algorithm Analysis in Java, 3rd ed. Boston, MA: ­Addison-Wesley, 2011.

M08_BROO1160_12_SE_C08.indd 414

23/07/14 10:26 am

9

C H A P T E R

Database Systems A database is a system that converts a large collection of data into an abstract tool, allowing users to search for and extract pertinent items of information in a manner that is convenient to the user. In this chapter we explore this subject as well as take side excursions into the related fields of data mining, which seeks techniques for uncovering hidden patterns in large data collections, and traditional file structures, which provide many of the tools underlying today’s database and data mining systems.

9.1  Database Fundamentals The Significance of Database Systems The Role of Schemas Database Management Systems Database Models

9.2  The Relational Model Issues of Relational Design Relational Operations SQL

M09_BROO1160_12_SE_C09.indd 415

*9.3  Object-Oriented Databases

Indexed Files Hash Files

*9.4  Maintaining Database Integrity

9.6  Data Mining

The Commit/Rollback Protocol Locking

*9.5  Traditional File Structures

9.7  Social Impact of ­ atabase Technology D *Asterisks indicate suggestions for optional sections.

Sequential Files

23/07/14 8:26 pm

416

Chapter 9  Database Systems

Today’s technology is capable of storing extremely large amounts of data, but such data collections are useless unless we are able to extract those particular items of information that are pertinent to the task at hand. In this chapter we will study database systems and learn how these systems apply abstraction to convert large data conglomerates into useful information sources. As a related topic, we will investigate the rapidly expanding field of data mining, whose goal is to develop techniques for identifying and exploring patterns within data collections. We will also examine the principles of traditional file structures, which provide the underpinnings for today’s database and data mining systems.

9.1  Database Fundamentals The term database refers to a collection of data that is multidimensional in the sense that internal links between its entries make the information accessible from a variety of perspectives. This is in contrast to a traditional file system (­Section9.5), sometimes called a flat file, which is a one-dimensional storage system, meaning that it presents its information from a single point of view. Whereas a flat file containing information about composers and their compositions might provide a list of compositions arranged by composer, a database might present all the works by a single composer, all the composers who wrote a particular type of music, and perhaps the composers who wrote variations of another composer’s work.

The Significance of Database Systems Historically, as computing machinery found broader uses in information management, each application tended to be implemented as a separate system with its own collection of data. Payroll was processed using the payroll file, the personnel department maintained its own employee records, and inventory was managed via an inventory file. This meant that much of the information required by an organization was duplicated throughout the company, while many different but related items were stored in separate systems. In this setting, database systems emerged as a means of integrating the information stored and maintained by a particular organization (Figure9.1). With such a system, the same sales data could be used to produce restocking orders; create reports on market trends, direct advertisements, and product announcements to customers who are most likely to respond favorably to such information; and generate bonus checks for members of the sales force. Such integrated pools of information provided a valuable resource with which management decisions could be made, assuming the information could be accessed in a meaningful way. In turn, database research focused on developing techniques by which the information in a database could be brought to the decision-making process. Much progress has been made in this regard. Today, database technology, combined with data mining techniques, is an important management tool, allowing the management of an organization to extract pertinent information from enormous amounts of data covering all aspects of the organization and its environment. Moreover, database systems have become the underlying technology that supports many of the more popular sites on the World Wide Web. The ­underlying theme of sites such as Google, eBay, and Amazon is to provide an interface

M09_BROO1160_12_SE_C09.indd 416

23/07/14 8:26 pm

9.1  Database Fundamentals

417

Figure 9.1   A file versus a database organization a. File-oriented information system

Customer records

Payroll records

Employee records

Inventory records

Sales records

Customer service department

Payroll department

Personnel department

Purchasing department

Marketing department

b. Database-oriented information system

Management

Customer service department

Marketing department Integrated database

Payroll department

Purchasing department

Personnel department

between clients and databases. To respond to a client’s request, the server ­interrogates a database, organizes the results in the form of a Web page, and sends that page to the client. Such Web interfaces have popularized a new role for database technology in which a database is no longer a means of storing a company’s records but, instead, is the company’s product. Indeed, by ­combining database technology with Web interfaces, the Internet has become a major worldwide information source.

The Role of Schemas Among the disadvantages of the proliferation of database technology is the ­potential of sensitive data being accessed by unauthorized personnel. Someone placing an order at a company’s website should not have access to the company’s

M09_BROO1160_12_SE_C09.indd 417

23/07/14 8:26 pm

418

Chapter 9  Database Systems

financial data; similarly, an employee in a company’s benefits department may need access to the company’s employee records but should not have access to the corporation’s inventory or sales records. Thus the ability to control access to the information in the database is as important as the ability to share it. To provide different users access to different information within a database, database systems often rely on schemas and subschemas. A schema is a description of the entire database structure that is used by the database software to maintain the database. A subschema is a description of only that portion of the database pertinent to a particular user’s needs. For example, a schema for a university database would indicate that each student record contains such items as the current address and phone number of that student in addition to the student’s academic record. Moreover, it would indicate that each student record is linked to the record of the student’s faculty adviser. In turn, the record for each faculty member would contain the person’s address, employment history, and so on. Based on this schema, a linkage system would be maintained that ultimately connected the information about a student to the employment history of a faculty member. To keep the university’s registrar from using this linkage to obtain privileged information about the faculty, the registrar’s access to the database must be restricted to a subschema whose description of the faculty records does not include employment history. Under this subschema, the registrar could find out which faculty member is a particular student’s adviser but could not obtain access to additional information about that faculty member. In contrast, the subschema for the payroll department would provide the employment history of each faculty member but would not include the linkage between students and advisers. Thus the payroll department could modify a faculty member’s salary but could not obtain the names of the ­students advised by that person.

Database Management Systems A typical database application involves multiple software layers, which we will group into two major layers—an application layer and a database management layer (Figure9.2). The application software handles the communication with the user of the database and may be quite complex, as exemplified by applications

Figure 9.2   The conceptual layers of a database implementation

User

Application software

Database seen in terms of the application

M09_BROO1160_12_SE_C09.indd 418

Database management system

Database seen in terms of a database model

Actual database

Database seen in its actual organization

23/07/14 8:26 pm

9.1  Database Fundamentals

419

Distributed Databases With the advancement of networking capabilities, database systems have grown to encompass databases, known as distributed databases, that consist of data residing on different machines. For instance, an international corporation might store and maintain local employee records at local sites yet link those records via a network to create a single distributed database. A distributed database might contain fragmented and/or replicated data. The first case is exemplified by the previous employee-records example in which different fragments of the database are stored in different locations. In the second case, duplicates of the same database component are stored at different locations. Such replication might occur as a means of reducing information retrieval time. Both cases pose problems not present in more traditional centralized databases—how to disguise the distributed nature of the database so that it functions as a coherent system or how to ensure that replicated portions of a database remain duplicates of each other as updates occur. In turn, the study of distributed databases is a current area of research.

in which users access a database by means of a website. In that case the entire application layer consists of clients throughout the Internet and a server that uses the database to fill the requests from the clients. Note that the application software does not directly manipulate the database. The actual manipulation of the database is accomplished by the database ­management system (DBMS). Once the application software has determined what action the user is requesting, it uses the DBMS as an abstract tool to obtain the results. If the request is to add or delete data, it is the DBMS that actually alters the database. If the request is to retrieve information, it is the DBMS that performs the required searches. This dichotomy between the application software and the DBMS has several benefits. One is that it allows for the construction and use of abstract tools, which we have repeatedly found to be a major simplifying concept in software design. If the details of how the database is actually stored are isolated within the DBMS, the design of the application software can be greatly simplified. For instance, with a well-designed DBMS, the application software does not have to be concerned with whether the database is stored on a single machine or scattered among many machines within a network as a distributed ­database. Instead, the DBMS would deal with these issues, allowing the application software to access the database without concern for where the data is actually stored. A second advantage of separating the application software from the DBMS is that such an organization provides a means for controlling access to the database. By dictating that the DBMS performs all access to the database, the DBMS can enforce the restrictions imposed by the various subschemas. In particular, the DBMS can use the entire database schema for its internal needs but can require that the application software employed by each user remain within the bounds described by that user’s subschema.

M09_BROO1160_12_SE_C09.indd 419

23/07/14 8:26 pm

420

Chapter 9  Database Systems

Still another reason for separating the user interface and actual data manipulation into two different software layers is to achieve data independence—the ability to change the organization of the database itself without changing the application software. For example, the personnel department might need to add an additional field to each employee’s record to indicate whether the corresponding employee chose to participate in the company’s new health insurance ­program. If the application software dealt directly with the database, such a change in the data’s format could require modifications to all application programs dealing with the database. As a result, the change instigated by the personnel department might cause changes to the payroll program as well as to the program for printing mailing labels for the company’s newsletter. The separation between application software and a DBMS removes the need for such reprogramming. To implement a change in the database required by a single user, one needs to change only the overall schema and the subschemas of those users involved in the change. The subschemas of all the other users remain the same, so their application software, which is based on the unaltered subschemas, does not need to be modified.

Database Models We have repeatedly seen how abstraction can be used to hide internal complexities. Database management systems provide yet another example. They hide the complexities of a database’s internal structure, allowing the user of the database to imagine that the information stored in the database is arranged in a more useful format. In particular, a DBMS contains routines that translate commands stated in terms of a conceptual view of the database into the actions required by the actual data storage system. This conceptual view of the database is called a database model. In the following sections we will consider both the relational database model and the object-oriented database model. In the case of the relational database model, the conceptual view of the database is that of a collection of tables consisting of rows and columns. For example, information about a company’s employees might be viewed as a table containing a row for each employee and columns labeled name, address, employee identification number, and so on. In turn, the DBMS would contain routines that would allow the application software to select certain entries from a particular row of the table or perhaps to report the range of values found in the salary column—even though the information is not actually stored in rows and columns. These routines form the abstract tools used by the application software to access the database. More precisely, application software is often written in one of the general-purpose programming languages, such as those discussed in ­Chapter6. These languages provide the basic ingredients for algorithmic expressions but lack instructions for manipulating a database. However, a program written in one of these languages can use the routines provided by the DBMS as prewritten subroutines—in effect extending the capabilities of the language in a manner that supports the conceptual image of the database model. The search for better database models is an ongoing process. The goal is to find models that allow complex data systems to be conceptualized easily, lead to concise ways of expressing requests for information, and produce efficient database management systems.

M09_BROO1160_12_SE_C09.indd 420

23/07/14 8:26 pm

9.2  The Relational Model

421

Questions & Exercises 1. Identify two departments in a manufacturing plant that would have

­ ifferent uses for the same or similar inventory information. Then, d describe how the subschema for the two departments might differ. 2. What is the purpose of a database model? 3. Summarize the roles of the application software and a DBMS.

9.2  The Relational Model In this section we look more closely at the relational database model. It portrays data as being stored in rectangular tables, called relations, which are similar to the format in which information is displayed by spreadsheet programs. For example, the relational model allows information regarding the employees of a firm to be represented by a relation such as that shown in Figure9.3. A row in a relation is called a tuple (some say “TOO-pul,” others say “­TUH-pul”). In the relation of Figure9.3, tuples consist of the information about a particular employee. Columns in a relation are referred to as attributes because each entry in a column describes some characteristic, or attribute, of the entity represented by the corresponding tuple.

Issues of Relational Design A pivotal step in designing a relational database is to design the relations making up the database. Although this might appear to be a simple task, many subtleties are waiting to trap the unwary designer. Suppose that in addition to the information contained in the relation of ­Figure9.3, we want to include information about the jobs held by the employees. We might want to include a job history associated with each employee that consists of such attributes as job title (secretary, office manager, floor supervisor), a job identification code (unique to each job), the skill code associated with each job, the department in which the job exists, and the period during which the employee held the job in terms of a starting date and termination date. (We use an asterisk as the termination date if the job represents the employee’s c­ urrent position.) Figure 9.3   A relation containing employee information

M09_BROO1160_12_SE_C09.indd 421

Empl ld

Name

Address

SSN

25X15 34Y70 23Y34 • • •

Joe E. Baker Cheryl H. Clark G. Jerry Smith • • •

33 Nowhere St. 563 Downtown Ave. 1555 Circle Dr. • • •

111223333 999009999 111005555 • • •

23/07/14 8:26 pm

422

Chapter 9  Database Systems

One approach to this problem is to extend the relation in Figure 9.3 to include these attributes as additional columns in the table, as shown in Figure9.4. ­However, close examination of the result reveals several problems. One is a lack of efficiency due to redundancy. The relation no longer contains one tuple for each employee but rather one tuple for each assignment of an employee to a job. If an employee has advanced in the company through a sequence of several jobs, several tuples in the new relation must contain the same information about the employee (name, address, identification number, and Social Security number). For example, the personal information about Baker and Smith is repeated because they have held more than one job. Moreover, when a particular position has been held by numerous employees, the department associated with that job along with the appropriate skill code must be repeated in each tuple representing an assignment of the job. For example, the description of the floor manager job is duplicated because more than one employee has held this position. Another, perhaps more serious, problem with our extended relation surfaces when we consider deleting information from the database. Suppose for example that Joe E. Baker is the only employee to hold the job identified as D7. If he were to leave the company and be deleted from the database represented in Figure9.4, we would lose the information about job D7. After all, the only tuple containing the fact that job D7 requires a skill level of K2 is the tuple relating to Joe Baker. You might argue that the ability to erase only a portion of a tuple could solve the problem, but this would in turn introduce other complications. For instance, should the information relating to job F5 also be retained in a partial tuple, or does this information reside elsewhere in the relation? Moreover, the temptation to use partial tuples is a strong indication that the design of the database can be improved. The cause of all these problems is that we have combined more than one concept in a single relation. As proposed, the extended relation in Figure9.4 contains information dealing directly with employees (name, identification number, address, Social Security number), information about the jobs available in the company (job identification, job title, department, skill code), and information

Figure 9.4   A relation containing redundancy Empl ld

Name

Address

SSN

Job ld Job Title Skill Code

Dept

Start Date Term Date

25X15

Joe E. Baker

33 Nowhere St.

111223333

F5

Floor manager

FM3

Sales

9-1-2009

9-30-2010

25X15

Joe E. Baker

33 Nowhere St.

111223333

D7

Dept. head

K2

Sales

10-1-2010

*

F5

Floor manager

FM3

Sales

10-1-2009

*

Personnel

3-1-1999

4-30-2010

34Y70

Cheryl H. 563 Downtown Clark Ave.

999009999

23Y34

G. Jerry Smith

1555 Circle Dr.

111005555

S25X Secretary

T5

23Y34

G. Jerry Smith • • •

1555 Circle Dr. • • •

111005555

S26Z Secretary

T6

• • •

M09_BROO1160_12_SE_C09.indd 422

• • •

• • •

• • •

• • •

Accounting 5-1-2010 • • •

• • •

* • • •

23/07/14 8:26 pm

9.2  The Relational Model

423

Database Systems for PCs Personal computers are used in a variety of applications, ranging from elementary to sophisticated. In elementary “database” applications, such as storing Christmas card lists or maintaining bowling league records, spreadsheet systems are often used in lieu of database software since the application calls for little more than the ability to store, print, and sort data. There are, however, true database systems available for the PC market, one of which is Microsoft’s Access. This is a complete relational database system as described in Section9.2, as well as chart- and report-generation software. Access provides an excellent example of how the principles presented in this text form the backbone of popular products on the market today.

regarding the relationship between employees and jobs (start date, termination date). On the basis of this observation, we can solve our problems by redesigning the system using three relations—one for each of the preceding categories. We can keep the original relation in Figure9.3 (which we now call the EMPLOYEE relation) and insert the additional information in the form of the two new relations called JOB and ASSIGNMENT, which produces the database in Figure9.5. Figure 9.5   An employee database consisting of three relations EMPLOYEE relation Empl ld

Name

Address

SSN

25X15 34Y70 23Y34 • • •

Joe E. Baker Cheryl H. Clark G. Jerry Smith • • •

33 Nowhere St. 563 Downtown Ave. 1555 Circle Dr. • • •

111223333 999009999 111005555 • • •

JOB relation Job ld

Job Title

Skill Code

Dept

S25X S26Z F5 • • •

Secretary Secretary Floor manager • • •

T5 T6 FM3 • • •

Personnel Accounting Sales • • •

ASSIGNMENT relation Empl ld

Job ld

Start Date

Term Date

23Y34 34Y70 23Y34 • • •

S25X F5 S26Z • • •

3-1-1999 10-1-2009 5-1-2010 • • •

4-30-2010 * * • • •

M09_BROO1160_12_SE_C09.indd 423

23/07/14 8:26 pm

424

Chapter 9  Database Systems

A database consisting of these three relations contains the pertinent information about employees in the EMPLOYEE relation, about available jobs in the JOB relation, and about job history in the ASSIGNMENT relation. Additional information is implicitly available by combining the information from different relations. For instance, if we know an employee’s identification number, we can find the departments in which that employee has worked by first finding all the jobs that employee has held using the ASSIGNMENT relation and then finding the departments associated with those jobs by means of the JOB relation (Figure9.6). Through processes such as these, any information that could be obtained from the single large relation can be obtained from the three smaller relations without the problems previously cited. Unfortunately, dividing information into various relations is not always as trouble-free as in the preceding example. For instance, compare the original relation in Figure9.7, with attributes EmplId, JobTitle, and Dept, to the proposed decomposition into two relations. At first glance, the two-relation system might appear to contain the same information as the single-relation system, but, in fact, it does not. Consider for example the problem of finding the department in which a given employee works. This is easily done in the single-relation system by interrogating the tuple containing the employee identification number of the target employee and extracting the corresponding department. However, in the Figure 9.6   Finding the departments in which employee 23Y34 has worked EMPLOYEE relation Empl ld

Name

Address

SSN

25X15 34Y70 23Y34 • • •

Joe E. Baker Cheryl H. Clark G. Jerry Smith • • •

33 Nowhere St. 563 Downtown Ave. 1555 Circle Dr. • • •

111223333 999009999 111005555 • • •

JOB relation Job ld

Job Title

Skill Code

Dept

S25X S26Z F5 • • •

Secretary Secretary Floor manager • • •

T5 T6 FM3 • • •

Personnel Accounting Sales • • •

are contained in the personnel and accounting departments.

ASSIGNMENT relation

The jobs held by employee 23Y34

M09_BROO1160_12_SE_C09.indd 424

Empl ld

Job ld

Start Date

Term Date

23Y34 34Y70 23Y34 • • •

S25X F5 S26Z • • •

3-1-1999 10-1-2009 5-1-2010 • • •

4-30-2010 * * • • •

23/07/14 8:26 pm

9.2  The Relational Model

425

Figure 9.7   A relation and a proposed decomposition Empl ld

Job Title

Dept

Original relation containing employees, jobs, and departments.

Empl ld

Job Title

Job Title

Dept

Proposed decomposition

two-relation system, the desired information is not necessarily available. We can find the job title of the target employee and a department having such a job but this does not necessarily mean that the target employee works in that particular department, because several departments might have jobs with the same title. We see, then, that sometimes dividing a relation into smaller relations causes the loss of information, and sometimes it does not. (The latter is called a lossless decomposition—or sometimes a nonloss decomposition.) Such relational characteristics are important design considerations. The goal is to identify the relational characteristics that can lead to problems in database design and find ways to reorganize those relations to remove these problematic characteristics.

Relational Operations Now that you have a basic understanding of how data can be organized in terms of the relational model, it is time to see how information can be extracted from a database consisting of relations. We begin with a look at some operations that we might want to perform on relations. At times we need to select certain tuples from a relation. To retrieve the information about an employee, we must select the tuple with the appropriate identification attribute value from the EMPLOYEE relation, or to obtain a list of the job titles in a certain department, we must select the tuples from the JOB relation having that department as their department attribute. The result of such a process is another relation consisting of the tuples selected from the parent relation. The outcome of selecting information about a particular employee results in a relation containing only one tuple from the EMPLOYEE relation. The outcome of selecting the tuples associated with a certain department results in a relation that probably contains several tuples from the JOB relation. In short, one operation we might want to perform on a relation is to select tuples possessing certain characteristics and to place these selected tuples in a new relation. To express this operation, we adopt the syntax NEW ← SELECT from EMPLOYEE where EmplId = '34Y70'

M09_BROO1160_12_SE_C09.indd 425

23/07/14 8:26 pm

426

Chapter 9  Database Systems

The semantics of this statement is to create a new relation called NEW containing those tuples (there should be only one in this case) from the relation EMPLOYEE whose EmplId attribute equals 34Y70 (Figure9.8). In contrast to the SELECT operation, which extracts rows from a relation, the PROJECT operation extracts columns. Suppose, for example, that in searching for the job titles in a certain department, we had already SELECTed the tuples from the JOB relation that pertained to the target department and placed these tuples in a new relation called NEW1. The list we are seeking is the JobTitle column within this new relation. The PROJECT operation allows us to extract this column (or columns if required) and place the result in a new relation. We express such an operation as NEW2 ← PROJECT JobTitle from NEW1

The result is the creation of another new relation (called NEW2) that contains the single column of values from the JobTitle column of relation NEW1. As another example of the PROJECT operation, the statement MAIL ← PROJECT Name, Address from EMPLOYEE

can be used to obtain a listing of the names and addresses of all employees. This list is in the newly created (two-column) relation called MAIL (Figure9.9). Another operation used in conjunction with relational databases is the JOIN operation. It is used to combine different relations into one relation. The JOIN of two relations produces a new relation whose attributes consist of the attributes from the original relations (Figure9.10). The names of these attributes are the same as those in the original relations except that each is prefixed by the relation of its origin. (If relation A containing attributes V and W is JOINed with relation B containing attributes X, Y, and Z, then the result has five attributes named A.V, A.W, B.X, B.Y, and B.Z.) This naming convention ensures that the attributes in the new relation have unique names, even though the original relations might have attribute names in common.

Figure 9.8   The SELECT operation

EMPLOYEE relation

Empl ld

Name

Address

SSN

25X15 34Y70 23Y34 • • •

Joe E. Baker Cheryl H. Clark G. Jerry Smith • • •

33 Nowhere St. 563 Downtown Ave. 1555 Circle Dr. • • •

111223333 999009999 111005555 • • •

NEW

NEW relation

M09_BROO1160_12_SE_C09.indd 426

SELECT from EMPLOYEE where Emplld = '34Y70'

Empl ld

Name

Address

SSN

34Y70

Cheryl H. Clark

563 Downtown Ave.

999009999

23/07/14 8:26 pm

9.2  The Relational Model

427

Figure 9.9   The PROJECT operation

EMPLOYEE relation

Empl ld

Name

Address

SSN

25X15 24Y70 23Y34 • • •

Joe E. Baker Cheryl H. Clark G. Jerry Smith • • •

33 Nowhere St. 563 Downtown Ave. 1555 Circle Dr. • • •

111223333 999009999 111005555 • • •

MAIL

MAIL relation

PROJECT Name, Address from EMPLOYEE

Name

Address

Joe E. Baker Cheryl H. Clark G. Jerry Smith • • •

33 Nowhere St. 563 Downtown Ave. 1555 Circle Dr. • • •

The tuples (rows) of the new relation are produced by concatenating tuples from the two original relations (see again Figure9.10). Which tuples are actually joined to form tuples in the new relation is determined by the condition under which the JOIN is constructed. One such condition is that designated attributes Figure 9.10   The JOIN operation

Relation A

X

Y

Z

V

W

5

g

p

r

2

4

d

e

t

4

2

m

q

p

6

4

t

f

C

Relation C

M09_BROO1160_12_SE_C09.indd 427

Relation B

JOIN A and B where A.W = B.X

A.V

A.W

B.X

B.Y

B.Z

r

2

2

m

q

t

4

4

d

e

t

4

4

t

f

23/07/14 8:26 pm

428

Chapter 9  Database Systems

have the same value. This, in fact, is the case represented in Figure9.10, where we demonstrate the result of executing the statement C ← JOIN A and B where A.W = B.X

In this example, a tuple from relation A should be concatenated with a tuple from relation B in exactly those cases where the attributes W and X in the two tuples are equal. Thus the concatenation of the tuple (r, 2) from relation A with the tuple (2,m, q) from relation B appears in the result because the value of attribute W in the first equals the value of attribute X in the second. On the other hand, the result of concatenating the tuple (r, 2) from relation A with the tuple (5, g, p) from relation B does not appear in the final relation because these tuples do not share common values in attributes W and X. As another example, Figure9.11 represents the result of executing the statement C ← JOIN A and B where A.W
Note that the tuples in the result are exactly those in which attribute W in relation A is less than attribute X in relation B. Let us now see how the JOIN operation can be used with the database of Figure9.5 to obtain a listing of all employee identification numbers along with the department in which each employee works. Our first observation is that the information required is distributed over more than one relation, and thus the process of retrieving the information must entail more than SELECTions and PROJECTions. In fact, the tool we need is the statement NEW1 ← JOIN ASSIGNMENT and JOB where ASSIGNMENT.JobId = JOB.JobId

Figure 9.11   Another example of the JOIN operation

Relation A

Y

Z

V

W

1

g

p

r

2

4

d

e

t

4

2

m

q

p

6

5

t

f

C

Relation B

JOIN A and B where A.W
A.V A.W Relation C

M09_BROO1160_12_SE_C09.indd 428

X

B.X

B.Y

B.Z

r

2

4

d

e

r

2

5

t

f

t

4

5

t

f

23/07/14 8:26 pm

9.2  The Relational Model

429

that produces the relation NEW1, as shown in Figure9.12. From this relation, our problem can be solved by first SELECTing those tuples in which ASSIGNMENT. TermDate equals '*' (which indicates “still employed”) and then PROJECTing the attributes ASSIGNMENT.EmplId and JOB.Dept. In short, the information we need can be obtained from the database in Figure9.5 by executing the sequence NEW1 ← where NEW2 ← LIST ←

JOIN ASSIGNMENT and JOB ASSIGNMENT.JobId = JOB.JobId SELECT from NEW1 where ASSIGNMENT.TermDate = '*' PROJECT ASSIGNMENT.EmplId, JOB.Dept from NEW2

SQL Now that we have introduced the basic relational operations, let us reconsider the overall structure of a database system. Remember that a database is actually stored in a mass storage system. To relieve the application programmer from the details of such systems, a database management system is provided that allows the application software to be written in terms of a database model, such as the relational model. The DBMS accepts commands in terms of the model and converts them into actions relative to the actual storage structure. This conversion is handled by a collection of routines within the DBMS that are used by the application software as abstract tools. Thus a DBMS based on the relational model would include routines to perform the SELECT, PROJECT, and JOIN operations, which Figure 9.12   An application of the JOIN operation JOB relation

ASSIGNMENT relation Empl ld

Job Id

Start Date

Term Date

Job ld

Job Title

Skill Code

Dept

23Y34 34Y70 25X15 • • •

S25X F5 S26Z • • •

3-1-1999 10-1-2009 5-1-2010 • • •

4-30-2010 * * • • •

S25X S26Z F5 • • •

Secretary Secretary Floor manager • • •

T5 T6 FM3 • • •

Personnel Accounting Sales • • •

NEW1

JOIN ASSIGNMENT and JOB where ASSIGNMENT. JobId = JOB.Jobld

NEW1 relation ASSIGNMENT ASSIGNMENT ASSIGNMENT Empl ld Job Id StartDate

23Y34 34Y70 25X15 • • •

M09_BROO1160_12_SE_C09.indd 429

S25X F5 S26Z • • •

3-1-1999 10-1-2009 5-1-2010 • • •

ASSIGNMENT TermDate

4-30-2010 * * • • •

JOB Job ld

JOB JobTitle

JOB SkillCode

JOB Dept

S25X F5 S26Z • • •

Secretary Floor manager Secretary • • •

T5 FM3 T6 • • •

Personnel Sales Accounting • • •

23/07/14 8:26 pm

430

Chapter 9  Database Systems

could then be called from the application software. In this manner the application software can be written as though the database were actually stored in the simple tabular form of the relational model. Today’s relational database management systems do not necessarily provide routines to perform the SELECT, PROJECT, and JOIN operations in their raw form. Instead, they provide routines that might be combinations of these basic steps. An example is the language SQL (Structured Query Language), which forms the backbone of most relational database query systems. For example, SQL is the underlying language in the relational database system MySQL (pronounced “My–S–Q–L”) used by many database servers in the Internet. One reason for SQL’s popularity is that the American National Standards Institute has standardized it. Another reason is that it was originally developed and marketed by IBM and has thus benefited from a high level of exposure. In this section we explain how relational database queries are expressed in SQL. Although we are about to find that a query stated in SQL is expressed in an imperative-sounding form, the reality is that it is essentially a declarative statement. You should read an SQL statement as a description of the information desired rather than a sequence of activities to be performed. The significance of this is that SQL relieves application programmers from the burden of developing algorithms for manipulating relations—they need merely to describe the information desired. For our first example of an SQL statement, let us reconsider our last query in which we developed a three-step process for obtaining all employee identification numbers along with their corresponding departments. In SQL this entire query could be represented by the single statement SELECT EmplId, Dept FROM Assignment, Job WHERE Assignment.JobId = Job.JobId AND Assignment.TermDate = '*';

As indicated by this example, each SQL query statement can contain three clauses: a select clause, a from clause, and a where clause. Roughly speaking, such a statement is a request for the result of forming the JOIN of all the relations listed in the from clause, SELECTing those tuples that satisfy the conditions in the where clause, and then PROJECTing those attributes listed in the select clause. (Note that the terminology is somewhat reversed since the select clause in an SQL statement identifies the attributes used in the PROJECT operation.) Let us consider some simple examples. The statement SELECT Name, Address FROM Employee;

produces a listing of all employee names and addresses contained in the relation Employee. Note that this is merely a PROJECT operation. The statement SELECT EmplId, Name, Address, SSNum FROM Employee WHERE Name = 'Cheryl H. Clark';

produces all the information from the tuple associated with Cheryl H. Clark in the Employee relation. This is essentially a SELECT operation.

M09_BROO1160_12_SE_C09.indd 430

23/07/14 8:26 pm

9.2  The Relational Model

431

The statement SELECT Name, Address FROM Employee WHERE Name = 'Cheryl H. Clark';

produces the name and address of Cheryl H. Clark as contained in the Employee relation. This is a combination of SELECT and PROJECT operations. The statement SELECT Employee.Name, Assignment.StartDate FROM Employee, Assignment WHERE Employee.EmplId = Assignment.EmplId;

produces a listing of all employee names and their dates of initial employment. Note that this is the result of JOINing the relations Employee and Assignment and then SELECTing and PROJECTing the appropriate tuples and attributes as identified in the where and select clauses. We close by noting that SQL encompasses statements for defining the structure of relations, creating relations, and modifying the contents of relations as well as performing queries. For example, the following are examples of the INSERT INTO, DELETE FROM, and UPDATE statements. The statement INSERT INTO Employee VALUES ( '42Z12', 'Sue A. Burt', '33 Fair St.', '444661111');

adds a tuple to the Employee relation containing the values given; DELETE FROM Employee WHERE Name = 'G. Jerry Smith';

removes the tuple relating to G. Jerry Smith from the Employee relation; and UPDATE Employee SET Address = '1812 Napoleon Ave.' WHERE Name = 'Joe E. Baker';

changes the address in the tuple associated with Joe E. Baker in the Employee relation.

Questions & Exercises 1. Answer the following questions based on the partial information given in

the EMPLOYEE, JOB, and ASSIGNMENT relations in Figure9.5: a. Who is the secretary in the accounting department with experience in

the personnel department? b. Who is the floor manager in the sales department? c. What job does G. Jerry Smith currently hold? 2. Based on the EMPLOYEE, JOB, and ASSIGNMENT relations presented in

­ igure9.5, write a sequence of relational operations to obtain a list of all F job titles within the personnel department.

M09_BROO1160_12_SE_C09.indd 431

23/07/14 8:26 pm

432

Chapter 9  Database Systems

3. Based on the EMPLOYEE, JOB, and ASSIGNMENT relations presented in

Figure9.5, write a sequence of relational operations to obtain a list of employee names along with the employees’ departments. 4. Convert your answers to questions 2 and 3 into SQL. 5. How does the relational model provide for data independence? 6. How are the different relations in a relational database tied together?

9.3  Object-Oriented Databases Another database model is based on the object-oriented paradigm. This approach leads to an object-oriented database consisting of objects that are linked to each other to reflect their relationships. For example, an object-oriented implementation of the employee database from the previous section could consist of three classes (types of objects): Employee, Job, and Assignment. An object from the Employee class could contain such entries as EmplId, Name, Address, and SSNum; an object from the class Job could contain such entries as JobId, JobTitle, SkillCode, and Dept; and each object from the class Assignment could contain entries such as StartDate and TermDate. A conceptual representation of such a database is shown in Figure9.13 where the links between the various objects are represented by lines connecting the related objects. If we focus on an object of type Employee, we find it linked to a collection of objects of type Assignment representing the various assignments that that particular employee has held. In turn, each of these objects of type Assignment is linked to an object of type Job representing the job associated Figure 9.13   The associations between objects in an object-oriented database

Assignment Job

Employee Assignment Assignment

Job

Job

M09_BROO1160_12_SE_C09.indd 432

23/07/14 8:26 pm

9.3  Object-Oriented Databases

433

with that assignment. Thus all the assignments of an employee can be found by following the links from the object representing that employee. Similarly, all the employees who have held a particular job can be found by following the links from the object representing that job. The links between objects in an object-oriented database are normally maintained by the DBMS, so the details of how these links are implemented are not a concern of the programmer writing application software. Instead, when a new object is added to the database, the application software merely specifies the other objects to which it should be linked. The DBMS then creates any linkage system that might be required to record these associations. In particular, a DBMS might link the objects representing the assignments of a given employee in a manner similar to a linked list. Another task of an object-oriented DBMS is to provide permanent storage for the objects entrusted to it—a requirement that might seem obvious but is inherently distinct from the manner in which objects are normally treated. Normally, when an object-oriented program is executed, the objects created during the program’s execution are discarded when the program terminates. In this sense the objects are considered transient. But objects that are created and added to a database must be saved after the program that created them terminates. Such objects are said to be persistent. Thus creating persistent objects is a significant departure from the norm. Proponents of object-oriented databases offer numerous arguments to show why the object-oriented approach to database design is better than the relational approach. One is that the object-oriented approach allows the entire software system (application software, DBMS, and the database itself ) to be designed in the same paradigm. This is in contrast to the historically common practice of using an imperative programming language to develop application software for interrogating a relational database. Inherent in such a task is the clash between imperative and relational paradigms. This distinction is subtle at our level of study but the difference has been the source of many software errors over the years. Even at our level, we can appreciate that an object-oriented database combined with an objected-oriented application program produces a homogeneous image of objects communicating with each other throughout the system. On the other hand, a relational database combined with an imperative application program conjures an image of two inherently different organizations trying to find a common interface. To appreciate another advantage that object-oriented databases have over their relational counterparts, consider the problem of storing employee names in a relational database. If an entire name is stored as a single attribute in a relation, then inquiries regarding only surnames are awkward. However, if the name is stored as individual attributes, such as first name, middle name, and surname, then the number of attributes becomes problematic because not all names conform to a specific structure—even when the population is restricted to a single culture. In an object-oriented database, these issues can be hidden within the object that holds the employee’s name. An employee’s name can be stored as an intelligent object that is capable of reporting the related employee’s name in a variety of formats. Thus, from outside these objects, it would be just as easy to deal with only surnames as with entire names, maiden names, or nicknames. The details involved with each perspective would be encapsulated within the objects. This ability to encapsulate the technicalities of different data formats is advantageous in other cases as well. In a relational database, the attributes in a relation

M09_BROO1160_12_SE_C09.indd 433

23/07/14 8:26 pm

434

Chapter 9  Database Systems

are part of the overall design of the database, and thus the types associated with these attributes permeate the entire DBMS. (Variables for temporary storage must be declared to be the appropriate type, and functions for manipulating data of the various types must be designed.) Thus, extending a relational database to include attributes of new types (audio and video) can be problematic. In particular, a variety of functions throughout the database design might need to be expanded to incorporate these new data types. In an object-oriented design, however, the same functions used to retrieve an object representing an employee’s name can be used to retrieve an object representing a motion picture because the distinctions in type can be hidden within the objects involved. Thus the object-oriented approach appears to be more compatible with the construction of multimedia databases—a feature that is already proving to be a great advantage. Still another advantage the object-oriented paradigm offers to database design is the potential for storing intelligent objects rather than merely data. That is, an object can contain methods describing how it should respond to messages regarding its contents and relationships. For example, each object of the class Employee in Figure9.13 could contain methods for reporting and updating the information in the object as well as a method for reporting that employee’s job history and perhaps a method for changing that employee’s job assignment. Likewise, each object from the Job class could have a method for reporting the specifics of the job and perhaps a method for reporting those employees who have held that particular job. Thus to retrieve an employee’s job history, we would not need to construct an elaborate function. Instead, we could merely ask the appropriate employee object to report its job history. This ability to construct databases whose components respond intelligently to inquiries offers an exciting array of possibilities beyond those of more traditional relational databases.

Questions & Exercises 1. What methods would be contained in an instance of an object from the Assignment class in the employee database discussed in this section?

2. What is a persistent object? 3. Identify some classes, as well as some of their internal characteristics,

that can be used in an object-oriented database dealing with a warehouse inventory. 4. Identify an advantage that an object-oriented database can have over a

relational database.

9.4  Maintaining Database Integrity Inexpensive database management systems for personal use are relatively simple systems. They tend to have a single objective—to shield the user from the technical details of the database implementation. The databases maintained by these systems are relatively small and generally contain information whose loss or

M09_BROO1160_12_SE_C09.indd 434

23/07/14 8:26 pm

9.4  Maintaining Database Integrity

435

corruption would be inconvenient rather than disastrous. When a problem does arise, the user can usually correct the erroneous items directly or reload the database from a backup copy and manually make the modifications required to bring that copy up to date. This process might be inconvenient, but the cost of avoiding the inconvenience tends to be greater than the inconvenience itself. In any case, the inconvenience is restricted to only a few people, and any financial loss is generally limited. In the case of large, multiuser, commercial database systems, however, the stakes are much higher. The cost of incorrect or lost data can be enormous and can have devastating consequences. In these environments, a major role of the DBMS is to maintain the database’s integrity by guarding against problems such as operations that for some reason are only partially completed or different operations that might interact inadvertently to cause inaccurate information in the database. It is this role of a DBMS that we address in this section.

The Commit/Rollback Protocol A single transaction, such as the transfer of funds from one bank account to another, the cancellation of an airline reservation, or the registration of a student in a university course, might involve multiple steps at the database level. For example, a transfer of funds between bank accounts requires that the balance in one account be decremented and the balance in the other be incremented. Between such steps the information in the database might be inconsistent. Indeed, funds are missing during the brief period after the first account has been decremented but before the other has been incremented. Likewise, when reassigning a passenger’s seat on a flight, there might be an instant when the passenger has no seat or an instant when the passenger list appears to be one passenger greater than it actually is. In the case of large databases that are subject to heavy transaction loads, it is highly likely that a random snapshot will find the database in the middle of some transaction. A request for the execution of a transaction or an equipment malfunction will therefore likely occur at a time when the database is in an inconsistent state. Let us first consider the problem of a malfunction. The goal of the DBMS is to ensure that such a problem will not freeze the database in an inconsistent state. This is often accomplished by maintaining a log containing a record of each transaction’s activities in a nonvolatile storage system, such as a magnetic disk. Before a transaction is allowed to alter the database, the alteration to be performed is first recorded in the log. Thus the log contains a permanent record of each transaction’s actions. The point at which all the steps in a transaction have been recorded in the log is called the commit point. It is at this point that the DBMS has the information it needs to reconstruct the transaction on its own if that should become necessary. At this point the DBMS becomes committed to the transaction in the sense that it accepts the responsibility of guaranteeing that the transaction’s activities will be reflected in the database. In the case of an equipment malfunction, the DBMS can use the information in its log to reconstruct the transactions that have been completed (committed) since the last backup was made. If problems should arise before a transaction has reached its commit point, the DBMS might find itself with a partially executed transaction that cannot be

M09_BROO1160_12_SE_C09.indd 435

23/07/14 8:26 pm

436

Chapter 9  Database Systems

completed. In this case the log can be used to roll back (undo) the activities actually performed by the transaction. In the case of a malfunction, for instance, the DBMS could recover by rolling back those transactions that were incomplete (noncommitted) at the time of the malfunction. Rollbacks of transactions are not restricted, however, to the process of recovering from equipment malfunctions. They are often a part of a DBMS’s normal operation. For example, a transaction might be terminated before it has completed all its steps because of an attempt to access privileged information, or it might be involved in a deadlock in which competing transactions find themselves waiting for data being used by each other. In these cases, the DBMS can use the log to roll back a transaction and thus avoid an erroneous database due to incomplete transactions. To emphasize the delicate nature of DBMS design, we should note that there are subtle problems lurking within the rollback process. The rolling back of one transaction might affect database entries that have been used by other transactions. For example, the transaction being rolled back might have updated an account balance, and another transaction might have already based its activities on this updated value. This might mean that these additional transactions must also be rolled back, which might adversely affect still other transactions. The result is the problem known as cascading rollback.

Locking We now consider the problem of a transaction being executed while the database is in a state of flux from another transaction, a situation that can lead to inadvertent interaction between the transactions and produce erroneous results. For instance, the problem known as the incorrect summary problem can arise if one transaction is in the middle of transferring funds from one account to another when another transaction tries to compute the total deposits in the bank. This could result in a total that is either too large or too small depending on the order in which the transfer steps are performed. Another possibility is known as the lost update problem, which is exemplified by two transactions, each of which makes a deduction from the same account. If one transaction reads the account’s current balance at the point when the other has just read the balance but has not yet calculated the new balance, then both transactions will base their deductions on the same initial balance. In turn, the effect of one of the deductions will not be reflected in the database. To solve such problems, a DBMS could force transactions to execute in their entirety on a one-at-a-time basis by holding each new transaction in a queue until those preceding it have completed. But a transaction often spends a lot of time waiting for mass storage operations to be performed. By interweaving the execution of transactions, the time during which one transaction is waiting can be used by another transaction to process data it has already retrieved. Most large database management systems therefore contain a scheduler to coordinate time-sharing among transactions in much the same way that a multiprogramming operating system coordinates interweaving of processes (Section3.3). To guard against such anomalies as the incorrect summary problem and the lost update problem, these schedulers incorporate a locking protocol in which the items within a database that are currently being used by some transaction

M09_BROO1160_12_SE_C09.indd 436

23/07/14 8:26 pm

9.4  Maintaining Database Integrity

437

are marked as such. These marks are called locks; marked items are said to be locked. Two types of locks are common—shared locks and exclusive locks. They correspond to the two types of access to data that a transaction might require—shared access and exclusive access. If a transaction is not going to alter a data item, then it requires shared access, meaning that other transactions are also allowed to view the data. However, if the transaction is going to alter the item, it must have exclusive access, meaning that it must be the only transaction with access to that data. In a locking protocol, each time a transaction requests access to a data item, it must also tell the DBMS the type of access it requires. If a transaction requests shared access to an item that is either unlocked or locked with a shared lock, that access is granted and the item is marked with a shared lock. If, however, the requested item is already marked with an exclusive lock, the additional access is denied. If a transaction requests exclusive access to an item, that request is granted only if the item has no lock associated with it. In this manner, a transaction that is going to alter data protects that data from other transactions by obtaining exclusive access, whereas several transactions can share access to an item if none of them are going to change it. Of course, once a transaction is finished with an item, it notifies the DBMS, and the associated lock is removed. Various algorithms are used to handle the case in which a transaction’s access request is rejected. One algorithm is that the transaction is merely forced to wait until the requested item becomes available. This approach, however, can lead to deadlock, since two transactions that require exclusive access to the same two data items could block each other’s progress if each obtains exclusive access to one of the items and then insists on waiting for the other. To avoid such deadlocks, some database management systems give priority to older transactions. That is, if an older transaction requires access to an item that is locked by a younger transaction, the younger transaction is forced to release all of its data items, and its activities are rolled back (based on the log). Then, the older transaction is given access to the item it required, and the younger transaction is forced to start again. If a younger transaction is repeatedly preempted, it will grow older in the process and ultimately become one of the older transactions with high priority. This protocol, known as the wound-wait protocol (old transactions wound young transactions, young transactions wait for old ones), ensures that every transaction will ultimately be allowed to complete its task.

Questions & Exercises 1. What is the difference between a transaction that has reached its commit

point and one that has not? 2. How could a DBMS guard against extensive cascading rollback? 3. Show how the uncontrolled interweaving of two transactions, one deduct-

ing $100 from an account and the other deducting $200 from the same account, could produce final balances of $100, $200, and $300, assuming that the initial balance is $400.

M09_BROO1160_12_SE_C09.indd 437

23/07/14 8:26 pm

438

Chapter 9  Database Systems

4. a. Summarize the possible results of a transaction requesting shared

access to an item in a database. b. Summarize the possible results of a transaction requesting exclusive

access to an item in a database. 5. Describe a sequence of events that would lead to deadlock among transac-

tions performing operations on a database system. 6. Describe how the deadlock in your answer to question 5 could be broken.

Would your solution require use of the database management system’s log? Explain your answer.

9.5  Traditional File Structures In this section we digress from our study of mutidimensional database systems to consider traditional file structures. These structures represent the historical beginning of data storage and retrieval systems from which current database technology has evolved. Many of the techniques developed for these structures (such as indexing and hashing) are important tools in the construction of today’s massive, complex databases.

Sequential Files A sequential file is a file that is accessed in a serial manner from its beginning to its end as though the information in the file were arranged in one long row. Examples include audio files, video files, files containing programs, and files containing textual documents. In fact, most of the files created by a typical personal computer user are sequential files. For instance, when a spreadsheet is saved, its information is encoded and stored as a sequential file from which the spreadsheet application software can reconstruct the spreadsheet. Text files, which are sequential files in which each logical record is a single symbol encoded using ASCII or Unicode, often serve as a basic tool for constructing more elaborate sequential files such as an employee records file. One only needs to establish a uniform format for representing the information about each employee as a string of text, encode the information according to that format, and then record the resulting employee records one after another as one single string of text. For example, one could construct a simple employee file by agreeing to enter each employee record as a string of 31 characters, consisting of a field of 25 characters containing the employee’s name (filled with enough blanks to complete the 25-character field), followed by a field of 6 characters representing the employee’s identification number. The final file would be a long string of encoded characters in which each 31-character block represents the information about a single employee (Figure9.14). Information would be retrieved from the file in terms of logical records consisting of 31-character blocks. Within each of these blocks, individual fields would be identified according to the uniform format with which the blocks were constructed.

M09_BROO1160_12_SE_C09.indd 438

23/07/14 8:26 pm

439

9.5  Traditional File Structures

Figure 9.14   The structure of a simple employee file implemented as a text file File consists of a sequence of blocks each containing 31 characters. File

Each block consists of a 25 character field containing an employee’s name followed by a six character field containing the employee’s identification number. Logical record

K

I M B E R L Y

A N N

D A W S O N

Employee’s name

3

8

5

1

7

2

Employee’s identification number

The data in a sequential file must be recorded in mass storage in such a way that the sequential nature of the file is preserved. If the mass storage system is itself sequential (as in the case of a magnetic tape or CD), this is a straightforward undertaking. We need merely record the file on the storage medium according to the sequential properties of the medium. Then processing the file is the task of merely reading and processing the file’s contents in the order in which they are found. This is exactly the process followed in playing audio CDs, where the music is stored as a sequential file sector by sector along one continuous spiraling track. In the case of magnetic disk storage, however, the file would be scattered over different sectors that could be retrieved in a variety of orders. To preserve the proper order, most operating systems (more precisely, the file manager) maintain a list of the sectors on which the file is stored. This list is recorded as part of the disk’s directory system on the same disk as the file. By means of this list, the operating system can retrieve the sectors in the proper sequence as though the file were stored sequentially, even though the file is actually distributed over various portions of the disk. Inherent in processing a sequential file is the need to detect when the end of the file is reached. Generically, we refer to the end of a sequential file as the end-of-file (EOF). There are a variety of ways of identifying the EOF. One is to place a special record, called a sentinel, at the end of the file. Another is to use the information in the operating system’s directory system to identify a file’s EOF. That is, since the operating system knows which sectors contain the file, it also knows where the file terminates. A classic example involving sequential files is payroll processing in a small company. Here we imagine a sequential file consisting of a series of logical records, each of which contains the information about an employee’s pay (name, employee identification number, pay scale, and so on) from which checks must be printed on a routine basis. As each employee record is

M09_BROO1160_12_SE_C09.indd 439

23/07/14 8:26 pm

440

Chapter 9  Database Systems

retrieved, that employee’s pay is calculated, and the appropriate check produced. The activity of processing such a sequential file is exemplified by the statement while (the EOF has not been reached): retrieve the next record from the file and process it

When the logical records within a sequential file are identified by key field values, the file is usually arranged so that the records appear in the order determined by the keys (perhaps alphabetical or numerical). Such an arrangement simplifies the task of processing the information in the file. For example, suppose that processing payroll requires that each employee record be updated to reflect the information on that employee’s time sheet. If both the file containing the time sheet records and the file containing the employee records are in the same order according to the same keys, then this updating process can be handled by accessing both files sequentially—using the time sheet retrieved from one file to update the corresponding record from the other file. This is a significant improvement over the repeated searching process that would be required if the files were not in corresponding order. Thus updating classic sequential files is typically handled in multiple steps. First, the new information (such as the collection of time sheets) is recorded in a sequential file known as a transaction file, and this transaction file is sorted to match the order of the file to be updated, which is called the master file. Then, the records in the master file are updated by retrieving the records from both files sequentially. A slight variation of this updating process is the process of merging two sequential files to form a new file containing the records from the two originals. The records in the input files are assumed to be arranged in ascending order according to a common key field, and it is also assumed that the files are to be merged in a manner that produces an output file whose keys are also in ascending order. The classic merge algorithm is summarized in Figure9.15. The underlying theme is to build the output file as the two input files are scanned sequentially (Figure9.16). Figure 9.15   A function for merging two sequential files def MergeFiles (InputFileA, InputFileB, OutputFile): if (both input files at EOF): Stop, with OutputFile empty. if (InputFileA not at EOF): Declare its first record to be its current record. if (InputFileB not at EOF): Declare its first record to be its current record. while (neither input file at EOF): Put the current record with the "smaller" key field value in OutputFile. if (that current record is the last record in its corresponding input file): Declare that input file to be at EOF. else: Declare the next record in that input file to be the file’s current record. Starting with the current record in the input file that is not at EOF, copy the remaining records to OutputFile.

M09_BROO1160_12_SE_C09.indd 440

23/07/14 8:26 pm

9.5  Traditional File Structures

441

Figure 9.16   Applying the merge algorithm. (Letters are used to represent entire records. The particular letter indicates the value of the record’s key field) Output file

Input files B

D

A

C

B

D

A

C

B

D

A

C

B

D

A

C

B

D

A

C

B

D

A

C

A

A

A

A

A

A

B

B

C

B

C

D

B

C

D

E

E

F

E

F

E

F

E

F

E

F

E

F

B

C

D

E

F

Indexed Files Sequential files are ideal for storing data that will be processed in the order in which the file’s entries are stored. However, such files are inefficient when records within the file must be retrieved in an unpredictable order. In such situations what is needed is a way to identify the location of the desired logical record quickly. A popular solution is to use an index for the file in much the same way that an index in a book is used to locate topics within the book. Such a file system is called an indexed file. An index for a file contains a list of the keys stored in the file along with entries indicating where the record containing each key is stored. Thus to find a particular record, one finds the identifying key in the index and then retrieves the block of information stored at the location associated with that key.

M09_BROO1160_12_SE_C09.indd 441

23/07/14 8:26 pm

442

Chapter 9  Database Systems

A file’s index is normally stored as a separate file on the same mass storage device as the indexed file. The index is usually transferred to main memory before file processing begins so that it is easily accessible when access to records in the file is required (Figure9.17). A classic example of an indexed file occurs in the context of maintaining employee records. Here an index can be used to avoid lengthy searches when you are retrieving an individual record. In particular, if the file of employee records is indexed by employee identification numbers, then an employee’s record can be retrieved quickly when the employee’s identification number is known. Another example is found on audio CDs where an index is used to allow relatively quick access to individual recordings. Over the years numerous variations of the basic index concept have been used. One variation constructs an index in a hierarchical manner so that the index takes on a layered or tree structure. A prominent example is the hierarchical directory system used by most operating systems for organizing file storage. In such a case, the directories, or folders, play the role of indexes, each containing links to its subindexes. From this perspective, the entire file system is merely one large indexed file.

Hash Files Although indexing provides relatively quick access to entries within a data storage structure, it does so at the expense of index maintenance. Hashing is a technique that provides similar access without such overhead. As in the case of an indexed system, hashing allows a record to be located by means of a key value. But, rather than looking up the key in an index, hashing identifies the location of the record directly from the key. A hash system can be summarized as follows: The data storage space is divided into several sections, called buckets, each of which is capable of holding several records. The records are dispersed among the buckets according to an algorithm that converts key values into bucket numbers. (This conversion from key values to bucket numbers is called a hash function.) Each record is stored in the bucket identified by this process. Therefore, a record that has been placed in the storage structure can be retrieved by first applying the hash function to the Figure 9.17   Opening an indexed file

Main memory

Index is transferred to main memory when the indexed file is opened

Mass storage

Index

Indexed file

Index is stored in mass storage as a separate file

M09_BROO1160_12_SE_C09.indd 442

23/07/14 8:26 pm

9.5  Traditional File Structures

443

Authentication via Hashing Hashing is much more than a means of constructing efficient data storage systems. For example, hashing can be used as a means of authenticating messages transferred over the Internet. The underlying theme is to hash the message in a secret way. This value is then transferred with the message. To authenticate the message, the receiver hashes the message received (in the same secret way) and confirms that the value produced agrees with the original value. (The odds of an altered message hashing to the same value are assumed to be very small.) If the value obtained does not agree with the original value, the message is exposed as being corrupted. Those who are interested might wish to search the Internet for information about MD5, which is a hash function used extensively in authentication applications. It is enlightening to consider error detection techniques as an application of hashing for authentication. For example, the use of parity bits is essentially a hashing system in which a bit pattern is hashed to produce either a 0 or a 1. This value is then transferred along with the original pattern. If the pattern ultimately received does not hash to that same value, the pattern is considered corrupted.

record’s identifying key to determine the appropriate bucket, then retrieving the contents of that bucket, and finally searching through the data retrieved for the desired record. Hashing is not only used as a means of retrieving data from mass storage but also as a means of retrieving items from large blocks of data stored in main memory. When hashing is applied to a storage structure in mass storage, the result is called a hash file. When applied to a storage structure within main memory, the result is usually called a hash table. Let us apply the hashing technique to the classic employee file in which each record contains information about a single employee in a company. First, we establish several available areas of mass storage that will play the role of buckets. The number of buckets and the size of each bucket are design decisions that we will consider later. For now, let us assume that we have created 41 buckets, which we refer to as bucket number 0, bucket number 1, through bucket number 40. (The reason we selected 41 buckets rather than an even 40 will be explained shortly.) Let us assume that an employee’s identification number will be used as the key for identifying the employee’s record. Our next task, then, is to develop a hash function for converting these keys into bucket numbers. Although the employee identification “numbers” might have the form 25X3Z or J2X35 and are therefore not numeric, they are stored as bit patterns, and we can interpret the bit patterns as numbers. Using this numeric interpretation, we can divide any key by the number of buckets available and record the remainder, which in our case will be an integer in the range from 0 to 40. Thus we can use the remainder of this division process to identify one of the 41 buckets (Figure9.18). Using this as our hash function, we proceed to construct the file by considering each record individually, applying our divide-by-41 hash function to its key to obtain a bucket number, and then storing the record in that bucket (Figure9.19). Later, if we need to retrieve a record, we need merely apply our hash function to the record’s key to identify the appropriate bucket and then search that bucket for the record in question.

M09_BROO1160_12_SE_C09.indd 443

23/07/14 8:26 pm

444

Chapter 9  Database Systems

Figure 9.18   Hashing the key field value 25X3Z to one of 41 buckets 25X3Z

Key field value:

ASCII representation:

0011001000110101010110000011001101011010

Equivalent base 10 value:

215,643,337,562

Remainder after division by 41:

3

Bucket number:

3

At this point let us reconsider our decision to divide the storage area into 41 buckets. First, note that to obtain an efficient hash system, the records being stored should be distributed evenly among the buckets. If a disproportionate number of keys happen to hash to the same bucket (a phenomenon called clustering), then a disproportionate number of records will be stored in a single bucket. In turn, retrieving a record from that bucket could require a time-consuming search, causing the loss of any benefits gained by hashing. Now observe that if we had chosen to divide the storage area into 40 buckets rather than 41, our hash function would have involved dividing the keys by the value 40 rather than 41. But, if a dividend and a divisor both have a common Figure 9.19   The rudiments of a hashing system 1 41 55 41 14

2 41 96 82 14

0 41 14 0 14

Remainders When divided by 41, the key field values of 14, 55, and 96 each produce a remainder of 14. Thus these records are stored in bucket 14.

95 136 #13

M09_BROO1160_12_SE_C09.indd 444

96 14 55 #14

343 #15

Buckets in mass storage

#16

23/07/14 8:26 pm

9.5  Traditional File Structures

445

factor, that factor will be present in the remainder as well. In particular, if the keys to the entries stored in our hash file happened to be multiples of 5 (which is also a divisor of 40), then the factor of 5 would appear in the remainders when divided by 40, and the entries would cluster in those buckets associated with the remainders 0, 5, 10, 15, 20, 25, 30, and 35. Similar situations would occur in the case of keys that are multiples of 2, 4, 8, 10, and 20, because they are all also factors of 40. Consequently, we choose to divide the storage area into 41 buckets because the choice of 41, being a prime number, eliminated the possibility of common factors and therefore reduced the chance of clustering. Unfortunately, the possibility of clustering can never be completely eliminated. Even with a well-designed hash function, it is highly likely that two keys will hash to the same value, a phenomenon called a collision, early in the file construction process. To understand why, consider the following scenario. Suppose that we have found a hash function that arbitrarily distributes records among 41 buckets, that our storage system is empty, and that we are going to insert new records one at a time. When we insert the first record, it will be placed in an empty bucket. However, when we insert the next record, only 40 of the 41 buckets are still empty, so the probability that the second record will be placed in an empty bucket is only 40/41. Assuming that the second record is placed in an empty bucket, the third record finds only 39 empty buckets, and thus the probability of it being placed in one of them is 39/41. Continuing this process, we find that if the first seven records are placed in empty buckets, the eighth record has only a 34/41 probability of being placed in one of the remaining empty buckets. This analysis allows us to compute the probability that all the first eight records will be placed in empty buckets—it is the product of the probabilities of each record being placed in an empty bucket, assuming that the preceding entries were so placed. This probability is (41/41)(40/41)(39/41)(38/41) . . . (34/41) = .482

The point is that the result is less than one-half. That is, it is more likely than not that in distributing records among 41 buckets a collision will have occurred by the time the eighth record is stored. The high probability of collisions indicates that, regardless of how well-chosen a hash function might be, any hash system must be designed with clustering in mind. In particular, it is possible that a bucket might fill up and overflow. One approach to this problem would be to allow the buckets to expand in size. Another approach is to allow buckets to spill into an overflow area that has been reserved for that purpose. In any case the occurrence of clustering and overflowing buckets can significantly degrade the performance of a hash file. Research has shown that, as a general rule, hash files perform well as long as the ratio of the number of records to the total record capacity of the file (a ratio known as the load factor) remains below 50 percent. However, if the load factor begins to creep above 75 percent, the system’s performance generally degrades (clustering raises its ugly head, causing some buckets to fill and possibly overflow). For this reason, a hash storage system is usually reconstructed with a larger capacity if its load factor approaches the 75 percent value. We conclude that the efficiency of record retrieval obtained by implementing a hash system is not gained without cost.

M09_BROO1160_12_SE_C09.indd 445

23/07/14 8:26 pm

446

Chapter 9  Database Systems

Questions & Exercises 1. Follow the merge algorithm presented in Figure9.15, assuming that one

input file contains records with key field values equal to B and E while the other contains A, C, D, and F. 2. The merge algorithm is the heart of a popular sort algorithm called the

merge sort. Can you discover this algorithm? (Hint: Any nonempty file can be considered to be a collection of one-entry files.) 3. Is being sequential a physical or conceptual property of a file? 4. What are the steps required when retrieving a record from an indexed

file? 5. Explain how a poorly chosen hash function can result in a hash storage

system becoming little more than a sequential file. 6. Suppose a hash storage system is constructed using the division hash

function as presented in the text but with six storage buckets. For each of the following key values, identify the bucket in which the record with that key is placed. What goes wrong and why? a.  24 b.  30 c.  3 d.  18 e.  15 f.  21 g.  9 h.  39   i.  27 j.  0 7. How many people must be gathered together before the odds are that two

members of the group will have birthdays on the same day of the year? How does this problem relate to the material in this section?

9.6  Data Mining A rapidly expanding subject that is closely associated with database technology is data mining, which consists of techniques for discovering patterns in collections of data. Data mining has become an important tool in numerous areas including marketing, inventory management, quality control, loan risk management, fraud detection, and investment analysis. Data mining techniques even have applications in what might seem unlikely settings as exemplified by their use in identifying the functions of particular genes encoded in DNA molecules and characterizing properties of organisms. Data mining activities differ from traditional database interrogation in that data mining seeks to identify previously unknown patterns as opposed to traditional database inquiries that merely ask for the retrieval of stored facts. Moreover, data mining is practiced on static data collections, called data warehouses, rather than “online” operational databases that are subject to frequent updates. These warehouses are often “snapshots” of databases or collections of databases. They are used in lieu of the actual operational databases because finding patterns in a static system is easier than in a dynamic one. We should also note that the subject of data mining is not restricted to the domain of computing but has tentacles that extend far into statistics. In fact, many

M09_BROO1160_12_SE_C09.indd 446

23/07/14 8:26 pm

9.6  Data Mining

447

would argue that since data mining had its origins in attempts to perform statistical analysis on large, diverse data collections, it is an application of statistics rather than a field of computer science. Two common forms of data mining are class description and class ­discrimination. Class description deals with identifying properties that characterize a given group of data items, whereas class discrimination deals with identifying properties that divide two groups. For example, class description techniques would be used to identify characteristics of people who buy small economical vehicles, whereas class discrimination techniques would be used to find properties that distinguish customers who shop for used cars from those who shop for new ones. Another form of data mining is cluster analysis, which seeks to discover classes. Note that this differs from class description, which seeks to discover properties of members within classes that are already identified. More precisely, cluster analysis tries to find properties of data items that lead to the discovery of groupings. For example, in analyzing information about people’s ages who have viewed a particular motion picture, cluster analysis might find that the customer base breaks down into two age groups—a 4-to-0 age group and a 25-to-40 age group. (Perhaps the motion picture attracted children and their parents?) Still another form of data mining is association analysis, which involves looking for links between data groups. It is association analysis that might reveal that customers who buy potato chips also buy beer and soda or that people who shop during the traditional weekday work hours also draw retirement benefits. Outlier analysis is another form of data mining. It tries to identify data entries that do not comply with the norm. Outlier analysis can be used to identify errors in data collections, to identify credit card theft by detecting sudden deviations from a customer’s normal purchase patterns, and perhaps to identify potential terrorists by recognizing unusual behavior. Finally, the form of data mining called sequential pattern analysis tries to identify patterns of behavior over time. For example, sequential pattern analysis might reveal trends in economic systems such as equity markets or in environmental systems such as climate conditions. As indicated by our last example, results from data mining can be used to predict future behavior. If an entity possesses the properties that characterize a class, then the entity will probably behave like members of that class. However, many data mining projects are aimed at merely gaining a better understanding

Bioinformatics Advances in database technology and data mining techniques are expanding the repertoire of tools available to biologists in research areas involving the identification of patterns and the classification of organic compounds. The result is a new field within biology called bioinformatics. Having originated in endeavors to decode DNA, bioinformatics now encompasses such tasks as cataloguing proteins and understanding sequences of protein interactions (called biochemical pathways). Although normally considered to be a part of biology, bioinformatics is an example of how computer science is influencing and even becoming ingrained in other fields.

M09_BROO1160_12_SE_C09.indd 447

23/07/14 8:26 pm

448

Chapter 9  Database Systems

of the data, as witnessed by the use of data mining in unraveling the mysteries of DNA. In any case, the scope of data mining applications is potentially enormous, and thus data mining promises to be an active area of research for years to come. Note that database technology and data mining are close cousins, and thus research in one will have repercussions in the other. Database techniques are used extensively to give data warehouses the capability of presenting data in the form of data cubes (data viewed from multiple perspectives—the term cube is used to conjecture the image of multiple dimensions) that make data mining possible. In turn, as researchers in data mining improve techniques for implementing data cubes, these results will pay dividends in the field of database design. In closing, we should recognize that successful data mining encompasses much more than the identification of patterns within a collection of data. Intelligent judgment must be applied to determine whether those patterns are significant or merely coincidences. The fact that a particular convenience store has sold a high number of winning lottery tickets should probably not be considered significant to someone planning to buy a lottery ticket, but the discovery that customers who buy snack food also tend to buy frozen dinners might constitute meaningful information to a grocery store manager. Likewise, data mining encompasses a vast number of ethical issues involving the rights of individuals represented in the data warehouse, the accuracy and use of the conclusions drawn, and even the appropriateness of data mining in the first place.

Questions & Exercises 1. Why is data mining not conducted on “online” databases? 2. Give an additional example of a pattern that might be found by each of

the types of data mining identified in the text. 3. Identify some different perspectives that a data cube might allow when

mining sales data. 4. How does data mining differ from traditional database inquiries?

9.7  Social Impact of Database Technology With the development of database technology, information that was once buried in arcane records has become accessible. In many cases, automated library systems place a patron’s reading habits within easy reach, retailers maintain records of their customers’ purchases, and Internet search engines keep records of their clients’ requests. In turn this information is potentially available to marketing firms, law enforcement agencies, political parties, employers, and private individuals. This is representative of the potential problems that permeate the entire spectrum of database applications. Technology has made it easy to collect enormous amounts of data and to merge or compare different data collections to obtain

M09_BROO1160_12_SE_C09.indd 448

23/07/14 8:26 pm

9.7  Social Impact of Database Technology

449

relationships that would otherwise remain buried in the heap. The ramifications, both positive and negative, are enormous. These ramifications are not merely subjects for academic debate—they are realities. In some cases the data collection process is readily apparent; in others it is subtle. Examples of the first case occur when one is explicitly asked to provide information. This may be done in a voluntary manner, as in surveys or contest registration forms, or it may be done in an involuntary manner, such as when imposed by government regulations. Sometimes whether it is voluntary depends on one’s point of view. Is providing personal information when applying for a loan voluntary or involuntary? The distinction depends on whether receiving the loan is a convenience or a necessity. To use a credit card at some retailers now requires that you allow your signature to be recorded in a digitized format. Again, providing the information is either voluntary or involuntary depending on your situation. More subtle cases of data collection avoid direct communication with the subject. Examples include a credit company that records the purchasing practices of the holders of its credit cards, websites that record the identities of those who visit the site, and social activists who record the license plate numbers on the cars parked in a targeted institution’s parking lot. In these cases the subject of the data collection might not be aware that information is being collected and less likely to be aware of the existence of the databases being constructed. Sometimes the underlying data-collection activities are self-evident if one merely stops to think. For example, a grocery store might offer discounts to its regular customers who register in advance with the store. The registration process might involve the issuance of identification cards that must be presented at the time of purchase to obtain the discount. The result is that the store is able to compile a record of the customers’ purchases—a record whose value far exceeds the value of the discounts awarded. Of course, the force driving this boom in data collection is the value of the data, which is amplified by advances in database technology that allow data to be linked in ways that reveal information that would otherwise remain obscure. For example, the purchasing patterns of credit card holders can be classified and cross-listed to obtain customer profiles of immense marketing value. Subscription forms for body-building magazines can be mailed to those who have recently purchased exercise equipment, whereas subscription forms for dog obedience magazines can be targeted toward those who have recently purchased dog food. Alternative ways of combining information are sometimes very imaginative. Welfare records have been compared to criminal records to find and apprehend parole violators, and in 1984 the Selective Service in the United States used old birthday registration lists from a popular ice cream retailer to identify citizens who had failed to register for the military draft. There are several approaches to protecting society from abusive use of databases. One is to apply legal remedies. Unfortunately, passing a law against an action does not stop the action from occurring but merely makes the action illegal. A prime example in the United States is the Privacy Act of 1974 whose purpose was to protect citizens from abusive use of government databases. One provision of this act required government agencies to publish notice of their databases in the Federal Register to allow citizens to access and correct their personal information. However, government agencies were slow to comply with

M09_BROO1160_12_SE_C09.indd 449

23/07/14 8:26 pm

450

Chapter 9  Database Systems

this provision. This does not necessarily imply malicious intent. In many cases the problem was one of bureaucracy. But, the fact that a bureaucracy might be constructing personnel databases that it is unable to identify is not reassuring. Another, and perhaps more powerful, approach to controlling database abuse is public opinion. Databases will not be abused if the penalties outweigh the benefits; and the penalty businesses fear the most is adverse public opinion—this goes right to the bottom line. In the early 1990s it was public opinion that ultimately stopped major credit bureaus from selling mailing lists for marketing purposes. More recently, Google discontinued its Google Buzz social networking tool in 2011 after its automatic sharing of contact information from the popular Gmail tool was greeted with harsh public criticism. Even government agencies have bowed to public opinion. In 1997 the Social Security Administration in the United States modified its plan to make Social Security records available via the Internet when public opinion questioned the security of the information. In some of these cases results were obtained in days—a stark contrast to the extended time periods associated with legal processes. Of course, in many cases database applications are beneficial to both the holder and the subject of the data, but in all cases there is a loss of privacy that should not be taken lightly. Such privacy issues are serious when the information is accurate, but they become gigantic when the information is erroneous. Imagine the feeling of hopelessness if you realized that your credit rating was adversely affected by erroneous information. Imagine how your problems would be amplified in an environment in which this misinformation was readily shared with other institutions. Privacy problems are, and will be, a major side effect of advancing technology in general and database techniques in particular. The solutions to these problems will require an educated, alert, and active citizenry.

Questions & Exercises 1. Should law enforcement agencies be given access to databases for the

purpose of identifying individuals with criminal tendencies, even though the individuals might not have committed a crime? 2. Should insurance companies be given access to databases for the purpose

of identifying individuals with potential medical problems, even though the individuals have not shown any symptoms? 3. Suppose you were financially comfortable. What benefits could you derive

if this information were shared among a variety of institutions? What penalties could you suffer from the distribution of this same information? What if you were financially uncomfortable? 4. What role does a free press have in controlling database abuse? (For example,

to what extent does the press affect public opinion or expose abuse?)

M09_BROO1160_12_SE_C09.indd 450

23/07/14 8:26 pm

Chapter Review Problems

451

Chapter Review Problems (Asterisked problems are associated with optional sections.)

1. What is the significance of database manage-

ment systems? 2. What is a database model? 3. What is a lossless decomposition or a nonloss

decomposition? 4. What is the difference between a tuple and an

attribute? 5. Identify two benefits of separating application

software from the DBMS. 6. Describe the similarities between an abstract

data type (Chapter8) and a database model. 7. Identify the level within a database system

(user, programmer of application software, designer of the DBMS software) at which each of the following concerns or activities occur:

a. How should data be stored on a disk to maximize efficiency? b. Is there a vacancy on flight 243? c. How should a relation be organized in mass storage? d. How many times should a user be allowed to mistype a password before the conversation is terminated? e. How can the PROJECT operation be implemented?

8. Which of the following tasks are handled by a

DBMS?

a. Ensure that a user’s access to the database is restricted to the appropriate subschema. b. Translate commands stated in terms of the database model into actions compatible with the actual data storage system. c. Disguise the fact that the data in the database is actually scattered among many computers in a network.

9. Describe how the following information about

railways, trains (for a particular day), and passengers would be represented in a relational database:

M09_BROO1160_12_SE_C09.indd 451

Trains: Rolar, Omni, and Holiday Trains for Rolar: R221, R567, and R234 Holiday special Trains: H897 and H008 Trains for Omni: O999 and O815 John has reservations on R221 (seat 34U), R567 (seat 23U), and R234 (seat 43L). Henry has reservations on O999 (seat 15L) and H008 (seat 18L). Duke has reservations on H897 (seat 7U) and O815 (seat 2L). 10. To what extent is the order in which SELECT

and PROJECT operations are applied to a relation significant? That is, under what conditions will SELECTing and then PROJECTing produce the same results as first PROJECTing and then SELECTing? 11. Give an argument showing that the “where”

clause in the JOIN operation as described in Section9.2 is not necessary. (That is, show that any query that uses a “where” clause could be restated using a JOIN operation that concatenated every tuple in one relation with every tuple in the other.) 12. In terms of the relations shown below, what

is the appearance of the relation FINAL after executing each of these instructions: A relation

B relation

L

M

N

X

Y

X

P

1

9

7

Y

Q

7

4

3

Z

R

6

a. FINAL b. FINAL c. FINAL d. FINAL

← ← ← ←

SELECT from B where X = 9 PROJECT L from A SELECT from A where L = Z JOIN A and B where A.N = B.Y

23/07/14 8:26 pm

452

Chapter 9  Database Systems

13. Using the commands SELECT, PROJECT,

and JOIN, write a sequence of instructions to answer each of the following questions about branches and their courses in terms of the following database:

ID

Networks DataBase VLSI

IT655 CS543 EC653

19. Design a relational database containing infor-

mation about employees of different companies and their salaries. (Avoid redundancies similar to those in Figure9.4.) 20. Design a relational database containing infor-

Course relation CName

disciplines. (Avoid redundancies similar to those in Figure9.4.)

mation about fruits, colors, and the season of their availability. (Avoid redundancies similar to those in Figure9.4.) 21. Design a relational database containing infor-

Branch relation BName

ID

Credits

Computer Science Computer Science Electronics & Communication Electronics & Communication Information Technology Information Technology

CS543 EC653 IT655 EC653 CS543 IT655

4 5 4 5 4 4

mation about parts, suppliers, and customers. Each part might be supplied by several suppliers and ordered by many customers. Each supplier might supply many parts and have many customers. Each customer might order many parts from many suppliers; in fact, the same part might be ordered from more than one supplier. (Avoid redundancies similar to those in Figure9.4.) 22. Write a sequence of instructions (using the

a. Which branches offer IT665? b. List all the branches present in Branch relation. c. Which branches offer 4-credit courses?

operations SELECT, PROJECT and JOIN) to retrieve the JobId, StartDate, and TermDate for each job in the accounting department from the relational database described in Figure9.5.

14. Answer question 13 using SQL.

23. Answer the previous problem using SQL.

15. Using the commands SELECT, PROJECT, and

24. Write a sequence of instructions (using the

JOIN, write sequences to answer the follow-

ing questions about the information in the EMPLOYEE, JOB, and ASSIGNMENT relations in Figure9.5: a. Obtain the name of an employee whose Job ID is S25X. b. Obtain a list of the department, skill code and job title of the employee named G. Jerry Smith. c. Obtain a list of the name and address of the employee whose start date is 5-1-2010.

16. Answer question 14 using SQL. 17. Design a relational database containing infor-

mation about authors, their titles, and their publishers. (Avoid redundancies similar to those in Figure9.4.) 18. Design a relational database containing

information about students, their courses, and their current semester along with their

M09_BROO1160_12_SE_C09.indd 452

operations SELECT, PROJECT and JOIN) to retrieve the Name, Address, JobTitle, and Dept of every current employee from the relational database described in Figure9.5. 25. Answer the previous problem using SQL. 26. Write a sequence of instructions (using the

operations SELECT, PROJECT and JOIN) to retrieve the Name and JobTitle of each current employee from the relational database described in Figure9.5. 27. Answer the previous problem using SQL. 28. What is the difference in the information sup-

plied by the single relation Name

Department

TelephoneNumber

Jones Smith Baker

Sales Sales Personnel

555-2222 555-3333 555-4444

23/07/14 8:26 pm

Chapter Review Problems

36. Translate the query in the previous problem

and the two relations Name Jones Smith Baker

Department Sales Sales Personnel

Department

TelephoneNumber

Sales Sales Personnel

555-2222 555-3333 555-4444

29. Design a relational database containing informa-

tion about novels, its authors and the number of pages in the novels. Be sure to allow for the fact that a novel may contain less number of pages in one version and at the same it may contain more number of pages in a new version. 30. Pick a popular website such as www.google.com,

www.amazon.com, or www.ebay.com and design a relational database that you would propose to serve as the site’s supporting database. 31. On the basis of the database represented in

Figure9.5, state the question that is answered by the following program segment: TEMP ← SELECT from JOB where JobTitle = 'Secretary' RESULT ← PROJECT SkillCode, Department from TEMP

32. Answer question 31 using SQL. 33. On the basis of the database represented in

Figure9.5, state the question that is answered by the following program segment: INTER1 ← JOIN JOB and ASSIGNMENT where JOB.JobId = ASSIGNMENT.JobId INTER2 ← SELECT from INTER1 where EmplId = '23Y34' FINAL ← PROJECT TermDate, StartDate from INTER2

34. Answer question 33 using SQL. 35. On the basis of the database represented in

Figure9.5, state the question that is answered by the following program segment: TEMP1 ← JOIN EMPLOYEE and JOB where EMPLOYEE.EmplId = JOB.EmplId

M09_BROO1160_12_SE_C09.indd 453

453

into SQL. 37. Translate the SQL statement SELECT Job.JobTitle FROM Assignment, Job WHERE Assignment.JoblId = Job.JobId AND Assignment.EmplId = '34Y70';

into a sequence of SELECT, PROJECT, and JOIN operations. 38. Translate the SQL statement SELECT Assignment.StartDate FROM Assignment, Employee WHERE Assignment.EmplId = Employee.EmplId AND Employee.Name = 'Joe E. Baker';

into a sequence of SELECT, PROJECT, and JOIN operations. 39. Describe the effect that the following SQL

statement would have on the database in Problem 13. INSERT INTO Course VALUES ('Computer Concepts', 'CS342');

40. Describe the effect that the following SQL

statement would have on the database in question 13. UPDATE Branch SET ID = 'CS555' WHERE BName = 'Computer Science' AND Credits = 5;

*41. Identify some of the objects that you would

expect to find in an object-oriented database used to maintain a grocery store’s inventory. What methods would you expect to find within each of these objects? *42. Identify some of the objects that you would

expect to find in an object-oriented database used to maintain records of a library’s holdings. What methods would you expect to find within each of these objects? *43. What incorrect information is generated by

the following schedule of transactions T1 and T2?

23/07/14 8:26 pm

454

Chapter 9  Database Systems

T1 is designed to compute the sum of accounts A and B; T2 is designed to transfer $100 from account A to account B. T1 begins by retrieving the balance of account A; then, T2 performs its transfer; and finally, T1 retrieves the balance of account B and reports the sum of the values it has retrieved. *44. What is the difference between incorrect summary problem and lost update problem? Explain your answer with examples. *45. What effect would the wound-wait protocol have on the sequence of events in question 43 if T1 was the younger transaction? If T2 was the younger transaction? *46. Suppose one transaction tries to add $100 to an account whose balance is $200 while another tries to withdraw $100 from the same account. Describe an interweaving of these transactions that would lead to a final balance of $100. Describe an interweaving of these transactions that would lead to a final balance of $300. *47. What is the difference between a transaction having exclusive access or shared access to an item in a database and why is the distinction important? *48. The problems discussed in Section9.4 involving concurrent transactions are not limited to database environments. What similar problems would arise when accessing a document with word processors? (If you have a PC with a word processor, try to access the same document with two activations of the word processor and see what happens.) *49. Suppose a sequential file contains 50,000 records and 5 milliseconds is required to interrogate an entry. How long should we expect to wait when retrieving a record from the middle of the file? *50. List the steps that are executed in the merge algorithm in Figure9.15 if one of the input files is empty at the start. *51. Modify the algorithm in Figure9.15 to handle the case in which both input files contain a record with the same key field value. Assume that these records are identical and that only one should appear in the output file. *52. Design a system by which a file stored on a disk can be processed as a sequential file with either of two different orderings.

M09_BROO1160_12_SE_C09.indd 454

*53. Describe how a sequential file containing

information about a magazine’s subscribers could be constructed using a text file as the underlying structure. *54. Design a technique by which a sequential

file whose logical records are not a consistent size could be implemented as a text file. For example, suppose you wanted to construct a sequential file in which each logical record contained information about a novelist as well as a list of that author’s works. *55. Explain the terms cluster analysis, association

analysis, outlier analysis, and sequential pattern analysis in brief. *56. The chapter drew parallels between a tradi-

tional file index and the file directory system maintained by an operating system. In what ways does an operating system’s file directory differ from a traditional index? *57. If a hash file is partitioned into 10 buckets,

what is the probability of at least two of three arbitrary records hashing to the same bucket? (Assume the hash function gives no bucket priority over the others.) How many records must be stored in the file until it is more likely for collisions to occur than not? *58. Solve the previous problem, assuming that

the file is partitioned into 100 buckets instead of 10. *59. If we are using the division technique dis-

cussed in this chapter as a hash function and the file storage area is divided into 23 buckets, which section should we search to find the record whose key, when interpreted as a binary value, is the integer 124? *60. Compare the implementation of a hash file to

that of a homogeneous two-dimensional array. How are the roles of the hash function and the address polynomial similar? *61. Give one advantage that

a. a sequential file has over an indexed file. b. a sequential file has over a hash file. c. an indexed file has over a sequential file. d. an indexed file has over a hash file. e. a hash file has over a sequential file. f. a hash file has over an indexed file. *62. Explain the technique of hashing. How is it

related to a hash function and a hash table?

23/07/14 8:26 pm

Social Issues

455

Social Issues The following questions are intended as a guide to the ethical/social/legal issues associated with the field of computing. The goal is not merely to answer these questions. You should also consider why you answered as you did and whether your justifications are consistent from one question to the next. 1. In the United States, DNA records of all federal prisoners are now stored in a

database for use in criminal investigations. Would it be ethical to release this information for other purposes—for example, for medical research? If so, for what purposes? If not, why not? What are the pros and cons in each case? 2. To what extent should a university be allowed to release information about its students? What about their names and addresses? What about grade distributions without identifying the students? Is your answer consistent with your answer to question 1? 3. What restrictions are appropriate regarding the construction of databases about individuals? What information does a government have a right to hold regarding its citizens? What information does an insurance company have a right to hold regarding its clients? What information does a company have a right to hold regarding its employees? Should controls in these settings be implemented and, if so, how? 4. Is it proper for a credit card company to sell the purchasing patterns of its clients to marketing firms? Is it acceptable for a sports car mail order business to sell its mailing list to a sports car magazine? Is it acceptable for the Internal Revenue Service in the United States to sell the names and addresses of those taxpayers with significant capital gains to stockbrokers? If you cannot answer with an unqualified yes or no, what would you propose as an acceptable policy? 5. To what extent is the designer of a database responsible for how the information in that database is used? 6. Suppose a database mistakenly allows unapproved access to information in the database. If that information is obtained and used adversely, to what degree do the database designers share responsibility for the misuse of the information? Does your answer depend on the amount of effort required by the perpetrator to discover the flaw in the database design and obtain the unauthorized information? 7. The prevalence of data mining raises numerous issues of ethics and privacy. Is your privacy infringed if data mining reveals certain characteristics about the overall population of your community? Does the use of data mining promote good business practice or bigotry? To what extent is it proper to force citizens to participate in a census, knowing that more information will be extracted from the data than is explicitly requested by the individual questionnaires? Does data mining give marketing firms an unfair advantage over unsuspecting audiences? To what extent is profiling good or bad? 8. To what extent should a person or corporation be allowed to collect and hold information about individuals? What if the information collected is already publicly available although scattered among several sources? To what extent should a person or company be expected to protect such information?

M09_BROO1160_12_SE_C09.indd 455

23/07/14 8:26 pm

456

Chapter 9  Database Systems

9. Many libraries offer a reference service so that patrons can enlist the assis-

tance of a librarian when searching for information. Will the existence of the Internet and database technology render this service obsolete? If so, would that be a step forward or backward? If not, why not? How will the existence of the Internet and database technology affect the existence of libraries themselves? 10. To what extent are you exposed to the possibility of identity theft? What steps

can you take to minimize that exposure? How could you be damaged if you were the victim of identity theft? Should you be liable when identity theft occurs?

Additional Reading Berstein, A., M. Kifer, and P. M. Lewis. Database Systems, 2nd ed. Boston, MA: Addison-Wesley, 2006. Connolly, T., and C.E. Beg. Database Systems: A Practical Approach to Design, Implementation and Management, 5th ed. Boston, MA: Addison-Wesley, 2009. Date, C. J. An Introduction to Database Systems, 8th ed. Boston, MA: AddisonWesley, 2004. Date, C. J. Databases, Types and the Relational Model, 3rd ed. Boston, MA: AddisonWesley, 2007. Elmasri, R., and S. Navathe. Fundamentals of Database Systems, 6th ed. Boston, MA: Addison-Wesley, 2011. Patrick, J. J. SQL Fundamentals, 3rd ed. Upper Saddle River, NJ: Prentice-Hall, 2009. Silberschatz, A., H. Korth, and S. Sudarshan. Database Systems Concepts, 6th ed. New York: McGraw-Hill, 2009. Ullman, J. D., and J. D. Widom. A First Course in Database Systems, 3rd ed. Upper Saddle River, NJ: Prentice-Hall, 2008.

M09_BROO1160_12_SE_C09.indd 456

23/07/14 8:26 pm

Computer Graphics In this chapter we explore the field of computer graphics—a field

10

C H A P T E R

that is having a major impact in the production of motion pictures and interactive video games. Indeed, advances in computer g­ raphics are freeing the visual media from restrictions of reality, and many argue that computer-generated animation may soon replace the need for ­traditional actors, sets, and photography throughout the motion picture and television industries.

10.1 The Scope of ComputerGraphics 10.2 Overview of 3D Graphics 10.3 Modeling Modeling Individual Objects Modeling Entire Scenes

10.4 Rendering

10.6 Animation

Light-Surface Interaction Clipping, Scan Conversion, and Hidden-Surface Removal Shading Rendering-Pipeline Hardware

Animation Basics Dynamics and Kinematics The Animation Process *Asterisks indicate suggestions for optional sections.

*10.5 Dealing with Global Lighting Ray Tracing Radiosity

M10_BROO1160_12_SE_C10.indd 457

01/08/14 11:19 AM

458

Chapter 10  Computer Graphics

Computer graphics is the branch of computer science that applies computer ­technology to the production and manipulation of visual representations. It is associated with a wide assortment of topics including the presentation of text, the construction of graphs and charts, the development of graphical user interfaces, the manipulation of photographs, the production of video games, and the creation of animated motion pictures. However, the term computer graphics is increasingly being used in reference to the specific field called 3D graphics, and most of this chapter concentrates on this topic. We begin by defining 3D graphics and ­clarifying its role within the broader interpretation of computer graphics.

10.1  The Scope of Computer Graphics With the emergence of digital cameras, the popularity of software for manipulating digitally encoded images has rapidly expanded. This software allows one to touch up photographs by removing blemishes and the dreaded “red eye,” as well as cutting and pasting portions from different photographs to create images that do not necessarily reflect reality. Similar techniques are often applied to create special effects in the motion picture and television industries. In fact, such applications were major motivating factors for these industries shifting from analog systems such as film to digitally encoded images. Applications include removing the appearance of support wires, overlaying multiple images, or producing short sequences of new images that are used to alter the action that was originally captured by a camera. In addition to software for manipulating digital photographs and motion picture frames, there is now a wide variety of utility/application software packages that assist in producing two-dimensional images ranging from simple line drawings to sophisticated art. (A well-known elementary example is Microsoft’s application called Paint.) At a minimum, these programs allow the user to draw dots and lines, insert simple geometric shapes such as ovals and rectangles, fill regions with color, and cut and paste designated portions of a drawing. Note that all the preceding applications deal with the manipulation of flat two-dimensional shapes and images. They are, therefore, examples of two related fields of research: One is 2D graphics, the other is image ­processing. The distinction is that 2D graphics focuses on the task of converting two-­dimensional shapes (circles, rectangles, letters, etc.) into patterns of pixels to produce an image, whereas image processing, which we will meet later in our study of arti­ ficial intelligence, focuses on analyzing the pixels in an image in order to identify patterns that can be used to enhance or perhaps “understand” the image. In short, 2D graphics deals with producing images while image processing deals with analyzing images. In contrast to converting two-dimensional shapes into images as in 2D graphics, the field of 3D graphics deals with converting three-dimensional shapes into images. The process is to construct digitally encoded versions of three-dimensional scenes and then to simulate the photographic process to produce images of those scenes. The theme is analogous to that of traditional photography, except that the scene that is “photographed” using 3D graphics techniques does not exist as a physical reality but instead “exists” merely as a collection of data and algorithms. Thus, 3D graphics involves “­photographing”

M10_BROO1160_12_SE_C10.indd 458

01/08/14 11:19 AM

10.1  The Scope of Computer Graphics

459

virtual worlds, whereas traditional ­photography involves ­photographing the real world. It is important to note that the creation of an image using 3D graphics encompasses two distinct steps. One is the creation, encoding, storage, and manipulation of the scene to be photographed. The other is the process of producing the image. The former is a creative, artistic process; the latter is a computationally intense process. These are topics that we will explore in the next four sections. The fact that 3D graphics produces “photographs” of virtual scenes makes it ideal for use in interactive video games and animated motion picture productions where the shackles of reality would otherwise limit the action. An interactive video game consists of an encoded three-dimensional virtual environment with which the game player interacts. The images that the player sees are produced by means of 3D graphics technology. Animated motion pictures are created in a similar manner, except that it is the human animator who interacts with the virtual environment rather than the ultimate viewer. The product ultimately distributed to the public is a sequence of two-dimensional images as determined by the production’s director/producer. We will investigate the use of 3D graphics in animation more thoroughly in Section10.6. For now, let us close this section by imagining where these applications may lead as 3D graphics technology advances. Today, motion pictures are distributed as sequences of two-dimensional images. Although the projectors that display this information have progressed from analog devices with reels of film to digital technology using DVD players and flat panel displays, they still deal only with two-dimensional representations. Imagine, however, how this may change as our ability to create and manipulate realistic three-dimensional virtual worlds improves. Rather than “photographing” these virtual worlds and distributing a motion picture in the formof two-dimensional images, we could distribute the virtual worlds. A potential viewer would receive access to the motion picture set rather than just the motion picture. This three-dimensional set would then be viewed by means of a “3D graphics projector” in much the same way that video games are viewed by special-­purpose “game boxes.” One might first watch a “suggested plot” that would result in v ­ iewing the motion picture as the director/producer envisioned. But, the viewer could also interact with the virtual set in a manner reminiscent of a video game to produce other scenarios. The possibilities are extensive, especially when we also consider the potentials of the three-dimensional human-machine interfaces that are being developed.

Questions & Exercises 1. Summarize the distinction between image processing, 2D graphics, and

3D graphics. 2. How does 3D graphics differ from traditional photography? 3. What are the two major steps in producing a “photograph” using 3D

graphics?

M10_BROO1160_12_SE_C10.indd 459

01/08/14 11:19 AM

460

Chapter 10  Computer Graphics

10.2  Overview of 3D Graphics Let us begin our study of 3D graphics by considering the entire process of creat­ ing and displaying images—a process that consists of three steps: modeling, rendering, and displaying. The modeling step (which we will explore in detail in Section10.3) is analogous to designing and constructing a set in the traditional motion picture industry, except that the 3D graphics scene is “constructed” from digitally encoded data and algorithms. Thus, the scene produced in the context of computer graphics may never exist in reality. The next step is to produce a two-dimensional image of the scene by computing how the objects in the scene would appear in a photograph made by a camera at a specified position. This step is called rendering—the subject of Sections10.4 and 10.5. Rendering involves applying the mathematics of analytic geometry to compute the projection of the objects in the scene onto a flat surface known as the projection plane in a manner analogous to a camera projecting a scene onto film (Figure10.1). The type of projection applied is a perspective projection, which means that all objects are projected along straight lines, called projectors, that extend from a common point called the center of projection, or the view point. (This is in contrast to a parallel projection in which the projectors are parallel. A perspective projection produces a projection similar to that seen by the human eye, whereas a parallel projection produces a “true” profile of an object, which is often useful in the context of engineering drawings.) The restricted portion of the projection plane that defines the boundaries of the final image is known as the image window. It corresponds to the rectangle that is displayed in the viewfinder of most cameras to indicate the boundaries of the potential picture. Indeed, the viewfinder of most cameras allows you to view more of the camera’s projection plane than merely its image window. (You may see the top of Aunt Martha’s head in the viewfinder, but unless the top of her head is within the image window, it will not appear in the final picture.) Once the portion of the scene that projects into the image window is identified, the appearance of each pixel in the final image is computed. This Figure 10.1   The 3D graphics paradigm Projection plane

Image window

Projectors

Object in scene

Image of object on projection plane

Center of projection

M10_BROO1160_12_SE_C10.indd 460

01/08/14 11:19 AM

10.3 Modeling

461

pixel-­by-pixel process can be computationally complex because it requires determining how the objects in the scene interact with light—a hard, shiny surface in bright light should be rendered differently than a soft, transparent surface in indirect light. In turn, the rendering process borrows heavily from numerous fields ­including material science and physics. Moreover, determining the appearance of one object often requires knowledge about other objects in the scene. The object may be in the shadow of another object, or the object may be a mirror whose appearance is essentially that of another object. As the appearance of each pixel is determined, the results are stored collectively as a bit map representation of the image in a storage area called the frame buffer. This buffer may be an area of main memory or, in the case of hardware designed specifically for graphics applications, it may be a block of special purpose memory circuitry. Finally, the image stored in the frame buffer is either displayed for viewing or transferred to more permanent storage for later display. If the image is being produced for use in a motion picture, it may be stored and perhaps even modified before final presentation. However, in an interactive video game or flight simulator, images must be displayed as they are produced on a real-time basis, a requirement that often limits the quality of the images created. This is why the graphics quality of full-feature animated productions distributed by the motion picture industry exceeds that of today’s interactive video games. We close our introduction to 3D graphics by analyzing a typical video game system. The game itself is essentially an encoded virtual world together with software that allows that world to be manipulated by the game player. As the player manipulates that world, the game system repeatedly renders the scene and stores the image in the image buffer. To overcome real-world time constraints, much of this rendering process is handled by special-purpose hardware. Indeed, the presence of this hardware is a distinguishing feature between a game system and a generic personal computer. Finally, the display device in the game system displays the contents of the frame buffer, giving the player the illusion of a changing scene.

Questions & Exercises 1. Summarize the three steps involved in producing an image using 3D

graphics. 2. What is the difference between the projection plane and the image

window? 3. What is a frame buffer?

10.3  Modeling A 3D computer graphics project begins in much the same way as a theatrical stage production—a set must be designed and the required props must be collected or constructed. In computer graphics terminology, the set is called a scene and the props are called objects. Keep in mind that a 3D graphics scene is virtual because

M10_BROO1160_12_SE_C10.indd 461

01/08/14 11:19 AM

462

Chapter 10  Computer Graphics

it consists of objects that are “constructed” as digitally encoded models rather than tangible, physical structures. In this section we will explore topics related to “constructing” objects and scenes. We begin with issues of modeling individual objects and conclude by considering the task of collecting those objects to form a scene.

Modeling Individual Objects In a stage production, the extent to which a prop conforms to reality depends on how it will be used in the scene. We may not need an entire automobile, the telephone does not have to be functional, and the background scenery may be painted on a flat backdrop. Likewise, in the case of computer graphics, the degree to which the software model of an object accurately reflects the true properties of the object depends on the requirements of the situation. More detail is necessary to model objects in the foreground than objects in the background. Moreover, more detail can be produced in those cases that are not under stringent, real-time constraints. Thus, some object models may be relatively simple whereas others may be extremely complex. As a general rule, more precise models lead to higher-quality images but longer rendering times. In turn, much of the ongoing research in computer graphics seeks the development of techniques for constructing highly detailed, yet efficient, object models. Some of this research deals with developing models that can provide different levels of detail depending on the object’s ultimate role in the scene, the result being a single object model that can be used in a changing environment. The information required to describe an object includes the object’s shape as well as additional properties, such as surface characteristics that determine how the object interacts with light. For now, let us consider the task of ­modeling shape. Shape  The shape of an object in 3D graphics is usually described as a collection

of small flat surfaces called planar patches, each of which is the shape of a polygon. Collectively, these polygons form a polygonal mesh that approximates the shape of the object being described (Figure10.2). By using small planar patches, the approximation can be made as precise as needed. The planar patches in a polygonal mesh are often chosen to be triangles because each triangle can be represented by its three vertices, which is the minimum number of points required to identify a flat surface in three-dimensional space. In any case a polygonal mesh is represented as the collection of the vertices of its planar patches. A polygonal mesh representation of an object can be obtained in a variety of ways. One is to begin with a precise geometric description of the desired shape, and then use that description to construct a polygonal mesh. For example, analytic geometry tells us that a sphere (centered at the origin) with radius r is described by the equation r 2 = x 2 + y2 + z 2 Based on this formula, we can establish equations for lines of latitude and longitude on the sphere, identify the points where these lines intersect, and then use these points as the vertices of a polygonal mesh. Similar techniques can be applied to other traditional geometric shapes, and this is why characters in

M10_BROO1160_12_SE_C10.indd 462

01/08/14 11:19 AM

10.3 Modeling

463

Figure 10.2   A polygonal mesh for a sphere

less-expensive computer-generated animations often appear to be pieced together from such structures as spheres, cylinders, and cones. More general shapes can be described by more sophisticated analytical means. One is based on the use of Bezier curves (named after Pierre Bezier who developed the concept in the early 1970s as an engineer for the Renault car company), which allow a curved line segment in three-dimensional space to be defined by only a few points called control points—two of which represent the ends of the curve segment while the others indicate how the curve is distorted. As an example, Figure10.3 displays a curve defined by four control points. Note how the curve appears to be pulled toward the two control points that do not identify the segment ends. By moving these points, the curve can be twisted into Figure 10.3   A Bezier curve Control points marking the ends of the curve

Curve

Control points used to distort the curve

M10_BROO1160_12_SE_C10.indd 463

01/08/14 11:19 AM

464

Chapter 10  Computer Graphics

different shapes. (You may have experienced such techniques when constructing curved lines using drawing software packages such as Microsoft’s Paint.) Although we will not pursue the topic here, Bezier’s techniques for describing curves can be extended to describe three-dimensional surfaces, known as Bezier surfaces. In turn, Bezier surfaces have proven to be an efficient first step in the process of obtaining polygonal meshes for complex surfaces. You may ask why it is necessary to convert a precise description of a shape, such as the concise formula of a sphere or the formulas describing a Bezier surface, into an approximation of the shape using a polygonal mesh. The answer is that representing the shape of all objects by polygonal meshes establishes a uniform approach to the rendering process—a trait that allows entire scenes to be rendered more efficiently. Thus, although geometric formulas provide precise descriptions of shapes, they serve merely as tools for constructing polygonal meshes. Another way of obtaining a polygonal mesh is to construct the mesh in a brute force manner. This approach is popular in cases where a shape defies representation by elegant mathematical techniques. The procedure is to build a physical model of the object and then to record the location of points on the surface of the model by touching the surface with a pen device that records its position in three-dimensional space—a process known as digitizing. The collection of points obtained can then be used as vertices to obtain a polygonal mesh describing the shape. Unfortunately, some shapes are so complex that obtaining realistic models by geometric modeling or manual digitizing is unfeasible. Examples include intricate plant structures such as trees, complex terrain such as mountain ranges, and gaseous substances such as clouds, smoke, or the flames of a fire. In these cases, polygonal meshes can be obtained by writing programs that construct the desired shape automatically. Such programs are collectively known as proceduralmodels. In other words, a procedural model is a program unit that applies an algorithm to generate a desired structure. As an example, procedural models have been used to generate mountain ranges by executing the following steps: Starting with a single triangle, i­ dentify the midpoints of the triangle’s edges (Figure 10.4a). Then, connect these ­midpoints to form a total of four smaller triangles (Figure 10.4b). Now, while holding the original triangle’s vertices fixed, move the midpoints in three-dimensional space (allowing the triangle’s edge lines to stretch or contract), thus distorting the ­triangular shapes (Figure 10.4c). Repeat this process with each of the smaller triangles (­Figure 10.4d), and continue repeating the process until the desired detail is obtained. Procedural models provide an efficient means of producing multiple complex objects that are similar yet unique. For instance, a procedural model can be used to construct a variety of realistic tree objects—each with its own, yet similar, branching structure. One approach to such tree models is to apply branching rules to “grow” tree objects in much the same way that a parser (­Section 6.4) constructs a parse tree from grammar rules. In fact, the collection of branching rules used in these cases is often called a grammar. One grammar may be designed for “­growing” pine trees whereas another may be designed for “growing” oaks. Another method of constructing procedural models is to simulate the underlying structure of an object as a large collection of particles. Such models are called particle systems. Usually particle systems apply certain predefined rules to move the particles in the system, perhaps in a manner reminiscent of molecular

M10_BROO1160_12_SE_C10.indd 464

01/08/14 11:19 AM

10.3 Modeling

465

Figure 10.4   Growing a polygonal mesh for a mountain range a. Identify the midpoints Midpoint Midpoint Midpoint b. Connect the midpoints Midpoint Midpoint Midpoint c. Move the midpoints Midpoint Midpoint

Midpoint d. Repeat the process on the smaller triangles

interactions, to produce the desired shape. As an example, particle systems have been used to produce an animation of sloshing water as we will see later in our discussion of animation. (Imagine a bucket of water modeled as a bucket of marbles. As the bucket rocks, the marbles tumble around, simulating the movement of water.) Other examples of particle system applications include flickering fire flames, clouds, and crowd scenes. The output of a procedural model is usually a polygonal mesh that approximates the shape of the desired object. In some cases, such as generating a mountain range from triangles, the mesh is a natural consequence of the generating process. In other cases, such as growing a tree from branching rules, the mesh may be constructed as an additional, final step. For example, in the case of particle systems, the particles on the outer edge of the system are natural candidates for the vertices of the final polygonal mesh. How precise the mesh generated by a procedural model may be depends on the situation. A procedural model for a tree in a scene’s background may produce a course mesh that reflects only the basic shape of the tree, whereas a procedural model for a tree in the foreground may produce a mesh that distinguishes individual branches and leaves.

M10_BROO1160_12_SE_C10.indd 465

01/08/14 11:19 AM

466

Chapter 10  Computer Graphics

Fractals The construction of a mountain range by means of a procedural model as described in the text (see Figure10.4) is an example of the role that fractals play in 3D graphics. Technically speaking, a fractal is a geometric object whose “Hausdorff dimension is greater than its topological dimension.” What this means intuitively is that the object is formed by “packing together” copies of an object of a lower dimension. (Think of the illusion of width created by “packing together” multiple parallel line segments.) A fractal is usually formed by means of a recursive process, where each activation in the recursion “packs together” additional (yet smaller) copies of the pattern being used to build the fractal. The fractal that results is self-similar in that each portion, when magnified, appears as a copy of itself. A traditional example of a fractal is the von Koch snowflake that is formed by repeatedly replacing the straight-line segments in the structure

with smaller versions of the same structure. This leads to a sequence of refinements that proceeds as follows:

Fractals are often the backbone of procedural models in the field of 3D graphics. Indeed, they have been used to produce realistic images of mountain ranges, vegetation, clouds, and smoke.

Surface Characteristics  A model consisting merely of a polygonal mesh captures only the shape of an object. Most rendering systems are capable of enriching such models during the rendering process to simulate various surface characteristics as requested by the user. For example, by applying different shading techniques (which we will introduce in Section10.4) a user may specify that a polygonal mesh for a ball be rendered as a red smooth ball or a green rough ball. In some cases, such flexibility is desirable. But in situations requiring faithful rendering of an original object, more specific information about the object must be included in the model so that the rendering system will know what it should do. There are a variety of techniques for encoding information about an object in addition to its shape. For instance, along with each vertex in a polygonal mesh, one might encode the color of the original object at that point on the object. This information could then be used during rendering to recreate the appearance of the original object. In other instances, color patterns can be associated with an object’s surface by means of a process known as texture mapping. Texture mapping is similar to the process of applying wallpaper in that it associates a predefined image with

M10_BROO1160_12_SE_C10.indd 466

01/08/14 11:19 AM

10.3 Modeling

467

the surface of an object. This image might be a digital photograph, an artist’s rendering, or perhaps a computer-generated image. Traditional texture images include brick walls, wood grained surfaces, and marble facades. Suppose, for example, that we wanted to model a stone wall. We could represent the shape of the wall with a simple polygonal mesh depicting a long rectangular solid. Then, with this mesh we could supply a two-dimensional image of stone masonry. Later, during the rendering process, this image could be applied to the rectangular solid to produce the appearance of a stone wall. More precisely, each time the rendering process needed to determine the appearance of a point on the wall it would simply use the appearance of the corresponding point in the masonry image. Texture mapping works best when applied to relatively flat surfaces. The result can look artificial if the texture image must be distorted significantly to cover a curved surface (imagine the problems of trying to wallpaper a beach ball) or if the texture image wraps completely around an object causing a seam where the texture pattern may not blend with itself. Nonetheless, texture mapping has proven to be an efficient means of simulating texture and is widely used in situations that are real-time sensitive—a prime example being interactive video games. The Search for Realism  Building object models that lead to realistic images is a topic

of ongoing research. Of special interest are materials associated with living characters such as skin, hair, fur, and feathers. Much of this research is specific to a particular substance and encompasses both modeling and rendering techniques. For instance, to obtain realistic models of human skin, some researchers have incorporated the degree to which light penetrates the epidermal and dermal skin layers and how the contents of those layers affect the skin’s appearance. Another example involves the modeling of human hair. If hair is to be seen from a distance, then more traditional modeling techniques may suffice. But, for close-up views, realistic-appearing hair can be challenging. Problems include translucent properties, textural depth, draping characteristics, and the manner in which hair responds to external forces such as wind. To overcome these hurtles, some applications have resorted to modeling individual strands of hair—a ­daunting task because the number of hairs on a human head can be on the order of 100,000. More astounding, however, is that some researchers have constructed hair models that address the scaled texture, color variation, and mechanical dynamics of each individual strand. Still another example in which considerable detail has been pursued is in modeling cloth. In this case the intricacies of weaving patterns have been used to produce proper textural distinctions between fabric types such as twill versus satin, and detailed properties of yarn have been combined with knitting p ­ attern data to create models of knit fabric that lead to extremely realistic close-up images. In addition, knowledge of physics and mechanical engineering has been applied to individual threads to compute images of draped material that account for such aspects as stretching of threads and shearing of the weave. The production of realistic images is an active area of research that, as we have said, incorporates techniques in both the modeling and rendering processes. Typically, as progress is made, the new techniques are first incorporated in ­applications that are not subject to real-time constraints, such as the graphics software of motion picture production studios where there is a significant delay between the modeling/rendering process and the ultimate presentation

M10_BROO1160_12_SE_C10.indd 467

01/08/14 11:19 AM

468

Chapter 10  Computer Graphics

of images. As these new techniques are refined and streamlined, they find their way into real-time applications, and the quality of the graphics in these environments improves as well. Truly realistic real-time interaction with virtual worlds may not be too far in the future.

Modeling Entire Scenes Once the objects in a scene have been adequately described and digitally encoded, they are each assigned a location, size, and an orientation within the scene. This collection of information is then linked to form a data structure called a scene graph. In addition, the scene graph contains links to special objects representing light sources as well as a particular object representing the camera. It is here that the location, orientation, and focal properties of the camera are recorded. Thus, a scene graph is analogous to a studio set-up in traditional photography. It contains the camera, lights, props, and background scenery—everything that will contribute to the appearance of the photograph when the shutter is snapped— all in their proper places. The difference is that a traditional photography setup contains physical objects whereas a scene graph contains digitally encoded representations of objects. In short, the scene graph describes a virtual world. The positioning of the camera within a scene has many repercussions. As we mentioned earlier, the detail with which objects are modeled depends on the object’s location in the scene. Foreground objects require more detail than background objects, and the distinction between foreground and background depends on the camera position. If the scene is to be used in a context analogous to a theatrical stage setting, then the roles of foreground and background are well established and the object models can be constructed accordingly. If, however, the context requires that the camera’s position be altered for different images, the detail provided by the object models might need to be adjusted between “photographs.” This is an area of current research. One envisions a scene consisting of “intelligent” models that refine their polygonal meshes and other features as the camera moves within the scene. An interesting example of a moving camera scenario occurs in virtual reality systems with which a human user is allowed to experience the sensation of

3D Television Several technologies exist to produce 3D imagery in the context of television, but all rely on the same stereoscopic visual effect—two slightly different images arriving at the left and right eyes are interpreted by the brain as depth. The most inexpensive mechanisms for this require special glasses with filter lenses. Older colored lenses (used in cinema in the 1950s) or the more modern polarized lenses filter out ­different aspects of a single image from the screen, resulting in different images reaching ­different eyes. More costly technology involves “active” glasses that alternately s­ hutter left and right lenses in synchronization with a 3D television that switches quickly between the left and right images. Finally, 3D televisions are being developed that do not require special glasses or head gear. They use elaborate arrays of filters or magnifying