Dispatch Source
Dispatch source 是对freeBSD kQueue的封装,可以监听很多系统底层的事件,例如文件描述符、mach port、signal、VFS节点等。 CFSocket就是利用了dispatch source来实现对socket端口的监听(socket也是一种文件描述符)。
实际应用:
- 比如我们有一个iOS上的应用开启了HTTP服务,允许用户上传文件到手机上, 我们可以利用dispatch source监听指定文件夹的变化,当用户上传文件后,会触发回调的block,我们就可以知道用户上传了。
- 监听内存压力。当系统发现内存压力变化时,会激活 memoryPressure类型的dispatch source,通过监听这个source,可以提前释放一些内存,比如中止遍历、释放缓存等
什么是文件描述符?
任何可读写的对象都可以当作文件描述符,包括 普通文件、Socket 、设备、服务等。他是一个索引值,指向内核为每一个进程所维护的该进程开启文件的记录表。
为什么要用文件描述符?
之所以使用文件描述符,而不使用文件指针,是为了避免暴露内存地址。
什么是 kQueue?
是一种IO多路复用的模型。
IO多路复用机制:简单来说就是通过单线程或单进程同时监测多个文件描述符是否可以执行IO操作的能力。通过把多个IO的阻塞复用到同一个的阻塞上,从而使得系统在单线程或单进程的情况下可以同时处理多个客户端请求。(比如多个APP使用了同一个80端口发送HTTP请求)
有四种IO模型:select/ poll/ epoll/ kqueue。其中select和poll使用数组和链表存储,在检查链表中是否有文件描述符需要读写时,采用的是线性扫描的方法,不管文件描述符是不是活跃的,都会轮询一遍,因此效率较低。而epoll和kqueue 是对select和poll的增强,采用了红黑树和链表存储,会注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会通过类似回调的机制激活这个文件描述符