Computer System Organization

A computer system is made up of various components. The components can be hardware or software. Because these systems are so massively complex, the components are organized in layers.

Layers of Organization

Modern computer systems have a layered organization, which each layer either using the services of, or being physically built from, entities on the level directly below it.

Layer

People

Domain

Application Programs

Application Programmers

Software

System Utility Programs

System Programmers

Operating System

I/O System (BIOS)

Computer System

Computer Engineers

Hardware

CPU

Computer Architects

Memories, Logic Circuits, Flip-Flops, Gates

Logic Designers

Transistors, Diodes, Resistors, Power Supplies

Materials Scientists

Exercise: Research “firmware.” How does firmware fit into this table?

The Computer System Layer

The computer systems we build today feature programmable processing units which interact with a number of devices, each controlled by an I/O controller, and using memory.

Clearly, this picture is an oversimplification. Each CPU can have one or more cores. There may be additional kinds of processors, including GPUs and TPUs. Memory itself is layered (cache memory, main memory, secondary memory). Machines themselves are networked, giving the appearance of one large machine made up of smaller ones.

Deals with computer-centered concepts like registers and memory locations

Solves problems of interest to humans, usually in application areas like health care, game playing, finance, etc.

Controls and manages computer systems

Concerned with anything high-level

Concerned with data transfer, reading from and writing to files, compiling, linking, loading, starting and stopping programs, and even fiddling with the individual bits of a small word of memory

Is almost always device or platform independent; programs concentrate on general-purpose algorithms

Deals with writing device drivers and operating systems, or at least directly using them; programmers exploit this low-level knowledge

Is often done in languages like JavaScript, Perl, Python, Ruby, Lisp, Elm, Java, and C# that feature automatic garbage collection and free the programmer from low-level worries

Is often done in assembly language, C, C++, and Rust where programmers have to manage memory themselves

Is done in languages that generally have big fat runtime systems

Generally feature extremely small run-time images, because they often have to run in resource constrained environments

If done properly, can be very efficient: good garbage collection schemes allow much more efficient memory utilization than the usual memory micro-management common in C programs

If done properly, can be very efficient: you can take advantage of the hardware

There are different levels of programming languages: High-level languages, Assembly Languages, Machine Languages. A machine language is what a processor runs. It’s pure binary. A assembly language has instructions that map one-to-one to machine language instructions. A high-level language uses far more abstract concepts to describe computations. Often, people write in a high-level language, which a compiler translates to assembly language, which an assembler translates into machine language: