GNU Make 的 Jobserver 实现
2024-12-02
本文描述了 GNU Make 的“jobserver”实现,主要面向希望了解 GNU Make jobserver 的人,以及对 UNIX 编程中一个传统难题感兴趣的人:如何同时等待两种不同类型的事件(信号和文件描述符)。GNU Make 可以并行调用多个命令或“作业”。当使用递归 makefile 时,单个 make 实例无法知道所有其他 make 实例正在运行多少作业,导致并行效率低下。Jobserver 功能通过使用管道来同步各种 make 实例,解决了这个问题。顶级 make 创建一个管道,并在其中写入 N-1 个单字节令牌。每个 make 实例在运行作业之前必须从管道中读取一个令牌,并在作业完成后将其写回。由于只有 N 个令牌,因此可以确保永远不会调用超过 N 个作业。文章详细解释了该算法的实现细节,包括如何处理信号和文件描述符,以及如何避免死锁和竞争条件。