yum install man man-pages //安装man帮助程序 man帮助页
man 一共有八类文档
man ls //是一类文档
man 2 read //系统调用是二类文档 比如read
man 2 socket //系统调用
man 2 select //系统调用
//0 是标准输入 1是标准输出 2是错误输出
任何命令在操作系统中均有文件描述符
man 2 socket //看到 可以SOCK_NONBLOCK
1.BIO socket是阻塞的
man 2 socket //系统调用
一个连接就是一个文件描述符,一个文件描述符就是一个fd;
有数据则处理 没有则等待 无法执行下面内容,只能抛出更多线程。
cpu没有一直处理数据。
2.同步非阻塞
内核发生了变化,一个线程即可,循环问每个文件描述符是否有数据,有数据则处理,没有则问下一个文件描述符。
取数据 并处理是一个线程 则是同步的。
问题:
man 2 socket //系统调用
3.多路复用
select出现 减少用户态核心态线程切换
man 2 select //查看select用法
缺点:fds 文件描述 拷贝成为累赘
4.共享空间
通过系统调用mmap来实现
减少I/O和内核沟通
man 2 mmap
进程通过epoll将文件描述符放到共享空间
man epoll
用户进程放文件描述符到共享空间的红黑树,内核去红黑树中获取,将一些到达的数据放到链表。用户进行从链表取进而执行。
上面功能是共享空间实现的,不是零拷贝,零拷贝如下:
man 2 sendfile
内核中增加了系统调用sendfile()实现零拷贝
read write方式 涉及到数据的拷贝,
sendfile 方式,程序调用senfile,则不涉及拷贝直接从内核读取数据。
文件数据–>内核–>内核缓冲区–>用户空间–>网卡
内核读sendfile 直接发出去
sendfile()加mmp组建为kafka
kafka通过mmap看到内存空间,内核也能看到,减少触发内核,减少数据调用,减少系统拷贝。
nginx 多少个cpu启动多少个进程worker ,一个进程worker使用kernel的epoll,同步非阻塞多路复用。
linux没有AIO
windows有AIO