Questions tagged «operating-systems»

操作系统(OS)是基本软件,其规则是对软件和可用硬件的中间软件需求,管理输入/输出,内存分配/重新分配,文件系统以及设备应执行的其他基本任务。

6
我们如何将(分层)文件系统作为基本数据结构?
我是自学成才的,没有CS学位。在这个时代,我对数据结构的了解越多,我就越想知道,我们如何仍将文件系统,目录和文件作为OS上的基本数据存储结构? 我了解它的简单性,但如今看来,可能会有更多本机可用的选项。据我所知,唯一改善文件系统基本功能的项目是ReiserFS,您可以在其中知道文件的哪一行由谁以及何时更改。 例如,如果我可以对文件进行本机标记,则可以在其中标记图像,图表,文字处理文档,整个代码存储库,这些都属于一个项目,这对我真的很有帮助。由于我陷入了文件系统范式中,所以我知道可以将所有这些文件放到一个文件夹/目录中,但是如果它们已经存在于不同的目录中并且需要留在那儿呢?我知道那里有可以做到这一点的程序,但是为什么它们不在文件系统上? 很好的东西是文件系统中的某种关系功能,就像使用RDBMSes一样。我知道那应该是Vista / 7的一部分,但是那也不属于功能列表。 当然,任何程序都可以存储二进制文件并在其中具有任何数据结构,为什么操作系统除了文件系统的简单体系结构之外,不能提供更复杂的数据存储方式?

7
为什么SSL / TLS没有内置在现代操作系统中?
大多数主要操作系统都内置了许多构成Internet基础结构的基本网络协议。例如,TCP,UDP和DNS都内置在Linux,UNIX和Windows中,并可以通过低级系统API供程序员使用。 但是当涉及到SSL或TLS时,必须转向第三方库,例如OpenSSL或Mozilla NSS。 SSL是一个相对较旧的协议,它基本上是与TCP / IP一样普遍的行业标准,那么为什么它不内置在大多数操作系统中?

3
多任务如何工作
我对操作系统的内部运作一无所知,但是我可以或多或少地猜测许多功能的近似行为。不过,我无法弄清的一件事是多任务处理。 从理论上讲,操作系统会根据CPU以较小的时间间隔运行各种程序来管理时间。但目前还不清楚这是如何真正起作用。 假设操作系统要启动我的程序。机器代码从某个地址开始加载到RAM中的某个位置。我想应该跳转到该地址,以便执行我的代码。但是以这种方式,直到我跳回操作系统,操作系统才能重新获得控制权。 基本上,我可以想象只有两种方式可以完成这项工作,但似乎都不合适: 操作系统可以读取我要执行的机器指令并对其进行仿真,而不是直接执行它们。我故意含糊其词,因为我不知道这将如何工作,但似乎会大大减慢该程序的速度。 或者,操作系统可以等到我进行系统调用。在那一刻,它重新获得控制权,并可以检查我已经运行了多长时间并进行了分时操作。这可能有效,但是似乎不可靠,因为我可以进行很长的计算而不涉及系统调用,并且会挂起所有内容一段时间。 因此,似乎这两种机制都无法很好地发挥作用。实际如何执行多任务处理?

8
您认为托管操作系统是个好主意吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 诸如Microsoft Singularity和JNode之类的托管OS 是一个非常有趣的概念。从本质上讲,操作系统是用用低级语言(C / C ++ / Assembly)编写的代码引导的,该语言本质上实现了虚拟机。其余的OS(以及所有userland应用程序)在虚拟机上运行。有一些很棒的事情。例如,您突然使任意指针过时了。如果编写得当,您将摆脱大多数现代OS当前拥有的大量遗留问题。 但是,缺点是,您与硬件之间的距离太远了,而作为开发人员,您将无法下降到较低的抽象级别并弄脏您的手。 您对此有何看法?

