美文网首页
绿盟面试准备

绿盟面试准备

作者: CLCP | 来源:发表于2018-04-26 15:22 被阅读23次

    C++基础知识

    1. 指针和引用的区别: 指针是一个变量 ,引用是别名.指针可以初始化为空, 引用必须初始化为具体的值.
    2. static关键字
      1. 作用域隐藏, 编译多个文件时使用
      2. 全局的生命周期
      3. static修饰的变量初始值为0
      4. 在C++中, static修饰的成员函数没有this指针.智能访问static变量,且static修饰的成员函数和成员变量属于类而不属于对象
    3. 堆区, 栈区, 静态常量区

      手动申请的内存放在堆区, 静态和全局变量存放在常量区, 其余变量存放在栈区

    4. 关于new和malloc

      malloc是C语言的库函数, new是C++的运算符. new会调用C++中类的构造函数, malloc没有类似的调用. new出来的内存用delete释放, malloc出来的内存用free()释放.

    5. C++的内存布局

      普通类: 类成员函数不占空间
      含有虚函数: 类里面含有虚函数时会多维护一张虚表, 占用一个指针的空间
      单继承: 不管派生类中是否有虚函数,都只维护一张虚表, 如果派生类中有虚函数,则虚表中会存在对应的表项
      菱形继承: (非虚继承): 派生类中有两个指针, 同时维护两张虚表
      菱形继承(虚继承): 两个vbptr和一个vfptr

    6. C++函数压栈顺序:

      从右向左. this指针是C++成员函数的第一个参数, 存放在ECX寄存器中, 以便快读访问. 压栈过程中首先压入下一条指令的地址(返回地址), 保存现场.

    并发编程

    进程是资源分配的基本单位,线程是任务调度最小单位.
    在fork调用时, 操作系统会把父进程的所有资源都复制一遍(写时复制对用户来讲是透明的). 而在生成子线程的时候只会复制一些必要的资源. 所以说进程是资源分配的基本单位.

    1. 多进程

      进程间通信: socket(实践过), 管道通信(实践过), 共享内存, 消息队列
      进程间同步: 信号量. PV操作. P: 如果信号量为0就将当前进程挂起, 大于0就执行并将信号量减一. V: 如果有进程因为信号量挂起则唤醒, 没有则将信号量加一.

    2. 多线程

      线程同步: 信号量, 互斥锁(同步对于共享数据的访问), 条件变量(同步线程间共享变量的值, 当共享数据达到某个值的时候,唤醒等待这个共享变量的线程).

    3. IO复用

      epoll系统调用, 事件通知机制.
      epoll实现原理:
      epoll将监听的所有的文件描述符放在一颗红黑树里, 然后epoll还会维护一个链表, 当存储在红黑树里的文件描述符发生可读或可写事件时, 该文件描述符就被添加到链表中, 所以每一次epoll_wait调用只需要查询这个链表, 有数据就将数据都返回, 没有就继续sleep.
      ET模式和LT模式
      LT模式是epoll的默认工作模式, LT模式下, 当epoll_wait检测到文件描述符上有事件发生时, 应用程序可以不立即处理该事件, 因为后续的epoll_wait调用还会继续通知该事件. ET模式下, 当应用程序接收到事件通知时, 必须立即处理该事件, 因为后续的epoll_wait调用不会重复通知该事件.

    高性能服务程序框架

    1. Reactor模式
      主线程监听文件描述符上是否有事件发生, 如果有立即通知工作线程处理, 工作线程负责IO和业务逻辑处理. 除此之外主线程不做任何实质性的工作.
    2. Proactor模式
      将IO交给内核来处理, 也就是采取异步IO. 工作线程只负责业务逻辑.
    3. 半同步/半异步模式
      主进程负责监听时间, 包括IO事件, 信号, 定时器等等. 主进程由事件触发, 是异步进程, 工作进程负责业务逻辑的处理, IO等, 顺序执行, 是同步进程.
    4. 领导者/追随者模式
      在一个进程池中, 选出一个进程为领导进程, 其余的是追随者进程. 当领导进程监听到文件描述符上的事件时, 先从进程池中选出一个作为新的领导者, 然后去处理文件描述符上的事件. 处理完成之后回到进程池中等待成为新的领导者. 这样就实现了两个进程的并发执行.

    TCP

    1. 三次握手(建立连接)

      • 客户端向服务端发送一个SYN, 用于序号同步, SYN不携带数据, 但是占用一个序号
      • 服务器向客户端发送SYN + ACK字段, SYN + ACK同样不携带数据, 但是占用一个序号
      • 客户端向服务器发送一个ACK字段, 如果不携带数据, ACK不占用序号
        为什么是三次握手 ?
        TCP是 可靠传输协议, 两次握手不能保证成功率, 四次握手太浪费资源
    2. 四次挥手(断开连接)

      • 客户端向服务端发送一个FIN段
      • 服务器返回一个ACK, 此时服务端处于半关闭状态, 此时服务器还可以发送数据, 但是不接收数据
      • 当服务器发送完数据后, 向 客户端发送一个FIN段
      • 客户端向服务端返回一个ACK, 连接关闭.
    3. TIME_WAIT状态

      当客户端在接收到服务器 的结束报文段的时候, 并不会直接进入CLOSED状态, 而是会进TIME_WAIT状态. 客户端要等待2MSL(报文最大生存时间)的时间才能完全关闭. TIME_WAIT状态存在的原因主要有两点: 第一点是保证可靠地终止TCP连接, 第二点是保证迟来的TCP报文有足够的时间被接收.

    4. 异常
      TCP提供了异常终止一个连接的方法, 向对方发送一个复位报文.

    相关文章

      网友评论

          本文标题:绿盟面试准备

          本文链接:https://www.haomeiwen.com/subject/wvgelftx.html