程序如何接收信号?

How does a program receive a signal?

理论问题:假设我打开 Skype,我的朋友给我打电话。 Skype 如何知道有人在给我打电话?它是否每秒检查一次呼叫(信号)?

Skype: Is someone calling?

Server: No.

Skype: Is someone calling?

Server: No.

Skype: Is someone calling?

Server: Yes.

Skype: Alright, hook us up.

肯定有更好的方法。

我不知道Skype实际上是如何实现的。希望这不是问题的意图。这是对它如何工作的超高级描述。

它可能起作用的一种方法是:

  • 你是运行服务器
  • 服务器正在侦听套接字
  • 监听时,服务器被阻塞(什么都不做)
  • 当信息到达您的套接字时,OS 向您的服务器发出信号
  • 一旦发出信号,服务器就会接受信息并做出适当的响应

这可能是也可能不是对您的具体情况的真实描述。另一种可能性是:

  • 您是运行客户
  • 有一个远程服务器运行
  • 您与远程服务器建立会话并开始监听
  • 监听时,客户端被阻塞(什么都不做)
  • 服务器正在侦听套接字
  • 监听时,服务器被阻塞(什么都不做)
  • 当数据包到达您的 Skype 客户端时,远程 OS 向服务器发送信号
  • 收到信号后,服务器会启动一个新线程来处理您的请求
  • 它计算出它收到的数据包与您的会话相关联,并发送它们
  • 当这些信息到达您的本地 OS 时,它会向您的客户发出信号
  • 一旦发出信号,客户端就会接受信息并做出适当的响应

各方法图片:

    SKYPE     __________________   ????????
(local server)                  (remote client)



    SKYPE     _________     SERVER    ________   ???????
(local client)         (remote server)        (remote client)

在这两种情况下,如果所涉及的操作系统支持多道程序设计(多个进程重叠执行,不一定真正并行),则不需要轮询,在这种情况下,这些进程可以在 I/O 上阻塞,直到收到OS.

不过,从根本上说,在 I/O 上进行阻塞的多道程序很像轮询,因为进程调度程序每次决定哪个进程获得下一个时间片时都会进行轮询。