2
DMA控制器如何工作?
摘自Andrew S. Tanenbaum(第5.1.4节,现代操作系统中的直接内存访问),Herbert Bos,2014年, 为了简化说明,我们假定CPU通过连接CPU,内存和I / O设备的单个系统总线访问所有设备和内存,如图5-4所示。 为了解释DMA的工作原理,让我们首先看一下不使用DMA时如何进行磁盘读取。 首先,磁盘控制器逐位从驱动器逐位顺序读取该块(一个或多个扇区),直到整个块都在控制器的内部缓冲区中为止。 接下来,它计算校验和以验证没有发生读取错误。然后,控制器引起中断。操作系统开始运行时,它可以通过执行循环从控制器缓冲区一次读取一个字节或一个字的磁盘块,每次迭代都从控制器设备寄存器中读取一个字节或一个字并将其存储在主存储器中。 问:在第二步中 数据不是从“控制器的缓冲区 ”传输到主存储器吗?为什么既说“ 来自控制器的缓冲区 ” 又说“ 来自控制器设备寄存器 ”? 在第二步中,控制器可以将数据从其缓冲区传输到主存储器,而不会中断cpu,也无需再次涉及OS吗? 使用DMA时,过程不同。 首先,CPU通过设置其寄存器来对DMA控制器进行编程,以使其知道在何处传输(图5-4中的步骤1)。 它还向磁盘控制器发出命令,告诉它将数据从磁盘读入其内部缓冲区并验证校验和。 当有效数据位于磁盘控制器的缓冲区中时,DMA可以开始。DMA控制器通过在总线上向磁盘控制器发出读取请求来启动传输(步骤2)。此读取请求看起来与其他任何读取请求一样,并且磁盘控制器不知道(或不在乎)它是来自CPU还是来自DMA控制器。通常,要写入的内存地址在总线的地址线上,因此,当磁盘控制器从其内部缓冲区中提取下一个字时,它便知道将其写入哪里。写入内存是另一个标准的总线周期(步骤3)。 写入完成后,磁盘控制器也会通过总线将确认信号发送到DMA控制器(步骤4)。然后,DMA控制器增加要使用的存储器地址,并减少字节数。如果字节计数仍大于0,则重复步骤2至4,直到计数达到0。 那时,DMA控制器中断CPU,以告知传输现在已完成。操作系统启动时,不必将磁盘块复制到内存;它已经在那里。 问:在第二步中,DMA控制器请求磁盘控制器将数据从磁盘控制器的缓冲区传输到主内存。第一步,CPU向磁盘控制器发出命令,告诉它将数据从磁盘读入其内部缓冲区。同时,当磁盘控制器完成将数据从磁盘传输到磁盘控制器的缓冲区时,CPU是否还可以告知磁盘控制器将数据从磁盘控制器的缓冲区传输到主内存,因此不需要DMA控制器告诉磁盘控制器将数据从磁盘控制器的缓冲区传输到主存储器?(我不明白为什么我们需要一个DMA控制器在磁盘和主内存之间进行数据传输,所以我想我错过了理解报价的重要内容)。 设备的设备控制器控制该设备并在该设备上执行操作。DMA控制器在什么设备上控制和执行操作? 谢谢!

4
测试具有随机行为的程序的最佳实践是什么?
在进行研发工作时,我经常发现自己编写的程序在行为上有很大的随机性。例如,当我从事基因编程工作时,我经常编写生成并执行任意随机源代码的程序。 测试此类代码的问题在于,错误通常是间歇性的,并且很难重现。这不仅仅是将随机种子设置为相同的值并重新开始执行。 例如,代码可能从内核环形缓冲区读取一条消息,然后对消息内容进行条件跳转。自然,当以后尝试重现该问题时,环形缓冲区的状态将已更改。 即使此行为是一种功能,它也可能以意想不到的方式触发其他代码,从而经常揭示出单元测试(或人工测试人员)找不到的错误。 是否有建立此类测试系统的最佳实践?如果是这样,一些参考资料将非常有帮助。如果没有,欢迎任何其他建议!

8
分布式计算到底是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 究竟什么构成分布式计算,它与并行/并发计算有何不同? 在多个并行线程中尝试使用互斥量和信号量尝试同步访问资源是否会在分布式计算领域构成问题?

