linux同步与通信

这几天读完了UNP v2,对进程间通信与同步的方式有所了解,现对主要的知识点总结如下:

根据出现的历史,先有的管道,FIFO,信号,然后是systemV IPC,再是后来的Poxis IPC,systemV IPC是内核持续性的,而Poxis根据实现不同有的是内核有的是文件系统持续性。

管道:分为管道和FIFO, 管道一般用于父子进程,不能跨进程传输,FIFO可以在文件系统上建立对象,属于一种文件类型(用p标识),可跨进程通信。他们的内容是进程持久性的,也就是说当进程结束时,管道中的内容都丢失了。管道一般都是单工的,只能单向通信,管道通信的前提是管道的两端都被打开,不像消息队列等打开一端就可以发送消息。管道传输的也是字节流,必要时需要制定应用层传输协议来防治粘包。

消息队列:可以看做是一个消息链表,在某个进程往一个队列中写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。具有内核持续性,也就说一个进程写入消息后可以中止,可让另一个进程在以后某个时候读出该消息。存放的是有边界的消息记录,每个消息含有优先级,POXIS消息队列可以进行notify,在消息到达后通过信号或线程进行消息通知。SystemV消息队列可以指定优先级,优先级高的被优先投递,并支持接收指定优先级的消息。在编写一对多模型的时候不同于管道需要创建多个连接,消息队列只需要创建一个连接,各个进程都可以从其中标识地取出属于自己的消息。缺点就是不能结合select/poll使用,必要时需要用管道转接。新编写的应用程序应该首先考虑使用POXIS消息队列。

互斥锁与条件变量: 可以实现生产者与消费者模型,可以动态分配也可以静态分配,当动态分配并指定共享时可以用在进程间同步,存在的问题是当拥有互斥锁的进程或线程异常终止时可能导致临界区数据不一致。当某个进程阻塞在一个条件变量上的时候,如果调用pthread_exit/pthread_cancel取消线程时,会使该线程再次获得该条件变量的互斥锁,并且线程退出时并不会释放该锁,这样就会造成死锁,解决的办法是使用pthread_cleanup_push/pthread_cleanup_pop来实现清理处理程序的安装和删除。

读写锁: 可以提高并发度,根据实现的不同,可以分为读优先,写优先。读写锁默认也是线程间的锁,如果需要在进程间锁也需要指定PTHREAD_PROCESS_SHARED 属性。

记录锁: 可以提供细粒度的锁,并且程序终止时会完成已有锁的清理工作。由内核维护记录锁,分为建议性锁和强制性锁,强制性锁可以阻止非协作进程读一个已被锁住的文件,但这并不能保证数据的一致性。

信号量: 分为有名信号量,基于内存的信号量,systemV信号量,Poxis有名信号量通过一个文件名打开,标识一个内核中文件系统的结构,所以是随内核持久的,可以在进程间或线程间使用,而基于内存的信号量则具有随进程的持续性。

相对于互斥锁有三点不同:

1. 互斥锁必须由给他上锁的线程解锁,信号量没有这种限制;

2. 信号量有一个与之关联的值,它由挂出操作加一,由等待操作减一,那么任何线程都可以挂出一个信号,即使当时没有线程在等待该信号量的值为正数也没关系,但是如果某个线程调用pthread_cond_signal,但是没有任何线程阻塞在pthread_cond_wait调用中,那么相应条件变量的信号将丢失。

3. 各种同步技巧中能够从信号处理程序中安全调用的唯一函数是sem_post函数。互斥锁是为上锁而优化的,条件变量是为等待而优化的,信号量即可用于上锁又可用于等待,因而可能导致更多的开销和更高的复杂性。

SystemV信号量则是计数信号量集,他维护一组信号量,他允许增长或减少信号量的值不只是1,所以相对posix信号量较为复杂。

共享内存区:共享内存区是IPC形式中最快的,一旦这样的内存区映射到共享他的进程的地址空间,这些进程间数据的传递就不需要涉及内核(指不需要通过执行任何进入内核的系统调用),然而一般需要某种形式的同步。而管道,FIFO,消息队列都需要经由内核传递,所以数据需要四次复制。

