思维导图
C语言中指针数组和数组指针的区别
数组指针本质上是一个指针变量,用于存储整个数组的起始地址,指针每偏移一个单位,内存就会偏移整个数组的容量的大小,一般用于二维数组,二维数组的数组名,本质上是一个数组指针常量
本质上是一个数组,只是每个数据元素都是一个指针变量
结构体字节对齐
结构体中的每个成员,在分配内存时,要以数据类型对齐一次;所有成员分配内存结束后,整体也需要对齐一次;32位系统以 min(最大字节的成员,4) 对齐,64位系统以 min(最大字节的成员,8)对齐
TCP和UDP的区别
TCP ----> 稳定
提供面向连接的,可靠的数据传输服务;传输过程中,数据不会出错;TCP会给每个数据包编上编号,该编号称之为序列号,每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止;数据传输效率低,耗费资源多;数据收发是不同步的,为了提高效率,TCP会将多个较小,并且发送间隔短的数据包,沾成一个包发送,该现象称为沾包现象
UDP ----> 快速
面向无连接的,不保证数据可靠的,尽最大努力传输的协议;传输过程中,数据是可能会出错的;数据传输效率高,实时性高;限制每次传输的数据大小,多出部分直接忽略删除;收发是同步的,不会沾包
同步通信和异步通信的区别
同步通信:发送和接收在同一时间进行,发送方需要等待响应(阻塞)
异步通信:发送和接收可以在不同时间进行,发送方不需要等待响应(非阻塞)
谈谈你对多线程的理解
线程也称轻量版的进程,是进程的一个执行路径。
线程是任务调度的最小单位。
每个进程都至少有一个线程。
线程操作消耗内存较小,效率较高。
线程还有同步互斥机制:对于线程同步问题,有两个机制完成:无名信号量和条件变量;
对于线程互斥问题,采用互斥锁来解决。
线程允许多并发执行,多个线程可以共用一个进程
多个线程释放资源时,可能会发生死锁
大小端的验证
将一个整数的指针或对象内容转成字符数组的方式来检查内存中字节的顺序
互斥锁相关问题
互斥锁本质上也是一个特殊的临界资源,该临界资源在同一时刻只能被一个线程所拥有,当一个线程试图去锁定被另一个线程锁定的互斥锁时,该线程会阻塞等待,直到拥有互斥锁的线程解锁了该互斥锁;在多线程编程中,死锁是一种情况,其中两个或多个线程被永久阻塞,因为每个线程都在等待其他线程释放它们需要的资源。
共享内存特点
共享内存表示的是多个进程共享一个外部的物理内存,效率比较高
共享内存具有时效性,存放到共享内存区域中的数据,如果不及时读取,下一次写入后,前面的数据会被覆盖
共享内存的操作不是一次性的,写入到共享内存中的数据,即使读取出去后,依然存在于共享内存,直到下一次被覆盖
讲一下C中的指针
指针是一种特殊的变量,它存储的是另一个变量的内存地址。指针提供了一种间接访问内存的方式,使得程序能够动态地操作数据
指针有:指针数组,数组指针,指针函数,函数指针,野指针,空指针,指针和内存分配
gcc分步编译
预处理阶段:将预处理指令解析(例如条件编译的处理、头文件的展开等),删除注释
编译阶段:将程序进行语法分析和语义分析,中间代码优化,生成汇编程序
汇编阶段:将汇编程序编译生成目标程序(.o文件),是一个二进制程序
链接阶段:将多个目标程序与相关库(静态库或动态库)进行链接,生成可执行程序
说一下对套接字的理解
sfd = socket(); //创建一个用于连接的套接字文件描述符
bind(); //为服务器套接字绑定ip地址和端口号,为了让客户端额能够找到服务器
listen(); //将服务器套接字设置成被动监听状态,用于接收客户端的连接请求
newfd = accept(); //阻塞等待客户端的连接请求,如果有客户端发来连接请求,创建一个新的用于通信的套接字文件描述符
while(1) { send\recv\read\write; //数据收发工作 }
close(); //关闭套接字、关闭监听
HTTP协议和TCP协议和UDP协议之间的关系
HTTP是应用层协议,TCP是传输层协议,两者的联系是BS模型,HTTP需要TCP来传输其封装的数据,TCP也能保证HTTP相关的数据的完整和正确
IP地址和子网掩码如何决定 网卡所在的网段
IP地址&子网掩码
计算机网络中的OSI七层模型和TCP/IP四层体系结构
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
网络接口层,网际层,传输层,应用层
数据结构中栈和队列的区别
栈和队列都是操作受限的线性表;
栈是先进后出的,队列是先进先出的;
栈是在栈顶进行插入和删除的,而队列实在队尾进行插入,队头进行删除的;
数据结构中顺序表和链表的区别
顺序表通常使用数组实现,链表通常使用若干个节点组成;
顺序表访问速度较快,链表访问速度较慢;
顺序表插入元素或删除元素需要移动大量元素,链表只需改变它的相邻节点指针就可以了;
顺序表通常在栈上分配内存,而链表在堆上分配内存;
顺序表实现相对简单,链表实现相对复杂;
TCP通信的3次握手和4次挥手
第一次握手:客户端向服务器发送一个SYN报文,并进入SYN_SENT状态,请求建立连接;
第二次握手:服务器收到请求后,想客户端发送一个SYN-ACK报文,,并进入SYN_RCVD状态,同意连接请求;
第三次握手:客户端收到后,想服务器发送AVK报文,此时连接成功。
第一次挥手:主动端向被动端发送FIN报文,进入FIN-WAIT_1状态;
第二次挥手:被动端收到后,发送ACK报文,进入CLOKSE_WAIT状态。主动方接收到ACK报文后进入FIN-WAIT_2状态。如果数据未发送完毕,则继续发送直到完毕;
第三次挥手:被动端向主动端发送FIN报文,进入LAST_ACK状态;
第四次挥手:主动端收到后,回复一个ACK报文,被动端收到后断开连接。
指针和指针变量的区别
指针是一种数据类型,而指针变量是这种类型的实例;
指针变量存储的是一个内存地址,而指针定义了指针变量可以存储哪一种指针类型的内存地址;
共享内存和消息队列的优缺点
共享内存:
优点:提供了最快的IPC之一,实施起来相对方便,访问速度快;
缺点:需要使用额外的同步机制来避免竞态条件和数据不一致,不当的使用可能使内存泄漏。
消息队列:
优点:提供了数据封装,每个消息都可以包含不同的数据和优先级;本身提供了同步机制,避免竞态条件;
缺点:比共享内存更复杂;消息可能会延迟;对资源有限制
结构体中一个char 一个int 结构体占字节长度是多少
8个字节