是否可以保证在上下文切换或抢占之前完成系统调用?我们是否应该期望系统调用指令不可中断。或者它取决于系统调用类型或操作系统实现?
答案 0 :(得分:4)
是否保证在上下文切换或抢占之前完成系统调用
不,即使在单线程应用程序中,许多系统调用实际上也会导致上下文切换。我们不要忘记,目前大多数现代系统上都有其他进程,还有硬件中断和大量异步事件。
或者它取决于系统调用类型还是操作系统实现?
是的,非常如此。
如果那些系统调用线程安全保证与否?
阅读您的系统文档。
大多数C编译器工具链包括单线程和多线程库。即使单线程库也是上下文切换安全的,但不一定是同一进程的重入。上下文切换就是这样,当前线程的整个上下文被切换为一个新的上下文。只要这些线程没有触及任何共享资源(上下文重叠),就没有其他任何事情需要关注。但是,在编写多线程应用程序时,必须对您拥有的线程之间共享的资源负责。在大多数情况下,良好的设计可以避免共享资源,但可能存在不可避免的关键路径。
大多数现代操作系统都有许多内部共享资源,并且它们使用各种技术来同步对这些资源的访问。锁,信号量,关键部分,原子操作(无锁算法)都是多线程环境中的常见做法。应用程序编写者不应该担心操作系统如何在内部管理对共享资源的访问,因此您可以从应用程序中调用open
,read
和write
,无需担心不会在进程中的线程之间共享任何句柄。
编写多线程应用程序时,应使用编译器工具链提供的线程安全库。线程安全库使用与操作系统相同的所有技术来保护内部共享资源,但它们无法保护您自己!如果在线程之间共享资源,例如全局变量,句柄,缓冲区,甚至访问某些类型的硬件寄存器,则必须安排同步这些访问。
OS编写者负责保护他们自己的内部共享资源并记录所有线程安全问题。
图书馆作者负责保护他们自己的内部共享资源并记录所有线程安全问题。
应用程序编写者负责保护自己的共享资源并记录所有进程并发问题(进程间资源共享)。
答案 1 :(得分:1)
没有。让我们假设您正在等待套接字读取完成。这可能需要几秒钟。现在,如果你的单核cpu是多任务的,你期望它在等待时运行其他线程。