C++的跨平台(Linux)开发——总结

  • 设备和文件IO
    • Linux 内核函数
      • 内核函数和API区别(fopen、open) 
        • API函数通过库函数 进行操作
        • 内核直接操作硬件
        • 从效率上:内核函数比库函数快
        • 从移植性上:内核几乎无法跨操作移植,库函数比较方便
    • 文件操作
      • open函数
      • read函数
        • 阻塞式函数——没读取到内容是不会往下执行的
      • wirte函数
      • create函数
      • close函数
      • lseek函数
      • fcntl函数
    • 文件夹操作
      • mkdir 函数
      • rmdir 函数
        • 针对空文件夹——有数据或者其他文件就不能删除
    • 业务场景
      • 文件读写
      • lseek 文件拆分
      • 多线程操作同一个文件 fcntl文件锁 ——文件锁会被绕过,现在很少用,而是用线程锁
    • 面试问题
      • 文件操作流程
      • 内核函数和API区别
      • 什么是阻塞式函数
  • 进程管理
    • 什么是进程
      • PID是什么
      • PCB是什么
    • 进程的状态
    • init进程
    • fork 函数
      • 作用:开辟新的子进程
      • 过程:一次调用,两次返回(父子进程)
      • 父进程 pid>0  子进程pid==0
      • 代码拷贝,多进程中数据,地址一直,数据独立不能数据共享
      • 注意:多进程中的数据如果全局变量地址是一样的,数据是独立的
    • 业务场景
      • 前后置服务器
      • 守护进程(心跳 ——后台看不见,比如微信看完切换到qq,这时候微信这个进程就存在守护进程里)
    • 面试问题
      • 进程和线程关系和区别
      • 进程状态切换问题
      • 进程的结束问题(exit(结束状态码)——子进程调用,主进程会收到状态码。如果主进程先结束,子进程就托孤,系统没人管)
      • 进程和程序的关系()
  • IPC进程间通信
    • 管道
      • 半双工(数据单向流动)
      • 匿名管道PIPE
        • 存在于父子、兄弟进程间(有亲缘关系进程)
      • 命名管道FIFO
        • 没有关系的多个进程之间
        • 存在一个管道文件(容易被误删)
    • 信号
      • 什么是信号(信号发出,执行绑定的函数——类似qt信号和槽)
      • 信号的分类
        • 可靠信号(34只会,发多少执行多少)
        • 不可靠信号(1-31-循环发送多次信号,就只会到达一两个)
      • 代码去实现
        • 不可携带数据signal
        • 可携带数据 sigaction(int类型)
      • 信号屏蔽 sigprocmask
        • 同种排队,异种中断
      • 信号冲突问题

    • 消息队列
      • 链表的形式存在
      • 每一个消息都可以携带数据
      • 数据是存在一定的顺序——先进先出
        • 链表尾部追加、头部删除
      • 读取一个消息,会自动删除链表的头(最早的消息)
      • 代码实现
        • msgget 消息队列创建和访问
        • msgsend 发送消息
        • msgrcv 接收消息
        • msgctl 控制消息队列
          • 删除
    • 共享内存(跟消息队列、信号量 是三剑客 不属于进程,进程可以共享)
      • 多个进程中可以共享的一块内存区域
      • 不属于任何进程
      • 所有的进程都可以操作
      • 后一个访问者可以查看到前一个访问操作的结果
      • 代码实现
        • shmget 创建和访问
        • shmat 连接进程
        • shmdt 断开进程连接
        • shmctl 控制共享内存
          • 删除
    • 信号量
      • 多个进程间访问同一数据 进程锁操作 通知操作
      • 代码实现
        • semget 创建
        • semop 一次pv操作
        • semctl 信号量控制
          • 删除
    • 业务场景
      • IPC通信管理
        • 数据传输(适合:共享内存、管道、消息队列)
        • 数据共享(共享内存,有指向性不能共享)
        • 通知事件(消息队列、信号、信号量)
        • 进程锁同步机制(信号量——进程锁——pv操作)
    • 面试问题
      • 不同的IPC技术的运用场景(能用和适用用)
  • socket 网络通信(与前面不一样的是使用了网络)
    • 网络基础概念
      • IP地址
        • 作用:找到网络中特定的主机
      • 端口
        • 确定应用程序
      • 通信协议
        • TCP
          • 1、验证通信双方是否在线
          • 2、流式IO传输,不会限制大小
          • 3、键链三次握手;断线四次挥手
          • 牺牲效率,提高数据安全
        • UDP
          • 1、不需要验证通信双方是否在线的情况
          • 2、报文包传输,每一包64KB大小
          • 3、发送报文包
          • 牺牲部分数据安全,提高传输效率
        • 自定义通信协议
          • 协议头
          • 协议体
      • 局域网
      • 广域网
      • 域名
    • 代码实现
      • 服务器
        • socket 函数
        • setsockopt函数——端口重用
        • bind 函数
        • listen 函数
        • accept 函数
      • 客户端
        • socket
        • connect
    • 面试问题
      • TCP和UDP区别
      • xxx业务需要使用什么通信协议实现,为什么
      • 三次握手四次挥手流程
  • socket IO复用
    • 为什么需要IO复用
      • 为了实现高(客户端的访问数量高)、并发(数据量大)
    • 阻塞式IO
    • 非阻塞式IO
    • 多线程IO
    • 多路复用IO
      • select
        • 1、socket数组
        • 2、轮询遍历所有的socket
      • Poll——链表——仍然要遍历
      • epoll
        • 2、使用事件队列的方式,边缘触发
        • 3、选择某一个触发了事件的socket到进程中执行操作
        • Epoll——异步阻塞(所有socket全部处于阻塞状态,事件发生了才会处理read),同步执行(socket产生事件之后,唤醒主进程操作,主进程处于同步等待状态,epoll_wait,产生事件才能read,没有事件到达一直wait,(搭线程池的原因),从wait角度来说是同步的,从事件队列红黑树来说是异步阻塞

Wait后交给线程池处理又变成异步的了)

没有事件到达之后就一直阻塞,事件到达之后就变成同步执行

  • 没有多线程之前,都是同步,有了之后变成异步(read——同步,读取到数据才往下走)
    • 异步:我做的事情跟你无关,一个客户端登录登录不上,不影响其他线程处理业务
    • 业务场景
      • 前置服务器开发
    • 面试问题
      • select \poll和 epoll区别
      • epoll原理
      • epoll封装步骤
      • LT模式和ET模式
  • 线程池
    • 为什么需要线程池——减少创建和销毁线程的次数——减少内存和cpu的消耗
    • 代码实现
      • 任务队列
      • 空闲线程队列
      • 忙碌线程队列
      • 线程数量最大值 MAX 最小MIN
      • 线程条件变量
        • 线程等待
        • 线程唤醒
      • 线程访问同一数据的安全问题
        • 互斥量

两个进程,用了进程锁和线程锁,哪个优先级更高——进程锁

线程包含在进程内,线程锁是用在同一个进程有两个或者多个线程,解决进程内部问题

进程锁一定是进程与进程之间的访问

  • 面试问题
    • 什么业务场景需要线程池(复杂的用模板)
    • 线程池设计

你可能感兴趣的:(服务器,Linux,C/C++,c++,linux,开发语言)