操作系统实际上做了什么?

时间:2010-05-05 20:04:48

标签: c++ operating-system

操作系统究竟做了什么?我知道操作系统可以编程,例如,C ++,但我之前认为C ++程序必须在操作系统下运行?有人可以解释并给出链接吗?在此先感谢,

11 个答案:

答案 0 :(得分:13)

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

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

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

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

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

答案 1 :(得分: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)。

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

确定,http://en.wikipedia.org/wiki/Operating_system

  

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

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

  • 内存管理
  • 设备&amp;驱动程序
  • 文件系统
  • 流程和主题
  • 系统调用

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

答案 7 :(得分:1)

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

操作系统提供了更高级别的编程接口,通常在多个操作系统上标准化,如POSIX适用于所有Unix风格。

答案 8 :(得分:1)

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

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

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

他们没有给你源代码,然后你的计算机编译它;它通常会为您提供最终的可执行文件。

答案 9 :(得分:1)

基本上,操作系统是所有其他程序在其中运行的程序。它实际上是计算机启动时开始运行的第一个程序。因此,它控制所有硬件,并在网守处作用于其他程序以访问该硬件。它还控制(或至少应该)在其下运行的所有程序 - 它们启动时,停止方式以及它们可以访问的资源。你可以称之为“主控制程序”:)

答案 10 :(得分:1)

术语“操作系统”在应用于PC时,通常是指现代“受保护的内存”操作系统,它不仅提供一组基本的系统服务,还提供完整的用户界面:

  • 一个内核,设备驱动程序和系统服务提供存储器保护,即不能与对方的存储器干扰任务,并且其是进程内执行单位的线程,以及用于螺纹方式的组合在PC硬盘等存储设备上,彼此交谈,访问包含文件的文件系统等共享资源的任务实际上是操作系统的核心。

  • 在该操作系统的顶部的“壳”可能是作为上DOS的“command.com”文本命令提示一样简单(记住“C产品:&gt; _”?)或作为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代码库。