【问题标题】:What Does an OS Actually Do?操作系统实际上做了什么?
【发布时间】:2011-02-16 02:39:11
【问题描述】:

操作系统到底是做什么的?我知道操作系统可以用例如 C++ 编程,但我以前认为 C++ 程序必须在操作系统下运行?有人可以解释一下并给出链接吗?提前谢谢,呃

【问题讨论】:

标签: c++ operating-system


【解决方案1】:

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

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

例如,在制作 GUI 时,不是将每个位发送到监视器,而是告诉操作系统(或窗口管理器)制作一个窗口。然后你告诉它在你的窗口中放置一个按钮。操作系统然后处理绘制窗口、移动窗口、移动按钮(但将其保持在窗口中应位于的位置)。

现在,您可以使用 C++ 编写操作系统,但这并不容易。您必须开发内核等等,找到与硬件接口的方法,然后将该接口公开给您的用户和他们的程序。

因此,从本质上讲,操作系统处理软件到硬件的接口并管理您的物理资源。 C++ 程序可以在 OS 中运行,或者,经过足够的工作,可以自行运行,甚至是 OS。

【讨论】:

  • C/C++ 操作系统易于安装。但是对于小型平台的特定功能,需要进行组装。另外,不要忘记线程和多任务处理!
  • @Earlz:在过去编写过操作系统调度程序后,我可以自信地说,编写调度程序来处理线程和多任务处理比编写多线程应用程序要容易得多(而且更有趣!)。我不会说用任何语言编写操作系统是“容易的”,但......
【解决方案2】:

其实,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)。

这些头文件要么定义常量,要么为编译器提供基本支持。实际上,在操作系统完成某些初始化之前,某些语言功能将丢失,例如newcatch

