0

我最近完成了一个操作系统课程的项目,但在项目的一个特定部分,我想知道我是否做出了最好的决定。在这个项目中,我们需要设计一个 PID Manager。

PID 管理器背后的目的是在首次创建进程时为其分配唯一的进程标识符 (PID)。当进程完成执行时,PID 将返回给 PID 管理器,以便可以将相同的 PID 重新分配给以后的进程。不能为两个进程分配相同的 PID。

下面是我们需要实现的接口:

public interface PIDManager
{

    public static final int MIN_PID = 4;
    public static final int MAX_PID = 127;

    public int getPID();
    public int getPIDWait();
    public void releasePID(int pid);
}

因此 getPID() 只返回一个唯一的 PID,但如果没有可用的 PID,则返回 -1。getPIDWait() 返回一个唯一的 PID,但会阻塞调用进程,直到 PID 可用。releasePID() 释放 PID 以便它可以被另一个需要使用它的进程使用。

我们需要某种类型的数据结构来跟踪分配的 PID。问题描述说这个数据结构需要没有竞争条件死锁。例如,同一个 PID 可以同时分配给多个进程,这是我们不希望的。

所以我最近完成了这个项目。我选择使用 ArrayList 来跟踪分配的 PID。我选择了 ArrayList 是因为它的大小可以增长和缩小,这提供了很多便利,可以轻松地在 ArrayList 中添加或删除 PID,并检查其中是否包含 PID。但现在我不确定 ArrayList 是否会导致竞争条件或死锁。在这种情况下使用 ArrayList 会起作用吗?如果你愿意,我可以提供我的实现。

4

1 回答 1

3

如果我正确地解释了您的限制,那么您的 PID 范围是 4-127,所以从性能方面来说ArrayList,只要您适当地锁定,您就可以使用。

稍微更有效地使用内存是使用BitSet. 您仍然需要适当的锁定。

以轻微的内存成本但更好的性能,您可能会发现其中一个并发集更有效 - 可能是ConcurrentSkipListSet. 然后,您不需要执行任何锁定,因为它本质上是线程安全的。有关相关线程,请参见此处

于 2013-10-08T23:44:57.963 回答