健身会所网站模板,类似织梦的建站cms,人力资源外包服务包括哪些,网站公司动态做不了怎么办1.进程间通信机制
常用的六种通信机制#xff1a; 管道、消息队列、共享内存、信号灯集、信号、Socket
管道#xff08;Pipe#xff09;和无名管道#xff08;匿名管道#xff09;#xff1a;
管道是一种半双工的通信方式#xff0c;数据只能单向流动#xff0c;通常…1.进程间通信机制
常用的六种通信机制 管道、消息队列、共享内存、信号灯集、信号、Socket
管道Pipe和无名管道匿名管道
管道是一种半双工的通信方式数据只能单向流动通常用于具有亲缘关系的进程间通信例如父子进程。 无名管道是在内存中开辟的一段缓冲区一端进程写入数据另一端进程读取数据。
无名管道的特点
1.只能用于亲缘间进程的通信
2.无名管道数据半双工的通信的方式
3.无名管道的大小是64K
4.无名管道不能够使用lseek函数(调用会出错 返回 -1)
5.读写的特点
如果读端存在写管道有多少写多少直到写满为止64k写阻塞直到管道中腾出新的4K空间写操作解除阻塞
如果读端不存写管道管道破裂SIGPIPE
如果写端存在读管道有多少读多少没有数据的时候阻塞等待
如果写端不存在读管道有多少读多少没有数据的时候立即返回(非阻塞)
命名管道FIFO
可以用于非亲缘进程间通信也可以用于亲缘进程间通信有名管道会创建一个管道文件只需要打开这个文件进行读写操作即可管道文件本质是在内存上的在硬盘上的只是一个标识。
有名管道的特点
1.可以用于任意进程间的通信不仅限亲缘进程
2.有名管道数据是半双工的通信方式
3.有名管道的大小是64K
4.有名管道不能够使用lseek函数(调用会失败 返回 -1)
5.读写的特点
如果读端存在写管道有多少写多少直到写满为止64k写阻塞
如果读端不存在写管道
1.读端没有打开写端在open的位置阻塞
2.读端打开后关闭管道破裂SIGPIPE
如果写端存在读管道有多少读多少没有数据的时候阻塞等待
如果写端不存在读管道
1.写端没有打开读端在open的位置阻塞
2.写端打开后关闭有多少读多少没有数据的时候立即返回
信号Signal 信号是一种进程间的异步通信方式用于通知接收进程发生了某种事件如进程终止、用户输入等。信号处理通常是预定义的。消息队列Message Queue
消息队列也是基于内核实现的A进程将消息写入消息队列
消息队列中的消息有类型和正文。
B进程可以根据消息的类型从消息队列中将对应类型的消息取走。
消息队列的大小默认是 16K
如果消息队列满了A进程还想向消息队列中写入消息此时A进程将会阻塞。
共享内存Shared Memory 最直接的通信方式之一允许两个或多个进程直接访问同一块内存区域。速度快但需要考虑同步问题如使用互斥锁或信号量。
信号灯集
信号灯集又叫做信号量数组他是实现进程间同步的机制
在一个信号灯集中可以有很多个信号灯这些信号灯之间工作相互互不干扰。
一般使用时使用的都是二值信号灯
套接字Socket 虽然最初用于网络通信但也可以用于同一台机器上的进程间通信支持TCP面向连接、可靠和UDP无连接、不可靠两种通信方式。
2.线程的同步互斥机制
互斥锁Mutex: 互斥锁是最基本的同步原则用于保护临界区Critical Section确保同一时间只有一个线程可以访问共享资源。其他试图获取锁的线程会被阻塞直到持有锁的线程释放锁。
信号量Semaphore: 信号量可以视为一个计数器用于控制对公共资源的访问数量。它允许一个或多个线程等待特定条件满足计数非零。线程通过waitP操作减少计数通过postV操作增加计数。当计数为零时wait操作会使线程等待。
条件变量Condition Variable: 条件变量用于线程间的同步允许线程等待某个条件成立。线程在条件满足前调用wait()函数挂起自身直到其他线程通过notify()或notify_all()函数通知条件已变成就绪。
读写锁Read-Write Lock: 读写锁允许多个读线程同时访问共享资源但在有写线程时会排斥所有读写线程。适用于读多写少的场景能提高并发效率。
自旋锁Spin Lock: 自旋锁在获取锁失败时并不立即放弃CPU而是在原地循环自旋等待锁释放。适用于锁持有时间很短的情况避免了线程上下文切换的开销。
原子操作Atomic Operation: 原子操作是不可分割的操作保证了操作的完整性。在多线程环境下对变量进行原子操作可以避免数据竞争如原子加、减、交换等。