操作系统到底是做什么的?

13

操作系统到底是做什么的?我知道操作系统可以用C++等编程语言来编写,但是我之前认为C++程序必须在操作系统下运行。能否有人解释一下并提供相关链接?谢谢,Ell


1
如果你想要一个关于操作系统主要通用问题的好概述,我推荐这本书:http://williamstallings.com/OS/OS6e.html。 - Martin Smith
11个回答

13

操作系统是介于您的代码(用户代码)和硬件之间的一层。

操作系统负责管理物理组件,并为您提供一个简单(希望如此)的API,以便构建应用程序。它处理哪些程序运行、何时运行、谁先运行、如何处理内存、谁获得内存、视频绘制等所有内容。

例如,当创建GUI时,您不需要直接将每个位发送到显示器,而是告诉操作系统(或窗口管理器)创建一个窗口,然后告诉它在您的窗口中放置一个按钮。然后操作系统会处理绘制窗口、移动窗口、移动按钮(但保持其在窗口中所在位置)等操作。

现在,您可以使用C++编写操作系统,但这并不容易。您需要开发自己的内核和其他组件,找到一种与硬件进行交互的方式,然后向用户及其程序公开该接口。

因此,操作系统处理软件与硬件之间的接口,并管理您的物理资源。C++程序可以在操作系统中运行,也可以通过足够的工作自行运行,甚至成为操作系统。


1
C/C++的操作系统很容易设置。但是为了实现小型平台特定的功能,需要转向汇编语言。此外,不要忘记线程和多任务处理! - Earlz
8
作为一名曾经编写过操作系统调度器的人,我可以自信地说,编写一个用于处理线程和多任务处理的调度器比编写多线程应用程序要容易得多(也更有趣!)。虽然我不会说用任何语言编写操作系统是“容易”的。 - BlueRaja - Danny Pflughoeft

6
实际上,C++标准本身对这个问题有所规定。§1.4/7中定义了两种实现:托管和独立。对于托管实现,国际标准定义了一组可用库。独立实现是指在没有操作系统的情况下可能进行执行,并具有包括某些语言支持库(17.4.1.3)在内的一组实现定义的库。
而在17.4.1.3中:
独立实现具有一组实现定义的头文件。该集合应至少包括如表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>   

提供的头文件版本应至少声明abort()、atexit()和exit()函数(18.3)。

这些头文件要么定义常量,要么为编译器提供基本支持。在实践中,某些语言特性将缺失,直到操作系统完成一些初始化工作,例如new和catch。


4

操作系统其实就是一个运行其他程序并管理它们的硬件资源的程序。

如果你真的想深入了解内部原理,我建议阅读书籍《深入理解Linux内核》


3

当然, http://en.wikipedia.org/wiki/Operating_system

操作系统是计算机上的软件,管理不同程序使用其硬件的方式,并规定用户控制计算机的方式。操作系统存在于几乎所有包含多个程序的计算机设备上,从手机和游戏机到超级计算机和Web服务器。一些流行的现代个人计算机操作系统包括Microsoft Windows、Mac OS X和Linux(另见:操作系统列表、操作系统比较)。

我的意思是,操作系统的描述,它何时以及为什么这样做远远超出了这个网站的答案范围。


2
操作系统,更具体地说是其内核,是用诸如C语言之类的语言开发的,并且与任何其他程序一样编译为机器码。主流操作系统与您使用C编写的某些代码之间的主要区别是,C代码将通过操作系统的CPU调度程序在时间共享中运行。同时要考虑到操作系统首先运行,并能够设置这样一个环境,在其中完全控制并限制它启动的所有内容。还要记住,系统调用是进程可以向操作系统通信的方式,一切都只是可以在其类型的任何其他处理器上运行的典型机器指令。
任何主流操作系统提供的几个关键功能:
- CPU 调度程序 - 这将加载一个进程,允许它运行非常有限的时间,然后将其退出,重新获得控制,并允许其他内容运行(无论是内核任务还是另一个进程,通常内核任务具有优先级) - 内存管理 - 你运行的任何应用程序都没有确切的内存地址,因为这很容易改变。所有进程都将运行在虚拟内存中,操作系统将把虚拟内存(例如:0x41000+)转换为物理地址。(再次强调,这是抽象化硬件常见的方式) - 文件系统 - 各种不同的 - 资源 - 任何类型的设备都可以被视为资源。一个进程可能会请求访问资源。(奇怪的是,在现今时代,没有任何主流操作系统具有预防资源死锁的机制。) - 安全性 - 这是通过角色完成的。每个进程在严格的约束条件下运行非常重要。这是操作系统提供的另一种抽象化。