所有的共享方式都各有利弊吧,例如基于内核的有的需要内存拷贝,共享内存快却需要加锁来保障数据的一致性,所以我们应该按需使用。此外还有信号和socket,由于涉及内容太多,此处不再赘述。

时间: 2024-08-07 22:54:01

linux同步与通信的相关文章

Linux编程---进程通信

Linux的通信方式主要有分类有下面几种: -匿名管道和FIFO有名管道 -消息队列,信号量和共享存储 -套接字 .对于套接字的进程通信,我就留在套接字的文章中再写了. 一.管道 管道是最古老的进程通信机制了.提供进程间的单向通信. 1.创建管道 int pipe(int fdes[2]); 实际上管道通过参数返回读和写的两个文件描述符.相当于是打开了两个文件吧.但是这个文件是特殊的pipe文件.fdes[0]表示的是输入,fdes[2]表示的是输出.注意,这个函数只创建一个文件,而不是创建两个

进程的同步与通信,进程与线程同步的区别,进程与线程通信的区别【转】

本文转载自:http://www.cnblogs.com/youngforever/p/3250270.html 这两天看进程的同步与通信,看了几本书上的介绍,也从网上搜了很多资料,越看越迷惑,被这几个问题搞得很纠结. 进程同步与互斥的区别? 进程的同步方式有哪些? 进程的通信方式有哪些? 进程同步与通信的区别是什么? 线程的同步/通信与进程的同步/通信有区别吗? 在好多教材上(包括国内与国外的)也没有明确这些概念,现在对每个问题还没有准确的答案,下面将自己的理解记下来,以后再补充. 参考资料:

linux线程间通信之条件变量和互斥量

一.条件变量定义 有的时候仅仅依靠锁住共享资源来使用它是不够的.有时候共享资源只有某些状态的时候才能够使用.比方说,某个线程如果要从堆栈中读取数据,那么如果栈中没有数据就必须等待数据被压栈.这种情况下的同步使用互斥锁是不够的.另一种同步的方式--条件变量,就可以使用在这种情况下.条件变量(Condition Variable)是线程间的一种同步机制,提供给两个线程协同完成任务的一种方法,使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止.条件变量的测试一般是用互斥量来保护的,用来确保每

多任务实时系统中的同步与通信

在多任务实时系统中,常常需要在任务之间或者中断与任务之间进行通信,这就产生了同步与通信机制. 同步可分为两种: ①资源同步:避免两个及以上任务对同一个资源的同时操作 ②活动同步:确定任务的活动是否到达一个确定状态 通信的目的主要是以下几点: ①让一个任务控制另一个任务 ②在任务间传递信息(通常为状态) ③传递数据 ④同步 通信的主要方式有: ①全局变量:容易引起混乱 ②共享内存:需要和某种同步机制配合使用 ③信号量.邮箱.消息队列.互斥体等消息机制 一. 信号量 信号量的通俗结束:一家餐馆有二十

linux 同步IO: sync、fsync与fdatasync

[linux 同步IO: sync.fsync与fdatasync] 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作.这种输出方式被称为延迟写(delayed write) 延迟写减少了磁盘读写次数,但是却降低了文

linux下串口通信与管理

linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get install setserial 插上USB转串口,在终端输入命令 #dmesg | grep ttyUSB0 如果出现连接成功信息,则说明系统已经识别该设备 一.找到自己的串口设备 查找自己的开发板与电脑的连接的COM口方法 Windows:设备管理器 linux: (1)dmesg #查看带有

linux 同步IO: sync msync、fsync、fdatasync与 fflush

最近阅读leveldb源码,作为一个保证可靠性的kv数据库其数据与磁盘的交互可谓是极其关键,其中涉及到了不少内存和磁盘同步的操作和策略.为了加深理解,从网上整理了linux池畔同步IO相关的函数,这里做一个罗列和对比.大部分为copy,仅为记录,请各位看官勿喷. 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓

linux同步软件

linux同步软件:scp,rsync,inotify,sersync 一.scp     scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 . 与rcp 不同的是,scp 在需要进行验证时会要求你输入密码或口令.     scp 命令是 SSH 中最方便有用的命令了,试想,在两台服务器之间直接传送文件,仅仅用 scp 一个命令就完全解决了.你可以在一台服务器上以 root 身份运行 #scp serverna

linux下IPC通信

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. # 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. # 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段. # 消息队列