时间公司简历笔试一面二面三面HR面
03/02mihoyo
bilibili
斗鱼
03/04阿里提前批
03/10头条(运维)
网易雷火(服务器)
阿里提前批(飞天)
03/16CVTE(c++)
深信服(c++)
腾讯(后台)
03/19拼多多(服务器)
美团(运维)
Thoughtworks
猿辅导(服务器)
作业帮(运维)
作业帮(C++)
03/20快手(后台)
华为(C++)
百度(C++)
西山居(服务器)
七牛云(后端)
360(C++)
03/27阿里(C++)
04/07腾讯(业务运维)

MY OWN

A端: 开发界面

B端: Business, 商家, 商业用户

C端: Consumer, 消费者, 个人和家庭用户

腾讯一面(3.22)

  1. TEG: Technology and Engineering Group

  2. 面向对象, 多态

  3. 虚函数

    1. 概念
      1. 虚函数是为了允许用基类的指针来调用子类的这个函数
      2. 纯虚函数是为了实现一个接口, 起到一个规范的作用
    2. 对于虚函数来说, 父类和子类都有各自的版本。由多态方式调用的时候动态绑定
    3. 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
    4. 如果指针指向的是子类对象, 将调用子类的析构函数, 然后自动调用基类的析构函数
    5. 意义
      1. 为了安全, 因为避免任何需要明确但是因为不小心而导致的未知的结果, 提醒子类去做应做的实现
      2. 为了编码的效率
  4. 虚函数表

  5. 快排, 堆排

  6. 网络字节序, 大小端

    1. 大端: 高位在前, 人类读写数值的方法
    2. 小端: 低位在前 img
    3. 除了计算机的内部处理, 其他的场合几乎都是大端字节序, 比如网络传输和文件储存
    4. “只有读取的时候,才必须区分字节序,其他情况都不用考虑。”
    5. 历史原因是CPU架构不同, 为了规范所以让网络字节序为大端
    6. image-20200323233818841
  7. 进程调度

    1. 先来先服务, 短作业等待时间过长
    2. 短作业优先, 长作业饿死
    3. 最短剩余时间
  8. 内存管理

    1. 只读部分
      1. .text: 代码段
      2. .rodata: 常量
    2. 读写部分
      1. .data: 初始化了全局变量, 静态变量
      2. .bss: 未初始化的全局变量, 静态变量
      3. heap: malloc, free
      4. stack: 函数调用, 生命周期被限制的变量
    3. 页面置换算法
      1. 先进先出
      2. 先进先出·改
      3. 最近最久未使用(LRU)
      4. 时间片轮转
  9. 阻塞, 非阻塞, 同步, 异步

  10. 服务器容灾

    1. 高可用: 两台机器, 备份机一直发hello包, 主机未应答的话, 主动接管业务
    2. 冷备: 手动启动配置备份机
    3. 容错: A运行时, 通过软件同步复制操作到B, A崩溃后, B立刻托管业务, 成本变高
  11. 索引优化

    1. 最左前缀匹配 a = 1 and b = 2 and c > 3 and d = 4, (a, b, c, d)索引用不到d
    2. count(distinct col) / count(*) 越大越好, 最大是唯一键的1
    3. 索引列不参与计算
    4. 拓展索引, 不要新建索引
  12. limit优化

    1. limit的逻辑

      select * from table_name limit 10000,10
      1. 从数据表中读取第N条数据添加到数据集中
      2. 重复第一步直到 N = 10000 + 10
      3. 根据 offset 抛弃前面 10000 条数
      4. 返回剩余的 10 条数据
    2. 自增索引

    3. 先把索引列查找出来

    4. inner join

腾讯二面

  1. 进程通信

    1. 共享内存: 不需要系统调用, 所以效率最高, 但是没有同步互斥机制
  2. 范式

    1. 第一范式: 每个属性不可再分
    2. 第二范式: 消除了非主属性对于码的部分函数依赖 实体的属性完全依赖于主关键字,即:不能存在仅依赖主关键字的一部分 (学号, 课程号, 得分, 课程名)
    3. 第三范式: 消除数据库中关键字之间的依赖关系 消除传递依赖 (学号, 系别, 系主任)
    4. BCNF范式: 不允许主键的一部分被另一部分或其它部分决定 (学生, 老师, 课程)
  3. uuid不重复的原理

    1. 时间戳
    2. 名字的MD5散列

