【问题标题】:poll system call in linux drivers轮询Linux驱动程序中的系统调用
【发布时间】:2012-12-10 07:36:47
【问题描述】:

我正在学习 Linux 内部。所以我遇到了poll 系统调用。据我了解,当一些数据准备好从设备读取以及我们准备好数据到设备时,驱动程序使用它来提供通知。

如果设备没有任何数据要读取,进程将在数据可用时进入睡眠状态并唤醒,反之亦然用于写入情况。

谁能通过一些真实的例子给我对 poll 系统调用的具体理解?

【问题讨论】:

  • 我不确定这里是否有一个简单的例子。 W. Richard Stevens 在他的 Unix 网络编程 卷 1 的第 6 章中需要几十行代码来创建一个基于 poll(2) 的简单 TCP“回声”服务器的核心,他的代码是一个简单明了的模型。这是我的建议:拿到那本书并阅读它。尽管poll(2) 可用于任何文件句柄,而不仅仅是网络套接字,但这是最常用的地方,因此可以找到最好的解释。

标签: linux linux-kernel system-calls


【解决方案1】:

poll 和 select(后者与 poll 非常相似,但有these 的区别)sys 调用用于所谓的异步事件驱动方法来处理客户端的请求。

基本上,在网络编程中,服务器处理来自网络客户端的许多连接有两种主要策略:

1) 更传统:线程或面向过程的方法。在这种情况下,网络服务器有一个主进程,它在一个特定的网络端口(Web 服务器的端口 80)上侦听传入连接,当连接到达时,它会产生新的线程/进程来处理这个新连接。 Apache HTTP 服务器采用了这种方法。

2) 前面提到的异步事件驱动方法,其中(在最简单的情况下)网络服务器(例如 Web 服务器)是只有一个进程的应用程序,它接受连接(为每个新客户端创建套接字),然后监视这些套接字轮询/选择传入数据。 Nginx http 网络服务器采用了这种方法。

【讨论】:

  • Re:网络编程,您的回答暗示select()poll() 仅用于网络套接字。在 Unix 系统中,这些调用可以在任何文件句柄上工作,而不仅仅是套接字。
  • Re: 流程结构模型,这里完全不相关;内核不在乎。也一样,因为它是对可能的复杂性范围的挥手处理,忽略了太多以至于它基本上是错误的。它也被删除了。
  • 回复:poll(2)select(2),差异在 Linux 的内核级别无关紧要,因为它们是使用相同的内核级别机制实现的。
  • poll 和 select 用于非阻塞 IO,不要与异步 io 混淆。
  • @mzet:您的回答描绘了一种错误的二分法,在一种情况下,您有 FD-per-child 和阻塞套接字,并且在单个大循环中使用 poll/select 来检查 FD 事件的单片进程在另一种情况下。我已经编写了几个程序,其中孩子们被分叉并使用select() 监控 FD。所以,孩子被分叉的事实并不能告诉你如何或是否使用poll/select()。在任何情况下,OP 都在谈论内核内部,当调用其轮询处理函数时,驱动程序看不到任何有关进程结构的信息。
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多