|
进程通信是操作系统内核层极为重要的部分。本文试图从用户的角度探讨AIX的进程通信的有关内容。
按照每次通信时交换信息的多少,可将AIX进程之间的通信分为两类:简单通信和大信息量通信。下面简单介绍它们的有关概念及实现方法。
1. AIX进程的简单通信
简单通信又称为低级通信,是指进程之间的通信是通过传递简单的控制信号来实现的。主要有以下三种方式:
*
利用睡眠SLEEP()和唤醒WAKEUP()实现进程之间的同步/互斥。SLEEP用来使调用它的进程以指定的优先级在某个队列上睡眠,而WAKEUP则用来唤醒在指定队列上睡眠的进程。二者都是由系统提供的。
*
利用系统调用WAIT()和EXIT()实现父子进程之间的同步。WAIT等待子进程运行结束,而EXIT则用来终止一个进程或程序,并把状态返回给它的父进程。
*
利用软中断信号实现同一用户的各进程之间的通信。AIX中设置了22个软中断信号(其中包括两个用户自己定义的信号),它们的符号名及功能如下表所示。
软中断号 符号名 功能 软中断号 符号名 功能
1 SIGHUP 远端挂断 12 SIGSYS 系统调用错误
2 SIGINT 键入DELETE 13 SIGPIPE PIPE只有写者无读者
3 SIGQUIT 键入QUIT 14 SIGALRM 报警信号
4 SIGILL 非法指令 15 SIGTERM 软件终止信号
5 SIGTRAP 断点或跟踪指令 16 SIGUSR1 用户定义
6 SIGIOT IOT指令 17 SIGUSR2 用户定义
7 SIGEMT EMT指令 18 SIGCLD 子进程消亡
8 SIGFPE 浮点溢出 19 SIGPWR 电源失效
9 SIGKILL 要求终止该进程 20 SIGWINCH 窗口变换
10 SIGBUS 总线超时 21 SIGURG 紧急的SOCKET条件
11 SIGSEGV 段违例 22 SIGPOLL I/O流事件信号
2. 能交换大量信息的通信
在AIX中,能交换大量信息的通信方式有以下四种:
管道通信(PIPE)
管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个进程为写进程,另一个进程为读进程。写进程通过写端(发送端)往管道文件中写入信息;读进程通过读端(接收端)从管道文件中读取信息。两个进程协调不断地进行写、读,便会构成双方通过管道传递信息的流水线。
利用系统调用PIPE()创建一个无名管道文件,通常称为无名管道或PIPE;利用系统调用MKNOD()创建一个有名管道文件,通常称为有名管道或FIFO。
PIPE是一种非永久性的管道通信机构,当它访问的进程全部终止时,它也将随之被撤消;它也不能用于不同族系的进程之间的通信。而FIFO是一种永久的管道通信机构,它可以弥补PIPE的不足。
管道文件被创建后,便可对它进行读写操作,通过系统调用WRITE()和READ()来实现。通信完毕后,可将管道文件关闭,用CLOSE()来实现。
消息通信(MESSAGE)
消息通信方式以消息缓冲区为中间介质,通信双方的发送和接收操作均以消息为单位。在存储器中,消息缓冲区被组织成队列,通常称之为消息队列。
创建消息队列用系统调用MSGGET()来实现,这一步工作也被称为消息队列的初始化。在进行通信时,消息队列的发送和接收分别用系统调用MSGSND()和MSGRCV()来实现。在需要改变队列的使用权限及其它一些特性时,用MSGCTL()来实现。
共享存储段通信(SHARED MEMORY)
共享存储段通信方式允许多个进程在外部通信协议或同步/互斥机制的支持下使用同一个内存段(作为中间介质)进行通信,它是一种最有效的数据通信方式。
在进行通信之前,先创建一个共享内存段。创建共享内存段用系统调用SHMGET()来实现。映射和分离操作分别用系统调用SHMAT()和SHMDT()来实现。在需要改变共享内存段的存取权限及其它一些特性时,用系统调用SHMCTL()来实现。
信号量(SEMAPHORE)
信号量通信方式是借助一组可共享的信号量(一般情况下为25个)来实现进程之间的通信。
初始化操作用系统调用SEMGET()来实现,其目的是建立一个需要的信号量组。对信号量进行增值、减值和测试等操作时,用系统调用SEMOP()来实现。在需要改变信号量集的存取权限及其它一些特性时,用系统调用SEMCTL()来实现。
小结:
上文介绍的AIX的进程通信机制,是AIX系统内部通信的基础。在AIX中,多个进程可协同工作,共同完成同一任务,这些进程之间需要共享数据和相互交换信息。AIX的进程之间通信的手段有多种,包括简单通信和大信息量通信等。
原文链接:http://www-900.ibm.com/cn/products/servers/pseries/tech/aix_com.shtml
|