了解计算水平


9

对不起,我的困惑的问题。我在寻找一些指针。

到目前为止,我主要在应用程序层上使用Java和Python,并且对操作系统和硬件的理解还很模糊。我想了解更多有关较低级别的计算的信息,但是它确实以某种方式变得不知所措。在大学里,我参加了一门有关微程序设计的课程,即如何使处理器硬连线以实现ASM代码。到目前为止,我一直认为,如果对“低水平”知识更多,我将无法完成更多工作。

我有一个问题:硬件怎么可能几乎完全被开发人员隐藏?准确地说,操作系统是硬件的软件层吗?一个小例子:在编程中,我从来没有遇到过了解什么是L2或L3缓存的需求。对于典型的业务应用程序环境,几乎不需要了解汇编程序和较低级别的计算,因为当今存在几乎所有内容都可以使用的技术堆栈。我猜这些较低级别的重点是为高层提供接口。另一方面,我想知道较低的水平会对整个图形计算产生什么影响。

因此,另一方面,存在理论上的计算机科学分支,该分支适用于抽象计算模型。但是,我也很少遇到这样的情况,我发现它在复杂性模型,证明验证等类别中很有帮助。我有点知道,有一个称为NP的复杂性类,它们是无法解决的我想念的是一个框架,供您考虑这些事情。在我看来,这里有各种不同的阵营,很少互动。

最近几周,我一直在阅读有关安全性问题的信息。在这里,许多不同的层以某种方式汇聚在一起。攻击和利用几乎总是发生在较低级别,因此在这种情况下,有必要了解OSI层的详细信息,OS的内部工作原理等。


1
有一个伟大的回答这个(第一个问题)programmers.stackexchange.com/questions/81624/...
Puckl

攻击和攻击可以发生在各个级别。如果我编写了一个易受攻击的PHP脚本,则无论底层操作系统如何,都可以利用它,更不用说硬件了。
tdammers 2012年

1
找到了一本关于该主题的好书:计算系统的元素:从第一原理构建现代计算机Noam Nisan,Shimon Schocken。
肖肯

在dos时代,使用汇编语言处理VGA图形例程是获得任何性能的唯一途径,但我想我不知道自己在做什么!但是在我职业生涯的最后十年或更长时间里,我不必再看那么低的东西。我现在几乎不知道在这些级别上会发生什么。我什至很少需要分配或清理自己的内存。我怀疑团队中的许多人都不知道堆栈是什么!在许多方面,以这种水平进行编码并不能有效地提高效率。相反,我们站在巨人的肩膀上。
加文·豪顿

Answers:


19

考虑这些事情的关键词是抽象

抽象只是意味着故意忽略系统的细节,以便在从多个子系统中组装一个较大的系统时,可以将其视为单个不可分割的组件。这是难以想象的强大-写一个现代的应用程序,同时考虑内存分配的细节登记蔓延晶体管运行时会以某种理想化的方式是可行的,但它是无比容易考虑它们,而只使用高级操作。现代计算范例主要依赖于多个抽象层次:固态电子,微编程,机器指令,高级编程语言,OS和Web编程API,用户可编程框架和应用程序。如今,几乎没有人可以理解整个系统,甚至没有一种可以想象的途径可以使我们回到那种状态。

抽象的另一面是力量的损失。通过将细节决策留给较低层次,我们通常会接受以较低的效率进行决策,因为较低层次没有“全局”,并且只能通过本地知识来优化其工作,而不是(潜在地)像人一样聪明。(通常。通常,由于处理器架构变得如此复杂,因此如今,对于机器而言,将HLL编译为机器代码通常比由最有知识的人来完成更好。)

安全问题是一个有趣的问题,因为抽象中的缺陷和“漏洞”通常可以被利用来破坏系统的完整性。当API假定您可以调用方法A,B和C,但前提是条件X成立时,很容易忘记条件,并且不为违反条件而发生的后果做好准备。例如,经典的缓冲区溢出利用了这样一个事实,即除非您自己分配了此特定的内存块,否则写入内存单元会产生不确定的行为。API仅保证东西结果会发生,但实际上结果是由下一个较低级别的系统详细信息定义的-我们故意忘记了!只要我们满足该条件,这就无关紧要,但是,如果不满足,那么深入了解这两个级别的攻击者通常可以根据需要指挥整个系统的行为,并导致不良情况的发生。

内存分配错误的情况特别糟糕,因为事实证明,在大型系统中,如果没有单个错误,手动管理内存确实非常非常困难。这可能被视为失败的抽象案例:尽管可以用C来完成您需要的一切mallocAPI,这很容易被滥用。编程社区的某些成员现在认为这是在系统上引入层级边界的错误位置,而是通过自动内存管理和垃圾回收来推广语言,这虽然失去了一些功能,但却提供了防止内存损坏和未定义行为的保护。实际上,当今仍然使用C ++的主要原因在于,它允许您精确控制何时获取和释放哪些资源。通过这种方式,当今托管和非托管语言之间的主要分裂可以被视为对在何处精确定义抽象层的分歧。

对于计算中的许多其他主要替代范例也可以说相同的问题-在必须构建大型系统的所有时间里,这个问题确实不断出现,因为我们根本无法为当今常见的复杂需求从头设计解决方案。(近来AI的一个普遍观点是,人脑实际上的确这样工作的-通过反馈回路,大规模互连的网络等产生的行为,而不是单独的模块和层之间具有简单抽象的接口,这就是为什么我们在模拟我们自己的情报方面几乎没有成功。)


1
十分感谢。因此,垃圾回收/内存管理的示例可能是这种交互的最著名示例。尼尔·格申菲尔德(Neil Gershenfeld)写了一些有趣的东西,尽管我只理解其中的一部分。
RParadox 2012年

关于复杂性的非常好的观点。如果只有机器可以设计我们的机器,这将导致什么?如果AI人士在谈论AI创造更智能的AI,也许我们就在那里。;)
RParadox 2012年
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.