Linux下多任务间通信和同步-概述
嵌入式开发交流群280352802,欢迎加入!
在前面,我们学习了两种多任务的实现手段:进程和线程.由于进程是工作在独立的内存空间中,不同的进程间不能直接访问到对方的内存空间,因而需要某种方式来通信.而同一进程内的线程共享内存空间,很容易实现数据共享,但需要严格控制多线程对同一内存地址的访问,因而需要采用某种方式来同步.
(1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信.
(2)信号(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的.linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数).
(3)消息队列(Messge Queue):消息队列是消息的链接表,包括Posix消息队列SystemV消息队列.它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息.消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点.
(4)共享内存(Shared memory):可以说这是最有效的进程间通信方式,是针对其他通信机制运行效率较低而设计的.它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新.这种通信方式需要依靠某种同步机制,如互斥锁和信号量等.
(5)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛.起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字.
(6)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段.
(7)互斥锁(Mutex):互斥锁主要用于线程同步,它可以对共享资源加锁,任何其他试图在此对互斥量加锁的线程将会阻塞直至当前线程释放该互斥锁,保证每次只有一个线程可以对共享资源访问.
在以上7中方式中,前5种主要用于多任务通信,后两种主要用于多任务间同步.