【讨论】:

    【解决方案3】:

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

    如果你真的很想进入内部,我建议你阅读本书Understanding the Linux Kernel

    【讨论】:

      【解决方案4】:

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

      操作系统是计算机上的软件,它管理不同程序使用其硬件的方式,并规范用户控制计算机的方式。操作系统几乎可以在任何包含具有多个程序的计算机的设备上找到——从手机和视频游戏机到超级计算机和网络服务器。一些流行的现代个人计算机操作系统包括 Microsoft Windows、Mac OS X 和 Linux(另请参阅:操作系统列表、操作系统比较)。

      我的意思是对操作系统的描述,它在什么时候做什么以及为什么远远超出了这个网站恕我直言的答案。

      【讨论】:

        【解决方案5】:

        操作系统,更具体地说是它的内核,是用诸如 C 之类的语言开发的。它像任何其他程序一样被编译成机器代码。主流操作系统与您用 C 编写的某些代码之间的主要区别在于,C 代码将通过操作系统的 CPU 调度程序分时运行。还要考虑操作系统首先运行,并且能够设置这样一个环境,它完全控制和限制它启动的任何东西。还要记住,系统调用是进程与操作系统进行通信的方式,一切都只是可以在任何其他同类处理器上运行的典型机器指令。

        任何主流操作系统都提供的一些关键功能:

        • CPU 调度程序 - 这将加载一个进程,允许它运行一段非常有限的时间,然后将其退出,重新获得控制权并允许其他东西运行(无论是内核任务还是其他进程,通常是内核任务优先)
        • 内存管理 - 您运行的任何应用程序都没有确切的内存地址,因为这很容易发生变化。所有进程都将在虚拟内存中运行,操作系统会将虚拟内存(例如:0x41000+)转换为物理地址。 (同样,它抽象了经常提到的硬件)
        • 文件系统 - various kinds
        • 资源 - 任何类型的设备都被视为资源。进程可以请求访问资源。 (奇怪的是,在当今时代,没有主流操作系统具有防止资源死锁的机制。)
        • 安全 - 这是通过角色完成的。每个过程都在严格的限制内运行是非常重要的。这是操作系统提供的另一种抽象。

        【讨论】:

          【解决方案6】:

          操作系统只是一个软件,它是您的硬件和软件之间的接口。它对该硬件进行了抽象,以使其更易于使用。例如,您不必在程序中读取键盘状态来检查用户是否按了键。你可能会认为它是一堆堆在一起的砖块,从非常精确的硬件视图到非常抽象的视图(从位、到窗口或按钮……例如)

          您不必使用特定语言编写操作系统,但出于效率和方便的原因,大多数操作系统都是用 C 编写的。然后,您可以使用任何语言进行编程(您自己的应用程序),前提是您在操作系统上安装了正确的库。

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

            • 操作系统的职责有一个明确的定义:它为程序提供对底层机器硬件的访问权限。不过,对于操作系统必须提供的虚拟化/多路复用的数量没有明确的定义。
            【解决方案8】:

            从编程的角度来看,操作系统主要提供抽象。从 CPU 和内存管理的细节中抽象出来,从处理硬件设备的细节中抽象出来,从网络协议栈的细节中抽象出来。

            操作系统提供更高级别的编程接口,通常跨多个操作系统标准化,如 POSIX 为所有 Unix 风格所做的那样。

            【讨论】:

              【解决方案9】:

              阅读问题后,我明白您要问什么。您要问的是 C/C++ 程序是否需要操作系统才能运行。答案是不。 C/C++ 是一种将人类语言翻译成机器语言的编译器。它不需要特定的操作系统。但是,如果您在 Visual Studio 中进行编译,则生成的可执行机器代码只能在 Windows 上运行。

              具体来说,C/C++ 代码通常是可移植的,如果你有一个操作系统的编译器,你可以编译它,它会像这样运行。但是,有时您有特定于机器的代码(或特定于操作系统的代码),例如使用基于 Windows 的界面的 Windows 应用程序,该界面无法移植到另一个操作系统。我能想到的一些示例就像目录操作通常不可移植,并且通常取决于您使用的操作系统。然而,大多数文件操作,如 fopen,都是可移植的。

              操作系统有点不同。它需要不同类型的编译器,并且需要不同的加载方式。大多数操作系统都是用 C/C++ 编写的,然后由编译器编译,然后分发。例如,微软用 C/C++ 编写 Windows 95,他们通过编译器,然后将生成的可执行代码刻录到 CD-ROM 中,然后将其卖给您,然后放入磁盘,它会复制生成的可执行代码到您的机器上并使用它。

              他们不给你源代码,然后你的电脑编译它;通常他们会给你生成的可执行文件。

              【讨论】:

              • 编写操作系统不需要需要“不同类型的编译器”。至少,编译器需要输出不同的“可执行”格式(即引导加载程序可以启动的格式,或者如果目标系统这样做,硬件可以直接启动)。 Gcc 构建 linux 和用户空间程序。
              • @dmckee:还有更多细微的差别。例如,异常处理等 C++ 功能的代码生成可能会有所不同。而且我不认为 G++(Gnu Compiler Collection 的一部分)可以用来构建 Linux——你需要它的 C 编译器。这表明即使在 GCC 中也有不同种类的编译器。
              • @MSalters:如果不加以纠正,这个答案会产生误导。 GNU c 编译器构建 linux 内核、大多数用户空间程序大多数 linux 发行版的引导加载程序。 GNU 编译器集合包含多个编译器这一事实并没有增加讨论的内容。事实上,如果你回到 gcc 1.34 的时代,只有一个编译器(用于 c),而 gcc 仍然构建了内核和用户空间程序。
              • @dmckee:请注意问题是关于 C++,而不是 C。因此 gcc 包含两者是非常相关的,但只有第二个可用于构建 Linux
              【解决方案10】:

              基本上,操作系统是所有其他程序在其中运行的程序。它实际上是您的计算机在启动时开始运行的第一个程序。因此,它控制所有硬件,并充当看门人,让其他程序访问该硬件。它还控制(或至少应该)在其下运行的所有程序——它们何时启动、如何停止以及它们可以访问哪些资源。你可以称它为“主控制程序”:)

              【讨论】:

                【解决方案11】:

                “操作系统”一词应用于 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 代码库。

                【讨论】:

                  猜你喜欢
                  • 2013-06-02
                  • 2020-11-21
                  • 2015-02-26
                  • 2017-06-29
                  • 2013-06-13
                  • 2021-10-25
                  • 2011-08-12
                  • 1970-01-01
                  • 2010-11-27
                  相关资源
                  最近更新 更多