系统调用应该在上下文切换之前完成吗
should system calls be completed before context switch
是否保证系统调用在上下文切换或抢占之前完成?我们是否应该期望系统调用指令是不可中断的。还是取决于系统调用类型或操作系统实现?
没有。假设您正在等待套接字读取完成。这可能需要几秒钟。现在,如果您的单核 cpu 是 multi-task,您希望它在等待时 运行 其他线程。
Is it guaranteed that system calls will be completed before context switch or preemption
不,许多系统调用实际上会导致发生上下文切换,即使在单线程应用程序中也是如此。我们不要忘记,当今大多数现代系统上还有其他进程 运行,外加硬件中断和大量异步事件。
Or is it depend on system call type or operating system implementations ?
是的,非常。
if those system calls thread safe what guarantees or not?
阅读您的系统文档。
大多数 C 编译器工具链包括单个库和 multi-threaded 库。即使是单线程库也是 context-switch 安全的,但不一定来自同一进程 re-entrant。 context-switch 就是这样,当前线程的整个上下文被切换为新线程。只要这些线程不接触任何共享资源(上下文重叠),就没有其他需要关心的事情。但是,当您编写 multi-threaded 应用程序时,您必须对您拥有的线程之间共享的资源负责。在大多数情况下,良好的设计会避免共享资源,但也可能存在无法避免的关键路径。
大多数现代操作系统都有许多内部共享资源,它们使用各种技术来同步对这些资源的访问。锁、信号量、临界区、原子操作(lock-free 算法)都是 multi-threaded 环境中的常见做法。应用程序编写者永远不需要担心 OS 如何在内部管理对共享资源的访问,因此您可以从您的应用程序调用 open
、read
和 write
,而无需关注,前提是您不在进程中的线程之间共享任何句柄。
当您编写 multi-threaded 应用程序时,您应该使用编译器工具链提供的 thread-safe 库。 Thread-safe 图书馆使用与操作系统相同的所有技术来保护内部共享资源,但它们无法保护您免受您自己的伤害!如果您在线程之间共享资源,例如全局变量、句柄、缓冲区,甚至是对某些硬件寄存器的访问,则必须安排同步这些访问。
OS 作者有责任保护他们自己的内部共享资源并记录所有 thread-safety 问题。
图书馆作者有责任保护他们自己的内部共享资源并记录所有 thread-safety 问题。
应用程序编写者负责保护他们自己的共享资源并记录所有进程并发问题(inter-process 资源共享)。
是否保证系统调用在上下文切换或抢占之前完成?我们是否应该期望系统调用指令是不可中断的。还是取决于系统调用类型或操作系统实现?
没有。假设您正在等待套接字读取完成。这可能需要几秒钟。现在,如果您的单核 cpu 是 multi-task,您希望它在等待时 运行 其他线程。
Is it guaranteed that system calls will be completed before context switch or preemption
不,许多系统调用实际上会导致发生上下文切换,即使在单线程应用程序中也是如此。我们不要忘记,当今大多数现代系统上还有其他进程 运行,外加硬件中断和大量异步事件。
Or is it depend on system call type or operating system implementations ?
是的,非常。
if those system calls thread safe what guarantees or not?
阅读您的系统文档。
大多数 C 编译器工具链包括单个库和 multi-threaded 库。即使是单线程库也是 context-switch 安全的,但不一定来自同一进程 re-entrant。 context-switch 就是这样,当前线程的整个上下文被切换为新线程。只要这些线程不接触任何共享资源(上下文重叠),就没有其他需要关心的事情。但是,当您编写 multi-threaded 应用程序时,您必须对您拥有的线程之间共享的资源负责。在大多数情况下,良好的设计会避免共享资源,但也可能存在无法避免的关键路径。
大多数现代操作系统都有许多内部共享资源,它们使用各种技术来同步对这些资源的访问。锁、信号量、临界区、原子操作(lock-free 算法)都是 multi-threaded 环境中的常见做法。应用程序编写者永远不需要担心 OS 如何在内部管理对共享资源的访问,因此您可以从您的应用程序调用 open
、read
和 write
,而无需关注,前提是您不在进程中的线程之间共享任何句柄。
当您编写 multi-threaded 应用程序时,您应该使用编译器工具链提供的 thread-safe 库。 Thread-safe 图书馆使用与操作系统相同的所有技术来保护内部共享资源,但它们无法保护您免受您自己的伤害!如果您在线程之间共享资源,例如全局变量、句柄、缓冲区,甚至是对某些硬件寄存器的访问,则必须安排同步这些访问。
OS 作者有责任保护他们自己的内部共享资源并记录所有 thread-safety 问题。
图书馆作者有责任保护他们自己的内部共享资源并记录所有 thread-safety 问题。
应用程序编写者负责保护他们自己的共享资源并记录所有进程并发问题(inter-process 资源共享)。