腾讯(业务运维)一面

  1. mysql修改字段名
  2. mysql修改字段值
  3. 查看IO iostat
  4. 修改DNS服务器ip
    1. 非永久解决方案: /etc/resolv.conf
    2. 永久解决方案: /etc/dhcp/dhclient.conf

腾讯(业务运维)二面

  1. TCP端口一共多少个 16位, , 所以是0-65535

  2. 端口分类

    1. 公认端口: 0-1023
    2. 注册端口: 松散的绑定一些服务
    3. 动态和私有端口: 49152-65535, 可用于任意软件与任何其他的软件通信的端口数,使用因特网的传输控制协议,或用户传输协议。
  3. 文件权限:

    拥有者, 拥有者所在用户组, 其他用户

  4. 如何判断tcp超时

    1. 3次ACK快重传
    2. α·SRTT +(1 - α)·RTT
    3. 容易混淆的知识
      1. MSL: maximum segment lifetime, 最大报文生存时间
      2. TTL: time to live, 路由的跳数
      3. RTT: round trip time, 往返时延, 数据包回环一圈的时间
      4. RTO: Retransmission Time Out, 重传超时
  5. tcp 可靠性

    1. 校验和
    2. 字节编号
    3. 数据段确认
      1. 一次发送滑动窗口大小个数据段
      2. 对连续接受的数据段的最后一个序号进行确认
      3. 不连续的已经接受的缓存
      4. 超时重传
  6. 如何创建进程

    1. fork(): 复制当前进程, 返回父进程和子进程ID一共两次
    2. vfork(): 产生子进程和父进程共享地址空间
    3. clone(): clone可以让你有选择性的继承父进程的资源

    img

  7. mysql服务的连接过程 image-20200413074535469

