面试题解答整理

1、gdb调试原理

https://blog.csdn.net/u012658346/article/details/51159971

2、线程连接池的实现原理

https://blog.csdn.net/iteye_11539/article/details/81957057

3、select、poll、epoll区别

https://www.cnblogs.com/sunweiye/p/11172751.html
https://blog.csdn.net/wteruiycbqqvwt/article/details/90299610
文件描述符
https://blog.csdn.net/qq_33417547/article/details/72850982

4、静态库(.a、.lib)和动态库(.so、.dll)的区别

https://blog.csdn.net/dd_hello/article/details/81782934

5、c++的编译过程

https://blog.csdn.net/qq_43133135/article/details/82865618

编译过程
https://www.cnblogs.com/ericling/articles/11736681.html

6、tcp拥塞控制原理

拥塞窗口cwdn
慢开始阈值ssthresh
https://blog.csdn.net/qq_41431406/article/details/97926927

7、tcp四次挥手过程

https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc

8、tcp滑动窗口的作用

https://blog.csdn.net/h2604396739/article/details/85239439

9、如何用udp实现滑动窗口(?)

分析+代码:https://blog.csdn.net/yysdsyl/article/details/4260252?locationNum=6
代码:https://blog.csdn.net/hc260164797/article/details/7563228?utm_source=jiancool

10、c++11新特性

快速一览:https://blog.csdn.net/jiange_zh/article/details/79356417

11、虚函数表在内存的哪个部分

https://blog.csdn.net/zinthos/article/details/48230891?utm_source=blogxgwz6
什么是虚函数?
https://blog.csdn.net/weixin_43329614/article/details/89103574

12、vector、stack、list、map的底层实现

https://blog.csdn.net/u010903002/article/details/78701065
也可查看《STL源码剖析》

13、哪些排序是稳定排序

14、有哪些字符编码,

15、进程、线程和协程的区别

https://www.cnblogs.com/starluke/p/11795342.html

16、栈和堆的区别


栈的特性:先进后出,主要为一个线程独享,为这个线程的函数的调用服务的。用于存放返回地址,零时变量个参数而用。栈的内存一般都是由编译器自己来分配释放的,编译器所分配的内存是连续的,当定义一个变量的时候,在当前栈区的尾部来分配心的变量的内存。在windows系统里面栈的大小是2M,在linux系统里面栈的大小是8M,可以使用ulimit-s来设置栈的大小。栈的空间的分配是由高地址向低地址分配的。


堆的分配和释放是由程序员来分配和释放。在windows系统里面一般是小于2G的。因为系统是用链表来实现空闲地址空间的,所以堆的内存空间不是连续的,链表的遍历也是由低地址到高地址的,所以分配内存也是又低地址向高地址分配。

申请后系统的响应
栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该节点从空闲结点链表中删除,并将该结点的空间分配给程序。对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动地将对于的那部分重新放入空闲的链表中。

栈和堆中存储的内容
栈:在函数调用时,第一个进栈的是主函数中的下一条指令的地址,然后是函数的各个参数,在大多数C编译器中,参数是由右向左入栈的,然后是函数中的局部变量,注意静态变量是不入栈的,静态变量存储在静态存储区。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。

申请效率
栈:由系统自己分配,速度较快,但是程序员无法掌握。

堆:一般有两种方法来申请内存,new、和malloc,new是一种用算符而malloc是函数。由程序员申请出来的内存一般速度比较慢,而却容易产生内存碎片,不过用起来比较方便。

特点
堆的大小取决于操作系统有效的虚拟内存的大小,堆获得空间比较灵活,也相对而言比较大,但是速度慢;栈的话分配内存就相对快很多了。

17、osi七层模型

OSI七层模型
TCP/IP五层协议和OSI的七层协议对应关系
每一层都工作着不同的设备
每层中具体的协议

18、主要的应用层协议,

见上图

19、http和https的区别,

20、ssl握手的内容,

在这里插入图片描述
第一步:Visitor给出协议版本号、一个客户端随机数(Client random),以及客户端支持的加密方法。

第二步:Server确认双方使用的加密方法,以及一个服务器生成的随机数(Server random)。

第三步:Server发送数字证书给Visitor。

第四步:Visitor确认数字证书有效(查看证书状态且查询证书吊销列表),并使用信任的CA的公钥解密数字证书获得Server的公钥,然后生成一个新的46字节随机数(称为预备主密钥Pre-master secret),并使用Server的公钥加密预备主密钥发给Server。

