C++面经收录_如何优化全局变量定义的大块内存-程序员宅基地

技术标签: c++  mysql  后端  sql  

文件系统讲解

(22条消息) 操作系统之文件管理:3、文件目录(文件控制块FCB、多级目录结构、无环图目录结构、索引节点)_千寻瀑-程序员宅基地_多级目录结构

1.腾讯天美

1.自我介绍

2.placement new?我:啥玩意没听过

3.虚函数会吧

4.内联函数

5.虚函数可以是内联的吗

6.mysql acid

7.mysql mvcc 隔离级别实现原理什么一套都讲了

8.protobuff的优缺点?缺点不会

9.C++11的智能指针

10.B+ B树 红黑树区别

11.同步异步

12.阻塞非阻塞

13.可以同步非阻塞吗?我答得是可以

14.epoll和select区别

15.epoll是同步的还是异步的?

16.协程?

17.对称协程和非对称协程?不会

18.udp和tcp区别?讲完区别,又从wireshark讲起tcp,然后如何网络优化分析(因为这几天正好在学wireshark,吹了一吹)

19.redis的跳表

20.redis几种基本数据结构?

21.怎么用的zookeeper?底层原理是什么?不会底层

22.LRU怎么实现的?

23.协程为什么叫用户态线程?

24.动态规划和贪心区别?答的一般

25.动态规划可以得到全局最优解吗?可以

26.动态规划时间复杂度?看题,可能O(n)可能O(n^2)

27.只有一个数字出现奇数剩下都是出现偶次数,如何快速得到值?异或

\28. https://leetcode-cn.com/problems/minimum-size-subarray-sum/ lc209题,我用的滑动窗口,面试官非说我错了,是有点边界问题改完他还说我是错的,不能这么写,讲了几次还觉得我是错的,最后面试官亲自改测试例子也证明了代码没有问题。

29.反问 休闲类游戏组,帮别人面试的

===又想起来的。

30一致性算法?不会

31分布式了解吗?不太了解

2.小米

作者:dxgzg
链接:https://www.nowcoder.com/discuss/797600?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

1.自我介绍

2.项目介绍

3.实习介绍

4.C++11的新特性

5.懂rapidjson的底层原理?不懂。rapidjson使用的过程中遇到过那些bug?无

6.判断链表是否有环,求环的入口节点。两个月没刷题差点不会做了。。。

7.真不考虑北京吗?然后随便聊聊天帮我推荐到南京啦

11.5二面 南京二面

自我介绍、项目介绍、实习介绍

1.多态实现原理?虚函数指针具体怎么找虚函数表?

2.如何创建进程?我说./把可执行变成进程。告知不对。又说fork函数创建通过进程id判断一下。还不对。

3.进程布局?堆栈全局代码那些区

4.函数压栈过程,包括函数带参数

5.”hello world"存在那个区?

6.线程私有区和共享区

7.是个全局变量但我又想是线程独有的怎么办?陈硕永远滴神。__thred关键字,有一小节整好叫善用__thread关键字

8.tcp三次握手、流量控制、拥塞控制、MSS那一套

9.timewait

10.客户端握手发送SYN,TCP状态机,client变成什么状态?

11.相交链表

12.介绍了部门很多业务,给了口头offer

3.金山

作者:szZard
链接:https://www.nowcoder.com/discuss/781229?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

Q:了解哪个语言?

A:C++和python,最熟悉C++

Q:说一下C++11的新特性有哪些?

A:auto、range for循环、lambda函数式编程、nullptr解决了C99中NULL的二义性、智能指针

(17条消息) C ++ Lambda表达式详解_白云之道-程序员宅基地_c++lambda表达式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CwlrOvhX-1649732044767)(C:\Users\纠结伦\AppData\Roaming\Typora\typora-user-images\image-20220212145929112.png)]

Q:说一下智能指针

A:auto_ptr 、shared_ptr、 unique_ptr 、weak_ptr

Q:作用都是什么?

A:回答略

Q:它们的实现原理?

A:回答略

Q:实现思想是什么?

A:RAII 资源获取即初始化

Q:python有没有对应的东西和机制?

A:这个不太了解,使用python没用到过内存管理

Q:没用过就对了,因为python已经帮你实现好了,所以呢没用过,但是C++没有,这里给我讲了5分钟的课,涨知识了

Q:做道算法题吧,你觉得你的编程能力如何?如果你觉得一般我就出个简单的,觉得不错我就出的稍微难一点,做出来加分更多

A:平时做力扣简单的题都能做出来,中等的能做出来三分之一吧,困难的题大多都是学习

Q:那你写一个LRUCache吧

A:写出来了

Q:说一下实现的思路,讲一下

A:讲

Q:你这个是用双向链表做的,单向链表能写出来吗?

A:刚上来说应该不行,想了一会说可以

Q:为什么可以?

A:支支吾吾说不清楚

Q:你看看你哪地方用到了双向链表,是不是只有remove,然后开始讲课

A:后面基本都是引导我如何用单向链表实现,而且最后给我讲了实现方法

金山云 后端开发 一面 10.14

自我介绍

Q:介绍项目,项目应用的背景,怎么做的,创新点在哪,遇到了什么困难,有什么代码上的问题,怎么调bug的

Q:遇到过程序崩溃的情况吗?怎么调试?gdb咋用的

Q:遇到过程序反复崩溃的情况吗?而且每次崩溃的地方都不一样?

Q:程序的崩溃的原因是什么?

A:大部分是因为内存泄露或内存溢出?

Q:你是怎么解决内存泄露和溢出问题的?

Q:C++程序优化的方法

Q:用过哪些linux命令?比如网络方面的?

A:回答了ifconfig、route、netstat

Q:netstat的都有什么参数?

A:忘了

Q:查看cpu的命令呢? A:top和sar

Q:问了top有啥参数,几个参数的意思

A:不会,这些都是知道,用的次数不多

Q:说下你常用的,关于系统的

A:ps -ef | grep 查看进程

Q:ps -ef 里进程状态有个uninterrupt单词记不清了,讲一下

A:没印象,不了解

Q:进程的状态有那几个?

A:就绪、运行、阻塞

Q:编程遇到过CLOSE_WAIT状态吗

Q:知道TIME_WAIT吗?有什么作用,TIME_WAIT是谁发起的,谁会进入TIME_WAIT

Q:TIME_WAIT有哪些影响?

Q:TIME_WAIT对端口有什么影响

Q:你有什么缺点和优点

4.百度

作者:derrors
链接:https://www.nowcoder.com/discuss/774264?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

C++ 基础

  • 一个 C++ 程序从代码实现到运行要经过哪些阶段?每个阶段有什么作用?

    这里面试官主要是想问编译的那部分知识,所以就详细回答了预处理-编译-汇编-链接四个过程的原理。

  • 为了使程序编译运行后效率高一些,在编程时需要注意哪些问题?

    刚听到这个问题的时候很懵,完全不知道面试官在问什么,然后就问面试官需要在哪些方面来考虑,面试官说从编译器优化的角度来回答,想了半天,想起来在深入理解计算机原理书上好像有优化的一些方法,所以就回答了:循环外移、减少函数调用、避免内存引用和提高并行化这几个方面,还列举了个简单的代码例子,面试官说回答地不错就继续下一个问题了。

    (17条消息) 提高程序运行效率的10个简单方法_ljianhui的专栏-程序员宅基地_提高程序效率

    《深入理解计算机系统》 优化程序性能的几个方法 - 编程猎人 (programminghunter.com)

    提高并行性,减少函数调用,消除循环的低效率,提高数据缓存命中率,提高指令缓存的命中率,提高多核程序的命中率。类用直接初始化而不是赋值初始化,用++i,而不是i++;

  • C++ 中的 new/delete 函数与 malloc/free 的区别?

    主要是前者会调用相关对象的构造、析构函数,后者不会,前者不需要指定申请/释放的内存的大小,后者需要指定等。

    面试官追问:使用 new 申请内存失败会怎么样?

    答:会抛出异常。

    问:如果我想使得申请失败后返回一个空指针,需要怎么做?

    答:使用 nothrow new 来申请内存。

  • 虚函数的原理和实现?

  • 构造函数能否声明为虚函数或者纯虚函数,析构函数呢?

    析构函数可以为虚函数,并且一般情况下基类析构函数要定义为虚函数,只有在基类析构函数定义为虚函数时,调用操作符 delete 销毁指向对象的基类指针时,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。

    构造函数不能定义为虚函数。在构造函数中可以调用虚函数,不过此时调用的是正在构造的类中的虚函数,而不是子类的虚函数,因为此时子类尚未构造好。虚函数对应一个 vtable (虚函数表),类中存储一个 vptr 指向这个 vtable。如果构造函数是虚函数,就需要通过 vtable 调用,可是对象没有初始化就没有 vptr,无法找到 vtable,所以构造函数不能是虚函数。

  • 为什么父类的析构函数必须是虚函数?

    如果析构函数不被声明成虚函数,那么编译器将实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不会调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。

    (17条消息) (转)=========C++中析构函数可以为纯虚函数吗?_alu102601的博客-程序员宅基地

