程序如何收到信号?

时间:2017-11-17 14:12:03

标签: signals theory

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

  

Skype:有人打电话吗?

     

服务器:否。

     

Skype:有人打电话吗?

     

服务器:否。

     

Skype:有人打电话吗?

     

服务器:是的。

     Skype:好吧,请联系我们。

当然必须有更好的方法。

1 个答案:

答案 0 :(得分:1)

我不知道Skype是如何实施的。希望这不是问题的意图。以下是对此如何工作的超级高级描述。

它可能有用的一种方式是:

  • 您正在运行服务器
  • 服务器正在侦听套接字
  • 在收听时,服务器被阻止(无所事事)
  • 当信息到达您的套接字时,操作系统会向您的服务器发出信号
  • 一旦发出信号,服务器就会接受该信息并做出适当的响应

这可能是也可能不是对您特定案例中发生的事情的真实描述。另一种可能性是:

  • 您正在运行客户
  • 正在运行远程服务器
  • 您与远程服务器建立会话并开始聆听
  • 在收听时,客户端被阻止(无所事事)
  • 服务器正在侦听套接字
  • 在收听时,服务器被阻止(无所事事)
  • 当数据包到达您的Skype客户端时,远程操作系统会向服务器发出信号
  • 一旦发出信号,服务器就会启动一个新线程来处理您的请求
  • 它计算出它所获得的数据包与您的会话相关联并发送它们
  • 当这些信息到达您的本地操作系统时,它会向您的客户发出信号
  • 一旦发出信号,客户接受信息并做出适当的回应

每种方法的图片:

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



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

在这两种情况下,如果所涉及的操作系统支持多道程序设计(多个进程重叠执行,不一定真正并行执行),则不需要轮询,在这种情况下,这些进程可能会阻塞I / O,直到操作系统发出信号为止。

但是,从根本上说,对I / O进行阻塞的多道程序设计非常类似于轮询,因为进程调度程序在每次决定哪个进程获得下一个时间量时都会进行轮询。