【发布时间】:2011-02-16 02:39:11
【问题描述】:
操作系统到底是做什么的?我知道操作系统可以用例如 C++ 编程,但我以前认为 C++ 程序必须在操作系统下运行?有人可以解释一下并给出链接吗?提前谢谢,呃
【问题讨论】:
-
如果你想对关键的一般问题有一个很好的概述,我推荐这本书williamstallings.com/OS/OS6e.html
标签: c++ operating-system
操作系统到底是做什么的?我知道操作系统可以用例如 C++ 编程,但我以前认为 C++ 程序必须在操作系统下运行?有人可以解释一下并给出链接吗?提前谢谢,呃
【问题讨论】:
标签: c++ operating-system
操作系统是您的代码(用户代码)和硬件之间的一层。
操作系统负责管理物理组件并为您提供一个简单的(希望如此)API 以供您构建。它处理哪些程序运行、何时运行、谁先运行、如何处理内存、谁获得内存、视频绘图以及所有这些好东西。
例如,在制作 GUI 时,不是将每个位发送到监视器,而是告诉操作系统(或窗口管理器)制作一个窗口。然后你告诉它在你的窗口中放置一个按钮。操作系统然后处理绘制窗口、移动窗口、移动按钮(但将其保持在窗口中应位于的位置)。
现在,您可以使用 C++ 编写操作系统,但这并不容易。您必须开发内核等等,找到与硬件接口的方法,然后将该接口公开给您的用户和他们的程序。
因此,从本质上讲,操作系统处理软件到硬件的接口并管理您的物理资源。 C++ 程序可以在 OS 中运行,或者,经过足够的工作,可以自行运行,甚至是 OS。
【讨论】:
其实,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。
【讨论】:
操作系统实际上只是一个运行其他程序并为它们管理硬件资源的程序。
如果你真的很想进入内部,我建议你阅读本书Understanding the Linux Kernel。
【讨论】:
当然,http://en.wikipedia.org/wiki/Operating_system
操作系统是计算机上的软件,它管理不同程序使用其硬件的方式,并规范用户控制计算机的方式。操作系统几乎可以在任何包含具有多个程序的计算机的设备上找到——从手机和视频游戏机到超级计算机和网络服务器。一些流行的现代个人计算机操作系统包括 Microsoft Windows、Mac OS X 和 Linux(另请参阅:操作系统列表、操作系统比较)。
我的意思是对操作系统的描述,它在什么时候做什么以及为什么远远超出了这个网站恕我直言的答案。
【讨论】:
操作系统,更具体地说是它的内核,是用诸如 C 之类的语言开发的。它像任何其他程序一样被编译成机器代码。主流操作系统与您用 C 编写的某些代码之间的主要区别在于,C 代码将通过操作系统的 CPU 调度程序分时运行。还要考虑操作系统首先运行,并且能够设置这样一个环境,它完全控制和限制它启动的任何东西。还要记住,系统调用是进程与操作系统进行通信的方式,一切都只是可以在任何其他同类处理器上运行的典型机器指令。
任何主流操作系统都提供的一些关键功能:
【讨论】:
操作系统只是一个软件,它是您的硬件和软件之间的接口。它对该硬件进行了抽象,以使其更易于使用。例如,您不必在程序中读取键盘状态来检查用户是否按了键。你可能会认为它是一堆堆在一起的砖块,从非常精确的硬件视图到非常抽象的视图(从位、到窗口或按钮……例如)
您不必使用特定语言编写操作系统,但出于效率和方便的原因,大多数操作系统都是用 C 编写的。然后,您可以使用任何语言进行编程(您自己的应用程序),前提是您在操作系统上安装了正确的库。
【讨论】:
对于操作系统的职责没有“明确”的定义。它可能包括以下内容:
简而言之,操作系统是一个程序,使用户能够以相对简单的方式控制计算机的硬件
【讨论】:
从编程的角度来看,操作系统主要提供抽象。从 CPU 和内存管理的细节中抽象出来,从处理硬件设备的细节中抽象出来,从网络协议栈的细节中抽象出来。
操作系统提供更高级别的编程接口,通常跨多个操作系统标准化,如 POSIX 为所有 Unix 风格所做的那样。
【讨论】:
阅读问题后,我明白您要问什么。您要问的是 C/C++ 程序是否需要操作系统才能运行。答案是不。 C/C++ 是一种将人类语言翻译成机器语言的编译器。它不需要特定的操作系统。但是,如果您在 Visual Studio 中进行编译,则生成的可执行机器代码只能在 Windows 上运行。
具体来说,C/C++ 代码通常是可移植的,如果你有一个操作系统的编译器,你可以编译它,它会像这样运行。但是,有时您有特定于机器的代码(或特定于操作系统的代码),例如使用基于 Windows 的界面的 Windows 应用程序,该界面无法移植到另一个操作系统。我能想到的一些示例就像目录操作通常不可移植,并且通常取决于您使用的操作系统。然而,大多数文件操作,如 fopen,都是可移植的。
操作系统有点不同。它需要不同类型的编译器,并且需要不同的加载方式。大多数操作系统都是用 C/C++ 编写的,然后由编译器编译,然后分发。例如,微软用 C/C++ 编写 Windows 95,他们通过编译器,然后将生成的可执行代码刻录到 CD-ROM 中,然后将其卖给您,然后放入磁盘,它会复制生成的可执行代码到您的机器上并使用它。
他们不给你源代码,然后你的电脑编译它;通常他们会给你生成的可执行文件。
【讨论】:
基本上,操作系统是所有其他程序在其中运行的程序。它实际上是您的计算机在启动时开始运行的第一个程序。因此,它控制所有硬件,并充当看门人,让其他程序访问该硬件。它还控制(或至少应该)在其下运行的所有程序——它们何时启动、如何停止以及它们可以访问哪些资源。你可以称它为“主控制程序”:)
【讨论】:
“操作系统”一词应用于 PC 时,通常是指现代“受保护的内存”操作系统,它不仅提供一组基本的系统服务,还提供完整的用户界面:
提供内存保护的内核、设备驱动程序和系统服务、不会相互干扰内存的任务、作为进程内执行单元的线程以及线程方式的组合以及相互交谈和访问共享资源(如包含文件的文件系统)、存储设备(如 PC 硬盘)上的任务实际上是操作系统的核心。
操作系统顶部的“shell”可能与 DOS 上的“command.com”文本命令提示符一样简单(还记得“C:> _”吗?)或与 Windows Shell 一样复杂,包括它的控制面板等。
有时,“Linux 发行版”包含的远不止一个操作系统,而是由一个名称(例如 Ubuntu)非正式地引用,因此操作系统是什么(可能是 linux 内核和标准库)之间的界线) 并且仅附带该操作系统的应用程序(Linux 上的 Gnome 和 KDE 环境)非常灰暗。
了解操作系统到底是什么的一个好方法是阅读 Tannenbaum 的一本关于操作系统的书籍。我相信他详细展示了他的“minix”内核的实现。另一本书是“Linux Kernel Internals”。如果您能够处理这类书中的技术细节,那么您就可以真正理解操作系统“内核”是什么,然后开始理解围绕该内核的层。
我不知道有一种主要用 C++ 编写的商业或开源操作系统。这种系统级编程最常见的是纯 ANSI C 和汇编/机器语言的混合。低级汇编位通常涉及处理中断、初始化硬件和启动系统等任务。在您拥有堆、堆栈和工作虚拟内存系统之前,您不会想要使用 C++ 对象,甚至不想使用某些 C 特性,例如 malloc。您的资源和您的设计必须受到性能标准的限制,任何类型的额外开销,甚至是语义开销,都将受到谴责。
最近 Linus Torvalds 著名地侮辱了 C++,并在邮件列表中描述了为什么他永远不会将它用于 Linux 内核。然而,我相信 C++ 正在进军通常是“纯 C”天堂的领域。例如,Gnu GCC 团队现在终于愿意允许 C++ 进入 GCC 代码库。
【讨论】: