• 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
        • 线程条件变量
          • 线程等待
          • 线程唤醒
        • 线程访问同一数据的安全问题
          • 互斥量

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

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

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

    • 面试问题
      • 什么业务场景需要线程池(复杂的用模板)
      • 线程池设计
  • 相关阅读:
    多目标应用:基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度(MATLAB代码)
    (六) ES6 新特性 —— 迭代器(iterator)
    数组扩展方法(一)
    新版本IntelliJ IDEA(如2023)中运行Spring Boot找不到VM options进行端口的修改的问题解决
    南大通用GBase8s 常用SQL语句(282)
    代码随想录day57|647. 回文子串516. 最长回文子序列
    怎么把大视频发到微信上?关键时刻很实用!
    LRU和FIFO页面置换算法模拟实战
    数组的排序算法
    【Pm4py第八讲】关于Statistics
  • 原文地址:https://blog.csdn.net/hml111666/article/details/124963821