计算机网络

  • GET 和 POST 的区别?(17条消息) get请求和post请求的区别(全面讲解)__处女座程序员的日常的博客-程序员宅基地_post和get请求的区别

  • TCP 拥塞控制原理?

  • Cookie 和 Session 的原理分别是什么?

    Cookie和Session的作用和工作原理 - fen斗 - 博客园 (cnblogs.com)

  • TCP 粘包和粘包分别是什么?

    粘包:在进行数据传输时,发送端一次性连续发送多个数据包,TCP 协议将多个数据包打包成一个 TCP 报文发送出去;

    拆包:当发送端发送的数据包长度超过一次 TCP 报文所能传输的最大值时,就会将该数据包拆分成多个 TCP 报文分开传输。

    问:如何解决粘包和拆包问题?

    答:(1)设置消息定长(2)将消息分为头部和消息体,头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息(3)消息尾部添加特殊字符进行分割。

    [面试题:聊聊TCP的粘包、拆包以及解决方案 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/356225028#:~:text=常见的解决方案. 对于粘包和拆包问题,常见的解决方案有四种:. 发送端将每个包都封装成固定的长度,比如100字节大小。. 如果不足100字节可通过补0或空等进行填充到指定长度;.,发送端在每个包的末尾使用固定的分隔符,例如rn。. 如果发生拆包需等待多个包发送过来之后再找到其中的rn进行合并;例如,FTP协议;. 将消息分为头部和消息体,头部中保存整个消息的 )

操作系统

  • 内存管理自由链表和内存池讲一下

    这个问题回答的不太好,记得在学习 STL 内存配置器时候学过,不过太久没看了忘了好多。

  • 虚拟内存原理?

  • 逻辑地址怎么转换成物理地址?

二面(70mins)


自我介绍

项目介绍

  • 介绍一下做过的项目;

  • 研究生做过什么项目吗?

    这里开始介绍研究生做的课题,讲的比较仔细,面试官问的也比较多,回答完了面试官问为什么没在简历上写研究生做的项目,我回答说研究生的项目和岗位不太匹配,所以就没写在简历上。面试官说这个想法不对,简历上应该写自己做过的、最擅长的项目,这样面试才能更综合地考察的你的能力和你解决问题的方式。这里算是积累了一些经验了。

数据库

  • 你了解哪些索引?

    主要介绍了 B+ tree 索引,也比较了一些其他数据结构作为索引的优缺点。

  • Redis 有哪些数据结构?

  • Redis 持久化机制?

  • 缓存和数据库是如何实现同步的?

    缓存和数据库双写,采用预留缓存模式。

    • 读的时候,先读缓存,缓存没有再读数据库,然后取出数据后放入缓存,同时返回响应;
    • 更新的时候,先删除缓存,然后再更新数据库;这样读的时候就会发现缓存中没有数据而直接去数据库中读取数据
  • 分布式和集群了解吗?

    这个没有做过,直接回答了不了解,面试官也没多问。

情景题

  • 如果有海量的手机号数据需要保存,但机器的性能有限,如何才能尽可能少的占用内存?

    刚开始我的解决方案是将手机号依据字段的含义进行划分为三部分,即 aaa-bbbb-cccc,其中前两个部分有特定的含义,如号段、区号等,而第三部分是随机的,所以手机号的前两个部分会有大量的重复,因此可对前两部分进行压缩,使用少数几个字符来表示。

    面试官说这样的话是可以减少部分的内存的,但是优化的效果不太明显,还有没有其他的方法?

    想了一会儿,想到了前缀树这种数据结构,赶紧把思路告诉了面试官。没想到面试官让继续思考其他方法,我说可采用合适的编码方法进行压缩编码,比如霍夫编码。

    面试官看我想不到其他方法了,就给我讲了一种方法,就是通过对号码进行排序,然后使每一个手机号减去最小的手机号得到一个差值,作为偏移,这样的话我们只需要记住最小的手机号和后面每个手机的偏移就可以了,这样可以大大减低内存占用。妙啊,妙!

5.网易互娱

作者:derrors
链接:https://www.nowcoder.com/discuss/773647?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

一面(90mins)


自我介绍

  • 基本情况介绍

手撕代码

  • 动态规划类型

    img

    一开始写了一个暴力遍历的解法,面试官问还可以怎么优化,想了一下说可以通过动态规划来解决,介绍了一下解法思路,面试官说可以,也没让代码实现。… 面试完了再回顾这道题,竟然发现当初和面试官讲的思路行不通…哈哈哈哈看来面试官被忽悠住了

项目介绍

  • C++ 项目介绍,展开问题:

    1. C++ 多态介绍下?

      分别回答了编译时多态和运行时多态,进而面试官追问到虚函数、虚函数原理…

    2. C++11 标准用了哪些?

      自动类型推断、匿名函数、移动语义和完美转发,function 类模型和智能指针。

    3. 介绍下智能指针怎么实现的?

      主要对 shared_ptr 和 weak_ptr 进行了提问,包括之间的区别,在底层上是怎么实现的,基本上算是把 shared_ptr 手撸了一遍,这里提供一个参考版本:

      template<class T>
      class smart_pointer {
      private:
          T* _ptr; 
          int* _count;
      
      public:
          smart_pointer (T* ptr = nullptr) : _ptr(ptr) {
              if(_ptr) _count = new int(1);
              else _count = new int(0);
          }
      
          smart_pointer(const smart_pointer* ptr) { 
              if(this != &ptr) {
                  this->_ptr = ptr._ptr;
                  this->_count = ptr._count;
                  (*this->_count)++;
              }
          }
      
          smart_pointer& operator=(const smart_pointer& ptr) {
              if(this->ptr == ptr._ptr) return *this;
      
              if(this->_ptr) {
                  (*this->_count)--;
                  if(*this->count == 0) {
                      delete this->_ptr;
                      delete this->_count;
                  }
              }
      
              this->_ptr = ptr._ptr;
              this->_count = ptr._count;
              (*this->_count)++;
              return *this;
          }
      
          T& operator*() { return *(this->_ptr); } 
          T* operator->() { return this->_ptr; }
      
          ~smart_pointer() {
              (*this->_count)--;
              if(*this->_count == 0) {
                  delete this->_ptr;
                  delete this->_count;
              }
          }
      
          int use_count() { return *this->_count; }
      }
      
    4. 使用了什么 STL 容器,底层怎么实现的?怎么扩增容量的?

      主要回答了 vector 容器,讲了一下 vector 的实现原理,相比于其他容器的特性和缺点,对它的大小和容量面试官也提问了一些。另外面试问能不能自己实现一个容器,来回墨迹半天搞不懂面试官到底是要干什么,也就放弃了…

    5. 项目中缓存区怎么实现的?怎么实现自动紧凑和增长的?

      介绍了下实现原理,因为是基于 vector 来实现的,面试官问会存在什么问题,还可以怎么优化,简单回答了下性能方面的优化思路。

    6. select 、poll 和 epoll 的区别?

      一文搞懂select、poll和epoll区别 - 知乎 (zhihu.com)

      从结构、功能、性能、可移植方面进行了回答,这问题太常见了所以准备的相当充分,面试官看我回答的比较全面也就没再追问了。

    7. 介绍下操作系统的进程管理是怎样的?我们用的操作系统使用了那种调度策略?

      从进程状态和页面调度两个方面进行了回答…

情景题

游戏中假如有一个炸弹,这个炸弹的伤害范围是一个圆形区域,同时在地图里有很多人物,问怎么设计逻辑判断这个炸弹对哪些人物造成了伤害?

  • 答:可通过勾股定理计算每个人物与炸弹坐标的距离;

  • 问:计算距离涉及到根号计算,复杂度较高,如果了成千上万的人物在地图里,怎么优化?

  • 答:对于比较远的人物,可以直接比较单个坐标值,人物某个坐标值与炸弹对应坐标值的超过了伤害范围可直接判断无伤害。

    这一个问题和面试官周旋了好久,get 不到面试官的点,最后我用草稿纸画了下示意图,将每个坐标分别在 X 轴和 Y 轴上进行投影,根据在两个轴上单个维度的距离可计算的快一些,避免更复杂的开根号计算。

二面(50mins)


自我介绍

项目介绍

  • 介绍一下两个版本实现之间的区别;

    第二个版本是第一个版本的优化版本,着重介绍了改进的点,以及采用的 C++11 新特性;

  • 同步 IO 与异步 IO 的区别?

  • 阻塞 IO 与非阻塞 IO 的区别?

  • 同步日志和异步日志是怎么实现的?生产者-消费者模型是怎么实现的?

  • 定时器是怎么实现的?

    每个request报文绑定一个定时器,定时器初始化的时候为gettimeofday函数获取1970.1.1到现在的时间,而后将这个时间往后推500ms,获取报文过期时间。同时将该定时器加入到小根堆里,小根堆通过priority_queue函数实现。主函数循环过程中,先处理epoll_wait函数发生读写事件的文件描述符,而后处理超时事件。通过小根堆的堆顶时间与现在时间做对比,如果小于现在时间说明超时,会delete掉计时器绑定的报文结构体。delete报文结构体的时候,同时会将该报文对应的文件描述符从红黑树上摘下。

    先处理读写事件,再处理超时事件。这样做的有一个好处是,当超时的事件再次发生读写事件时,此时就可以复用之前的request结构体,减少new和delete。

  • GET 和 POST 的区别?在解析时需要注意什么?

手撕代码

  • LeetCode 爬楼梯
  • 输出所有可能的方案不是方案数量——回溯法。

情景题

  • 在二维地图中,有一些补给点,还有很多角色,对于每个角色返回距离他最近的补给坐标,要怎么设计?需要注意,补给点是固定的,角色是在地图中运动的。

    设计要点:对固定的补给点来设计而不是运动的角色,例如对补给点来设计一种排序,给定一个坐标返回距离这个坐标最近的补给点。

  • 情景题:设计一个排行榜,每个角色有一个分数,这个分数是动态变化的,你怎么设计这个排行榜?

    ​ 这个题目面试官好像是想考察数据结构的,当时回答时主要想设计一个可以动态地、高效地排序的数据结构,需要注意的是除了前十名,后面的角色分数也是要维护,因为可能后面的角色获得一定分数后可能进入前十名。这一题答的不太好,面试官说回去可以再好好研究一下。

6.竞技世界

作者:derrors
链接:https://www.nowcoder.com/discuss/773310?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

一面(60mins)


自我介绍

  • 个人的基本情况,本科和研究生阶段上过的专业课,成绩等。

计算机网络

  • 介绍一下 TCP 和 UDP,以及它们的区别?

    TCP 是面向连接的、可靠的、基于字节流的传输层控制协议;

    UDP 是无连接的、尽最大努力传输、不保证可靠性的传输层控制协议;

    它们之间的区别主要在于:(1)连接性(2)传输对象(3)可靠性(4)首部开销(5)传输方式(6)分片大小等。

  • TCP 和 UDP 分别有什么应用场景?

    TCP:FTP 文件传输、 HTTP/HTTPS;

    UDP:包总量较少的通信,如 DNS 、 SNMP 等;广播通信、音视频传输等。

  • TCP 的连接状态有哪些?

    这里面试官主要问了四次挥手过程中出现的连接状态,回答了 ESTABLISH、FIN_WAIT_1、CLOSE_WAIT、FIN_WAIT_2、LAST_ACK、TIME_WAIT 状态。

  • SYN 洪泛攻击了解吗?是什么原理?什么是半连接队列?

    半连接队列是服务器完成了第一次握手后将连接请求添加到的一个队列,而 SYN 攻击就是利用了这一点,客户端不断地发送伪造的 SYN 包来填满服务器的半连接队列,使得正常的连接请求得不到响应。

操作系统 & C++

  • 进程同步和通信的方式有哪些?

    同步:临界区、同步和互斥、信号量、管程;

    通信:匿名管道、有名管道、消息队列、信号量、共享内存、套接字。

  • 虚拟内存介绍一下?

    为了更好的管理内存,操作系统将内存抽象成地址空间。每个进程拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当进程访问到不在物理内存中的页时,发生缺页中断并进行页面置换,将缺失的页装入物理内存并重新执行失败的指令。

  • 申请动态内存的时,操作系统是怎么做的?

    (19条消息) Linux内存分配小结–malloc、brk、mmap_gfgdsg的专栏-程序员宅基地_linux内存

    从操作系统层面上看,malloc 是通过两个系统调用来实现的:brk 和 mmap

    • brk 是将进程数据段 (.data) 的最高地址指针向高处移动,这一步可以扩大进程在运行时的堆大小;
    • mmap是 在进程的虚拟地址空间中寻找一块空闲的虚拟内存,这一步可以获得一块可以操作的堆内存。

    通常,分配的内存小于 128k 时,使用brk调用来申请内存,大于 128k 时就使用mmap来申请内存;进程先通过这两个系统调用获得相应的虚拟地址,但还没有映射到物理内存,当访问这些虚拟地址的时候,通过缺页中断,让内核分配相应的物理内存,这样内存分配才算完成。

  • 智能指针了解吗?介绍一下

    shared_ptr、weak_ptr、unique_ptr

  • share_ptr 直接类构造和用 make_shared 的区别?

    shared_ptr 类 | Microsoft Docs

    区别是:shared_ptr 构造函数会执行两次内存申请,而 make_shared 则执行一次。

    面试官追问具体的内存申请过程:

    shared_ptr 在实现的时候使用的 refcount 技术,因此内部会有一个计数器(控制块,用来管理数据)和一个指针,指向数据。因此在执行shared_ptr p2(new A)的时候,首先会申请数据的内存,然后申请内控制块,因此是两次内存申请,而make_shared()则是只执行一次内存申请,将数据和控制块的申请放到一起。

  • 内存泄漏和内存溢出分别是什么?

  • 如何发现内存泄漏?

    ​ valgriand-memcheck工具可以检测。

    valgrind --tool=memcheck --leak-check=full ./可执行文件
    

    ​ 回答了使用 GDB 调试工具来测试,这部分没有实践过,所以了解的不深入,回答的不太好。

二面(50mins)


二面是通过微信视频面试的,面试官好像级别高一些,主要从项目和个人经历方面进行询问。

自我介绍

  • 面试的多了,自我介绍部分简直倒背如流…

项目

  • 为什么做这个项目?

  • 这个项目你觉得最难的地方是哪一块?为什么你觉得很难?

  • 除了简历上的项目,还做过其他项目吗?

    回答了研究生研究的课题,面试官让详细介绍一下研究课题的项目,这就舒服多了,随便提问,毕竟正在写论文呢…

  • 你研究生的专业是自然语言处理,为什么现在找的是 C++ 开发的工作n?

    ​ 这里和面试官聊了好久,把自己这两年的想法转变和面试官讨论了一下,感觉聊的挺投机的,面试官挺赞同我的一些想法的,所以聊完二面也就随之结束了。末了面试官还说有问题随时联系他…

7.抖音

作者:breeze_blows
链接:https://www.nowcoder.com/discuss/772414?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

8.20 国际化电商一面 60Min

\1. 介绍腾讯实习的项目

\2. 关系型数据库和非关系型数据库

关系型数据库 VS 非关系型数据库 - 知乎 (zhihu.com)

关系型数据库:

  • 易理解

因为行 + 列的二维表逻辑是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型更加容易被理解

  • 操作方便

通用的SQL语言使得操作关系型数据库非常方便,支持join等复杂查询,Sql + 二维关系是关系型数据库最无可比拟的优点,这种易用性非常贴近开发者

  • 数据一致性

支持ACID特性,可以维护数据之间的一致性,这是使用数据库非常重要的一个理由之一,例如同银行转账,张三转给李四100元钱,张三扣100元,李四加100元,而且必须同时成功或者同时失败,否则就会造成用户的资损

  • 数据稳定

    数据持久化到磁盘,没有丢失数据风险,支持海量数据存储

缺点:

  • 高并发下IO压力大

数据按行存储,即使只针对其中某一列进行运算,也会将整行数据从存储设备中读入内存,导致IO较高

  • 为维护索引付出的代价大

    为了提供丰富的查询能力,通常热点表都会有多个二级索引,一旦有了二级索引,数据的新增必然伴随着所有二级索引的新增,数据的更新也必然伴随着所有二级索引的更新,这不可避免地降低了关系型数据库的读写能力,且索引越多读写能力越差。

    • 为维护数据一致性付出的代价大

    数据一致性是关系型数据库的核心,但是同样为了维护数据一致性的代价也是非常大的。我们都知道SQL标准为事务定义了不同的隔离级别,从低到高依次是读未提交、读已提交、可重复度、串行化,事务隔离级别越低,可能出现的并发异常越多,但是通常而言能提供的并发能力越强。那么为了保证事务一致性,数据库就需要提供并发控制与故障恢复两种技术,前者用于减少并发异常,后者可以在系统异常的时候保证事务与数据库状态不会被破坏。对于并发控制,其核心思想就是加锁,无论是乐观锁还是悲观锁,只要提供的隔离级别越高,那么读写性能必然越差

非关系型数据库:

​ 应用最广泛的NoSql,KV型数据库以Redis为例,最大的优点我总结下来就两点:

  • 数据基于内存,读写效率高

  • KV型数据,时间复杂度为O(1),查询速度快

    缺点:

    • 只能根据K查V,无法根据V查K
    • 查询方式单一,只有KV的方式,不支持条件查询,多条件查询唯一的做法就是数据冗余,但这会极大的浪费存储空间
    • 内存是有限的,无法支持海量数据存储
    • 同样的,由于KV型NoSql的存储是基于内存的,会有丢失数据的风险

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwGoyIOC-1649732044768)(C:\Users\纠结伦\AppData\Roaming\Typora\typora-user-images\image-20220215100949419.png)]

