1、udp协议的特点有哪些?
a、无连接,发送和接收数据不需要建立连接,开销小,实时性好
b、不可靠传输,不保证数据包能够到达目的地,也不保证数据包的顺序
c、面向数据报的,以数据报形式发送数据
// 创建DatagramPacket对象,包含要发送的数据、长度、服务器地址和端口
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
d、支持广播和多播形式,UDP支持广播和多播功能,这使得UDP能够向多个目的地址发送相同的数据报。
2、TCP如何保证可靠的传输?
序列号和确认应答、超时重传、校验和、流量控制、拥塞控制、连接自动管理、数据分块的方式保证可靠传输。
序列号和确认应答:保证数据到达客户端,客户端能够对数据进行去重、排序等
超时重传:客户端超过定时器时间未应答,则重传
校验和:客户端对数据进行校验和计算对比服务端校验和,如果不一致,则认为数据在传输过程中发生异常,要求服务端重传。
流量控制:服务端会依据客户端的接收窗口大小,调整自己的发送数据速率,避免客户端过多数据堆积,导致丢包重发
拥塞控制:在网络拥堵时,服务端会自动调整自己的发送速率
连接管理:TCP三次握手和四次挥手,确保服务端和客户端已连接
数据分段:TCP数据报文分块,出现丢包等异常时只需重发异常部分。
3、Linux系统的零拷贝技术?
零拷贝(Zero-Copy)就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术,是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。
传统read+write方式:四次上下文切换和四次数据拷贝(其中两次有CPU参与)
主要方式有:
mmap+write方式:四次上下文切换和三次数据拷贝(用户空间到socket缓冲区时CPU参与)
splice(通过内核管道做中转传递数据),两次上下文切换和两次数据拷贝(要求有一个文件描述符需要支持管道)
sendfile方式:Linux2.4以前,两次上下文切换和三次拷贝(有一次是内核缓冲区拷贝到socket缓冲区);Linux2.4及以后,两次上下文切换和两次拷贝(磁盘到内存缓冲区,内存缓冲区到网卡缓冲区;原来的内核缓冲区到socket内存缓冲区改为了非传统拷贝,在socket缓冲区中引用指向内核缓冲区包含了偏移量等)
4、说一说进程调度算法有哪些
-
先来先服务(FCFS,First-Come, First-Served):按照进程到达的先后顺序进行调度,先到达的进程先执行。
-
**短作业优先调度(SJF, Shortest Job First):**选择估计运行时间最短的进程优先执行,以减少平均等待时间。特点:可以最大程度地减少平均等待时间,但可能会导致长作业被饿死(即长时间得不到执行)。
-
时间片轮转调度(RR, Round-Robin): 所有进程按照到达顺序排成一个队列,每个进程执行一个时间片后,将CPU时间片分配给下一个进程。特点:适用于时间片较短的情况,能够平衡各个进程的执行,但可能导致上下文切换频繁。
-
**优先级调度(PSA, Priority Scheduling Algorithm):**为每个进程分配一个优先级,优先级高的进程先获得CPU时间片。特点:可以根据不同的情况调整优先级,但可能导致低优先级的进程长时间等待,出现饥饿现象。
-
**多级反馈队列调度(MFQ, Multi-level Feedback Queue Scheduling):**将进程分为多个队列,每个队列有不同的优先级和时间片大小。进程在一个队列中执行完毕后,可以进入下一个优先级较高的队列。特点:能够兼顾不同类型的作业,既可以保证短作业优先执行,又可以避免长作业饥饿。
-
**最高响应比优先调度(HRRN, Highest Response Ratio Next):**根据等待时间和估计运行时间的比值(响应比)来选择下一个执行的进程,以最大化响应比。特点:可以减少平均等待时间,但需要预先知道每个进程的运行时间。