• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2022-09-26 16:27 Aet 隐藏边栏 |   抢沙发  18 
文章评分 2 次,平均分 5.0

智能指针

进程间通信

共享内存

  1. 让两个进程的虚拟地址空间映射到同一组物理内存页

  1. Linux
    1. POSIXshm_open + ftruncate + mmap
    2. System Vshmget + shmat
    3. 匿名共享映射:mmap(..., MAP_SHARED, ...)
    4. 普通文件映射:mmap
  2. windows
    1. CreateFileMapping
    2. OpenFileMapping
    3. MapViewOfFile

无名管道

  1. 无名管道是一段由内核维护的字节流缓冲区

  1. linux
    1. 通常先创建管道,再调用 fork()
    2. 父子进程会继承文件描述符,因此天然适合父子进程通信

  1. windows
    1. 通过句柄继承把管道句柄传递给子进程

有名管道

  1. 有名管道拥有一个可供独立进程找到的名字,因此通信双方不需要有父子关系
  2. Linux FIFO
    1. Linux FIFO 本质上仍然是字节流

  1. Windows Named Pipe
    1. Windows 有名管道功能更强,可以:
    2. 单向或双向通信
    3. 字节模式或消息模式
    4. 支持多个客户端实例
    5. 配合重叠 I/OIOCP
    6. 在适当配置下支持网络访问

消息队列

  1. 消息队列由内核维护。发送方提交完整消息,接收方按消息取出

  1. 与管道的重要区别:
    1. 管道:连续字节流,没有天然消息边界
    2. 消息队列:一条一条的消息,有消息边界
  2. linux System V 消息队列
    1. 消息可以带类型:

  1. POSIX 消息队列
    1. POSIX 消息队列支持消息优先级

  1. windows
    1. Windows 没有与 POSIX/System V 完全对应的通用内核消息队列 API
  2. 工程中常见组合:
    1. 消息队列:传递控制消息和共享内存索引
    2. 共享内存:保存真正的大块数据

socket

  1. 通用的双向通信接口

rpc

  1. 远程过程调用,它不是一种与 Socket 完全平级的底层通信方式
  2. RPC 的目标是让跨进程调用看起来接近普通函数调用
  3. 示例

com

  1. 跨进程时,可以用代理、存根服务器通信

DCOM

  1. DCOMCOM 调用扩展到不同机器

进程间同步

事件

  1. 某件事情发生了,等待者可以继续执行

  1. Windows 事件有两种
    1. 自动重置事件:唤醒一个等待者后,自动恢复为无信号状态
    2. 手动重置事件:保持有信号状态,可以唤醒所有等待者,直到调用

  1. linux
    1. Linux 没有一个与 Windows Event 完全相同的通用对象
    2. 常用替代方式:
    3. eventfd
    4. 条件变量
    5. 信号量
    6. 管道
    7. futex
    8. signalfd

互斥量

  1. 同一时刻,只允许一个执行者进入临界区

  1. windows
    1. 命名 Mutex 可以在多个进程之间打开

  1. linux
    1. 普通 pthread_mutex_t 默认只在线程间使用
    2. 要跨进程,需要把互斥量放在共享内存中,并设置:
    3. 还可以使用 robust mutex,使持锁进程崩溃后,其他进程能够检测

信号量

  1. 信号量本质上是一个计数器

  1. 如果初始化为3,表示最多允许3个执行者同时进入

  1. Windows

  1. Linux POSIX
    1. 第二个参数为1表示进程间共享,但信号量对象本身必须位于共享内存

条件变量

  1. 等待某个受互斥量保护的条件成立

  1. 跨进程使用时,条件变量和互斥量都必须放在共享内存中,并设置:

文件锁

  1. 多个进程通过文件交换数据时,可以使用文件锁
  2. linux

  1. windows

COM的使用

介绍

  1. COM定义了标准线路格式和协议,以便在不同硬件平台上运行的对象之间进行交互
  2. COM与实现语言无关,可以使用不同的编程语言来创建COM

概念

  1. 接口
    1. 成员函数的集合,面向对象中接口类
  2. IID
    1. 每个接口都有自己的唯一接口标识符IIDIID是一个全局唯一标识符GUIDIID只会对应一个接口
  3. COM
    1. COM类可以创建实现了多个 接口
  4. GLSID
    1. 每个com 类都有一个CLSID,在windowscom 类 的实现在 dll 或者 exe
  5. 映射关系
    1. COM 维护系统上安装的 COM 对象的所有 Clsid 的注册数据库
    2. 注册数据库是每个 CLSID 之间的映射,以及承载相应类的 DLLEXE 的位置。
    3. 每当调用方想要创建 COM 类的实例时,COM 都将查询此数据库
    4. 调用方只需了解用于请求类的新实例的 CLSID

CoCreateInstance

  1. 根据 CLSID 找到 COM 类的“类工厂”
  2. 让类工厂创建对象
  3. 再返回调用者指定的接口指针

临界区

概述

  1. 临界区不是某块特殊内存,而是一段访问共享资源、需要互斥执行的代码

Windows CRITICAL_SECTION

进入临界区时发生什么

  1. 如果没有其他线程持有:
    1. 立即获得临界区,继续执行
  2. 如果已经被其他线程持有:

  1. 工程中如果不依赖 Windows 专用 API,通常优先使用标准 C++

从DLL中找函数的地址

  1. Windows 中,从 DLL 查找函数地址的标准流程是:

  1. GetProcAddress 做了什么

查看DLL中的函数

  1. Windows 下,要“查看 DLL 中有哪些函数”,本质上是查看 DLLPE 导出表
  2. 枚举全部导出函数需要自己解析 PE 导出表,或者使用 dumpbinDependencies 等工具

编码

反转链表

单链表排序

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2026-07-28
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享