\3. 数据库的引擎

\4. Sql语句

\5. 数据库的锁

\6. 数据库的隔离状态

\7. 怎么防止幻读

\8. DNS的过程

\9. 处理中断,恢复中断

中断处理过程的五个阶段是什么-常见问题-PHP中文网

1.中断请求阶段–外部中断中断源利用CPU的中断输入引脚 输入中断请求信号/内部中断不需要中断请求

2.中断判优阶段–CPU一次只能接受一个中断源的请求,当多个中断源同时向CPU提出中断请求时,CPU必须找出中断优先级最高的中断源,这一过程称为中断判优。

3.中断响应阶段–经过中断判优,中断处理就进入中断响应阶段。中断响应时,CPU向中断源发出中断响应信号,同时:

① 保护硬件现场;

② 关中断;

③ 保护断点;

④ 获得中断服务程序的入口地址。

4.中断服务阶段–

1)保护现场。 在中断服务程序的起始部分安排若干条入栈指令,将各寄存器的内容压入堆栈保存。

2)开中断。 在中断服务程序执行期间允许级别更高的中断请求中断现 行的中断服务程序,实现中断嵌套。

3)中断服务。 完成中断源的具体要求。

4)恢复现场。 中断服务程序结束前,必须恢复主程序的中断现场。通常是将保存在堆栈中的现场信息弹出到原来的寄存器中。

