![Linux 内核如何处理多个并行 syscall() 请求?](https://linux22.com/image/133398/Linux%20%E5%86%85%E6%A0%B8%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%A4%9A%E4%B8%AA%E5%B9%B6%E8%A1%8C%20syscall()%20%E8%AF%B7%E6%B1%82%EF%BC%9F.png)
我想知道如果有一个多核系统(例如 8 核)会发生什么情况,并且每个在核心上运行的任务syscall()
同时向内核发出请求。我的问题是内核如何处理多个并行syscall()
请求,并行还是顺序或任何其他波浪式。
答案1
过去,对内核的调用是序列化的,使用大内核锁。不过,它在很久以前就被删除了,甚至在此之前,相当多的内核路径不再使用 BKL,因此系统调用已经并行运行了很长一段时间。随着内核本身引入抢占,系统调用甚至可以互相中断(参见旧版 Linux 内核不可抢占的原因是什么?了解详情)。
因此,您的问题的简短答案是内核并行处理多个并行系统调用。
在某些情况下,系统调用的执行涉及获取锁,这将序列化冲突的系统调用,但随着时间的推移,这种情况会变得越来越少,现有的锁会被删除或替换为更细粒度的锁(当它们导致性能问题时) 。