Solaris平台IPC及系统限制简介(一)

本文介绍Solaris平台上的进程间通信(IPC),包括PIPE、FIFO、System V IPC等机制的特点和系统限制。讨论了共享内存、消息队列、信号灯等的使用场景,并提供了调整系统参数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Solaris平台IPC及系统限制简介(一)



引言

IPC总览

PIPEFIFO

System V IPC

Shared memory特点及系统限制

Message queue特点及系统限制

Semaphore特点及系统限制

修改系统限制的方法

References

引言

IPC是系统高级编程经常涉及的内容。在Windows,Unix/Linux等各种平台上都有广泛的应用。本文简单介绍了Solaris平台上常用的几种IPC的特点,可调整的内核参数以及调整方法。旨在帮助那些在Unix特别是在Solaris平台上进行IPC开发或性能调优的技术人员更好的理解各种IPC的特点和各调优参数。本文不是开发手册,因此对各种方式的IPC如何使用并没有提供样例程序。如果您希望学习各种函数的使用方法,建议您求助于manpage或者《Programming Interfaces Guide》等其它资源。



IPC总览

IPC(即进程间通信)Inter Process Communication的简称。系统中的各种服务,用户程序在运行状态都可以看成为进程。一个应用程序执行后可以是一个进程、该进程可以由一个或多个线程组成,它们共享地址空间协同作业完成任务。比如我们常用的单线程、单进程运行的程序/usr/bin/bash。应用程序也可以由多个进程组成,每个进程也可以为多线程。比如常用数据库Oracle,它有多个进程组成。不同进程之间利用不同的IPC方式可以达到不同的目的。


常用的IPC主要分为基于System V内核机制产生的IPC和根据Posix标准实现的IPC。根据IPC出现的先后顺序结合功能差异,我们可以简单分类如下:

  • 交换数据

    • PIPE,Named PIPE(FIFO)

    • System V message queue

    • Posix message queue(基于标准1003.1b-1993)

    • RPC

  • 数据同步

    • System V shared memory,System V semaphore

    • Posix semaphore


或者,我们也可以根据功能的不同把IPC的各种方式分为以下四类:

  • 共享数据

    • shared memory

  • 交换数据

    • Pipe,FIFO,message queues

  • 同步对共享资源的访问

    • semaphore,mutex,lock

  • 远程过程调用

    • Sun RPC,Solaris Door


下面这张图则根据共享或者传递数据的数据本身存在位置把各种IPC方式进行分类。

















其中shared memory(共享内存)数据存在于用户空间,因此共享内存是最高效的IPC方式,因为不同进程直接在用户空间就可以直接访问;message queue(消息队列)及其数据存在于内核空间,进程存取数据开销相对大一些,得到的是从内核空间拷贝出来的数据。Posix标准的根据实现机制的不同,某些方式的IPC共享的数据存在于文件系统中,不同进程需要将磁盘上的文件映射至各自的地址空间进行数据交换,对文件系统的访问无疑使这种IPC方式的效率相对低一些。


各种IPC对象的生命周期也不一样,PIPE(管道)、FIFO(命名管道)在进程中止时系统会清空其中所有数据;System V shared memory(共享内存),message queue(消息队列)和semaphore(信号灯)在系统下次启动时才会被清空;而与文件系统关联的IPC对象除非主动删除,否则不会消失。


PIPEFIFO

1.PIPE

这是一种最古老的进程间通信方式。顾名思义,数据从管道一端进入另一端读出。管道存在于系统的内核空间。

API

int pipe(int fd[2]);

fd[0]为读端,从管道中读取数据; fd[1]为写端,向管道写入数据。

特点

  • 半双工,数据流向不能改变,读端写端不能交换

    原子操作,数据一次性写入/读出

    只能用于共同祖先的进程间

PIPE最常见的应用是shell,比如ls|grep *.txt


2.FIFO

命名管道的出现使不同祖先的进程只需要通过名字就可以使用管道进行通信。目前UnixFIFO还不能像Windows系统那样通过FIFO使不同机器上的进程之间通信。

API

int mkfifo(const char *pathname,mode_t mode);

fopen打开,fclose关闭。

特点

  • 半双工,数据不能同时在命名管道中双向流动

    原子操作

    如果读端突然在读写中被关闭将产生一个SIGPIPE信号


API可以看出这两者都与文件句柄相关,因此操作系统对进程打开句柄的限制会影响它们。在Solaris系统中,/usr/include/limits.h中定义的两个宏定义限制了文件句柄的使用。


  • OPEN_MAX 一个进程可以打开的最大句柄数。

  • PIPE_BUF 一次性写入FIFO的最大字节数。