5)中断返回。 返回到原程序的断点处,继续执行原程序。

5.中断返回阶段
返回到原程序的断点处,恢复硬件现场,继续执行原程序

\10. 程序编译的过程

\11. http的缓存机制

HTTP 缓存机制 - 知乎 (zhihu.com)

1强缓存

2.协商缓存

Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种唯一标识

浏览器缓存过程:

  1. 浏览器第一次加载资源,服务器返回200,浏览器将资源文件从服务器上请求下载下来,并把response header及该请求的返回时间(要与Cache-Control和Expires对比)一并缓存;
  2. 下一次加载资源时,先比较当前时间和上一次返回200时的时间差,如果没有超过Cache-Control设置的max-age,则没有过期,命中强缓存,不发请求直接从本地缓存读取该文件(如果浏览器不支持HTTP1.1,则用Expires判断是否过期);
  3. 如果时间过期,服务器则查看header里的If-None-MatchIf-Modified-Since
  4. 服务器优先根据Etag的值判断被请求的文件有没有做修改,Etag值一致则没有修改,命中协商缓存,返回304;如果不一致则有改动,直接返回新的资源文件带上新的Etag值并返回 200;
  5. 如果服务器收到的请求没有Etag值,则将If-Modified-Since和被请求文件的最后修改时间做比对,一致则命中协商缓存,返回304;不一致则返回新的last-modified和文件并返回 200;

\12. 乐观锁和悲观锁

乐观锁:CAS和版本号

面试官灵魂4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点? - 知乎 (zhihu.com)

\13. 修课程问题,拓扑排序

https://leetcode-cn.com/problems/course-schedule/submissions/

实习刚回来,对数据库好多知识不熟,确实回答的不好,第二天通知没通过,HR跟我说面试官建议我在准备准备,于是给我安排了第二次国际化电商的面试,神奇

9.3 国际化电商一面 50Min

\1. 聊腾讯实习项目

\2. 问为什么算法转开发

\3. 操作系统内存管理

\4. 逻辑地址和物理地址的转化

\5. http状态码

\6. tcp怎么保证可靠性

TCP主要提供了检验和、序列号/确认应答、超时重传、最大消息长度、滑动窗口控制等方法实现了可靠性传输。

\7. tcp的拥塞控制

\8. http1.0 1.1 1.2区别

\9. 输入数组nums,要求输出升序排序后的结果。已知数组元素为非负整数,且当数组长度为n时,所有元素的值都小于n;时间复杂度为O(n)

第二次国际化电商的面试明显感觉比上一次简单很多,八卦文和题目都做出来了,不明原因,还是挂了

之后被视频架构部门捞了,HR开始推荐客户端岗位,我表示想从事后端,于是经过协调安排了视频架构后端开发的面试

9.22 视频架构一面 70Min

\1. 固态硬盘和机械硬盘区别

\2. C++ 多态

\3. HTTP请求的过程,keep-alive

\4. https加密过程,为什么不是非对称加密

\5. 虚拟内存

\6. 页式管理和段式管理

\7. 数据库B+树

\8. Pagecache?

\9. 数据库两种引擎,索引结构

\10. DNS过程,问的很细

\11. 进程通信的方式,匿名管道,命名管道如何生成,信号怎么生成,头文件?

\12. 虚继承

\13. 网关

\14. http状态码,502,504?

https://blog.csdn.net/wangtingting_100/article/details/81106767

\15. http2.0 了解3.0吗

\16. go对于c++的优点

\17. 寻找第K大

面试官问的很深,自我感觉回答的不好,再次被挂掉,过了几天被商业化技术再次捞了起来,也是我面试的最后一个部门了,一面和二面都顺利通过,三面到现在也是不明原因,挂掉了

9.26 商业化技术一面 60Min

\1. 聊项目大概十五分钟

\2. http报文格式

\3. sql两种引擎区别

\4. 聚簇索性和非聚簇索性

\5. Sql语句查询前七天数据

\6. 用户态和内核态

\7. Get post还有什么方式

\8. 登录的时候用什么保存状态 session和cookie

Cookie、Session是如何保持登录状态的? - 简书 (jianshu.com)

\9. 最小栈怎么实现

\10. N叉树每层求最大值

基本回答的不错,顺利通过

10.9 商业化技术二面 70Min

\1. 聊项目,项目中最难得地方,怎么解决

\2. 为什么算法选开发

\3. 设计rpc框架考虑什么

\4. 检查手机号是否存在于百万数据电话号中

\5. C++多态

\6. 智能指针

\7. 构造函数可以是虚函数吗

\8. Rand7生成rand10和链表删除重复元素

顺利通过,至此感觉可以进字节希望最大的一次了,面试之后不到一个小时通知二面通过,安排了三面

10.12 商业化技术三面 40Min

\1. 聊项目,最大的收获

\2. 算法题丑数

\3. 数据库索引

整个面试过程感觉很魔幻,算法题也做出来了,就问了一个八卦文,第二天通知被挂了,心里还是挺难受的,挺遗憾的,这个时候应该也没什么HC了,也不会再接着面试了,秋招的最后一次面试,就这样结束了。

长风破浪会有时,直挂云帆济沧海!

8.海康威视

作者:蒋豆芽
链接:https://www.nowcoder.com/discuss/751721?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

1. C++多态

基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)。多态的实现机制为虚函数

虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类的同名函数

方法是在基类中为同名函数添加关键字virtual

2. 内存结构

img