第五步:Server使用自己的私钥,解密Visitor发来的预备主密钥。

第六步:Visitor和Server双方都具有了(客户端随机数+服务端随机数+预备主密钥),它们两者都根据约定的加密方法,使用这三个随机数生成对称密钥——主密钥(也称为对话密钥session key),用来加密接下来的整个对话过程。

第七步:在双方验证完session key的有效性之后,SSL握手机制就算结束了。之后所有的数据只需要使用“对话密钥”加密即可,不再需要多余的加密机制。

需要说明的是,session key不是真正的对称加密密钥,而是由session key进行hash算法得到一段hash值,从这个hash值中推断出对称加密过程中所需的key(即对称加密所需的明文密码部分)、salt(在RFC文档中称为MAC secret)和IV向量。以后客户端每次传输数据,都需要用key + salt +IV向量来完成对称加密,而服务端只需一个key和协商好的加密算法即可解密。同理服务端向客户端传输数据时也是一样的。

注意:
1.在SSL握手机制中,需要三个随机数(客户端随机数+服务端随机数+预备主密钥);
2.至始至终客户端和服务端只有一次非对称加密动作——客户端使用证书中获得的服务端公钥加密预备主密钥。
3.上述SSL握手机制的前提单向验证,无需验证客户端,如果需要验证客户端则可能需要客户端的证书或客户端提供签名等。
Server和Visitor通信,Server把数字证书发给Visitor,最关键的一点是Visitor要保证证书的有效性,通过查看证书状态并去CA的吊销列表查看Server的证书是否被吊销。只有Server的证书可用了,才保证了第一环节的安全性。

可以看出,使用SSL比前文介绍的“数字签名+加密”简便多了,将身份验证和密钥生成在会话的开始就完成了,而不需要每次的数据传输过程中都进行。

这就是https等使用ssl加密机制的握手通信过程。

21、缓存和cache的区别,

Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。

缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

2、Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。

缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。

3、假定以后存储器访问变得跟CPU做计算一样快,cache就可以消失,但是buffer依然存在。比如从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看却是稳定的,这样就能通过引入一个buffer使得OS接收数据的速率更稳定,进一步减少对磁盘的伤害。

22、死锁产生条件

https://blog.csdn.net/hd12370/article/details/82814348

23、编程题:回文串的字符数量,数组中出现超过一半数字的数量。

只有众数超过半数,运算结果才正确,核心理念是“正负抵消”

#include <iostream>
using namespace std;
int main()
{
	int size=11;
	int nums[]={2,1,2,3,2,6,2,2,2,8,4};
	int result= nums[0];
	int votes= 1;
	for(int i= 1; i< size; i++){
		 // 如果当前与result相等票数+1
		 if(votes == 0) result = nums[i];
		votes += nums[i] == result ? 1 : -1;
	}
	cout<<result<<endl;
	return 0;
}

24、从源文件到可执行文件的过程

全过程
其中:

  1. 预处理选项

gcc -E test.c -o test.i

预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。

  1. 编译选项

gcc -S test.c

编译完成之后就停下来,结果保存在test.s中。

  1. 汇编

gcc -c test.c

汇编完成之后就停下来,结果保存在test.o中。

另外:

组成一个程序的每个源文件通过编译过程分别转换成目标代码(objectcode)。每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可
以搜索程序员个人的程序库,将其需要的函数也链接到程序中。

25、数据库的索引是什么,

https://blog.csdn.net/ys_230014/article/details/88773918

26、索引为什么提高查找速度,

https://blog.csdn.net/m0_38128121/article/details/79663261

27、什么时候用索引,什么时候不用,

https://www.cnblogs.com/crazylqy/p/4706228.html

28、Tcp协议实现可靠传输的方法有什么

https://www.cnblogs.com/xiaokang01/p/10033267.html
校验和
确认应答和序列号
超时重传
连接管理
流量控制
拥塞控制
滑动窗口

29、编程题:删除链表中倒数第k个节点

https://www.cnblogs.com/Demrystv/p/9311288.html

基本思路:
  让链表从头开始走到尾,每移动一步,就让k值减一,当k 值走到结尾时,
  如果k 值大于0,说明链表根本没有倒数第k 个节点
  如果等于0,那么头节点就是倒数第k 个节点,此时应该返回 head.next
  如果小于0,则重新从头节点开始,每移动一步,k 值增加一,当k 等于0时,移动停止,移动到的节点就是要删除节点的上一个节点

