Update README.md

This commit is contained in:
zmr
2017-04-14 15:38:50 +08:00
committed by GitHub
parent ef76282e6e
commit 329ff98a80

View File

@@ -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中的进程如果是负值就发送给进程组。