如上图,从低地址到高地址,一个程序由代码段、数据段、BSS段、堆栈段组成。

  1. 代码段:存放程序执行代码的一块内存区域。只读,不允许修改,代码段的头部还会包含一些只读的常量,如字符串常量字面值(注意:const变量虽然属于常量,但是本质还是变量,不存储于代码段)。

  2. 数据段data:存放程序中已初始化全局变量静态变量的一块内存区域。

  3. BSS 段:存放程序中未初始化全局变量静态变量的一块内存区域。

  4. 可执行程序在运行时又会多出两个区域:堆区栈区。

    **堆区:**动态申请内存用。堆从低地址向高地址增长。

    栈区:存储局部变量函数参数值。栈从高地址向低地址增长。是一块连续的空间。

  5. 最后还有一个文件映射区(共享区),位于堆和栈之间。

3. 静态成员函数可以直接访问非静态数据成员吗

不能。

当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问。

4. socket编程了解吗

socket是一种特殊的文件。在Linux中,“一切皆文件”,都可以用“打开(open)——读写(write/read)——关闭(close)”的模式来操作。socket就是改模式的一个实现,并提供了一系列对应的函数接口。

我们以TCP为例,下图展示了其交互的过程:

img

图中展示的交互流程,具体如下所述 :

(1)服务器根据地址类型( ipv4, ipv6 )、 socket 类型、协议创建 socket。

(2)服务器为 socket 绑定 IP 地址和端口号。

(3)服务器 socket 监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket 并没有被打开 。

(4)客户端创建 socket。

(5)客户端打开 socket,根据服务器 IP 地址和端口号试图连接服务器 socket。

(6)服务器 socket 接收到客户端 socket 请求,被动打开,开始接收客户端请求,直到客户端返回连接信息 。这时候 socket 进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端连接请求 。

(7)客户端连接成功,向服务器发送连接状态信息 。

(8)服务器 accept 方法返回,连接成功 。

(9)客户端向 socket 写入信息 。

(10)服务器读取信息 。

(11)客户端关闭 。

(12)服务器端关闭 。

涉及到的接口函数如图

5. TCP四次挥手的CLOSE_WAIT状态是在什么时候,出现大量CLOSE_WAIT会有什么影响

第二次挥手时。

大量CLOSE_WAIT影响服务器资源的释放,最后申请不了新的资源后,服务器宕机。

6. IO多路复用了解吗,select有什么问题,1024可以修改吗

IO多路复用:Linux用select/poll函数实现IO复用模型,这两个函数也会使进程阻塞,但是和阻塞IO所不同的是这两个函数可以同时阻塞多个IO操作。而且可以同时对多个读操作、写操作的IO函数进行检查。select/poll会监听所有的IO,直到有数据可读或可写时,才真正调用IO操作函数。

select,poll,epoll都是IO多路复用的机制,I/O多路复用就是通过一种机制,可以监视多个文件描述符(Linux中,一切皆文件,通过文件描述符来标识),一旦某个文件描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。

但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需用户自己进行读写,异步I/O的实现是内核负责把数据从内核拷贝到用户空间,用户直接使用数据,这个过程是非阻塞的

三者的原型如下所示:

复制代码

int` `select(``int` `nfds, fd_set *readfds,  ``      ``fd_set *writefds, fd_set *exceptfds,  ``      ``struct timeval *timeout ``     ``); ` `int` `poll(struct pollfd *fds, nfds_t nfds,  ``     ``int` `timeout ``    ``); ` `int` `epoll_wait(``int` `epfd, struct epoll_event *events,  ``        ``int` `maxevents, ``int` `timeout ``       ``);

总结下select的几大缺点:

(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大

(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

(3)select支持的文件描述符数量太小了,默认是1024

理论上1024可以修改

7. 多线程有哪些锁,读写锁有什么特点

(1)互斥锁:mutex,保证在任何时刻,都只有一个线程访问该资源,当获取锁操作失败时,线程进入阻塞,等待锁释放。

(2)读写锁:rwlock,分为读锁和写锁,处于读操作时,可以运行多个线程同时读。但写时同一时刻只能有一个线程获得写锁。

互斥锁和读写锁的区别:

(a)读写锁区分读锁和写锁,而互斥锁不区分

(b)互斥锁同一时间只允许一个线程访问,无论读写;读写锁同一时间只允许一个线程写,但可以多个线程同时读。

(3)自旋锁:spinlock,在任何时刻只能有一个线程访问资源。但获取锁操作失败时,不会进入睡眠,而是原地自旋,直到锁被释放。这样节省了线程从睡眠到被唤醒的时间消耗,提高效率。

(4)条件锁:就是所谓的条件变量,某一个线程因为某个条件未满足时可以使用条件变量使该程序处于阻塞状态。一旦条件满足了,即可唤醒该线程(常和互斥锁配合使用)

(5)信号量

9.抖音-火山

作者:牛客454550420号
链接:https://www.nowcoder.com/discuss/750677?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

1.C++和C的区别

2.项目相关

3.session和cookie的区别

  • 我只知道是因为http是无状态的,所以需要…其他不知

4.数据不能明文保存怎么办

  • 我只知道hash一下

5.map

  • 我以为是问unordered_map和map的区别,答了一下
  • 结果想问的是怎么做hash,讲简单的hash
  • 解决冲突:开放地址细节讲不出来…

6.get和post的区别

  • 背了这三段

    • 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数

    • GET产生一个TCP数据包;POST产生两个TCP数据包

    • 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200;

      而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok

  • 100状态码什么意思

  • 为什么post要分成2次,有必要吗

    • 一般情况下 无论get、post 客户端只发一次HTTP请求。特殊情况下,POST 请求发送2次HTTP请求。
      如果客户端需要跟服务端确认 一个大的文件上传等场景服务端是否接受,客户端发送 试探性的请求,请求头带上 Expect: 100 continue, 这多出来一个 HTTP 请求,而不是多一个tcp 数据包。

7.应用层给一个大的数据,下层怎么做,两端都讲讲

  • 分段,分片相关

8.不同段走的路线一样吗?

  • 我讲的无连接和面向连接

9.数据报乱序,怎么解决

  • 我讲的滑动窗口,用选择重传说的

10.数据报丢了,怎么办

  • ARQ

11.数据报被篡改?发生错误怎么检测

12.项目相关

13.ICMP

  • 不知道怎么扯到这

14.DNS用的UDP吗

  • 首先了解一下TCP与UDP传送字节的长度限制:
    UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UDP报文一般不会大于512字节。

    区域传送时使用TCP,主要有一下两点考虑:
    1.辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。
    2.TCP是一种可靠的连接,保证了数据的准确性。

    域名解析时使用UDP协议:
    客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。

    UDP支持的最大数据不是受限于以太网帧的MTU1500字节吗?那么计算下来,也应该是1500-20-8=1472字节啊。怎么就是512了?

    解答
    进行了一波搜索,终于找到原因了。以太网帧在局域网中的MTU是1500byte,但是在非局域网环境,如:internet下的时候,MTU是各个路由器进行一个配置的。所以,通常路由器默认的MTU为576字节。所以,为了适应网络环境,DNS协议在返回的数据报大于512的时候,就转化为了TCP协议。

15.提到了TLS…

  • 不提了,不了解,随口一说
  • 还扯到了布隆过滤器,我说不知道,给我讲了下

16.算法题

  • 字符串只保留字母和数字,其他字符去掉
  • 时间O(n),空间就地
  • 双指针

17.局部性原理

18.CPU cache存的什么东西

  • ???

19.数据库与文件相比 好处

  • 扯数据库特性

  • (20条消息) 数据库与文件系统_hiddpy的博客-程序员宅基地_数据库 文件系统

  • ① 由于DBMS的存在,用户不再需要了解数据存储和其他实现的细节,直接通过DBMS就能获取数据,为数据的使用带来极大便利。

    ② 具有以数据为单位的共享性,具有数据的并发访问能力。DBMS保证了在并发访问时数据的一致性。

    ③ 低延时访问,典型例子就是线下支付系统的应用,支付规模巨大的时候,数据库系统的表现远远优于文件系统。

    ④ 能够较为频繁的对数据进行修改,在需要频繁修改数据的场景下,数据库系统可以依赖DBMS来对数据进行操作且对性能的消耗相比文件系统比较小。

    ⑤ 对事务的支持。DBMS支持事务,即一系列对数据的操作集合要么都完成,要么都不完成。在DBMS上对数据的各种操作都是原子级的。
    ————————————————

20.MVCC

  • 刚讲完作用就扯到锁了,怎么实现还没背呢

21.锁

  • 读写锁
  • Record Lock Gap Lock Next-Key Lock

22.主键索引和非主键索引的区别

  • 讲了innoDB主键索引和非主键索引的实现,叶子节点存的什么东西,查找过程

23.反问

10.虎牙

作者:Your_Julia
链接:https://www.nowcoder.com/discuss/745264?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

9.15 1h 一面

项目

1、客户端不同功能是单线程还是多线程

2、登录页面的密码传输安全性是否保证

3、上传大文件传输效率被限速怎么办

C++

1、构造函数可以设置为虚函数吗

2、析构函数可以设置为虚函数吗

3、C++11新特性

4、智能指针的介绍

5、栈与堆的区别 生长方向为何不同

STL

1、STL容器有哪些

2、set的底层实现

3、set的迭代器如何实现的

反问

1、建议

1)提高自身特长竞争力

2)项目全面性考虑,鲁棒性考虑

