2017-07-28 45 views
0

我已经读过关于用户空间和内核空间以及程序的执行路径如何从用户空间到内核空间的内容,我想这是一个例子,如果我的程序像这样运行程序访问内核空间时会发生什么

Poco::Net::SocketAddress sender; 
char buffer[64000]; 
. 
. 
. 
socket.receiveFrom(buffer, sizeof(buffer), sender); 

由于这次调用需要访问网卡,我认为它应该进入内核空间。

我的问题是: 因为程序会发生什么事让socket.receivefrom(...)调用

  1. 是否线程进入睡眠状态,并放弃它的核心,因为它会 到内核空间只有被唤醒时,字符缓冲区已经 书面
  2. 是否线程直接到内核空间,然后回来给用户空间写入的字符缓冲区
+0

查看https://unix.stackexchange.com/questions/370975/does-a-context-switch-occurs-when-an-interrupt-is-fired –

回答

0
    0后
  1. 否。该线程在内核权限(x86中的环0)上执行内核代码。内核中的线程可能会进入“休眠”状态(即,CPU可能会去执行一个不同的程序,或者会闲置,这取决于调度程序决定的内容)。但是,如果数据已经从网卡上获得,它可能根本无法进入睡眠状态。从用户的角度来看,您知道当通话返回时,您的数据已经存入缓冲区,并且您可能预计该通话需要一段时间。

  2. 这取决于调度程序。您可能会随时获得中断并执行其他操作。但是,一般来说,是的,你转到内核后面。

相关问题