C语言面试题小结

排序算法
1、快速排序
原理  时间和空间复杂度

归并排序

******网络的字节序 
大端:高字节放在内存高位
小端:低字节放在内存低位
网络序用的是大端主要是统一字节序,不同cpu架构,可能用不同的字节序

大小端的判断{
char a = 0;
 int b = 1;

memcpy(@b,@a,sizeof(a));
if(1 == a)
{
    是小端
}
else
{
    是大端
}

为什么要有网络序?
不同cpu架构不同的存储模式,所以确定一个网络传输标准


******网络知识 tcp三次握手 各种细节 timewait状态
三次握手syn ack 序列号变化
tcp 和 udp包的保文格式内容


******tcp 与 udp 区别 概念 适用范围
都在传输层,tcp需要三次握手建立连接,udp是无连接


******TCP四次挥手讲一下过程,最后一次ack如果客户端没收到怎么办,为什么挥手不能只有三次,为什么time_wait。
没收到无法释放连接,
TIME_WAIT存在的理由之一是尽可能护送最后的ACK达到对端。
TIME_WAIT存在的理由之二是新旧四元组(旧连接和新连接完全一样,可能会相互干扰,过一段时间,解除干扰)互不干扰。


******对于socket编程,accept方法是干什么的,在三次握手中属于第几次,可以猜一下,为什么这么觉得。
accept()函数获取连接fd 属于三次握手之后


******tcp怎么保证有序传输的,讲下tcp的快速重传和拥塞机制,知不知道time_wait状态,这个状态出现在什么地方,有什么用?
快速重传机制:当接收端收到比期望序号大的报文段时,(由于有可能是因为网络原因先后到达,故设计连续收到比期望大的三个ACK,称为冗余ACK)
拥塞机制:慢启动的过程,刚连接的时候不会一下子就满速率发送,而是一点一点的加,收到对端ack确认包后再加,如过收到三个冗余ACK包,就降低发送速率

每个Tcp socket在内核中都有一个发送缓冲区和一个接受缓冲区。tcp协议要求对端在接受到tcp数据报之后,要对其序号进行ACK,只有当接受到一个tcp数据报的ACK之后,才可以把这个tcp数据报从socket的发送缓冲区清除,另外tcp还有一个流量控制功能,tcp的socket接受缓冲区接受到网络上来的数据缓存起来后,如果应用程序一直没有读取,
socket接受缓冲区满了之后,发生的动作是:通知对端TCP协议中的窗口关闭,这便是滑动窗口的实现,保证TCP socket接受缓冲区不会溢出,因为对方不允许发送超过所通知窗口大小的数据, 这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它。

******知道udp是不可靠的传输,如果你来设计一个基于udp差不多可靠的算法,怎么设计?
UDP只有一个socket接受缓冲区,没有socket发送缓冲区,即只要有数据就发,不管对方是否可以正确接受。而在对方的socket接受缓冲区满了之后,新来的数据报无法进入到socket接受缓冲区,此数据报就会被丢弃,udp是没有流量控制的,
设计思路
数据完整性 –> 加上一个16或者32位的CRC验证字段              类似checksum
乱序 –> 加上一个数据包序列号SEQ                            序列号
丢包 –> 需要确认和重传机制,就是和Tcp类似的Ack机制

******http与https有啥区别?说下https解决了什么问题,怎么解决的?说下https的握手过程。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
(1)客户使用https的URL访
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。

1) https相对于http加入了ssl层,
2)需要到ca申请收费的证书,
3)安全但是耗时多,缓存不是很好,
4)注意兼容http和https(开发上)


******tcp 粘包半包问题怎么处理?
更具体的原因有三个,分别如下。
            1. 应用程序写入数据的字节大小大于套接字发送缓冲区的大小
            2. 进行MSS大小的TCP分段。MSS是最大报文段长度的缩写。MSS是TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是TCP报文段的最大长度,而是:MSS=TCP报文段长度-TCP首部长度
            3. 以太网的payload大于MTU进行IP分片。MTU指:一种通信协议的某一层上面所能通过的最大数据包大小。如果IP层有一个数据包要传,而且数据的长度比链路层的MTU大,那么IP层就会进行分片,把数据包分成托干片,让每一片都不超过MTU。注意,IP分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

解决粘包半包问题
由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,可以归纳如下。
(1)在包尾增加分割符,比如回车换行符进行分割,例如FTP协议;linebase包和delimiter包下,分别使用LineBasedFrameDecoder和DelimiterBasedFrameDecoder,如果超过规定字节长度,会报错。
(2)消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;fixed包下,使用FixedLengthFrameDecoder
(3)将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第 一个字段使用int32来表示消息的总长度,LengthFieldBasedFrameDecoder;。

******keepalive 是什么东东?如何使用?
用来探测对方是否还在


列举你所知道的tcp选项,并说明其作用。

****************socket什么情况下可读?
该套接字接收缓冲区中的数据字节数大于等于套接字接收缓存区低水位
该连接的读半部关闭(也就是接收了FIN的TCP连接)
该套接字是一个listen的监听套接字,并且目前已经完成的连接数不为0;
有一个错误套接字待处理


