为什么需要通信机制
1.信号量及管程的不足(只能传递少量数据)
2.不适用多处理器情况
进程通信机制
1.消息传递
1. send & receive原语
2.适用于分布式系统基于共享内存的多处理机系统,单处理机系统,可以解决进程间的同步,通信问题
基本通信方式
1.消息传递
2.共享内存
3.管道
4.套接字
5.远程过程调用
消息传递
发送进程S 接收进程R
send(des,msg) -os消息缓冲区-> receive(src,msg)
msg(text,size) msg(text,size)
1.send()陷入内核,内核复制消息到消息缓冲区
2.receivee()取出消息入队到PCB中消息队列
用P,V操作实现SEND原语
Send(des,msg)
{
根据des找接收进程,如果未找到,出错返回
申请空缓冲区P(buf-empty)
P(mutex1)
取出空缓冲区
V(mutex1);
把消息从message处复制到空缓冲区
P(mutex2)
把消息缓冲区挂到接收进程的消息队列
V(mutex2)
V(buf-full)
}
信号量:
buf-empty 初值为N
buf-full 初值为0
mutex1 初值为1
mutex2 初值为1
共享内存
1.物理内存内建立共享内存,将共享内存映射到各个进程中
2.读过解决读写者问题,解决共享内存中进程写入互斥问题
进程1 - 共享内存 - 进程2
管道通信方式PIPE
1.利用一个缓冲传输介质,
写,发送进程 -管道-> 读接收进程
2.问题:
1.字符流方式写入读出
2.先进先出顺序
3.管道通信机制必须提供的协调能力
1.互斥,同步,判断对方进程是否存在
典型操作系统IPC机制
Linux进程通信机制
UNIX
AT&T BSD
System V IPC 基于套接字的IPC
Linux IPC
^
|
POSIX IPC
Linux继承的IPC通信机制
Linux中用户能够通过API使用的进程同步机制:
管道,消息队列,共享队列,信号量,共享内存。
信号,套接字
内核同步机制:原子操作,自旋锁,读写锁,信号量,屏障
原子操作
1.不可分割,在执行完之前不会被其他任务或事件中断
2.常用于实现资源的引用计数
3.atomic_t
typedef struct {volatile int counter;} atomic_t;
原子操作API包括:
atomic_read(atomic_t*v)
atomic_set(atomic_t*v,int i)
void atomic_add(int i, atomic_t*v)
int atomic_sub_and_test(int i,atomic_t*v)
void atomic_inc(atomic_t*v)
int auomic_add_return(int i,atomic_t*v)
atomic_t v = atomic_init[0];
atomic_set(&v,4)
atomic_add(2,&v)
atomic_inc(&v)
printk('%d\n',atomic_read(&v);
int atomic_dec_and_test(atomic_t*v)
屏障(BARRIER)
1.一种同步机制(又称栅栏,关卡)
2.用于对一组线程进行协调
3.应用场景
1.一组线程协同完成一项任务,需要所有线程都到达一个汇合点后在一起向前推进
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· Tinyfox 简易教程-1:Hello World!