views:

497

answers:

11

What exactly does an operating system do? I know that operating systems can be programmed, in, for example, C++, but I previously believed that C++ programs must be run under an operating system? Can somebody please explain and give links? thanks in advance, ell

+3  A: 

sure, http://en.wikipedia.org/wiki/Operating_system

An operating system is the software on a computer that manages the way different programs use its hardware, and regulates the ways that a user controls the computer. Operating systems are found on almost any device that contains a computer with multiple programs—from cellular phones and video game consoles to supercomputers and web servers. Some popular modern operating systems for personal computers include Microsoft Windows, Mac OS X, and Linux (see also: list of operating systems, comparison of operating systems).

I mean the description of an operating system, what it does when and why goes far beyond an answer on this site imho.

Gregory Pakosz
+11  A: 

An operating system is a layer between your code (user code) and the hardware.

The OS is responsible for managing the physical components and giving you a simple (hopefully) API to build off. It handles which programs run, when, who goes first, how memory is handled, who gets memory, video drawing, and all that good stuff.

For example, when making a GUI, instead of you sending each bit to the monitor, you tell the OS (or window manager) to make a window. You then tell it to place a button in your window. The OS then handles drawing the window, moving the window, moving the button (but keeping it where it should be in the window).

Now, you can program an operating system in C++, but it's not easy. You have to develop your kernel and whatnot, find a way to interface with the hardware, then expose that interface to your users and their programs.

So, essentially, an OS handles software-to-hardware interfacing and manages your physical resources. C++ programs can be run in an OS or, with enough work, run by themselves or even be an OS.

peachykeen
C/C++ OSs are easy to setup. But dropping to assembly is necessary for small platform specific functions. Also, don't forget about threading and multitasking!
Earlz
@Earlz: Having written an OS scheduler in the past, I can confidently say that writing a scheduler to handle threading and multitasking is significantly easier (and more fun!) than writing a multi-threaded application. I would not say writing an OS in any language is "easy," though...
BlueRaja - Danny Pflughoeft
@BlueRaja yes it is. Low level work is the best kind!
Earlz
+4  A: 

An OS is really just a program that runs other programs and manages hardware resources for them.

If you are really serious about getting into the internals, I'd recommend reading the book Understanding the Linux Kernel.

Kristopher Johnson
+1  A: 

An operating system is just a software which is an interface between your hardware and your software. It makes an abstraction of this hardware to make it simpler to use. For instance, you don't have to read the keyboard status in your programs to check if the user hit a key. You might think of it as a lot of bricks put together and piled on top of each other, from a very precise view of the hardware to a very abstract view (from bits, to windows or buttons... for instance)

You don't have to program an operating system in a specific language, but most of them are written in C for efficiency and convenience reasons. You can do programming (your own applications) in any language then, provided that you have the correct libraries installed on the operating system.

Kamchatka
+1  A: 

There is no "clear" definition of what are the responsibilities of an OS. It could include the following:

  • Memory management
  • Devices & drivers
  • File system(s)
  • Processes and threads
  • System calls

In a nutshell OS is a program that enable the user to control computer's hardware in a relatively simple way

Dror Helper
There IS a clear definition of what are the responsibilities of an OS: it provides programs with access to underlying machine hardware. There is no clear definition for amount of virtualization/multiplexing the OS must provide, though.
Berkus
+1  A: 

From a programming perspective operating systems primarily provide abstraction. Abstraction from the details of the CPU and memory management, abstraction from dealing with hardware devices, abstraction from the details of network protocol stacks.

The operating system provides a higher-level programming interface, often standardized across several operating systems like POSIX does for all Unix flavors.

Asgeir S. Nilsen
+1  A: 

After reading the question, I see what you're trying to ask. What you're asking is if C/C++ programs require an OS to run. The answer is no. A C/C++ is a compiler that translate human language into machine language. It doesn't require a specific operating system. However, if you compile in say, Visual Studio, the resulting executable machine code can't run on anything but the Windows.

In specific, C/C++ code are usually portable in that if you have a compiler for an operating system, you can compile it and it will run like so. However, sometimes you have machine specific code (or OS specific code), such as a windows application that uses windows-based interfaces that cannot be ported over to another operating system. Some examples I can think of are like directory operations are usually not portable and usually depends on what OS you're on. However, most file operations, like fopen, are portable.

An OS is a bit different. It requires a different kind of compiler, and it requires a different way to load. Most OS are made in C/C++, it is then compiled by a compiler, then it is distributed. For example, Microsoft wrote Windows 95 in C/C++, they put it through a compiler, then burnt the resulting executable code into a CD-ROM, then sold it to you then you put the disk in and it will copy the resulting executable code onto your machine and you use it.

They don't give you the source code, then your computer compiles it; it's usually they give you the resulting executable.