1
一个操作系统只是一个软件,它是硬件和软件之间的接口。它对硬件进行抽象,使其更容易使用。例如,您不必在程序中读取键盘状态以检查用户是否按下了某个键。您可以将其想象为许多砖块放在一起并堆叠在一起,从硬件的非常精确的视图到非常抽象的视图(例如从位到窗口或按钮)。
您不必使用特定语言编写操作系统,但大多数操作系统出于效率和便利性原因都是用C语言编写的。您可以使用任何语言编程(您自己的应用程序),前提是您在操作系统上安装了正确的库。

1

操作系统的职责没有一个“明确”的定义。它可能包括以下内容:

  • 内存管理
  • 设备和驱动程序
  • 文件系统
  • 进程和线程
  • 系统调用

简而言之,操作系统是一种程序,使用户能够以相对简单的方式控制计算机硬件。


操作系统的职责有明确的定义:它为程序提供对底层机器硬件的访问。但是,操作系统必须提供多少虚拟化/复用并没有明确的定义。 - berkus

1
从编程的角度来看,操作系统主要提供抽象。抽象包括摆脱CPU和内存管理的细节、处理硬件设备的细节以及处理网络协议栈的细节。
操作系统提供了更高级别的编程接口,通常在多个操作系统上标准化,例如POSIX为所有Unix变体所做的那样。

1
阅读问题后,我看到你想问什么。你问的是C/C++程序是否需要操作系统来运行。答案是否定的。C/C++编译器将人类语言转换为机器语言。它不需要特定的操作系统。但是,如果你在Visual Studio中进行编译,则生成的可执行机器码只能在Windows上运行。
具体而言,C/C++代码通常是可移植的,如果你有一个操作系统的编译器,你可以编译它,并且它会像这样运行。但是,有时候你会有专门针对某些机器或操作系统的代码,例如使用Windows界面的Windows应用程序,不能移植到另一个操作系统。一些例子包括像目录操作之类的通常不可移植,并且通常取决于你所使用的操作系统。但是,大多数文件操作,比如fopen,都是可移植的。

操作系统有些不同。它需要一种不同类型的编译器,以及一种不同的加载方式。大多数操作系统都是用C/C++编写的,然后由编译器编译,随后分发。例如,微软使用C/C++编写了Windows 95,将其通过编译器编译后烧录到光盘上进行销售。您只需将光盘放入计算机中,它就会将所得到的可执行代码复制到您的机器上供您使用。

他们不会给你源代码,让你的计算机进行编译;通常情况下,他们会给你生成的可执行文件。


2
编写操作系统并不需要“不同类型的编译器”。至少,在编译器需要输出不同的“可执行”格式方面是如此(即引导加载程序可以启动或硬件可以直接启动,如果目标系统以这种方式进行)。GCC构建Linux和用户空间程序。 - dmckee --- ex-moderator kitten
@dmckee:还有更微妙的差别。例如,C++特性(如异常处理)的代码生成可能会有所不同。我认为G++(GNU编译器集合的一部分)不能用于构建Linux - 你需要它的C编译器。这表明即使在GCC内部也有不同种类的编译器。 - MSalters
@MSalters:如果不进行更正,这个答案是误导性的。GNU C编译器构建了Linux内核、大多数用户空间程序以及大多数Linux发行版的引导加载程序。GNU编译器集合包含多个编译器这一事实对讨论没有任何帮助。事实上,如果回到gcc 1.34的时代,只有一个(用于c的)编译器,而gcc仍然可以构建内核和用户空间程序。 - dmckee --- ex-moderator kitten
请注意,@dmckee:问题是关于C++,而不是C。因此,虽然gcc包含两者,但只有第二个才能用于构建Linux。 - MSalters

1
基本上,操作系统是所有其他程序运行的程序。它是你的计算机启动时运行的第一个程序。因此,它控制所有硬件,并作为其他程序访问该硬件的门卫。它还控制(或者至少应该控制)在其下运行的所有程序-它们何时启动,如何停止以及可以访问哪些资源等。你可能会称之为“主控程序” :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接