如何将程序部分分配到最少的段?

时间:2014-11-16 18:51:27

标签: algorithm linker mathematical-optimization partitioning segments

在考虑如何为80286程序实现链接器时,我遇到了以下问题:

  

给定一个整数 n 和一组每个部分的大小不大于 n 的部分,找到 S 的分区分区数量最少,因此在每个分区中,区段大小的总和不会超过 n

尝试将对象文件链接到16位保护模式下的80286体系结构的程序时,会出现此问题。该体系结构具有每个高达65536字节的段,并且复杂程序需要被分成多个段。链接器尝试将程序安排到尽可能少的段中,因为每个段对应于操作系统的段描述符表中的一个条目。请考虑此问题,而不考虑16位保护模式已过时的事实。

作为这个问题的一个复杂问题,可以考虑将程序的调用图链接起来。考虑到代码段的每次更改都有一点损失(CPU必须在段描述符表中查找新段)的情况,链接器可以尝试将函数分组到相互调用的相同部分。当调用图按预期的调用次数加权时,链接器可能会尝试将程序划分为段,以便跨越段边界的调用图的边具有最小的平方和/平方和。

问题

  1. 我有预感,原来的问题可能很容易就是NP难,但我不确定如何证明这一点。这是NP难吗?
  2. 是否有快速算法来近似一个好的解决方案?
  3. 是否有算法来解决第二个问题或近似一个好的解决方案?
  4. 我非常感谢有关将代码分发到细分主题的更多材料的建议。

0 个答案:

没有答案