【问题标题】:Why Are Programs Broken Down into Smaller Executables [closed]为什么程序被分解成更小的可执行文件[关闭]
【发布时间】:2014-02-01 00:07:31
【问题描述】:

为什么大程序会分解成小程序?

不只是 Word.exe,我假设 Word.exe 调用了多个可执行文件。在终端/命令提示符的情况下,我可以理解操作系统这样做。 “Shutdown /f/s”调用关闭程序,传递参数然后执行。

通过我的已root Galaxy S4 上的系统应用程序,我看到了官方相机应用程序使用的几个程序。一种叫做最佳面孔。为什么这是单独的而不只是在主 camera.apk 中?

还有更好的理由吗?我对编程比较陌生,我还没有开始阅读设计模式,所以也许我过早地问了这个问题。

我可以看到一些好处,例如 RAM 使用率;仅在需要时使用您需要的东西。 我也可以将此视为更好地修补错误和提高可读性的一个原因,但是像 C++ 一样,头文件提供了这个好处。

我已经查过了,我似乎能找到的唯一答案是将程序分解为单独的文件,如 C++ 中的标头。

【问题讨论】:

  • 单独的地址空间...
  • @ta.speot.is 因为 32 位计算机的 RAM 限制?
  • 主要是因为默认情况下一个应用程序无法访问另一个应用程序的内存。

标签: design-patterns ipc


【解决方案1】:

这是解决特定问题的解决方案。以下是几个例子:

  1. 根据设计,您的应用程序必须是分布式的,因为它需要在通过网络通信的多台计算机上运行(例如,客户端/服务器应用程序)。因此,您需要在不同的计算机上运行几个不同的进程。但是,这并不意味着您的计算机不能托管多个此类进程。关键在于,通过设计,您只需要分离应用程序的不同部分,以便每个部分只要可访问(通过网络或 IPC)就可以在任何地方运行。示例:调试器、启动编译器的 IDE、客户端/服务器应用程序(如一些在本地单独运行服务器的游戏)、C/C++ 编译器(通常为每个编译单元分叉以同时编译)等。

  2. 您需要隔离每个不同进程的故障。如果一个进程失败,您可能无法从进程本身做任何事情来尝试修复它或以任何方式管理失败。因此,您需要一个单独的进程来“监控”另一个进程。如果一个进程死亡,它不会杀死其他进程。例如,Chrome(互联网浏览器)是如何设计的:每个选项卡都是一个进程。这样,如果执行网页出现问题,整个选项卡甚至可能崩溃,它不会像以前在其他浏览器中所做的那样一次杀死所有选项卡(此后采用了类似的策略)。基本上,沙盒。另见:https://softwareengineering.stackexchange.com/questions/202089/chromes-multiple-process-per-each-tabs

  3. 内存限制:如果您的目标计算机是 32 位,并且您可以轻松达到这意味着的内存地址限制,那么您需要将您的应用程序拆分为多个进程,以便每个进程都有自己的地址空间.我不完全确定,但我想我在某处读到 Visual Studio(它仍然是一个 32 位可执行文件)也出于这个原因(除其他外)使用了许多不同的进程。当然,当您可以独占使用 64 位时,问题就不那么重要了,但并不是每个人都拥有这种奢侈。

【讨论】:

    【解决方案2】:

    嗯,有几个原因,其中一些你自己已经弄清楚了,比如记忆。

    执行较少任务的较小程序更容易开发、测试和维护。

    您不想仅仅因为有人在其中的一小部分引入了错误就破坏了整个系统。就像把所有的鸡蛋放在同一个地方一样。

    另外,考虑到许多程序/系统是由不同的团队开发的,这些项目在不同的时间开始/停止。

    有时,您的应用程序具有并行开发源代码分支,因为下一个软件版本由于上市时间而无法等待前一个版本启动。

    如果它们很小且独立,并且具有明确的功能,则可以将它们组合起来以解决更复杂的问题。 (有关 UNIX 工具,请参阅“实用程序员:从熟练工到大师”一书)。

    而且您可能还想扩展一些程序功能,因此您仍然具有插件能力......您将如何在一个单一的东西中做到这一点?

    【讨论】:

    • 我还是个新手,还在读高中,没想到很多程序都被打散了,团队写的。
    【解决方案3】:

    这是一个非常广泛的领域,拥有多个可执行文件只是其中一个方面。这一切都归结为管理复杂性。

    CPU,无论是在服务器、台式电脑还是智能手机上,都会处理它从内存中读取的指令,而无需了解可执行文件。如果复杂性不是软件开发中的问题,那么将指令传送到 CPU 的方式可能不会涉及可执行文件。在计算机时代的开始,计算机是通过手动直接操作内存来编程的——实际上是通过按下开关。如果有计算机必须执行的任务,它会以这种方式编程。

    后来,boot loaders 让人类操作员有机会选择性地将指令加载到内存中,例如从穿孔卡片或磁带中加载指令。现在,程序可以存储在计算机之外并可以重复使用。在某种程度上,这些是第一个可执行文件。

    随着处理能力、内存和存储空间的增长,必须有一个系统来管理所有这些资源,因此开发了操作系统。现在计算机的操作员不需要自己管理打孔卡和磁带。这些程序现在可以在文件系统上使用。可以加载到内存中并运行的文件是可执行文件。只需指示操作系统执行文件即可运行任务。

    现在,有机会将他们的程序作为文件系统上的文件进行管理,操作员能够将可执行文件的使用联系在一起,以构建更复杂的应用程序。这样,单个可执行文件就能够被不同的应用程序重用。它还使其他事情成为可能,如您的问题的其他答案中所述。

    这些操作和文件系统的原则今天在您的计算机或智能手机上仍然有效。这一切都始于计算机操作员寻找一种无需按下开关即可对计算机进行编程的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2015-05-21
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多