如何将OS/2应用程序移植到Linux操作系统
内存 进程内存在 Linux 和其它操作系统中的使用非常类似,但在进程间共享内存的机制不同。Linux 提供了一组基于 System V IPC 机制的 API。在这组 API 中处理共享内存。共享内存机制为一个进程可以拥有的段数量以及整个系统的段数量定义了界限。遗憾的是,这个界限限制了一个应用程序能使用的共享内存段的数量。 例如,如果一个 OS/2 应用程序创建了 500 个共享内存区域,您就无法使用到 System V 共享内存 API 的直接映射。尽管您可以重新编译内核并设置新的层次,但是必须考虑您的顾客们是否能接受这种改变。 您可以分配一个巨大的共享内存段,然后在这段内分配小一些的块。然而,没有边界检查。没有边界检查,应用程序会损坏已分配给其它进程的段。 实现一个与 OS/2 (它进行一些边界检查)类似的行为的另一个方法是使用文件映射。文件映射将一个文件映射到一个进程的内存空间内,以便允许把文件像内存一样来访问。没必要整个文件映射到内存,但可以把文件的一部分映射到一个内存区域。 共享内存机制的另一个差别是:当一个段被加载到一个进程中时,Linux 不保证会使用相同的内存地址。在 OS/2 上,您可以分配一块内存并将这一块内存传送给另一个进程。内存位于每个进程中相同的地址处。在 Linux 上情况并不一定如此。另外,为了访问另一个进程已创建的一个共享内存段,您需要知道这个段的标识。标识是一个独一无二的数字,可以通过使用一个名称(如果该名称作为一个文件存在)来计算这个数字。OS/2 提供几个系统调用,使得进程能够给出且获得到基于名字或内存地址的共享内存段的访问。 队列 OS/2 队列是一个允许进程把内存指针传给另一个进程的机制。传送进程必须通过 DosGiveSharedMemory 给接受进程提供到内存段的访问,然后把内存在段中的位置传送给接收进程。像机制名暗示的一样,队列可以在等待另一个进程读取它们的同时保存大量的这些内存位置。Linux 没有这个概念。 在可能的解决方案中,其中之一就是使用 System V 共享内存段。System V 共享内存段的问题是限制了被允许的段的数量。 另一个方法是使用文件映射并使用控制结构,该结构设置元素(内存位置)的顺序和对文件的访问权限。 信号量(Semaphore) OS/2 提供三种主要类型的信号量:事件、互斥和多等待。Linux 提供一个基于 System V IPC 的信号量机制并且支持信号量作为 pthread 库的一部分。OS/2 信号量是一个单独的实体,给您提供一个定义良好的行为。然而,可以将 System V 信号量定义成几组,这是可配置的。在不重新编译内核的情况下,每个组最多可以有 250 个信号量(2.4 内核)。这种系统在系统内只能有一定数量的信号量组(可以通过重编译内核来更改这个数量)。 System V 信号量基本上是计数变量,您可以增加或减少这些变量,并且这为您模仿事件信号量和互斥信号量的行为提供了足够的功能。唯一的问题是执行定时等待。在 Linux 上,您只能尝试/等待或等待。不允许超时。为了模仿超时,您需要构建某种定时机制,该机制能发送一个信号来中断正在等待一个事件的线程。 多等待信号量是一个已定义信号量的集合,这些信号量可以作为一组等待。System V 机制利用组,并且能等待许多与同一个组相关的操作。然而,只有应用程序仔细地规划了它对信号量(多等待中的所有信号量都来自于同一个信号量组)的使用,您才能得到期望的结果。我们实现了一个机制,它使线程能够等候这组内的每个信号量来模拟这一行为。 (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |