Without its software, a computer is basically a useless lump of metal.
- first line of the book “Operating Systems: Design and Implementation”
So, in my last article, we took a look at the last 50 or so years of operating system evolution. In this article, I want to take a short look at the current state of what an operating system is and does. So what exactly is an operating system?
Computer software can be roughly divided into two kinds: the system programs, which manage the operation of the computer itself, and the application programs, which solve problems for the users. The most fundamental of all the systems programs is the operating system, which controls all the computer’s resources and provides the base upon which the application programs can be written. 
Ok, so, thats pretty interesting right? So, to be fair, when we say “computer”, exactly what are we referring to?
A modern computer system consists of one of more processors, some main memory, clocks, terminals, disks, network interfaces, and other input/output devices. All in all, a complex system. 
So we’ve established what an operating system is, and what its trying to work with (components of a computer) — but why do we need this so called “operating system”?
Writing programs that keep track of all these components and use them correctly, let alone optimally, is an extremely difficult job. If every programmer had to be concerned with how disk drives work, and with all the dozens of things that could go wrong when reading a disk block, it is unlikely that many programs could be written at all. 
So, basically what we are talking about when we say “operating system” is a layer of services that abstract a lower level of complexity away so that we can build other more complex services on top of them without re-inventing the wheel. A very popular and highly influential operating system is the unix operating system. In the book “Design of the Unix Operating System” , Bach takes a look at why Unix was successful:
- written in high level language, C, making it easy to read, change, and move to other systems
- simple ui, power to provide services that users want
- provides primitives that permit complex programs to be built from simpler programs
- uses a hierarchial file system that allows easy maintenance and efficient implementation
- uses a consistent format for files, the byte stream, making application programs easier to write
- proves a simple, consistent interface to peripheral devices
- is multi-user, multi-process system; each user can execute several process simultaneaously
- hides the machine architecture from the user, kaing it easier to write programs that run on different hardware implementations
Which shows up how the system is layered around the hardware “core”, abstracting underlying plumbing as it goes. In this way, Unix is a very interesting design in that it takes a lot of loosely coupled pieces, and allows for higher order functions to be built on top of them.
Another interesting more recently developed operating system is TinyOS. TinyOS is an open source operating system and platform intended for wireless sensor networks. TinyOS is an embedded operating system written in the nesC programming language as a set of cooperating tasks and processes. TinyOS started as a collaboration between the University of California, Berkeley in co-operation with Intel Research. Since that time the project has grown into an international consortium, the TinyOS Alliance. There is a lot of interesting research based around wireless mobile ad hoc network (MANETs).
An interesting contrast between TinyOS and Unix is that a lot of people assume that an operating system and a desktop or graphical user interface (of any sort, windows or command line) are necessary components of an operating system; this is in fact, false, as TinyOS is an example of an OS that runs with no visual interface other than 3 LEDs on the mote circuit board. It also has no direct user input device, as it is meant to run the low level services of a small embedded device.
Given that from the previous article we established a history of operating systems, and in this article we took at look at modern operating system design (Unix), and emerging design (TinyOS) — I believe it is safe to say that the concept of an operating system is shifting and changing in different ways. Where are the bounds of what can be considered an operating system? The “Web2.0″ media seems to want to annoint every vaguely new computing paradigm as an “operating system” such as
- a webpage
- a web browser
- a web desktop
- a remote connection to a desktop
Given the arc of the previous article on the history of computing, and the current article’s focus on what modern operating system’s entail, I fail to see how a single web page or a web browser can possibly be defined as an “operating system”. None of the items listed above “manage the operation of the computer itself”. By the definition established above for an operating system, these components are not operating systems by any means. Tim Bray even tweeted:
However, as time goes on, every domain evolves as equilibrium is death. Computing is no different, and in the age of the internet we are quickly becoming a highly interconnected society by means of more sophisticated tools. As the complexity of our system advances, new layers of abstraction are required to built yet even more complex tools and systems. There is no doubt that the computing experience is shifting and users’ expectations are shifting as well. We are increasingly entering an age where data moves everywhere and the user experience is no longer on the desktop, but where ever the user happens to be using a device and in whatever context the user is in, be it desktop, commandline, or webpage.
I believe past shifts in computing can give us insights in how future shifts may occur, from storage, to computing infrastructure, to cloud computing. I will content that these shifts will produce needs for new layers of abstraction, similar to how the concept of an operating system evolved from the need to abstract away things like disk block access. As more complex services evolve on the web that need abstraction and aggregation via their APIs, what will our abstraction mechanisms look like, and how is this epoch of computing evolution any different than what was faced back in the 50s and 60s? What will the diagram above (Unix layers) look like in the near future with respect to layers of abstraction needed to produce more complex internet applicatons? I think looking back to it is an interesting topic, just as Tim Oreilly talks about how a critical design aspect of future web apps is:
Here very soon we may end up rethinking what an operating system really is, and quite possibly see our daily computing experience move away from being OS centered and towards a more ephemeral computing experience. In coming articles I’m going to take a look at how I think decentralized systems such as TinyOS will influence some older ideas to produce the next epoch of computing on the internet, and how the loosely coupled mindset of Unix may have a strong influence on this design as well.
 Andrew Tanenbaum, Operating Systems: Design and Implementation, Prentice Hall, 1987.
 M. Bach, Design of the Unix Operating System , Prentice Hall, 1986.