11_进程间通信

上传人:hy****d 文档编号:243021457 上传时间:2024-09-14 格式:PPT 页数:30 大小:54.50KB
返回 下载 相关 举报
11_进程间通信_第1页
第1页 / 共30页
11_进程间通信_第2页
第2页 / 共30页
11_进程间通信_第3页
第3页 / 共30页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,进程间通信,概述,实现进程间通信(IPC)的方法很多,但从历史来看,很多都不可移植,经过多年的发展,已经有很大的统一,IPC的方法主要包括:,管道,消息队列,信号量,共享内存,套接字,2,管道,管道是最古老的IPC方式,在历史上,有两方面的限制:,只能以半双工方式工作,管道的两端必须是具有公共祖先的进程,但最近的Unix系统大多都取消这两方面的限制,但为了兼容性原因,很多应用我们仍然假设管道只能以半双工方式工作,3,无名管道和命名管道,管道可以分为无名管道和命名管道两类,无名管道没有名字,只能工作在具有同一个祖先进程的若干个进程中,命名管道,又叫FIFO管道,可以在任何两个进程之间工作,4,无名管道,通过调用pipe系统调用可以创建一个无名管道int pipe(int 2);,由参数返回两个文件描述符:0为读而打开,1为写而打开,1的输出是0的输入,5,管道,内核,用户进程,fd0,fd1,6,使用管道,单个进程中管道基本没有什么用处,调用pipe创建管道后,再调用fork,就创建了从父进程到子进程(或反向)的IPC通道,还可以通过多次调用fork在两个子进程之间连接IPC通道,管道的一方进程应该关闭自己不需要的管道描述符,7,管道,内核,父进程,fd0,fd1,子进程,fd0,fd1,8,从子进程到父进程的管道,管道,内核,父进程,fd0,子进程,fd1,9,两条规则,当管道的一端被关闭后,下列两条规则起作用,当读一个写端被关闭的管道时,所有数据被读取后,,read,返回,0,。,(,只要管道的写端还有进程,就不会产生文件结束,),如果写一个读端被关闭的管道,则产生信号,SIGPIPE,,如果忽略或捕获该信号并返回,则,write,返回,-1,,,errno,设置为,EPIPE,10,一段典型的代码,int main(),int fd2;,pipe(fd);,if (pid_t pid = fork() 0),close(fd0);,write(fd1, .);,.,else,close(fd1);,read(fd0, .);,11,FIFO管道(命名管道),无名管道只能工作在具有同一个祖先进程的若干个进程中,FIFO管道可以克服这个问题,FIFO管道是一种文件类型,可以被创建在文件系统中,并设置相应的权限,多个进程可以通过分别以读/写方式打开该FIFO文件进行读/写,从而达到进行管道通信的目的,int mkfifo(char *pathname, mode_t mode),12,FIFO管道的主要用途,在进程之间传输数据,但不便于使用无名管道的地方,在客户进程,-,服务器进程之间进行通信,13,XSI IPC(XSI进程间通讯),有3种IPC被称为XSI IPC:消息队列、信号量和共享内存,XSI IPC没有使用文件系统名字空间,而是构造了自己的名字空间,这3种IPC具有类似的处理方式,14,标识符和键,每个内核中的IPC对象都用一个非负整数的标识符加以引用,它是IPC对象的内部名,为了使多个合作进程能共享使用同一IPC对象,Unix使用了外部名:键。每个IPC对象都和一个键相关联,可以调用ftok函数通过全局唯一字符串和项目ID产生键key_t ftok(char *path, int id);,15,XSI IPC结构,IPC结构是在系统范围内起作用的,它不属于某一个进程,IPC对象在文件系统中没有名字,只能使用专门的命令和函数访问这些对象,不能通过文件描述符来访问,16,IPC相关的几个命令,Unix系统提供了几个操纵IPC对象的命令,ipcs: 列出系统中的IPC对象,ipcrm: 删除指定的IPC对象,17,一个例子,- Shared Memory Segments -,key shmid owner perms bytes nattch status,0x0052e6a9 0 postgres 600 38207488 4,0x0052e2c1 32769 postgres 600 38207488 4,- Semaphore Arrays -,key semid owner perms nsems,0x0052e6a9 0 postgres 600 17,0x0052e6aa 32769 postgres 600 17,0x0052e6ab 65538 postgres 600 17,0x0052e6ac 98307 postgres 600 17,0x0052e6ad 131076 postgres 600 17,0x0052e6ae 163845 postgres 600 17,0x0052e6af 196614 postgres 600 17,0x0052e2c1 229383 postgres 600 17,0x0052e2c2 262152 postgres 600 17,0x0052e2c3 294921 postgres 600 17,0x0052e2c4 327690 postgres 600 17,0x0052e2c5 360459 postgres 600 17,0x0052e2c6 393228 postgres 600 17,0x0052e2c7 425997 postgres 600 17,- Message Queues -,key msqid owner perms used-bytes messages,18,消息队列,消息队列可以实现不同进程之间的消息传递,消息队列组织成一个链接表,消息的接收不一定按照先进先出的顺序,也可以按照消息的类型接收,消息队列是可靠的、有流控的、面向对象的,19,操纵消息队列,先通过ftok取得键值key,打开或创建消息队列int msgget(key_t key, int flag);,发送消息int msgsnd(int id, void *p, size_t nbytes, int flag);,接收消息ssize_t msgrcv(int id, void *p, size_t nbytes, long type, int flag);,20,信号量,信号量是OS提供的一种重要的进程同步工具,Unix信号量实现了整型信号量的一个超集功能。它是一组信号量,被称为信号量集,可以原子地对这组信号量集的若干个信号量一起进行操作,21,信号量上的操作,信号量的操作主要包括3个方面,打开或创建信号量,信号量值操作,获取或者设置信号量属性,22,打开/创建信号量,和消息队列一样,先调用ftok获得键值key,通过key打开或创建信号量,得到一个信号量集的标识int semget(key_t key, int nsems, int flag);,23,信号量值操作,信号量值的操作也就是wait(P)操作和signal(V)操作,int semop(int semid, struct sembuf semoparray, size_t nops);其中sembuf结构表示了如何操作信号量的值,semop具有原子性,要么执行所有的操作,要么什么也不做,24,sembuf结构体,struct sembuf,unsigned short sem_num; / 信号量集中的编号,short sem_op; / 信号操作,short sem_flg; / 标志,sem_op为正表示增加信号量的值,为负表示减少信号量的值,如果信号量的值不够减,进程被阻塞(无IPC_NOWAIT标志),25,共享内存,共享存储允许两个或更多的进程共享一定的存储区,这是最快的一种IPC,需要进程自己解决访问同步问题,26,获得共享存储标识,和消息队列同样,先调用ftok获得键值key,再调用shmget获得共享存储标识int shmget(key_t key, size_t size, int flag);,27,将共享存储段连接到地址空间中,共享存储段只有映射到进程的地址空间中才能被访问,通过调用shmat可以将共享存储段连接到进程地址空间中void *shmat(int shmid, const void *addr, int flag);,28,取消共享存储段在进程空间中的映射,当使用完毕后,需要将共享存储段从进程地址空间中撤销,int shmdt(void *addr);,29,注意,由于IPC对象是系统范围内的对象,不属于进程,所以,当进程结束的时候,系统不会帮进程清除相应的IPC对象,清理工作是进程的责任,所以,如果可能,尽量避免使用IPC对象。比如,如果是简单情况,可以使用文件锁代替信号量。,30,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!