前言
本篇文章继续讲解笔试和面试。
一、数组和链表的区别
1.内存:
数组使用连续的内存块来存储元素,每个元素在内存中占据固定大小的空间。这样的存储方式使得数组的访问速度快,通过索引即可直接访问任意位置的元素。
链表使用分散的内存块来存储元素,每个元素(节点)在内存中可以位于任意位置。每个节点包含了存储数据的部分和指向下一个节点的指针。这种存储方式使得插入和删除操作更加灵活,但访问元素需要遍历整个链表。
2.性能:
数组的访问速度快,通过索引可以直接访问任意位置的元素,时间复杂度为 O(1)。但是在插入和删除元素时,需要移动其他元素来保持连续性,导致时间复杂度为 O(n)。
链表在插入和删除元素时,只需要修改指针的指向,所以插入和删除的时间复杂度可以达到 O(1)。但是在访问元素时,需要遍历链表,时间复杂度为 O(n)。
3.操作复杂度:
数组的插入和删除操作需要移动其他元素,因此操作复杂度较高。在插入和删除元素的场景较多时,数组性能不如链表。
链表的插入和删除操作只需要改变指针的指向,操作复杂度较低。在需要频繁执行插入和删除操作的场景中,链表更加适合。
数组适合于需要频繁访问元素的场景,而链表适用于需要频繁插入和删除元素的场景。
二、什么是内存对齐
内存对齐是指在存储数据时,将数据按照一定规则放置在内存中的过程。
三、IIC的时序
1.开始信号(Start Signal):主设备发送一个低电平的信号,表示即将开始通信。
2.从设备地址(Device Address):主设备发送从设备的地址,主要用于指定与之通信的从设备。地址包括一个7位的从设备地址和读/写位。读/写位用于指示主设备是要进行读操作还是写操作。
3.应答信号(Acknowledge Signal):每次发送地址或数据后,发送方会释放SDA线(串行数据线),然后接收方会发送应答位。如果接收到的正确数据,则发送一个低电平的应答(ACK)信号;如果接收到的数据有误或不需要发送应答,则发送一个高电平的非应答(NACK)信号。
4.读或写操作(Read or Write Operation):主设备通过传输数据来完成读或写操作。在读操作中,从设备向主设备发送数据;在写操作中,主设备向从设备发送数据。
5.停止信号(Stop Signal):主设备发送一个高电平的停止信号,表示通信结束。
四、static作用
static关键字在C语言中可以用于静态变量、静态函数、静态全局变量和静态局部变量。它们的具体作用包括控制变量的生命周期、作用域以及对其他文件的可见性。
五、查看tty设备的方法
使用ls /dev/tty*
六、查找指定文件命令
1.使用find命令:
find <路径> -name <文件名>
<路径>:指定要搜索的起始路径。可以是根目录 /,也可以是当前目录 .,或者其他指定的目录。
-name <文件名>:指定要查找的文件名。可以使用通配符进行模糊匹配,如 * 表示任意字符。
2.使用locate命令:
locate <文件名>
<文件名>:指定要查找的文件名。与find不同,locate命令使用基于数据库的搜索,因此速度较快。
七、三次握手和四次挥手
1.三次握手
1.第一次握手(SYN):客户端向服务器发送一个带有 SYN(同步)标志的包,用于请求建立连接。发送方选择一个初始的序列号(Sequence Number)作为起始值,并将 SYN 标志置为1。
2.第二次握手(SYN+ACK):服务器收到客户端的 SYN 包后,确认收到,并向客户端发送一个带有 SYN 和 ACK(应答)标志的包。服务器也会为自己选取一个初始的序列号,并将客户端的序列号加1作为确认号(Acknowledgment Number)。
3.第三次握手(ACK):客户端收到服务器的 SYN+ACK 包后,向服务器发送一个带有 ACK 标志的包作为确认。该包中的序列号被设置为收到的确认号加1。
2.四次挥手
1.第一步(FIN1):
主动关闭连接的一方(称为发起者)向对方发送一个带有 FIN(Finish)标志的 TCP 报文段。
发起者不再发送数据,但仍可以接收对方发送的数据。
2.第二步(ACK1):
接收到 FIN 的一方(称为被动关闭者)收到 FIN 报文后,向发起者发送一个确认应答(ACK)报文,确认已收到 FIN。
被动关闭者仍可以发送剩余数据,直到发送和接收缓冲区中的数据都被传输完成。
3.第三步(FIN2):
被动关闭者发送一个带有 FIN 标志的报文段,表示它也希望关闭连接。
被动关闭者不再发送数据,但仍可以接收来自发起者的数据。
4.第四步(ACK2):
发起者接收到被动关闭者的 FIN 后,向被动关闭者发送一个确认应答,确认收到 FIN。
发起者等待一段时间,以确保对方收到确认应答。
八、半关闭状态
半关闭(Half-closed)状态是指在 TCP 连接中,一方关闭了它的输出流(发送数据),但仍然可以接收对方发送的数据。
九、字节流和数据报
字节流(TCP):
字节流是 TCP 中的传输方式,它将数据视为连续的字节流,没有明确的消息边界。
TCP 将数据划分为一个个的字节,并以无结构的方式在连接上进行传输。
发送方将数据以字节流的形式发送给接收方,接收方接收到字节后按照顺序重新组装成完整的数据。
具有可靠性和顺序性,TCP 通过序列号、确认号和重传机制来保证数据的可靠性和正确的顺序。
数据报(UDP):
数据报是 UDP 中的传输方式,它将数据视为独立的数据包,每个数据包之间是独立的。
UDP 将数据划分为一个个固定大小的数据报(通常称为 UDP 数据报或者 UDP 包)进行传输。
每个数据报都有自己的头部信息,包括源端口、目标端口和长度等,用于标识和组装数据。
数据报发送时不保证顺序和可靠性,接收方无法确保接收到的数据报的顺序和完整性。
总结
本篇文章就讲解到这里。