Daniel
Writing an OS does *not* require a "different kind of compiler". At least, not beyond the compiler needing to output a different "executable" format (i.e. one that the bootloader can launch or that the hardware can start directly if the target system does things that way). Gcc builds linux and the userspace programs.
dmckee
@dmckee: there are more, subtle differences. For instance, the code generation for C++ features like exception handling may differ. And I don't think G++ (part of the Gnu Compiler Collection) can be used to build Linux - you need its C compiler. That shows even within GCC there are different kinds of compilers.
MSalters
@MSalters: This answer is misleading if left uncorrected. The GNU c compiler builds the linux kernel, most of the user space programs *and* the boot loader for most linux distributions. The fact the the GNU compiler collection contains more than one compiler adds nothing to the discussion. Indeed, if you go back to the days of gcc 1.34, there was only the one compiler (for c), and gcc *still* built the kernel and the user-space programs.
dmckee
@dmckee: please note that the question is about C++, not C. Therefore it is quite relevant that gcc includes both, but only the second can be used to build Linux
MSalters
+2  A: 

An operating system, more specifically its kernel, is developed in a language such as C. And it is compiled into machine code just like any other program. The major difference between a mainstream OS and some code that you write in C is that the C code will run in a timeshare via the OS's CPU Scheduler. Also consider that the OS runs first, and is able to setup such an environment where it completely controls and restricts anything which it launches. Also keep in mind that system calls are how a process can communicate back to the OS, everything is just typical machine instructions that could run on any other processor of its type.

A few key features that any mainstream OS provides:

  • CPU Scheduler - This will load a process, allow it to run for a very limited amount of time before kicking it back off, regaining control and allowing something else to run (wether it be a kernel task or another process, typically kernel tasks have priority)
  • Memory management - Any application which you run does not have exact memory addresses since this is prone to change. All processes will run in virtual memory, and the OS will translate virtual memory (ex: 0x41000+) into a physical address. (again, its abstracting the hardware as is mentioned often)
  • File systems - various kinds
  • Resources - any kind of device kind be treated as a resource. A process may request access to a resource. (Oddly enough, in this day and age no mainstream OS has a mechanism for preventing dead locks for resources.)
  • Security - This is done through roles. It is very important that every process run within tight constrictions. This is another abstraction that the OS provides.
Zombies
+6  A: 

Actually, the C++ standard itself has something to say on this issue. §1.4/7:

Two kinds of implementations are defined: hosted and freestanding. For a hosted implementation, this International Standard defines the set of available libraries. A freestanding implementation is one in which execution may take place without the benefit of an operating system, and has an implementation-defined set of libraries that includes certain language-support libraries (17.4.1.3).

And in 17.4.1.3,

A freestanding implementation has an implementation-defined set of headers. This set shall include at least the following headers, as shown in Table 13:

Table 13—C++ Headers for Freestanding Implementations
_______________________________________________
 Subclause Header(s)
 18.1 Types    <cstddef>   
 18.2 Implementation properties    <limits>
 18.3 Start and termination    <cstdlib>
 18.4 Dynamic memory management    <new>
 18.5 Type identification  <typeinfo>  
 18.6 Exception handling   <exception> 
 18.7 Other runtime support    <cstdarg>   

The supplied version of the header shall declare at least the functions abort(), atexit(), and exit() (18.3).

These headers either define constants or provide basic support to the compiler. In practice, some language features will be missing until the OS completes some initialization, for example new and catch.

Potatoswatter
+1  A: 

Basically an OS is the program that all other programs run inside of. It's literally the first program that your computer starts running when it boots up. As such, it controls all the hardware, and acts at the gatekeeper for other programs to access that hardware. It also controls ( or should, at least ) all the programs that are running under it -- when they start, how the stop, and what resources they have access to. You might call it "The Master Control Program" :)

+1  A: 

The term "operating system" when applied to a PC, normally refers to a modern "protected memory" operating system that provides not only a basic set of system services but also a complete user interface:

  • the combination of a kernel, device drivers, and system services that provide memory protection, tasks that can not interfere with each other's memory, and threads which are units of execution within a process, as well as ways for threads and tasks to talk to each other and to access shared resources like file-systems that contain files, on storage devices like your PC's hard disk, are in fact, the core of the operating system.

  • the "shell" on top of that operating system might be as simple as the "command.com" text command prompt on DOS (remember " C:> _ "?) or as complex as the Windows Shell, including its control panel, etc.

Sometimes, a "linux distribution" contains far more than an operating system, but is informally referred to by a single name (such as Ubuntu) and so the line between what the operating system is (the linux kernel and standard libraries perhaps) and the applications that merely ship with that operating system (the Gnome and KDE environments on Linux) is pretty gray.

A great way to learn what an operating system really is, is to read one of Tannenbaum's books on Operating Systems. I believe he shows the implementation in detail of his "minix" kernel. Another book is "Linux Kernel Internals". If you can handle the technical detail in this kind of book, then you can really understand what an operating system "kernel" is, and then begin to make sense of the layers around that kernel.

I am not aware of one commercial or open source operating system that is written primarily in C++. Such system-level programming is most commonly carried out in a mix of pure ANSI C, and Assembly/Machine language. The low level assembly bits often are involved in tasks like handling interrupts, initializing hardware and booting the system up. Before you have a heap, and a stack, and a working virtual memory system, you wouldn't want to be using C++ objects, or even certain C features like malloc. Your resources and your design must be constrained by performance criteria, and any kind of extra overhead, even a semantic overhead, is to be deplored.

Recently Linus Torvalds famously insulted C++ and described on a mailing list why he would never use it for a Linux kernel. I believe however, that C++ is making inroads in areas that have typically been havens of "pure C". The Gnu GCC team for example is willing to allow C++ into the GCC codebase now, at last.

Warren P