nginx的epoll模型的介绍以及io多路复用模型(重点)
select,poll,epoll各自原理和区别 怎么选择使用


SYN Flood攻击


**********流量控制,拥塞控制
拥塞机制:慢启动的过程,刚连接的时候不会一下子就满速率发送,而是一点一点的加,收到对端ack确认包后再加,如过收到三个冗余ACK包,就降低发送速率。

**********TCP和UDP区别,TCP如何保证可靠性,对方是否存活(心跳检测)
三次握手机制
重传机制
序列号
拥塞机制

tcpdump抓包,如何分析数据包
tcpdump -i ens32 -nn 


tcp如何设定超时时间
 alarm(5)  设置超时时间


***************基于socket网络编程和tcp/ip协议栈,讲讲从客户端send()开始,到服务端recv()结束的过程,越细越好
create-》bind-》listen-》accept-》-》recv   建立连接的过程
                         connect-》-》send
                         
send()加入发送缓冲区,应用层传给驱动,驱动调用网卡发包,局域网的话,找到         

                         
http报文格式


http1.1与http1.0区别,http2.0特性


http3了解吗


http1.1长连接时,发送一个请求阻塞了,返回什么状态码?


udp调用connect有什么作用?
用它来检测udp端口的是否开放

操作系统
进程和线程-分别的概念 区别 适用范围 它们分别的通讯方式 不同通讯方式的区别优缺点


僵尸进程

常见的锁类型,各自区别,从操作系统角度说(重点)


常见死锁是怎么产生的,怎么定位的(重点)


CPU的执行方式


代码中遇到进程阻塞,进程僵死,内存泄漏等情况怎么排查。(重点)


为什么访问空指针进程会挂掉?


有没有了解过进程?说下进程和线程的区别?(重点)
进程,线程,协程


堆是线程共有还是私有,堆是进程共有还是私有,栈呢
堆是线程共有的,栈是线程私有的


共享内存的使用实现原理(必考必问,然后共享内存段被映射进进程空间之后,存在于进程空间的什么位置?共享内存段最大限制是多少?)


使用过哪些进程间通讯机制,并详细说明(重点)
信号量    携带信息太少
有名管道   
无名管道  
共享内存  速度最快的通信
socket通信 不同设备间通信

多线程和多进程的区别(重点 面试官最最关心的一个问题,必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催)


信号:列出常见的信号,信号怎么处理?

register:

      在函数内部定义变量时,默认是auto类型,即分配给变量内存。如果定义一个变量用register关键字,那么编译器尽可能把变量存放在CPU内部寄存器中,这样就不必通过内存寻址来访问变量,提高访问效率

volatile:

    这个是嵌入式开发必须知道的。用volatile修饰变量或地址,相当于告诉编译器这个值会随时发生变化,每次使用都要去内存中重新读取它的值。如果不用volatile,编译器会有优化操作:在同一进程中当上一次对这个地址操作的值在该进程中没有被修改时候,它会自动把上次读的数据取出来,而不是重新从这个地址取内容。在嵌入式开发中对寄存器或I/O端口的操作都要用volatile。

关键字 volatile 有什么含意? 并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设
这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,
而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量


说出你所知道的各类linux系统的各类同步机制(重点),什么是死锁?如何避免死锁(每个技术面试官必问)


列举说明linux系统的各类异步机制


如何实现守护进程?
特殊的僵尸进程

linux的内存管理机制是什么?

linux的任务调度机制是什么?

标准库函数和系统调用的区别?

指针函数和函数指针的区别?

宏定义和const常量的区别?

指针长度?要考虑64,32位系统

为什么进程用虚拟内存?

中断是什么?

*************Linux系统

linux的各种命令 给你场景让你解决

Linux了解么,查看进程状态ps,查看cpu状态 top。查看占用端口的进程号netstat grep

Linux的cpu 100怎么排查,top jstack,日志,gui工具

Linux操作系统了解么

怎么查看CPU负载,怎么查看一个客户下有多少进程

Linux内核是怎么实现定时器的

gdb怎么查看某个线程

core dump有没有遇到过,gdb怎么调试,

linux如何设置core文件生成

linux如何设置开机自启动

linux用过哪些命令、工具

用过哪些工具检测程序性能,如何定位性能瓶颈的地方

netstat tcpdump ipcs ipcrm (如果这四个命令没听说过或者不能熟练使用,基本上可以回家,通过的概率较小 _ ,这四个命令的熟练掌握程度基本上能体现面试者实际开发和调试程序的经验)

cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟练掌握,设置修改权限 tcp网络状态查看 各进程状态 抓包相关等相关命令 必须熟练掌握


gdb调试相关的经验,会被问到

************************comware操作系统相关
整体架构

cli
netconf       ---》  comsh守护进程(解析命令 -》 对应的进程插件-》拉起进程,发给进程)   ---》 具体进程(处理业务)  ---》保存DBM
snmp
openflow     《---返回数据                                  《---返回数据                                          

SR的好处:不需要查路由表(查标签转发表,更简单高效),支持标签srpolicy,显示路径等等
SR的发展:mpls-》sr
简单说下SDN:转发和控制分离,确定一个中心化,可编程


ospf,isis算出路由--》路由管理--》转发--》下驱动

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值