9
Ubuntu是否可以作为IT顾问的笔记本电脑使用?
我通常在大型企业中担任顾问程序员。我使用Windows笔记本电脑,而我的许多同事都使用Mac。 如果可以完全控制自己的开发环境,我个人将是运行Ubuntu。但是我偶尔会需要Microsoft特定的产品,尤其是IE。 在这种情况下,使用Mac的同事经常在虚拟机上运行Windows。 我的问题是:Ubuntu对于企业程序员的笔记本电脑是否可行?例如,在Ubuntu的VM上运行Windows是否像在Mac上一样容易?有没有人尝试过这个?在这种环境下,Ubuntu不能与Mac一样好地用于开发吗? 请注意,我没有进行.NET开发,因此通常要处理Java,该Java将在Apache服务器上运行,并由运行Windows的客户端使用。

8
C字符串是否始终以null终止,还是取决于平台?
现在,我正在使用嵌入式系统,并研究在没有操作系统的微处理器上实现字符串的方法。到目前为止,我正在做的只是使用使NULL终止的字符指针并将它们视为NULL表示结尾的字符串的想法。我知道这很普遍,但是您是否总是可以指望这种情况? 我问的原因是我正在考虑也许在某个时候使用实时操作系统,并且我想尽可能多地重用当前代码。因此,对于存在的各种选择,我是否可以期望字符串能够正常工作? 让我更具体地说明我的情况。我正在实现一个通过串行端口接收和处理命令的系统。我能否保持命令处理代码相同,然后期望在RTOS(包含命令)上创建的字符串对象全部以NULL终止?还是根据操作系统而有所不同? 更新资料 在被建议看一下这个问题之后,我确定它不能完全回答我的要求。问题本身是在询问是否应该始终传递字符串的长度,这与我要问的完全不同,尽管某些答案中包含有用的信息,但它们并不是我要找的。那里的答案似乎提供了为什么或为什么不以空字符终止字符串的原因。我要问的是,我是否可以或多或少地期望不同平台的出生字符串以空值终止自己的字符串,而不必走出去尝试在那里的每个平台。

2
文件系统是否将存储设备视为(非常大的)字节数组?
我想知道文件系统如何写入和读取存储设备。 我认为这是这样的: 文件系统不会直接访问存储设备,而是(通过存储设备的设备驱动程序)将存储设备作为(很大)字节数组呈现给文件系统。 例如,如果文件系统要访问硬盘,它将仅访问代表硬盘的字节数组。 这样,文件系统可以与任何类型的存储设备(传统硬盘,SSD,USB闪存驱动器等)一起使用,并且仅更改存储设备的设备驱动程序。 此图显示了我刚刚解释的内容: 我的理解正确吗?

2
RTOS与Bare Metal在MCU编程方面的优势?
请注意:这个问题专门提到了两个RTOS,但更为通用,以前曾为嵌入式RTOS编写过C代码并且直接在MCU上运行其软件的任何人都可以回答。 我有兴趣了解有关嵌入式RTOS的更多信息并为其编写应用程序。我目前正在查看Embox和RIOT,因为它们是开源的,现代的,活跃的并且似乎有出色的文档。我的目标分为两个阶段:第一阶段是弄清楚如何将这些OS编译并刷新到MCU(可能是AVR或ARM)。然后,第2阶段将编写一个简单的C程序(基本上是一个无头的守护程序),该程序会随着时间的流逝而发展为“业余应用程序”。然后,我将该程序刷新/部署到同一MCU,从而成功部署了一个由Embox / RIOT和位于其之上的应用程序组成的应用程序堆栈。 在走上任何最终导致死胡同的道路之前,我偶然发现了这篇文章,很好地解释了为什么用C /汇编器编写并闪存到MCU的实时应用程序真正不需要它们下面的RTOS。 。 所以现在我真的很困惑,并且质疑我对计算理论的一些基本理解。我想我想首先决定是否使用Embox / RIOT,或者: 保持进度,并在两个OS +应用程序的MCU上使用“应用程序堆栈”;要么 请留意本文的警告,并选择运行我的应用程序“裸机”的MCU 显然,前者需要做更多的工作,因此最好还是有一个很好的理由/选择那条路线。因此,我想问:这些(和类似的)嵌入式RTOS为MCU / C应用程序开发人员提供的真正好处是什么?使用RTOS,我的C应用程序可以从哪些特定功能中受益(也许不重新发明轮子?)?抛弃RTOS并裸机失去了什么? 我在这里要求具体的例子,而不是当您进入RTOS的Wikipedia条目时获得的媒体宣传;-)

