目录
一、简述socket中select、epoll的使用场景和区别
1、使用场景
2、区别
二、epoll水平触发和边缘触发的区别
三、简述Reactor和Proactor模式
1、Reactor
2、Proactor
3、区别
四、简述同步和异步的区别,阻塞和非阻塞的区别
1、同步与异步
2、阻塞与非阻塞
五、简述BIO和NIO的区别
1、BIO
2、NIO
六、简述5种I/O模型
1、阻塞I/O
2、非阻塞I/O
3、信号驱动I/O
4、I/O多路复用
5、异步I/O
七、简述socket网络编程中客户端和服务端用到哪些函数
1、服务器端函数
2、客户端函数
八、简述网络七层参考模型及每一层的作用
一、简述socket中select、epoll的使用场景和区别
1、使用场景
select、epoll都是I/O多路复用的机制,应用于高并发的网络编程的场景。I/O多路复用就是通过一种机制,可以监视多个文件描述符,一旦某个文件描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。
2、区别
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时候会很大,而epoll保证了每个fd在整个过程中只会拷贝一次。
(2)每次调用select都需要在内核遍历传递进来的所有fd,而epoll只需要轮询一次fd集合,同时查看就绪链表中有没有就绪的fd就可以了。
(3)select支持的文件描述符数量太小了,默认是1024,而epoll没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048。
二、epoll水平触发和边缘触发的区别
LT模式(水平触发)下,只要这个fd还有数据可读,每次epoll_wait都会返回它的事件,提醒用户程序去操作。
ET模式(边缘触发)下,它只会提示一次,直到下次再有数据流入之前都不会提升了,无论fd中是否还有数据可读。
三、简述Reactor和Proactor模式
在高性能的I/O设计中,有两个比较著名的模式:Reactor和Proactor。其中Reactor模式用于同步I/O,Proactor用于异步I/O操作。
1、Reactor
Reactor模式中读操作的具体步骤为:
(1)应用程序注册读就需事件和相关联的事件处理器;
(2)事件分离器等待事件发生;
(3)当发生读就需事件的时候,事件分离器调用第一步注册的事件处理器;
(4)事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理。
2、Proactor
Proactor模式中读操作的具体步骤为:
(1)应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键;
(2)事件分离器等待读取操作完成事件;
(3)在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作,并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区;
(4)事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。
3、区别
从上面看出,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要用户再自己接收数据,直接使用即可,操作系统会将数据从内核拷贝到用户区。
四、简述同步和异步的区别,阻塞和非阻塞的区别
1、同步与异步
同步:所有操作都做完,才返回给用户结果。即写完数据库之后,再响应用户,用户体验不好。
异步:无需等所有操作完成,就响应用户请求。即先响应用户请求,再慢慢写数据库,用户体验较好。
2、阻塞与非阻塞
阻塞:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停地检查这个函数有没有返回,必须等这个函数返回后才可以进行下一个动作。
非阻塞:非阻塞等待,每隔一段时间就去检查I/O事件是否就绪,没有就绪就可以做其他事情。
五、简述BIO和NIO的区别
1、BIO
BIO(Blocking I/O):阻塞I/O,调用者调用了某个函数,等待这个函数返回,期间什么也不做,停地检查这个函数有没有返回,必须等这个函数返回后才可以进行下一个动作。
2、NIO
NIO(New I/O):同时支持阻塞和非阻塞模式,NIO的做法是叫一个线程不断的轮询每个I/O的状态,看是否有I/O的状态发生了改变,从而进行下一步操作。
六、简述5种I/O模型
1、阻塞I/O
调用者调用了某个函数,等待这个函数返回,期间什么也不做,停地检查这个函数有没有返回,必须等这个函数返回后才可以进行下一个动作。
2、非阻塞I/O
非阻塞等待,每隔一段时间就去检查I/O事件是否就绪,没有就绪就可以做其他事情。
3、信号驱动I/O
Linux用套接口进行信号驱动I/O,安装一个信号处理函数,进程继续运行并不阻塞,当I/O事件就绪,进程收到SIGIO信号,然后处理I/O事件。
4、I/O多路复用
Linux用select、poll函数实现I/O复用模型,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的是这两个函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作、写操作的I/O函数进行检查,直到有数据可以读或者可以写时,才真正调用I/O操作函数。
5、异步I/O
Linux中,可以调用aio_read函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移和通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序,用户可以直接去使用数据。
前四种模型:阻塞I/O、非阻塞I/O、多路复用I/O和信号驱动I/O都属于同步模式,因为其中真正的I/O操作(函数)都将会阻塞进程,只有异步I/O模型真正实现了I/O操作的异步性。
异步和同步的区别在于,异步是内核将数据拷贝到用户区,不需要用户再自己接收数据,直接使用即可,而同步是内核通知用户数据到了,然后用户自己调用相应函数去接收数据。
七、简述socket网络编程中客户端和服务端用到哪些函数
1、服务器端函数
(1)socket创建一个套接字;
(2)bind绑定ip和port;
(3)listen使套接字变为可以被动链接;
(4)accept等待客户端的链接;
(5)write/read接收发送数据;
(6)close关闭连接。
2、客户端函数
(1)创建一个socket,用函数socket();
(2)bind绑定ip和port;
(3)连接服务器,用函数connect();
(4)收发数据,用函数send()和recv(),或read()和write();
(5)close关闭连接。
八、简述网络七层参考模型及每一层的作用
如下表:
OSI七层模型 | 功能 | 对应的网络协议 | TCP/IP四层概念模型 |
应用层 | 文件传输、文件管理、电子邮件的信息处理 | HTTP、TFTP、FTP、NFS、WAIS、SMTP | 应用层 |
表示层 | 确保一个系统的应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据的解密和加密 | Telnet、Rlogin、SNMP、Gopher | 应用层 |
会话层 | 负责在网络中的两节点建立,维持和终止通信 | SMTP、DNS | 应用层 |
传输层 | 定义一些传输数据的协议和端口 | TCP、UDP | 传输层 |
网络层 | 控制子网的运行,如逻辑编址,分组传输,路由选择 | IP、ICMP、ARP、RARP、AKP、UUCP | 网络层 |
数据链路层 | 主要对物理层传输的比特流包装,检测保证数据传输的可靠性,将物理层接收的数据进行MAC(媒体访问控制)地址的封装和解封装 | FDDI、Ethernrt、Arpanet、PDN、SLIP、PPP、STP、HDLC、SDLC、帧中继 | 数据链路层 |
物理层 | 定义物理设备的标准,主要对物理连接方式,电气特性,机械特性等制定统一标准 | IEEE 802.1A、IEEE 802.2到IEEE 802. | 数据链路层 |