系统的限制可以通过命令 /usr/bin/limit进行观察,只有OPEN_MAX可以修改。














还有一些命令也可以观察。比如命令行

$ /usr/bin/getconf OPEN_MAX





通过其他shell也可以观察。

C shell:,/usr/bin/csh 可以使用limit

sh-/usr/bin/sh

Bash-/bin/bash

Ksh -/usr/bin/ksh这三种均可以使用unlimit

System V IPC

System V内核采用的IPC机制主要有三种:

  • shared memory

  • message queues

  • semaphore

API




shared memory(共享内存)

如前所述,共享内存是速度最快,效率最高的IPC方式。它使得同一物理内存页(RAM)可以被多个进程同时访问。共享内存的模块本身也是有内核动态加载的。实际上,共享内存的实现方式并不是真的把一块内存同时放到两个进程的地址空间中去,而是通过各进程把同一块物理内存映射到自己的地址空间的方式使这块内存看起来好像同时为两个进程所用。

系统限制

  • 内核空间可用内存

    用户建立shared memory后,内核为管理每块共享内存会为它们各新建一个数据结构shmid_ds。这块数据结构在内核中分配,因此建立的共享内存个数越多,内核空间的内存就被使用的越多。

  • 交换空间(Swap Space)大小

    内存的使用涉及到很多方面。共享内存可以设置为ISM方式长期驻留在内存中而把其他进程交换到交换空间中去,因此交换空间的大小或多或少也影响了共享内存的使用。


  • 系统的可调整参数

    Solaris9及以前采用修改/etc/system的方式调整内核参数。 这种方式需要重新启动机器才能使修改生效,在Solaris10中没有废除这种做法,而是同时提供给您动态设置参数的方法修改系统的限制,不需要重新启动OS就可以使这些参数有效。

    通过/usr/bin/prctl修改task/project/process相关的系统限制。




  • Usage:-i process <PID> -n <resource name>

    通过rctladm控制系统范围内资源使用超出系统限制范围时的行为。








这个例子中

project.max-shm-memory 系统参数名称

syslog=off 当资源使用超出系统默认值时没有警告信息记入syslog

no-basic 只有通过setuid等方式使该用户具有root相当的权限才能修改资源管理权限。

deny 表示当资源使用超出系统默认值时系统拒绝。

bytes 为内存资源分配的单位。


下表是目前Solaris10系统可调节参数,以及废掉不再利用的一些在Solaris9上有效的参数。















也就说,从Solaris10开始与共享内存相关的可调整内核参数有只有2个:

project.max-shm-ids project 一个project可建立最多共享内存数

project.max-shm-memory project 一个project使用的共享内存可占用系统内存数

简单说明一下,projectSolaris Resource Management(资源管理)其中的概念和单位,可以简单理解为与一个用户相关的一组应用的进程。比如OracleSolaris10上进行安装的时候,就以project为单位针对OracleOracle用户分配所有与之相关的资源。比如《在Solaris10中为Oracle配置系统资源》,您可以进一步了解关于project建立的命令。



message queue(消息队列)




上面这张图表明了消息队列在内核空间的结构。水平方向是message queue头节点。垂直方向是一个个消息队列。队列中的每个消息通过指针和队列中的其他消息连接起来。消息占用的内存从系统中提前分配好的消息内存池中获取,所有的消息队列中的数据最后经过映射从内核空间到达用户空间并为各进程所用。

系统限制

Solaris10中与消息队列相关的参数主要包括3

process.max-msg-messages 进程使用的消息队列上最多消息数

process.max-msg-qbytes 进程使用的消息队列的消息的最大字节数

project.max-msg-ids 一个project允许建立的消息队列数

Semaphore(信号灯)

信号灯的功能易于理解,即为了同步对共享资源的访问而存在的一种进程间通信机制。它本身不在进程间交换数据,而是控制不同进程访问同一资源。

系统限制

与其他两种IPC方式类似,信号灯相关的系统参数有:

process.max-sem-ops 每个进程中调用semop(2) 需要执行的最大操作数

process.max-sem-nsems 各信号灯集中最大信号灯数量

project.max-sem-ids 一个project可以建立的信号灯集个数

修改系统限制的方法

    1. Usage:prctl -n <recource name> -v <value> -r -i process <PID>


      For example:#prctl -n project.max-shm-ids -v 100 -r -i process $$


如果您对project/task/processSolaris Resource Management概念不清楚,建议您参考manpage或者相关文档。


References

Solaris Internalcore kernel component

Unix Network Programming, Volume II

Solaris Tunable Parameters Reference Manual

Solaris Dynamic Tracing Guide

Solaris Modular Debugger Guide

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值