//删除单链表中的倒数第lastKth 个节点
    public ListNode removeLastKthNodeInSingle(ListNode head, int lastKth){
        if (head == null || lastKth < 1){
            return null;
        }

        ListNode cur = head;
        while (cur != null){
            lastKth--;
            cur = cur.next;
        }
        if (lastKth == 0){
            head = head.next;
        }

        // 可以举例子:1 2 3 4 5 的倒数第4个节点
        if (lastKth < 0){
            cur = head;
            while (++lastKth != 0){
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }
        return head;
    }

30、Static关键字,构造函数作用

static关键字的特点

a、 随着类的加载面加截
b、 优先于对象存在
c、 被类的所有对象共享
咱们班级的学生应该共用同一个班级编号
d、什么时候使用静态?
如果某个成员变量是被所有对象共享的 那么它就应该定义为静态
举例
— 饮水机(静态修饰 都用同一个饮水机)
— 水杯(非静态 每个人的水杯不一样)
可以通过类名调用
— 静态变量(类变量) 静态方法 (类方法)

static的注意事项

  • 静态方法中是没有this关键字的
    * 静态是随着类的加载而加载 this是随着对象的创建而存在
    * 静态比对象先存在 所以在静态方法中调用的this是不存在的
    * 静态方法只能访问静态的成员变量和静态的成员方法
    * 静态方法
    * 成员变量:只能访问静态变量
    * 成员方法: 只能访问静态方法
    * 原因:静态成员随着类的加载而创建 非静态成员随着对象创建而存在 调用静态成员时非静态成员可能没有创建
    * 非静态方法
    * 成员变量:可以是静态 也可以是非静态
    * 成员方法:可以是静态成员方法 也可以是非静态方法
    * 简单记
    * 静态只能访问静态

静态变量和成员变量的区别

  • 静态变量也叫类变量 成员变量也叫对象变量
  • A,所属不同
    * 静态变量属于类 也叫类变量
    * 成员变量属于对象 也叫对象变量
  • B,内存中的位置不同
    * 静态变量:方法区的静态区
    * 成员变量:堆内存中
  • C,内存中出现的时间不同
    * 静态变量:随着类的加载而加载
    * 成员变量:随着对象的创建而加载
  • D,调用不同
    * 静态变量:通过类名调用 也可以通过对象调用
    * 成员变量:通过对象调用

构造函数

  • 构造方法概述和作用
    * 给对象的数据(属性) 进行初始化
  • 构造方法的格式特点
    * a格式:修饰符 类名(参数类型 参数名){代码块 }
    * 方法名和类名相同
    * 没有返回值类型 连void也没有
    * 没有具体的返回值 return
  • 构造方法的重载及注意事项
    * 构造方法重载
    * 重载:方法名相同 返回值类型无关 只看参数列表
    * 构造方法注意事项
    * a:如果我们没有给构造方法 系统默认会给一个空参构造方法
    * b:如果有构造方法 系统不再给一个空参构造方法

31、深浅拷贝

https://www.jianshu.com/p/11acbe692e4c

32、多态如何实现

33、智能指针有哪些

34、myisam和innodb区别,

35、栈和队列(数据结构)

https://blog.csdn.net/liuyuchen282828/article/details/88809183

36、堆的性质(二叉树、堆排序)

https://blog.csdn.net/yangtzhou/article/details/84780574
https://blog.csdn.net/wufeifan_learner/article/details/88675550

37、单例模式(设计模式)

基于Java:https://www.cnblogs.com/zhuhuix/p/13030646.html

腾讯

进程间通信方式
共享内存方式优缺点
负载均衡怎么实现
共享内存过大造成什么问题
用的c++版本,c++11的特性
share_ptr跟。。的区别
map容器实现,unordered_map实现方式
map,vector是不是线程安全
list跟数组的区别
hash实现方式
linux常见命令,查看共享内存ipcs。查看内存,网络信息
tcp三次握手,四次挥手,状态转化
time_wait作用
https://blog.csdn.net/huangyimo/article/details/81505558
select,epoll区别,实现方式
什么情况下epoll性能优于select
epoll中et,lt触发方式
tcp,udp的区别
tcp粘包问题
怎么理解tcp一种流式协议
tcp怎么读取报文内数据,read函数怎么做的
怎么看tcp数据收齐了没有,
内存泄漏怎么排查,
手撕代码https://blog.csdn.net/weixin_43919932/article/details/105847581

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值