C语言中指针数组和数组指针的区别
是两种不同的数据结构
指针数组是一个数组,其中每个元素都是指针
数组指针是一个指向数组的指针,可以用来指向整个数组
结构体如何对齐
结构体中的每个成员再分配内存时,要以数据类型对齐一次,插入填充字节
所有成员分配内存结束后,整体需要对齐一次,确保结构体大小是最大对齐要求的倍数
TCP和UDP的区别
TCP是面向连接的协议,在数据传输钱需要建立连接,通过三次握手过程建立连接,确保双方能够通信,传输完毕后需要通过四次挥手过程断开连接
UDP是无连接的协议,数据传输不需要建立连接或断开连接过程,数据包可以随时发送和接收,没有握手过程
TCP提供可靠的数据传输服务,TCP确保数据包按顺序到达,并且没有数据丢失或重复
UDP不提供可靠性保证。UDP不保证数据包的到达顺序,也不保证数据包的完整性或不会丢失
TCP数据传输速度通常较慢,但能提供更高的可靠性和准确性
UDP数据传输速度通常较快,但可能会失去丢失数据或出现数据错误
TCP适用于对数据传输可靠性和顺序要求较高的场景
UDP适用于对实时性要求较高,但可以容忍一定数据丢失的场景
同步通信和异步通信的区别
同步通信中,通信的双方需要同一时间进行数据交换,发送方发送数据时会等待接收方的确认响应,接收方处理数据时会等待数据到来。
异步通信中,通信的双方不需要同时进行数据交换,发送方在发送数据后不会等待接收方的响应,可以继续进行其他操作,接收方也可以任意时间处理到达的数据,数据的发送和接收是独立的
对多线程的理解
线程是操作系统能够进行调度的基本单位,属于进程的一个组成部分,一个进程可以包含多个线程,这些线程共享进程的内存和资源
并发:多线程允许程序的多个任务同时进行,在单核处理器上,通过快速切换线程,使这些任务看上去是并行的
并行:在多核处理器上,多线程能够真正实现并行执行,多个线程在同一时刻在不同处理器核心上运行
线程生命周期包括创建、就绪、运行、等待、终止状态
多线程程序中,多个线程可能会访问共享资源。为了防止数据冲突或不一致,需要使用同步互斥机制,如互斥锁,信号量,条件变量
大小端的验证
多字节数据在内存中的存储顺序。
大端:数据的高位字节存储在低地址
小端:数据的低位字节存储在低地址
将一个多字节整数写入内存,检查其在内存中的实际字节顺序
创建一个32位整数0x12345678,将整数的地址强制转换为unsigned char类型指针,逐字节访问内存
互斥锁的相关问题
在同一时刻只允许一个线程访问共享资源。其他试图访问该资源的线程必须等待,直到资源被释放
线程访问共享资源前需要获取互斥锁,访问完成后释放互斥锁,获取锁的线程可以安全访问资源
可以保护共享资源,同步线程
死锁发生在多个线程相互等待对方持有的资源,导致所有线程都无法继续执行
避免持有和等待,尽可能让线程在开始执行前一次性获取所必需资源
按顺序获取资源
等待时间过长可以放弃回退
监测到死锁采取终止线程措施
共享内存特点
共享内存直接在进程间共享数据,不需要通过系统调用进行数据复制,数据传输速度快,效率高
具有时效性,放到共享内存区域中的数据如果不及时读取,下一次写入后前面的数据会被覆盖
共享内存的操作不是一次性的,写入共享内存中的数据,即使读取出去后,依然存在于共享内存,直到下次被覆盖
c语言中的指针
指针是一个变量,它的值是另一个变量的内存地址,指针通过该地址访问和操作存储在那里的数据
gcc编译
预处理-展开头文件,替换宏定义,删除注释
编译-检查语法问题,有错报错,没有则继续运行生成汇编文件
汇编-生成一个不可执行的二进制文件
链接-链接库函数,最终生成二进制文件
http协议和tcp协议udp协议之间的关系
http在应用层协议,通常使用tcp作为其传输层协议,http通过tcp提供可靠连接来确保数据的完整传输顺序,udp是传输层协议,可用于任何应用层协议,不仅限于http
指针和指针变量
指针是一种变量,存储另一个变量的内存地址
指针变量时存储指针值的变量,即存储其他变量地址的变量