利用Taotoken模型广场为虚拟机中的不同AI任务选型
2026/5/6 18:16:04
Linux 系统提供了两套 IPC 机制: System V IPC 和 POSIX IPC. 两者都提供了共享内存、消息队列和信号量功能, 但在 API 设计、特性、性能和可移植性方面存在显著差异.
API:
#include<sys/shm.h>intshmget(key_tkey,size_tsize,intshmflg);void*shmat(intshmid,constvoid*shmaddr,intshmflg);intshmdt(constvoid*shmaddr);intshmctl(intshmid,intcmd,structshmid_ds*buf);特点:
ftok()生成或使用IPC_PRIVATEshmctl(IPC_RMID)删除ipcs -m和ipcrm -m管理示例:
key_tkey=ftok(".",'s');intshmid=shmget(key,4096,IPC_CREAT|0666);void*addr=shmat(shmid,NULL,0);// 使用共享内存...shmdt(addr);shmctl(shmid,IPC_RMID,NULL);API:
#include<sys/mman.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>intshm_open(constchar*name,intoflag,mode_tmode);intshm_unlink(constchar*name);void*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset);intmunmap(void*addr,size_tlength);特点:
/my_shm)mmap()映射shm_unlink()删除/dev/shm文件系统中可见示例:
intfd=shm_open("/my_shm",O_CREAT|O_RDWR,0666);ftruncate(fd,4096);void*addr=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);// 使用共享内存...munmap(addr,4096);close(fd);shm_unlink("/my_shm");| 特性 | System V | POSIX |
|---|---|---|
| 标识方式 | 键值(key) | 名字(name) |
| 键值生成 | 需要ftok() | 直接使用字符串 |
| API 复杂度 | 4 个函数 | 5 个函数(包含 mmap) |
| 文件系统可见 | 否 | 是(/dev/shm) |
| 删除方式 | shmctl(IPC_RMID) | shm_unlink() |
| 管理工具 | ipcs/ipcrm | ls/rm(文件系统) |
| 跨平台 | 较差 | 较好(POSIX 标准) |
API:
#include<sys/msg.h>intmsgget(key_tkey,intmsgflg);intmsgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg);ssize_tmsgrcv(intmsqid,void*msgp,size_tmsgsz,longmsgtyp,intmsgflg);intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);特点:
mtype)用于消息分类msgctl(IPC_RMID)删除消息结构:
structmsgbuf{longmtype;// 消息类型charmtext[1];// 消息正文};API:
#include<mqueue.h>mqd_tmq_open(constchar*name,intoflag,mode_tmode,structmq_attr*attr);intmq_send(mqd_tmqdes,constchar*msg_ptr,size_tmsg_len,unsignedintmsg_prio);ssize_tmq_receive(mqd_tmqdes,char*msg_ptr,size_tmsg_len,unsignedint*msg_prio);intmq_close(mqd_tmqdes);intmq_unlink(constchar*name);特点:
/my_mq)mq_unlink()删除/dev/mqueue文件系统中可见| 特性 | System V | POSIX |
|---|---|---|
| 标识方式 | 键值(key) | 名字(name) |
| 消息类型 | mtype(long) | 优先级(unsigned int) |
| API 设计 | 较老 | 较现代 |
| 文件系统可见 | 否 | 是(/dev/mqueue) |
| 删除方式 | msgctl(IPC_RMID) | mq_unlink() |
| 管理工具 | ipcs/ipcrm | ls/rm(文件系统) |
| 跨平台 | 较差 | 较好(POSIX 标准) |
API:
#include<sys/sem.h>intsemget(key_tkey,intnsems,intsemflg);intsemop(intsemid,structsembuf*sops,size_tnsops);intsemctl(intsemid,intsemnum,intcmd,...);特点:
semctl(IPC_RMID)删除操作结构:
structsembuf{unsignedshortsem_num;// 信号量编号shortsem_op;// 操作值(-1: P, +1: V)shortsem_flg;// 标志(SEM_UNDO 等)};API:
#include<semaphore.h>// 命名信号量sem_t*sem_open(constchar*name,intoflag,mode_tmode,unsignedintvalue);intsem_wait(sem_t*sem);// P 操作intsem_post(sem_t*sem);// V 操作intsem_close(sem_t*sem);intsem_unlink(constchar*name);// 未命名信号量(进程内或共享内存中)intsem_init(sem_t*sem,intpshared,unsignedintvalue);intsem_destroy(sem_t*sem);特点:
sem_unlink()删除命名信号量/dev/shm文件系统中可见| 特性 | System V | POSIX |
|---|---|---|
| 标识方式 | 键值(key) | 名字(name)或内存地址 |
| 信号量集合 | 支持(多个信号量) | 单个信号量 |
| UNDO 机制 | 支持 | 不支持 |
| API 设计 | 较复杂 | 较简单 |
| 未命名信号量 | 不支持 | 支持 |
| 文件系统可见 | 否 | 是(命名信号量) |
| 删除方式 | semctl(IPC_RMID) | sem_unlink() |
| 管理工具 | ipcs/ipcrm | ls/rm(文件系统) |
| 跨平台 | 较差 | 较好(POSIX 标准) |
特点:
shmctl(),msgctl(),semctl()ftok()生成键值ipcs/ipcrm命令行工具管理优点:
缺点:
特点:
open(),close(),unlink()等优点:
缺点:
/dev/shm,/dev/mqueue)| 特性 | System V IPC | POSIX IPC |
|---|---|---|
| 标准化 | 非 POSIX | POSIX 标准 |
| 跨平台 | 较差 | 较好 |
| API 设计 | 较老 | 较现代 |
| 标识方式 | 键值(key) | 名字(name) |
| 文件系统可见 | 否 | 是 |
| 管理工具 | ipcs/ipcrm | 文件系统命令 |
| 键值/名字冲突 | 可能冲突 | 名字更直观 |
| 学习曲线 | 中等 | 较简单 |
| 系统支持 | 广泛支持 | 部分系统支持不完整 |
两者在性能上基本相同, 都实现了零拷贝的直接内存访问:
| 指标 | System V | POSIX |
|---|---|---|
| 零拷贝 | ✅ | ✅ |
| 延迟 | 极低 | 极低 |
| 吞吐量 | 极高 | 极高 |
| CPU 占用 | 低 | 低 |
System V 消息队列通常性能略好, 但差异不大:
| 指标 | System V | POSIX |
|---|---|---|
| 延迟 | 低 | 低-中 |
| 吞吐量 | 中-高 | 中 |
| CPU 占用 | 中 | 中 |
两者性能相近:
| 指标 | System V | POSIX |
|---|---|---|
| 延迟 | 极低 | 极低 |
| CPU 占用 | 低 | 低 |
✅适合:
❌不适合:
✅适合:
❌不适合:
System V:
key_tkey=ftok(".",'s');intshmid=shmget(key,4096,IPC_CREAT|0666);void*addr=shmat(shmid,NULL,0);// 使用...shmdt(addr);shmctl(shmid,IPC_RMID,NULL);POSIX:
intfd=shm_open("/my_shm",O_CREAT|O_RDWR,0666);ftruncate(fd,4096);void*addr=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);// 使用...munmap(addr,4096);close(fd);shm_unlink("/my_shm");System V:
key_tkey=ftok(".",'s');intsemid=semget(key,1,IPC_CREAT|0666);semctl(semid,0,SETVAL,1);// 初始化为 1structsembufop={0,-1,SEM_UNDO};// P 操作semop(semid,&op,1);// 临界区...op.sem_op=1;// V 操作semop(semid,&op,1);POSIX:
sem_t*sem=sem_open("/my_sem",O_CREAT,0666,1);sem_wait(sem);// P 操作// 临界区...sem_post(sem);// V 操作sem_close(sem);sem_unlink("/my_sem");查看限制:
ipcs -l主要限制:
shmmni: 最大共享内存段数量shmmax: 最大共享内存段大小msgmni: 最大消息队列数量msgmax: 单条消息最大大小semmni: 最大信号量集数量查看限制:
# 共享内存限制cat/proc/sys/kernel/shm_*# 消息队列限制cat/proc/sys/fs/mqueue/*主要限制:
# 查看所有 IPC 对象ipcs -a# 查看共享内存ipcs -m# 查看消息队列ipcs -q# 查看信号量ipcs -s# 删除共享内存ipcrm -m<shmid># 删除消息队列ipcrm -q<msqid># 删除信号量ipcrm -s<semid># 查看共享内存(在 /dev/shm)ls-l /dev/shm/# 查看消息队列(在 /dev/mqueue)ls-l /dev/mqueue/# 删除共享内存rm/dev/shm/<name># 删除消息队列rm/dev/mqueue/<name>System V IPC 和 POSIX IPC 都提供了共享内存、消息队列和信号量功能, 但在设计理念、API 风格和特性上存在显著差异:
选择建议:
man 7 shm_overview- 共享内存概述man 7 mq_overview- POSIX 消息队列概述man 7 sem_overview- POSIX 信号量概述