3)对自己项目涉及知识面的全面性了解与参照

2、新人培训

1)视频教学

2)导师指导

3)最重要的能力是将学习的东西结合到实践

ps:面试官太耐心太温柔了,不会的还给我举例子说明,对我的建议也是语重心长说了很多东西,全程真的一点都不紧张!


9.24 1h 二面

八股

1、如何避免野指针和内存泄漏

2、智能指针的实现原理

3、多态实现的几种办法

4、栈与堆的区别

5、使用过哪些容器

其他

1、如何对一个自定义类型实现sort编程

2、如何用你已知的数据结构实现一个QQ的最近联系人

3、如何将网络层线程数据传输到UI线程,即window的线程切换

4、 如何实现程序的单实例运行

建议

1、东西需要学深而不是随便一个方向工作几年

2、毕业刚出来几年努力,很大程度决定你之后的处境

3、面对困难的时候,学会如何用现有书本知识去解决问题

ps:是同一个面试官,依旧是对我不会的问题好几个方向去引,我真的太幸运了,面完就被发终面邮件了!


复盘

1、 如何避免野指针和内存泄漏

野指针:指针初始化为nullptr、释放内存后指针指向nullprt、访问数组时注意边界条件

内容泄漏:配套使用new/delete、使用智能指针、基类析构函数设置为虚函数

2、智能指针的实现原理

auto_ptr——new出来的内存实现自动delete

unique_ptr——实现一指针指向一对象

share_ptr——实现多指针指向一对象

weak_ptr——解决共享指针的循环引用问题

*

3、多态实现的几种办法

编译多态(静态多态):函数重载(函数名字相同但是参数列表不同)、模板(不去管参数的具体类型,面向处理逻辑编程)

运行多态(动态多态):基类指针指向子类对象实现对应版本的虚函数调用

4、栈与堆的区别

1)申请方式不同:栈是系统自动分配的,寄存器存在对栈操作的指令, 效率高;

堆是程序员自己手动分配的,效率没那么高,用起来方便但容易出现问题,容易产生碎片;

2)响应方式不同:当前栈空间大小大于等于申请的栈空间系统则分配,否则提示栈溢出;

当申请堆空间则是遍历空闲链表寻找第一个大于等于申请空间的节点,并将多余部分合并回链表

3)生长方式不同:栈是从高地址到低地址生长,是一段连续的空间,有预先分配的空间大小限制,默认初始化8M;

堆是从低地址到高地址生长,是一段不连续的空间,堆的大小取决与虚拟内存的大小;

4)存储内容不同:栈用于存储函数的参数与局部变量;

堆用于存储程序员自定义的内容;

5、STL容器

序列容器:vector、deque、list、forward_list

关联容器:set、multiset、map、multimap

无序容器:unordered_set、unordered_multiset、unordered_map、unordered_multimap

适配容器:stack、queue、priority_queue

1、如何对一个自定义类型实现sort编程

sort泛型编程:实现一个自己的class test,创建一个vector test_vector,使用sort(test _vector.begin(),test _vector.end(),cmp)完成排序

重载运算符’<‘/’>‘:实现一个自己的class test,为该类重载’<‘/’>',创建一个vector test_vector,使其可以直接调用sort(test_vector.begin(),test_vector.end())完成排序

使用自定义的类对象:自定义类对象Cmp实现class test的()调用函数符重载,创建一个vector test_vector,使用sort(test_vector.begin(),test_vector.end(),Cmp)完成排序

对funtional基类派生:引入funtional头文件, 自定义类对象Cmp实现class test的()调用函数符重载,创建一个vector test_vector,使用sort(test_vector.begin(),test_vector.end(),Cmp)完成排序

*

2、如何用你已知的数据结构实现一个QQ的最近联系人

要求:增删查O(1)

思路:哈希表能实现O(1)查找,链表可实现O(1)增删,将两个数据结构结合使用

实现:unordered_map<qq_id,Node* node> map,list<Node*node> qq_list

注意:value是指向链表节点的指针,实现链表位置的快速定位,链表使用双向链表,可以实现当前节点的删除

3、如何将网络层线程数据传输到UI线程,即window的线程切换

*

4、如何实现程序的单实例运行

1)扫描进程列表——相同进程名时出现误报

2)扫描窗口列表——漏掉无窗口程序

3)互斥体实现——通过加锁判断是否成功来实现单例

4)共享内存实现——通过对共享内存标记的更改判断是否可创建对象

11.虾皮

作者:MyforeverG
链接:https://www.nowcoder.com/discuss/836629?type=post&order=hot&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrack&gio_id=7AC5DAE36641CD18A8E434C50C98B300-1645932188668
来源:牛客网

3.进程和线程协程含义区别

一文读懂什么是进程、线程、协程 - 云+社区 - 腾讯云 (tencent.com)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fq9vwx6W-1649732044770)(C:\Users\纠结伦\AppData\Roaming\Typora\typora-user-images\image-20220227151343887.png)]

协程优点:

1.内存小。协程只需要极少的栈内存(大概是2~5KB),默认情况下,线程栈的大小为1MB

2.效率高。
协程是用户态线程。
线程之间的切换受到操作系统的调度。
pc计数器需要从线程A的保存点切换到线程B的上次保存点继续执行,还需要保存线程A的当前上下文。这些事情均由操作系统内核完成。那么将意味着线程切换势必造成系统调用。由用户态->系统态->用户态这样两次上下文切换的过程。

协程之间的切换是由虚拟机或者语言层面上的调度器调度

其中的切换是用户态->用户态→用户态(中间这个是调度器代码)而且,因为协程的占用内存小,切换所需要保存/恢复上下文也小

3. 减少同步锁
为什么协程不需要使用锁?因为协程最终还是运行在线程上,本质上还是单线程运行,没有临界区域的话自然不需要锁的机制。多协程自然没有竞争关系。

4.长连接和短连接区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3EOWnGv-1649732044770)(C:\Users\纠结伦\AppData\Roaming\Typora\typora-user-images\image-20220227151444117.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lLsf2xZW-1649732044771)(C:\Users\纠结伦\AppData\Roaming\Typora\typora-user-images\image-20220227151500728.png)]

5.cookie有哪些属性 、Session,cookie,token的区别

稳了!这才是cookie,session与token的真正区别 - 云+社区 - 腾讯云 (tencent.com)

如果将账户的一些信息都存入Cookie中的话,一旦信息被拦截,那么我们所有的账户信息都会丢失掉。所以就出现了Session

如果Session第一次名字服务器A,进行了存储。下一次命中B,就不行了。

Token相比较于Session的优点在于,当后端系统有多台时,由于是客户端访问时直接带着数据,因此无需做共享数据的操作。

  • Cookie是存储在客户端的
  • Session是存储在服务端的,可以理解为一个状态列表。拥有一个唯一会话标识SessionId。可以根据SessionId在服务端查询到存储的信息。
  • Session会引发一个问题,即后端多台机器时Session共享的问题,解决方案可以使用Spring提供的框架。
  • Token类似一个令牌,无状态的,服务端所需的信息被Base64编码后放到Token中,服务器可以直接解码出其中的数据。
CSRF攻击的大致方式如下:某用户登录了A网站,认证信息保存在cookie中。当用户访问攻击者创建的B网站时,攻击者通过在B网站发送一个伪造的请求提交到A网站服务器上,让A网站服务器误以为请求来自于自己的网站,于是执行响应的操作,该用户的信息边遭到了篡改。总结起来就是,攻击者利用用户在浏览器中保存的认证信息,向对应的站点发送伪造请求。用户的认证是通过保存在cookie中的数据实现,在发送请求是,只要浏览器中保存了对应的cookie,服务器端就会认为用户已经处于登录状态,而攻击者正是利用了这一机制。

