回顾
I0多路复用的原理?
- 程序首先向操作系统发起一个IO多路复用请求,告诉操作系统需要监视哪些IO通道。这些IO通道可以包括网络套接字、文件描述符等
- 操作系统随后会将这些IO通道放入一个队列中,并在某个IO通道就绪时(如数据到达、文件可读等)向程序发送一个事件通知
- 程序接收到事件后,可以立即处理该IO通道的操作。这意味着,程序可以在单个线程中同时监听多个输入流,并在有数据可读或可写时进行相应的处理,而不需要为每个通道创建一个独立的线程
实现I0多路复用可以使用哪些函数完成?
- 可以使用 select、poll、epoll这些函数来完成
select和poll的区别?
select
- 支持的最大文件描述符数量是有限制的
- 采用轮询方式,将所有待检测的文件描述符放在一个fd_set集合中,每次轮询需要遍历整个集合
- 是标准POSIX接口,在几乎所有操作系统上都能使用
- 对于返回状态码不够清晰明了,需要使用FD_ISSET宏来判断哪些文件描述符已经就绪
- elect函数仅支持三种事件标志:可读、可写和异常
poll
- 没有相关限制,可以处理任意数量的文件描述符
- 采用链表方式,将所有待检测的文件描述符放在一个链表中,每次检查时只需要遍历该链表即可,处理大量文件描述符时,poll效率更高
- 不是标准接口,在一些老旧的操作系统上可能无法使用
- 返回后直接通过revents字段来判断哪些文件描述符已经就绪,这使得poll的返回结果更加直观
- 支持更多的事件标志,包括可读、可写、异常、连接断开、优先级带数据和错误事件等
在UDP通信过程中,能否使用connect函数?为什么?有什么好处?
- 可以使用
- 使用connect函数为UDP套接字设置了一个目标地址后,后续调用send或sendto函数发送数据时,就可以省略目标地址参数。这可以使代码更简洁,减少出错的可能性。
- 当UDP套接字未连接时,send或sendto函数调用失败时,errno可能被设置为ENOTCONN或EDESTADDRREQ。而使用connect函数后,这些问题可以得到简化
- 在某些实现中,使用connect函数连接UDP套接字可能会提高性能,因为系统可以优化网络路径和缓存
- 通常,UDP套接字使用recvfrom函数来接收数据,因为它需要知道数据来自哪个源地址。但是,如果使用connect函数连接了UDP套接字,那么也可以使用recv函数来接收数据,因为系统已经知道数据应该来自哪个地址。这允许你在同一端口上创建多个套接字,这在某些应用程序中可能是有用的
0SI 7层网络体系结构有哪些?
- 应用层::应用层位于OSI参考模型的最高层,它的主要任务是通过应用程序间的交互来完成特定的网络应用
- 表示层:表示层从应用层接受数据,这些数据是以字符和数字的形式出现的(如Chinese、666)
- 会话层:会话层负责建立、管理和终止会话。会话层通过提供单会话或多会话管理、同步以及重新同步服务,来控制哪些应用进程正在通信,并负责建立、管理和终止会话。
- 传输层:传输层的主要任务是将从下层接收的数据进行分段和传输,并在到达目的地址后再进行重组
- 网络层:网络层的主要任务是选择合适的网间路由和交换节点,以确保数据分组(Packet)从发送端到达接收端
- 数据链路层:数据链路层通常也叫做链路层,它位于物理层和网络层之间
- 物理层:物理层是OSI参考模型的最低层,它直接面向实际承担数据传输的物理媒体(如通信链路),负责传送比特流(即由“1”和“0”表示的二进制数串)的功能
四层网络体系结构:
- 网络接口层:这一层没有规定具体内容,目的是互联全世界各种不同的网络接口,如有线的以太网接口,无线局域网的Wi-Fi接口。
- 网络层:主要负责建立两个节点之间的连接,通过寻址来选择合适的路由和交换节点,确保数据能够正确无误地按照地址传送给目的端的传输层。IP协议是这一层的核心。
- 传输层:负责在机器之间建立用于会话的端到端连接(用于数据传输),并提供可靠、透明和优化的数据传输服务机制。该层的核心协议包括TCP(传输控制协议)和UDP(用户数据报协议)。
- 应用层:主要为用户提供针对性的服务,包含大量的应用协议,如HTTP(超文本传输协议)、HTTPS(安全的HTTP)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、POP3(邮局协议第3版)等
ARP、HTTP、TFTP、IP、UDP、TCP说出全程和所在层
- ARP:地址解析协议,它在TCP/IP模型中属于IP层(网络层),在OSI模型中属于链路层。ARP协议用于将计算机的网络地址(IP地址32位)转化为物理地址(MAC地址48位)
- HTTP:超文本传输协议,它属于应用层协议。HTTP协议是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能
- TFTP:简单文件传输协议,它也属于应用层协议。TFTP是一个在UDP之上建立的简单的、面向文件的传输协议,仅支持文件上传和下载功能
- IP:网际互连协议,它位于TCP/IP模型的网络层(相当于OSI模型的网络层)。IP协议设计目的是提高网络的可扩展性,如解决互联网问题、实现大规模、异构网络的互联互通等
- UDP:用户数据报协议,它在TCP/IP模型中属于传输层。UDP是一种无连接的协议,它在传输数据之前不需要建立连接,因此它的传输速度较快,但数据安全性相对较低
- TCP:传输控制协议,同样位于TCP/IP模型的传输层。TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能
顺序表和链表的区别?
- 顺序表
- 顺序表底层存储空间是连续的,它使用一块连续的内存空间存储元素,并通过下标来访问和操作元素。由于元素在内存中连续存储,顺序表具有快速的随机访问能力,访问元素的时间复杂度为O(1)。
- 在顺序表中插入和删除元素时,需要移动其他元素以保持顺序,因此插入和删除的时间复杂度较高,为O(n)。此外,顺序表在插入时可能需要扩容,即开辟新空间、拷贝元素、释放旧空间,这也增加了操作的复杂性。
- 顺序表在存储数据时通常具有较高的空间利用率,因为它使用连续的存储空间,减少了空间碎片。然而,顺序表要求大片连续空间,改变容量不方便。
- 顺序表的设计相对简单,因为它基于数组实现,可以直接使用数组的下标来访问元素。
- 链表
- 链表底层存储空间则是不连续的,它在计算机内存的位置是随机存储的。链表中的元素通过指针链接次序实现逻辑顺序,因此在访问元素时需要从头节点开始逐个遍历,访问元素的时间复杂度为O(n)。
- 链表在插入和删除元素时则相对简单,不需要移动其他元素。链表中的节点包含数据域和指针域,插入和删除操作只需要修改指针即可,时间复杂度为O(1)。
- 链表在存储数据时空间利用率相对较低,因为每个节点除了存储数据外还需要存储指向下一个节点的指针。但是,链表在插入新数据时可以向系统申请新的内存空间,数据删除后也可以将空间还给系统,因此更加灵活。
- 链表的设计则相对复杂,需要定义节点结构、实现节点的链接和遍历等操作。此外,链表在查找数据时也需要按顺序找到该数据为止,无法像顺序表一样进行随机访问
进程和线程的区别?
- 进程
- 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。它具有独立的功能,可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。
- 拥有独立的地址空间和系统资源,包括文本区域、数据区域和堆栈区域等。因此,创建和销毁进程的开销相对较大
- 是独立的执行单元,具有自己的调度算法,在并发条件下更加稳定可靠。然而,由于进程间的相互制约,进程的执行具有间断性,即进程按各自独立的、不可预知的速度向前推进。
- 必须通过IPC(进程间通信)进行通信,切换开销相对较大。这是因为每个进程都有独立的地址空间和资源,需要进行复杂的上下文切换操作。
- 由程序、数据和进程控制块(PCB)三部分组成。一个程序在不同的数据集里就构成不同的进程,能得到不同的结果。
- 线程
- 是操作系统能够进行运算调度的最小单位,它被包含在进程当中,是进程中的实际运作单位。与进程相比,线程更为轻量级,共享进程的地址空间和系统资源。每个进程都至少包含一个线程,称为主线程,而其他线程则被称为子线程。
- 则直接访问其所属进程的地址空间和资源,因此可以方便地共享数据。与进程相比,线程的创建和销毁开销较小,因为它们共享进程的资源
- 可以并发执行,提高程序的吞吐量和响应性。但由于线程共享进程的资源,线程之间的调度和同步比较复杂,对并发条件的处理需要更多的注意。
- 可以直接共享进程的地址空间和资源,因此切换开销相对较小。这使得线程之间的通信更加高效和灵活。
- 一个进程可以包含多个线程,这些线程共享相同的地址空间和资源。这使得线程在编程中更加灵活和高效。