腾讯(业务运维)三面

  1. bash是如何执行命令的

    1. 执行交互式命令

      1. fork当前进程并且exec执行命令
      2. 内建命令不创建新进程cd, alias, export
    2. 执行脚本

      1. ./script.sh(需要可执行权限): fork成子进程, exec系统调用

        1. script.sh程序代码替换子进程代码
        2. _start开始执行
      2. /bin/sh ./script.sh(不需要可执行权限)

        1. 用解释器程序代码替换子进程代码
        2. 从 解释器的_start开始执行
      3. 实例

        #!/bin/sh
        cd ..
        ls
        1. 交互Shell(bashfork/exec一个子Shell(sh)用于执行脚本,父进程bash等待子进程sh终止
        2. sh读取脚本中的cd ..命令,调用相应的函数执行内建命令,改变当前工作目录为上一级目录
        3. sh读取脚本中的ls命令,fork/exec这个程序,列出当前工作目录下的文件,sh等待ls终止
        4. ls终止后,sh继续执行,读到脚本文件末尾,sh终止
        5. sh终止后,bash继续执行,打印提示符等待用户输入
        6. Shell脚本的执行过程
  2. fork底层

  3. 查看某个进程的系统调用 strace -p pid

  4. 用户态和内核态是如何切换的

  5. 分配给进程的资源包括什么, 又是如何分配的

  6. 进程调度算法

    1. 先来先服务
    2. 短作业优先
    3. 最高响应比(响应比 = 1+作业等待时间/作业处理时间)
    4. 优先级调度
  7. 时间片轮转算法 5ms - 800ms

深信服(C++)一面

  1. 为什么会有hash冲突 根据输入值变成固定的长度,必然存在不同的输入产生相同的值

  2. time33算法

    public int time33(char[] str) {
        int hash = 0;
        for (char c : str) {
            hash = hash * 33 + c;
        }
        return hash;
    }

百度(C++)一面

  1. tcp建立连接为什么需要三次
    1. 为什么不需要四次(ii, iii可以合并)
      1. A —syn+seq(A)=x—> B
      2. B ----ack=x+1--- —> A
      3. B —syn+seq(B)=y—> A
      4. A ----ack=y+1------> B
    2. 为什么不能是两次(不能就B的初始序列号达成一致)
      1. A —syn+seq(A)=x—> B
      2. B —syn+seq(B)=y+ack=x+1—> A
  2. tcp断开连接为什么需要四次
    1. 第二次挥手完成的时候,服务端可能还有数据要发送
    2. 所以只能先发送ack确认
  3. 内存排布
  4. 进程资源是如何隔离的
    1. namespace是Linux提供的资源隔离机制。只有在同一个namespace下的进程可以相互联系,但无法感受到外部进程的存在,营造出处于一个独立的系统环境中的错觉,从而实现了隔离。
    2. cgroup提供
      1. 资源限制
      2. 优先级控制
      3. 资源统计
      4. 任务控制
  5. 死锁的条件
    1. 互斥: 一个资源只能被一个进程占用
    2. 请求和保持等待: 一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持占有
    3. 不可抢占
    4. 循环等待: 所等待的进程必定会形成一个环路
  6. 死锁的预防
    1. 打破互斥: 实际意义不大
    2. 打破请求和保持等待: 一次性申请需要的全部资源
      1. 进程是动态的,不可能提前预知资源多少
      2. 资源利用率低,降低了资源使用的并发性
    3. 打破不可抢占: 允许分配已占有的资源
    4. 打破循环等待:资源有序分配
  7. 死锁的避免
    1. 银行家算法
  8. 死锁的检测
    1. 发生死锁时,最小代价恢复运行
    2. 发现环路说明有死锁
  9. 死锁的恢复
    1. 按照进程优先级撤销进程

百度二面

  1. GC

    1. 引用计数法
    2. mark sweep
    3. 维护不需要GC的
  2. 线程安全的单例模式

    1. 饿汉版

      #include <bits/stdc++.h>
       
      using namespace std;
       
      class single {
      private:
          single() = default;
       
          ~single() = default;
       
          static single *instance;
      public:
          int val = 2;
       
          static single *getInstance() {
              return instance;
          }
      };
       
      single *single::instance = new single();
       
      int main() {
          cout << single::getInstance()->val << endl;
      }
       
    2. 懒汉版

      #include <bits/stdc++.h>
       
      using namespace std;
       
      class single {
      private:
          single() = default;
       
          ~single() = default;
       
          static single *instance;
       
          static mutex _mutex;
      public:
          int val = 2;
       
          static single *getInstance() {
              if (instance == nullptr) {
                  unique_lock<mutex> lock(_mutex);
                  if (instance == nullptr)
                      instance = new single();
              }
              return instance;
          }
      };
       
      single *single::instance = nullptr;
      mutex single::_mutex;
       
       
      int main() {
          cout << single::getInstance()->val << endl;
      }
       

作业帮(运维)一面

  1. 软硬链接区别
    1. 硬连接共享inode
    2. 若原来的文件删除了,软链接不可访问,硬链接可以访问
    3. 软链接可以跨磁盘,硬连接不行
  2. 如何在log文件打开的情况下删除
  3. 运维的工作
    1. 对全平台的业务的监控与部署
    2. 服务部署的效率化与自动化
    3. 降低运维的成本
    4. 一整套服务的生命周期的管理

作业帮(运维)二面

  1. 常见http请求头

    请求头说明
    Accept文件类型(text/css)
    Accept-Encoding压缩方式(gzip)
    Accept-Languagezh, cn
    User-Agent操作系统,浏览器
    method
  2. 常见http响应头

    响应头说明
    Content-Type文件类型(text/css)
    Content-Encoding压缩方式(gzip)
    Content-Language
    status状态码(200)
    method
  3. 301与302, 常见状态码

    1. 301: 永久重定向(http://www.baidu.com跳转https://www.baidu.com)
    2. 302: 临时跳转(未登陆的用户访问用户中心重定向到登录页面)
    3. 400: 客户端请求有语法错误
    4. 403: 服务端收到请求, 但是拒绝提供服务
    5. 404: 请求的资源不存在
  4. cookie 和 session区别

    cookiesession
    存取方式ASCII字符串任意类型
    隐私策略客户端可见存储在服务器
    有效期时间可以设置比较长不可能又多又长
    跨域支持不支持
  5. websocket

    1. 基于TCP的真正的全双工通信,客户端和服务器都可以正常接受与发送数据
    2. 建立TCP连接后,不需要HTTP header
    3. 通信协议符为(ws, wss)
  6. 事务是什么 满足ACID的一组操作

  7. 为什么需要事务 保证数据库中数据的完整性和正确性

字节(运维)二面

  1. 聚簇索引 聚簇索引的数据的物理存放顺序与索引顺序是一致,IO时间变少

暑期实习面经

阿里一面

  1. const

    1. const修饰普通变量: 常量不能修改(注意编译器优化, volatile)

    2. const修饰指针变量

      1. 修饰指针指向的内容: 内容不可变

        const int *p = 8;
      2. 修饰指针: 指针不可变

        int* const p = &a;
        *p = 9; // 正确
        p = &b; // 错误
      3. 修饰指针和指针指向的内容: 均不可变

    3. const参数传递

      1. 按值传递的参数: 可以当没有必要(本来就是拷贝)

      2. 指针参数

        void Cpf(int *const a)
        {
            cout<<*a<<" ";
            *a = 9;
        }
      3. 自定义类型的参数

    4. const函数返回值

      1. const修饰内置类型: 是否修饰作用一样

        const int Cmf()
        {
            return 1;
        }
      2. const修饰函数指针

        const char *getStr() {
            return "dddd";
        }
         
        const char *str = getStr();
    5. const修饰成员函数 const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值

      class {
          int get_cm()const
          {
             return _cm;
          }
      }
  2. 多态

    一个接口, 多种行为

    1. 编译时多态: 函数重载与模板(静态)
    2. 运行时多态: 虚函数(动态)

    析构函数: 在多态基类中使用虚析构函数

  3. 指针和引用

    1. 代码

      int a=1;int *p=&a; // p是指针
      int a=1;int &b=a;  // b是引用, 和a相同
    2. 可以有const指针,但是没有const引用

    3. 指针可以有多级,但是引用只能是一级

    4. 指针可以改变,但引用不可改变

    5. “sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小

      int b=&a;
      sizeof(b); // 4
      sizeof(int *); // 8(64位)
    6. 函数参数

      1. 指针本质还是值传递

      2. 引用传递的是实参本身

        void test(int &a)
        {
          cout<<&a<<endl;
        }
         
        int main(void)
        {
            int a=1;
            cout<<&a<<endl;
            test(a);
            return 0;
        }
         
        // 0x7ffdf0564b14
        // 0x7ffdf0564b14
  4. 判断链表是否循环 leetcode141

CVTE C++

一面

  1. RTSP协议 RTSP(Real-TimeStream Protocol )被用于建立的控制媒体流的传输,它为多媒体服务扮演“网络远程控制”的角色。尽管有时可以把RTSP控制信息和媒体数据流交织在一起传送,但一般情况RTSP本身并不用于转送媒体流数据。媒体数据的传送可通过RTP/RTCP等协议来完成。

    实时传输控制协议(Real-time ControlProtocol,RTCP)与RTP共同定义在1996年提出的RFC 1889中,是和 RTP一起工作的控制协议。RTCP单独运行在低层协议上,由低层协议提供数据与控制包的复用。

  2. 基于UDP和TCP的传输有什么区别

    TCPUDP
    无状态面向连接无连接面向报文
    字节流模式数据报模式
    只能一对一可以多对多
    系统资源消耗大****小
    保证数据正确可能丢包
    保证数据顺序可能丢包
    流量控制,拥塞控制,
    超时重传,校验和
    尽力交付
  3. 如何解决UDP传输乱序的问题? tcp的seq

  4. shared_ptr和unique_ptr有什么区别

    shared_ptrunique_ptr
    计数器独有
    make_shared只能new
  5. shared_ptr如何做到多个同时管理一个对象 计数器, use_count, unique

  6. unique_ptr可以拷贝吗?为什么不能拷贝? 拷贝构造函数是被删除的

  7. c++多态如何理解? 一个接口, 多种行为

    1. 编译时多态: 函数重载与模板(静态)
    2. 运行时多态: 虚函数(动态)
  8. 多进程和多线程的区别 线程是CPU调度的基本单元 进程是系统资源分配的基本单元

  9. 如何在两个进程间共享一个对象

    1. 共享内存
    2. 管道
    3. MQ
  10. 虚拟地址空间

    1. 部分映射物理内存
    2. 伪连续, 不需要物理内存连续

电话面 二面

  1. mmap原理 mmap将一个文件或者其它对象映射进内存, 文件被映射到多个页上
    1. 在用户虚拟地址空间中寻找空闲的满足要求的一段连续的虚拟地址空间,为映射做准备(由内核mmap系统调用完成)
    2. 建立虚拟地址空间和文件或设备的物理地址之间的映射(设备驱动完成)
    3. 缺页中断
  2. 直接写磁盘的性能损耗 操作系统和C库函数通常会对写入的文件内容做缓存,以减少实际写文件的次数。直接调用系统函数fsync或C函数fflush将使系统的缓存机制失效,此时将强制把内容刷到磁盘上。除非必需,否则不要执行强制刷盘操作。

腾讯暑期实习面试

一面

  1. 进程线程通信

    1. 进程: 管道, 有名管道, 信号量, 消息队列, 共享内存, 套接字
    2. 线程: 锁, 信号量
  2. MySQL索引 MySQL 5.5以前的默认存储引擎是MyISAM, MySQL 5.5之后的默认存储引擎是InnoDB

    1. MyISAM
      1. 没有事务
      2. 全文索引(like %XXX)
      3. 表级锁
      4. 表压缩(io密集)
      5. count()
    特性说明InnoDBMyISAMMEMORY
    B树索引 (B-tree indexes)自增ID物理连续性更高, 二叉树,红黑树高度不可控
    R树索引 (R-tree indexes)空间索引
    哈希索引 (Hash indexes)无法做范围查询
    全文索引 (Full-text indexes)
    1. B树是多路树,红黑树是二叉树!红黑树一个节点只能存出一个值,B树一个节点可以存储多个值,红黑树的深度会更大,定位时 红黑树的查找次数会大一些。
    2. 高度
    3. 局部性原理
  3. MySQL的联合索引 叶节点存储的则是三个关键字col1、col2、col3三个关键字的数据,且按照col1、col2、col3的顺序进行排序

  4. https是什么

    1. http的安全版本
    2. ssl(Transport Layer Security) -> tls(Transport Layer Security)
  5. https 过程

    1. TCP三次握手(1.5-RTT)
  6. TLS四次握手(2-RTT)

  7. HTTP交互 (1-RTT), 真正传输数据的

    image-20200519165142493

    image-20200519165246955

  8. 服务端的状态码

    状态码
    2XX成功
    3XX重定向
    4XX客户端错误
    5XX服务端错误
  9. 加密算法有哪些

    1. 对称加密: DES, 3DES, AES
    2. 非对称加密: RSA, DSA
    3. SHA-1, MD5
  10. CA证书

    1. A服务器产生公钥私钥后向root ca发送请求
    2. root ca发送用自己的私钥加密的A服务器的证书
    3. 浏览器一般带有权威认证机构的公钥
    4. 这个公钥可以用来解密证书证明自己是自己
  11. restful接口

    1. API与用户的通信协议,总是使用HTTPs协议
    2. 每个网址代表一种资源(resource)
    3. 动词
  12. get和post区别

    GETPOST
    一般是获取一般是发送
    数据url可见
    <=2kb一般无限制
    安全性低, 无加密
  13. http1.0, 1.1, 2.0

    HTTP
    1.0新增了POST, 一次请求一次连接
    1.1keep-alive, 管道, 分块
    2.0二进制, 多路复用, 主动推送, 头部压缩
  14. TCP怎么可靠传输 拥塞控制, 流量控制, 校验和, 超时重传, 字节编号

  15. 滑动窗口是什么 接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小

  16. 拥塞窗口 拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口

二面

  1. 浏览器输入一个网址,发生的事情

  2. cdn是什么 大号的缓存代理

    img