XSS攻击见博客收藏

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRqHUtpp-1649732044771)(…/…/AppData/Roaming/Typora/typora-user-images/image-20220308115901501.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Z9Zws2M-1649732044771)(C:\Users\纠结伦\AppData\Roaming\Typora\typora-user-images\image-20220227152303793.png)]

6.sql中 索引的优缺点
7.怎么判断你写的sql语句是好是坏
8.linux中 如果一个文件没有权限 怎么加权限 777 表示啥意思
9.手撕代码 两个数组中 找出相同的 不能用python自带的方法
10.发朋友圈上传图片的用例设计
11.sql中慢查询是什么意思
12.pb协议含义
13.http协议的版本

14.进程和进程之间是怎么进行通信的

15.CPU过高的问题

教你一招!Linux下排查进程占用cpu高的问题 - SegmentFault 思否

top查看过高的进程,shift+h查看其线程

用pstack+线程号 查看调用找

12.科大讯飞

作者:冰棍儿君
链接:https://www.nowcoder.com/discuss/705465?type=post&order=hot&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrack&gio_id=7AC5DAE36641CD18A8E434C50C98B300-1646143041819
来源:牛客网

一面面经

  1. 一个指针重复delete会怎么样?编译报错还是运行报错?报什么错?

    编译正常,运行报错。

    free再次释放已释放的空间,不会有任何释放效果,因为free释放地址,是对地址作标记,表示该地址未被使用,可以再次用于分配。并不是说内存就消失了。

    (注意:1,free后原内存中的数据,不变或被重置。2,free后不会自动将指针置NULL,需要手动置NULL,继续用指针访问已释放的地址是不安全的。)

  2. 声明一个指针但是没有初始化,读写会怎样?只是读的话运行的话会怎样?

    编译的话会出现警告,但是不报错

  3. 编译器是如何区分重载的?

    编译器会给重载的函数其一些不同的名字,通过返回类型+函数名+参数类型的形式。

    (27条消息) 编译器如何C++的函数重载_未语愁眸-程序员宅基地_编译器是如何区分重载的

  4. C里面有重载吗?为什么没有?

    名字修饰内容
    1、在C语言中,编译器在编译过程会将我们的函数重命名,具体的方法就是在我们的函数名前加上“_“修饰符,通过这种方式就可以在我们的符号表种查找到了,但是假如有两个相同的函数,编译之后进行相同的重命名,在符号表中生成的函数名一样,那么就无法区分到底是哪个函数了,所以这也就是我们的C语言为什么不支持函数重载的原因了。
    2、在C++中,既然支持函数重载,那么它肯定对C语言在这方面进行了优化,具体的方法就是在我们的函数名后面加上参数然后生成我们符号表中的函数名称。那么这样一来,就很容易理解了,为什么C++可以支持函数重载了,就是因为函数重载底层的原理造成的,就是由于重载函数在符号表中生成的函数名称不一样,这样就能区分到底是哪个函数了。这样一来编译就能通过了。
    ————————————————
    版权声明:本文为CSDN博主「blog_zhangxu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_43503315/article/details/89714020

  5. 写过动态库吗?想要调用动态库的一个函数,应该怎么用?

    动态调用动态库方法 c/c++ linux windows - 简书 (jianshu.com)

    1、 .so动态库的生成

    可使用gcc或者g++编译器生成动态库文件(此处以g++编译器为例)

    g++ -shared -fPIC -c XXX.cpp

    g++ -shared -fPIC -o XXX.so XXX.o

    2、 .so动态库的动态调用接口函数说明

    动态库的调用关系可以在需要调用动态库的程序编译时,通过g++的-L和-l命令来指定。例如:程序test启动时需要加载目录/root/src/lib中的libtest_so1.so动态库,编译命令可照如下编写执行:

    g++ -g -o test test.cpp –L/root/src/lib –ltest_so1

    作者:KINGZ1993
    链接:https://www.jianshu.com/p/e258a5fd1aa0
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  6. 一个函数返回char*,函数内定义一个数组,如果返回这个数组的话会怎样?对返回的这个char*进行读写会怎样?

  7. 如果一个文件好几个G,用new分配内存来读取,可以装得下吗?

  8. 智能指针相关,shared_ptr,unique_ptr实现原理

    那么如何实现“独占”呢?我们可以在类中把拷贝构造函数和拷贝赋值声明为private,这样就不可以对指针指向进行拷贝了,也就不能产生指向同一个对象的指针。

  9. 如何对一个单向的无序链表进行排序

  10. Python里的GIL(python不咋会)

  11. 多线程对全局变量的读写。如果一个全局变量大部分是读,很少修改,有什么优化方式?

    当我们的程序比较小时,是否使用全局变量本身不会造成太大的影响,但如果程序比较大,函数和变量名比较多时,就要小心全局变量带来的危害。

    1、全局变量是所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件,和函数的模块化编程相违背,不利于程序的修改、调试和移植。编写函数时,最好用传参返回值来和外部交换数据,不要用全局变量。但有时候又不得不使用全局变量,定义了太多的全局变量,会破坏程序的结构性,所以C语言实现大型项目是很困难的,Linux内核这样的东西简直就是神物。

    2、全局变量是在程序开始运行之前的初始化阶段就诞生,到整个程序结束退出的时候才死亡,始终占用数据段上的空间,一定程度上造成了内存浪费,如果程序较大,内存也会很快被消耗完。

    3、全局变量在任何地方都可以被修改,所以软件的安全性也无法得到保证

    4、在面向对象的程序设计中,全局变量的初始化顺序不能确定,因编译器不同而不同,在面向对象的领域就变成了构造对象的顺序不确定,会造成无法预估的灾难性后果
    ————————————————
    版权声明:本文为CSDN博主「_wangpan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/wangpan0330/article/details/89065486

  12. C++如何创建一个线程?

  13. 线程的数量可以无限创建吗?最多能创建多少?

  14. 你这个项目(webserver)里用的多线程,有去测试不同线程数对性能的影响吗?

  15. 你这个项目如何实现高并发?

  16. select和epoll的区别?

  17. 如果5000个客户端连接进来,调用select会怎样?会报错吗还是咋?

    (27条消息) 彻底解释Linux select的1024限制(select真的受1024限制吗?不!)_Netfilter,iptables/OpenVPN/TCP guard:-(-程序员宅基地_select 超过1024

    超过了不会报错,但是内核还是看前1024个的状态。

  18. 如何去定位死锁?

  19. socket通信的流程?

  20. TIME_WAIT是在哪个阶段?为什么要有这个状态?

  21. HTTPS的过程?会话密钥如何生成?

  22. 网络服务器性能的限制因素有哪些?除了多线程、IO多路复用还有哪些可以优化的点?

  23. 页面置换有哪些算法

  24. 只有一个核的CPU是如何同时执行多个进程的(进程调度)?

  25. 程序崩溃如何定位?core文件如果很大的话会占用磁盘空间,怎样不生成core文件?

  26. 段错误一般可能由哪些原因导致?

    产生段错误的原因

    程序运行过程中能访问到的内存空间主要有栈和堆。栈存放了函数的本地变量,堆是程序运行过程中能够自由分配和使用的内存空间。产生段错误和栈、堆的访问密切相关。

    产生段错误的原因主要有:

    • 解引用空指针
    • 访问不可访问的内存空间(如内核空间)
    • 访问不存在的内存地址
    • 试图写一个只读内存空间(如代码段)
    • 栈溢出(函数递归调用)
    • 使用未初始化的指针(定义时没有初始化或者已经回收)
  27. Linux下如何查看进程的状态?

  28. kill和kill -9的区别是什么?如何去捕捉一个信号?所有的信号都可以被捕捉吗?

    kill 大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以

    kill -9代表的信号是SIGKILL,表示进程被终止,需要立即退出

    signal函数可以实现捕捉信号,注意,不能捕捉SIGKILLSIGSTOP信号

  29. Linux和Windows下网络抓包?网络出现问题可能的原因?

  30. 容器、微服务这些了解过吗?

  31. 有了解过最新的,前沿的一些技术吗?

----------------------------------------------------------------------------

13.虾皮

作者:太过年轻的小骗子
链接:https://www.nowcoder.com/discuss/723880?type=post&order=recall&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrack&gio_id=7AC5DAE36641CD18A8E434C50C98B300-1646205948473
来源:牛客网

json 其它协议了解吗 json的优缺点

linux常用命令

进程间通信方式

你对操作系统的理解
cpu占用率过高的时候怎么排查
IO频繁的情况怎么解决(记不太清了…

HTTP1.1和2.0的区别

HTTP常用状态码

HTTPS建立连接的过程

数据库唯一索引和主键索引的区别

主键索引和唯一索引哪个查询速度快

数据库索引一般用什么类型的键值
B+树索引和B树的区别(为什么不用B树
堆和栈的区别
堆和栈哪个访问更快
常见的排序算法及其效率

mysql 两段锁协议

加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。

解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。

两段封锁法可以这样来实现:事务开始后就处于加锁阶段,一直到执行ROLLBACK和COMMIT之前都是加锁阶段。ROLLBACK和COMMIT使事务进入解锁阶段,即在ROLLBACK和COMMIT模块中DBMS释放所有封锁。

\1. 在对任何数据进行读、写操作之前,要申请并获得对该数据的封锁。

\2. 每个事务中,所有的封锁请求先于所有的解锁请求。

14.百度

作者:小时光s3o
链接:https://www.nowcoder.com/discuss/740747?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

面试总结

后端,常规基本包括语言、操作系统、计网、网编、数据库、分布式等,岗位业务以 B/S 架构,其中面试对操作系统、计网、数据库的考察较深,时间过去有点久,面试问题不完全,其中印象较深的问题,如下:

一面、二面

自我介绍

一个 url 输入,到页面加载全过程,越详细越好(一、二面分别问了一次)

DNS 解析过程,越详细越好

gTLD 说明一下

Linux 下 100G 日志文件,其中为 url 记录,统计 top10,需要考虑哪些问题,算法设计

Linux 正则表达式搜索 grep

shell 脚本语言

MySQL 执行流程

MySQL 有哪些日志文件

bin log,undo log,redo log 分别什么作用

InnoDB 底层数据结构

为什么选择 InnoDB,还知道其他什么存储引擎

持久性如何实现

InnoDB 内存缓冲池 buffer pool

double write 知道吗

完整说明 double write 流程及目的,实现原理

聚簇索引

组合索引

索引优化

索引下推 ICP

平时用过哪些 Linux 命令

进程与线程区别

信号量知道吗

进程内存空间

操作系统内存管理方式是什么,如何保证碎片都能被有效利用

poll 与 epoll 的区别

对反应堆的理解

对 IO 的理解

文件描述符 IO 是阻塞还是非阻塞如何决定

当第二个参数cmd=F_GETFL时,它的作用是取得文件描述符***filedes***的文件状态标志。

当第二个参数cmd=F_SETFL时,它的作用是设置文件描述符***filedes***的文件状态标志,这时第三个参数为新的状态标志。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TYzd0Tso-1649732044771)(…/…/AppData/Roaming/Typora/typora-user-images/image-20220304153727605.png)]

算法题,倒数第 n 个节点,堆排,前 K 个高频元素

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq592567042/article/details/124118805

智能推荐

WPF 控件【V】Viewbox(一)Viewbox可以按特定比例伸缩或按固定窗口大小伸缩_wpf固定窗口大小控件-程序员宅基地

文章浏览阅读5k次。<Grid> <Viewbox > <Viewbox.RenderTransform> <ScaleTransform ScaleX="0.5" ScaleY="0.5"/> </Viewbox.RenderTransform> <Path Stroke=..._wpf固定窗口大小控件

一文带你了解卷积网络中的几何学_卷积几何理解-程序员宅基地

文章浏览阅读271次。文章发布于公号【数智物语】(ID:decision_engine),关注公号不错过每一篇干货。原标题 |An Easy Guide to Gauge Equivariant Convolutional Networks作者 |Michael Kissner译者 | AI小山(工程师)、Mr-UC(中国科学院大学)几何深度学习..._卷积几何理解

华为S5720-32X-EI-AC配置备份_s5720-52x-ei-ac固件备份-程序员宅基地

文章浏览阅读1.8k次。第一步备份配置文件到交换机flash中<172.31.255.159> save config.cfg<172.31.255.159>copy config.cfg backup.cfgCopy flash:/config.cfg to flash:/backup.cfg?[Y/N]:y100% complete.|Info: Copied file flash:/config.cfg to flash:/backup.cfg...Done.该步骤主要便于..._s5720-52x-ei-ac固件备份

IDEA技巧+SpringBoot Run Dashboard_idea run dashboard 如何关闭-程序员宅基地

文章浏览阅读3k次。Idea快速入门指南1.安装1.1.安装我们使用的是最新的2017.3.4版本:双击打开,选择一个目录,最好不要中文和空格:然后选择桌面快捷方式,请选择64位:然后选择安装:开始安装:然后勾选安装后运行,Finish:1.2.首次配置然后是UI界面选择,有白色和黑色两款,总有一款适合你:把不需要的组件禁用:插件暂时不选择安装,以后有需求还可以来安装:..._idea run dashboard 如何关闭

合并两个有序数组C++_有两个排序的数组a1和a2,内存在-程序员宅基地

文章浏览阅读1.2k次。合并两个有序数组题目描述:有两个排序的数组A1和A2,内存在A1的末尾有足够的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中,并且所有的数字是排序的。思路分析:从尾到头边比较,边移入正确的位置,时间复杂度为O(n)#include <iostream>using namespace std;void Combin2Array(int str1[], int length1, int str2[], int length2){ if (str1 == nullp_有两个排序的数组a1和a2,内存在

将字符串数组String[]转换成List的三种方法_字符串转list-程序员宅基地

文章浏览阅读4.7w次,点赞4次,收藏32次。将数组转换成list集合_字符串转list

随便推点

C++map的基本操作和使用_c++阻塞map-程序员宅基地

文章浏览阅读404次。1、map简介map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。2、map的功能自动建立Key - value的对应。key 和 value可以是任意你需要的类型。 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查_c++阻塞map

ORA-02266: 表中的唯一/主键被启用的外键引用_ora-02266:表中的唯一/主键-程序员宅基地

文章浏览阅读1.1k次。ORA-02266: 表中的唯一/主键被启用的外键引用 (一): 在删除有父子表关系的表的数据时,我们都知道要先删除子表 再 删除父表数据,或者先取消外键 然后再删除。昨天采用先删子表 ,再删父表,删除时使用truncate,结果在删除父表的时候,给出了这个提示:“表中的唯一/主键被启用的外键引用”。而改成delete则删除成功。网上给出的解释是ddl与dml_ora-02266:表中的唯一/主键

益农信息:农业物联网小气候自动监测站`····_益农农业监测系统-程序员宅基地

文章浏览阅读241次。小气候是指由于下垫面结构和性质不同,造成热量和水分收支差异,从而在小范围内形成一种与大气候不同特点的气候,统称小气候。农业小气候指的是以农作物为下垫面所形成的小气候,即指农业生活环境(如农田、果园、温室、畜舍等)和农业生产活动环境内(如晒场、喷药、农产品储运环境等)的气候。这些小气候与农业生产和农业生物有着密切的关系,主要表现为它们之间物质和能量的交换。农业小气候的范围,垂直方向大约为几米,一般不..._益农农业监测系统

(2)Mysql ----- The last packet successfully received from the server was *** millisecond ago.The-程序员宅基地

文章浏览阅读8.6w次,点赞6次,收藏38次。(1) http://programerni.diandian.com/post/2012-09-14/40038568893The last packet sent successfully to the server was 19365 milliseconds ago. The driver has not received any packets from the server._the last packet successfully received from the server was 5 milliseconds ago

ROM、RAM、FLASH、DDR、EMMC、SSD_fpga中ddr3和flash区别-程序员宅基地

文章浏览阅读8.4k次,点赞17次,收藏134次。目录ROM1.ROM2.PROM3.EPROM4.OTPROM5.EEPROM6.快闪存储器RAM1.静态随机存储器(SRAM)2.动态随机存储器(DRAM)SDRAMSDRAMDDR1DDR2DDR3flash一、存储数据的原理二、浮栅的重放电三、0 和 1四、连接和编址方式NAND flash和NO..._fpga中ddr3和flash区别

二 、TypeScript 变量和数据类型_ts为一个可能为null的值属性赋值-程序员宅基地

文章浏览阅读875次。一、什么是变量通俗的讲:变量,是用来存储数据的容器,并且是可以变化的。保温杯里泡枸杞,变量里面存数据。枸杞难挡岁月催,杯里再换点当归:枸杞 -> 当归。二、变量的使用2.1 基本使用变量的使用分为两步:1 声明变量并指定类型 2 给变量赋值。第一步:声明变量并指定类型let age :number;解释:let 是 TS 的关键字,用来声明变量。 age 是程序员自己定义的变量名称。 : number 用来指定变量 age 为数值类型。 注意:分._ts为一个可能为null的值属性赋值