我最近完成了一个操作系统课程的项目,但在项目的一个特定部分,我想知道我是否做出了最好的决定。在这个项目中,我们需要设计一个PID管理器。
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会起作用吗?如果您愿意,我可以提供我的实施。
答案 0 :(得分:3)
如果我正确地解释你的限制,那么你的PID范围是4-127,所以只要你适当地锁定,你就可以使用ArrayList
。
稍微更有效地使用内存将使用BitSet
。你仍然需要适当的锁定。
稍微降低内存成本但性能更好,您可能会发现其中一个并发集更有效 - 也许是ConcurrentSkipListSet
。然后,您不需要进行任何锁定,因为它本身就是线程安全的。有关相关主题,请参阅here。