2015-11-02 23 views
0

我有一个非常具体的问题。Blocking I/O操作在多线程C++应用程序中如何工作?

  1. 阻塞I/O操作如何recvfrom()调用工作在
    多线程应用程序?
  2. 操作系统如何调度阻塞系统调用的线程?
  3. 执行阻塞系统调用是否为 (例如,类似于繁忙的等待?)时,操作系统是否会调度线程,或者只有系统调用返回时操作系统只有 才调度线程?
  4. 会导致中断的执行线程(如果是这样的 情况下,将是值得的互斥或某种原子操作中编写的 其他线程的关键部分?)
+1

这个问题在哪里非常具体? –

+3

哪个操作系统? (评论不够长) – gurka

+0

@gurka有一点。例如,在Linux下,线程在处理调度时几乎就像进程一样处理。这在Windows上可能看起来有点不同,在没有MMU的微控制器上运行的操作系统可能会有很大差异。 –

回答

2

阻塞I/O操作如何recvfrom()调用 多线程应用程序中的工作?

线程被阻塞,其他线程继续被安排。这是开发多线程应用程序的主要优势之一,即使在单核机器上也是如此。

操作系统如何调度阻塞系统调用的线程?

不是,直到系统调用返回。

执行阻塞系统调用时(例如,类似于繁忙的等待?),操作系统会调度线程吗?或者系统调用返回后操作系统是否只调度线程?

第一,线程在系统调用时应该做些什么?

一般来说,后者也可能是,但至少可以说这是一个非常奇怪的实现。事实上,假设你是调度器,所以你现在处于内核空间。在用户空间中执行线程当前是而不是,因为它等待系统调用返回。那么线程将在哪里“继续”执行?

会导致中断的执行线程(如果是这样的话会是值得的互斥或某种原子操作内的代码的其他线程的关键部分?)

那么,这是一个阻塞调用:停止执行,直到阻塞条件已经过去。

+0

我甚至在想象如何调度程序安排在系统调用中被阻塞的线程时头痛。如果它在系统调用中被阻塞,这意味着它在内核中并等待某事。内核对它的安排意味着什么? – SergeyA

+0

@SergeyA:与“奇怪的实现”完全一样:你可以设置你的系统调用接口,以便将该线程的执行指针设置为立即返回内核空间的东西,但那样会很“性能损耗。 –

+0

谢谢你们的答案。 –

相关问题