目录
14、计算机网络中的OSI七层模型和TCP/IP四层体系结构
思维导图:
面试题练习:
1、C语言中指针数组和数组指针的区别
答:指针数组本质上是一个数组,数组中的元素都是指针,数组中可以存储很多指针,这些指针的数据类型一致。数组指针本质上是一个指针,这个指针指向了一个数组
2、结构体字节对齐的原理
答:结构体成员在内存地址为其字节大小的倍数的位置开始,不足则补充,各自对齐后还会根据最大字节数的成员的字节数的倍数对齐,另外,也会根据不同的要求额外进行对齐
3、TCP和UDP的区别
答:TCP通信时需要连接,数据完整性高、有序性高,但是传输效率不好保证,遇到网络不好等因素就会难以通信,传输速度也更慢,能够根据网络状况调整传输的速度,具有错误恢复机制,常用于传输要求可靠的程序。
UDP无需连接,但数据完整性难以保证,数据序列也可能是乱的,传输速度相对较快,数据发送可以保持最大速度,没有错误回复机制,常用于实时性要求的程序
4、同步通信和异步通信的区别
答:同步通信的发送方接收方数据传输保持同步,必须确认收到数据才能进行后续操作,基本不需要缓冲区,效率偏低,错误处理也比较简单,CPU占用率较高,使用于需要提高数据完整性和可靠性的环境
异步通信发送方接收方不用等待对方的数据即可发送数据,需要较大缓冲区等待对方处理数据,效率更高,错误处理更复杂,CPU占用率较低,适用于实时性要求高的环境
5、多线程的理解
答:多线程是一种编程技术,可以在同一时间执行多个任务,可以提高程序的效率,多线程允许程序并发进行,也可以并行执行,同一个进程内线程间共享内存和资源,但也要创建和管理线程,多个线程存在时会有同步互斥机制,需要使用互斥锁、信号量、条件变量等来控制,线程间等待释放资源时也可能会发送死锁现象,需要关闭线程等操作来解决
6、大小端验证
答:通过共用体判断,创建一个共用体,包含一个int类型的变量和一个char类型的变量,赋予int变量一个特定值,通过char检测对应字节
通过指针判断,创建一个int*类型的指针并初始化,将其地址转为char*类型,判断指针的值来得知大小端
7、互斥锁
答:互斥锁本质上是一种线程同步机制,作用是防止多个线程同时访问同一个共享资源,使用互斥锁时需要先锁定防止其他线程访问,访问完后需要解锁,以便别的线程访问,一个锁尝试锁定另一个已经锁定的锁时,可能会发送死锁,这个机制适用于保护多个线程使用的共享资源
8、共享内存特点
答:共享内存允许多进程线程直接访问同一块内存,效率更高,需要同步机制,生命周期需要明确管理,适用于需要高速数据交换的环境,一般和信号量集一起使用
9、C语言的指针
答:指针存储了变量在内存的地址,可以通过指针直接访问操作内存,指针声明时需要指定变量类型,也需要初始化才能使用,*操作符可以访问指针所指向的内存地址存储的值,&运算符可以获取指针指向的地址,指针偏移时指向的地址会按照数据类型的字节大小增加,指针指向数组时,数组名通常是指向首元素的指针,可以创建一个指针来存储指针,也可以创建一个指针来指向函数,指针可以转换数据类型,也可以比较指向的地址,指针的操作不当会造成内存泄漏、野指针、缓冲区一处的问题
10、gcc编译
答:gcc是一种编译器,常用于编译C语言,用来生成中间文件和可执行文件,分布的编译包括预处理、编译、汇编、链接,预处理阶段处理条件编译、展开头文件、删除注释,编译阶段将程序进行语法分析和语义分析,生成汇编程序,汇编阶段将汇编程序编译生成目标二进制程序,链接阶段将多个目标程序与相关库进行链接,生成可执行文件
11、socket套接字
答:套接字是进程间通信的端点,本质上是一种文件描述符,每个套接字与唯一的地址绑定,面向TCP时需要连接才能进行传输,同时也需要监听对方的连接,面向UDP时不用连接,可以设置阻塞状态,socket函数返回的文件描述符开辟了两个缓存区用于传输和接收
12、HTTP协议和TCP协议之间的关系
答:HTTP是应用层协议,TCP是传输层协议,两者的联系是BS模型,HTTP需要TCP来传输其封装的数据,TCP也能保证HTTP相关的数据的完整和正确
13、IP地址和子网掩码如何决定网卡所在网段
答:子网掩码是32位无符号整数,IP地址&子网掩码得到的结果就是网卡所在的网段
14、计算机网络中的OSI七层模型和TCP/IP四层体系结构
答:OSI七层模型包括物理层、数据链路层、网络层、运输层、会话层、表示层、应用层
TCP/IP四层体系结构包括网络接口层、网际层、运输层、应用层
15、数据结构栈和队列的区别
答:栈和队列都是操作受限的线性表,栈的特点是先进后出,队列的特点是先进先出,栈的操作都是同一端进行,队列的操作是在异端进行
16、数据结构顺序表和链表的区别
答:顺序表和链表都是根据存储形式区分的线性表,顺序表是顺序存储的线性表,下标相邻的元素物理存储地址也相邻,链表是链式存储的线性表,节点相邻的元素物理存储地址不一定相邻,顺序表的元素数量受数组范围和内存空间最大连续内存空间影响,而链表仅受内存空间剩余总内存大小影响,顺序表可以通过下标快速定位对应元素,而链表需要不断通过指针导向下一个节点最终找到对应元素,顺序表关闭只需要释放本身即可,而链表需要先释放所有节点,再释放本身
17、TCP通信三次握手四次挥手
答:客户护短发送SYN包,进入SYN_SENT状态;服务器接收SYN包并发送ACK包和SYN包,进入SYN_RCVD状态;客户端接收SYN包和ACK包,进入establish状态,发送ACK包,服务器也进入establish状态
主动关闭方发送FIN包,进入FIN_WAIT_1状态;被动方接收FIN包,发送ACK包,进入CLOKSE_WAIT状态,主动方接收ACK包,进入FIN_WAIT_2状态,发送完所有数据;被动方发送FIN包,进入LAST_ACK状态;主动方接收FIN包,发送ACK包,被动方接收ACK包,关闭连接
18、指针和指针变量
答:指针是内存地址编号
指针变量是存储指针的变量
19、共享内存和消息队列的优缺点
答:共享内存通信速度快,直接访问内存实现多个进程间通信,但是没有内置的同步机制,可能出现数据不一致的问题,编程复杂度高
消息队列可以发送具有特定格式和优先级的消息,独立于发送和接收进程,能够保留信息,但是系统复杂度提高,需要处理消息顺序性、丢失等问题,可能引入延迟
20、结构体中一个char一个int结构体字节长度是多少
答:8个,int对齐结果是在char和int间插入三个字节