3
在底层组件上进行TDD是个好主意吗?
我正在考虑编写低级驱动程序或OS组件/内核。 该osdev.org人们似乎认为重要的位没有有意义的可测试这种方式,但我看过一些讨论,有人认为是不同的。我环顾四周,但未能在低级组件上找到任何TDD的实际示例。 这是人们实际上在做的事情,还是人们在理论上谈论的事情,因为在实践中没有好的方法?

1
了解计算水平
对不起,我的困惑的问题。我在寻找一些指针。 到目前为止,我主要在应用程序层上使用Java和Python,并且对操作系统和硬件的理解还很模糊。我想了解更多有关较低级别的计算的信息,但是它确实以某种方式变得不知所措。在大学里,我参加了一门有关微程序设计的课程,即如何使处理器硬连线以实现ASM代码。到目前为止,我一直认为,如果对“低水平”知识更多,我将无法完成更多工作。 我有一个问题:硬件怎么可能几乎完全被开发人员隐藏?准确地说,操作系统是硬件的软件层吗?一个小例子:在编程中,我从来没有遇到过了解什么是L2或L3缓存的需求。对于典型的业务应用程序环境,几乎不需要了解汇编程序和较低级别的计算,因为当今存在几乎所有内容都可以使用的技术堆栈。我猜这些较低级别的重点是为高层提供接口。另一方面,我想知道较低的水平会对整个图形计算产生什么影响。 因此,另一方面,存在理论上的计算机科学分支,该分支适用于抽象计算模型。但是,我也很少遇到这样的情况,我发现它在复杂性模型,证明验证等类别中很有帮助。我有点知道,有一个称为NP的复杂性类,它们是无法解决的我想念的是一个框架,供您考虑这些事情。在我看来,这里有各种不同的阵营,很少互动。 最近几周,我一直在阅读有关安全性问题的信息。在这里,许多不同的层以某种方式汇聚在一起。攻击和利用几乎总是发生在较低级别,因此在这种情况下,有必要了解OSI层的详细信息,OS的内部工作原理等。

9
功能开发的操作系统选择[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我主要是.NET开发人员,所以我通常使用Windows / VisualStudio(这意味着:我很受宠),但是我在业余时间喜欢Haskell和其他(大多数是功能性的)语言。 现在,对于Haskell来说,Windows支持是可以的(您可以获取Haskell-Platform),但是latley我试图建立一个基本的Clojure / Scheme环境,这在Windows上很痛苦。 因此,我正在考虑尝试其他操作系统以获得更好的工具和语言支持。当然,这使我有了MacOS或某些Linux发行版。 我以前从未使用过MacOS,当然Linux会便宜(免费),而且我认为我不能在普通的PC硬件上并行引导MacOS(可以吗?)。加:我不知道可以在那些(对我)外国操作系统上使用的工具。 简而言之:我想探索更多Haskell,Clojure,Scala,Scheme,当然至少需要JavaScript / HTML5 / Css的良好工具。对.NET / Mono / F#的支持会很棒,但是为此,我仍将拥有Win7引导程序。 所以我想知道:-您首选的操作系统是什么,发行版(Ubuntu可行吗?)-您使用的是什么Editor / IDE 感谢您的帮助! PS:我不确定这是否是解决此问题的正确地方,但我当然希望如此-如果没有,请告诉我应该将其移至何处(StackOverflow似乎不是正确的地方,恕我直言)

4
C ++问题中的OS开发
作为硕士项目,我正在设计一个简单的操作系统。它被设计为在x86体系结构上以16位实模式运行。理想情况下,我想使用C ++开发此OS,并且仅在必要时使用汇编。到目前为止,我有一个用汇编语言编写的引导加载程序,用于加载由C ++和asm混合而成的内核。我的问题是关于使用C ++的问题。到目前为止,它已经编译并可以运行,但是我还没有使用任何动态内存分配。 如果我使用的是C,则编写用于处理内存分配的malloc函数是有意义的,但是在C ++中,将使用new关键字。所以... “ new”在后台如何工作以分配内存,我将如何处理呢? 必然地... 尝试使用C ++来利用其更高级别的摘要是否有意义?还是使用它会更让人头疼,我应该坚持使用C吗? 如果您认为C ++不是一个好的选择,请提供理由。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.