Update README.md
This commit is contained in:
@@ -108,3 +108,20 @@ void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key;
|
||||
## 接着POLL和SELECT
|
||||
学过网络编程的同学都清楚这两个调用是干什么的,用来等待个文件流的操作。
|
||||
其实这并不是网络编程的专利,在内核中本来就是一种监听等待的机制。书上说的很明白,我们来看看他的数据结构图。
|
||||
|
||||
|
||||
很简单,当我们调用POLL的时候其实就创建了一个POLL_TABLE添加一个等待的队列,而这个队列上有三个结构项
|
||||
1.指向被打开的文件类型指针。
|
||||
2.一个等待队列指针。
|
||||
3.一个关联的等待队列入口。
|
||||
|
||||
如果轮询时没有一个可以进行非阻塞IO,进入休眠。有IO则返回一个掩码。
|
||||
从图中我们也能看出来EPOLL出现的原因了,在典型情况下,对POLL或者SELSECT的调用只涉及到几个文件描述符,当我们需要使用很多描述符的时候处理成本增大,
|
||||
所以才有了EPOLL只需要一次构造内部内核数据结构,然后多次使用。
|
||||
|
||||
|
||||
#### 简单异步实现
|
||||
1.指定一个进程作为文件的“属主”,fcntl系统调用执行F_SETSHOW时,属主的PID被保存到filp->f_owner 中。
|
||||
|
||||
2.当输入文件有数据时,请求发送一个ISGIO信号。该信号被发送到存放在filp->f_owner中的进程,如果是负值,就发送给进程组。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user