There appears to be no single answer to this question, that satisfies all parties. With this in mind, the following broad definition will be applied:

An Operating System is the collection of software that makes the hardware usable.

The design of a typical Operating System tends to split the work into two distinct parts: “the kernel”, and “everything else”.

The Kernel

The kernel is the very heart of the Operating System. The kernel provides (hopefully) some kind of useful and consistent abstraction of the hardware that it is running on. It effectively provides the most basic software interface to the hardware: it deals with things like interrupts, manages memory, and allows reading/writing to things like SD cards without having to deal with things like protocols and timings. In short, the kernel is what enables developers to start being productive, free from having to deal with all of the deepest, most technical aspects of the actual hardware.

“An Operating System is the collection of software that makes the hardware usable.”

Everything Else

Above the kernel lies “everything else” about the Operating System. These represent software that utilise the kernel in order to bring higher-order functionality to the system as a whole. For example, tools and utilities such as programming languages, GUIs (Graphical User Interfaces), and web browsers may be considered part of the Operating System.

Although both developer and user must include the kernel as part of the Operating System, where a developer may decide to include a small set of “extras” (such as a standard library, a text editor, a compiler), a user’s view may stretch further to include a GUI, a web browser, a word processor and often more.

It may be that a simple definition of an Operating System is software that turns hardware into something usable for the developer, but something useful for the user.