共享内存(shared memory) 共享内存是一段可以被多个进程共享的内存段。首先,用shmget系统调用产生指定大小的共享内存段,然后需要访问此共享内存的进程调用shmat系统调用,把这个内存段附加到自己的地址空间,然后就可以像访问自己私有的内存一样访问这个内存段了。等到访问完毕,用shmdt脱离。同message queue一样,共享内存一旦产生,除非明确的删除(某个有权限的进程或者用ipcrm命令)或者系统重启。否则,产生的共享内存会一直保留在系统中。而且,只要有权限,就可以对共享内存进行操作。共享内存的内容由进程自己定义。为了防止多个进程在同一时间写同样一段共享内存,一般程序会使用信号量来控制对某一段地址的读写。 ipcs –am命令可以查看share memory的状况:
Shared Memory: T ID KEY MODE OWNER GROUP CREATOR CGROUP NATTCH SEGSZ CPID LPID ATIME DTIME CTIME m 258 0 --rw-r----- oracle dba oracle dba 12 8388608 106303 106329 16:28:54 16:48:36 16:28:49
T: 类型 m 表明这是个共享内存 ID: 用户自己定义的,在调用shmget时传送的参数。
Key: 系统返还的全局唯一的ID。
Mode: 权限,含义和文件权限基本一致
Owner, group: 队列建立者的名字和组
CREATOR, CGROUP:队列建立者和组的ID
NATTCH: 有几个进程挂接(attach)在这段共享内存上
SEGSZ: 共享内存段大小(字节)
CPID: 产生者PID LPID: 最后挂接(attach)或者脱离(detach)者PID
ATIME: 最后挂接(attach)时间
DTIME: 最后脱离(detach)时间。.
CTIME: 建立或者最后修改的时间
信号量(semaphore) 在操作系统中,有些资源数量是有限的,在同一时间,只能由有限(一个或几个)的进程使用和访问。例如磁带机,同一时间,只能由一个进程使用。这样的资源被称为关键(critical)资源。信号量就是用来记录关键资源的使用情况的。首先,利用系统调用semget产生一个信号量。当需要使用关键资源时,调用semop,传递的参数为需要使用的资源的数量,例如2个,参数就为+2。如果这个资源有2个或者更多可用,进程就获得了使用权,否则就必须等待,直到有足够的资源可用。当进程使用资源结束的时候,也用semop释放关键资源。参数为需要释放的数量,例如2,参数为-2。同message queue一样,共信号量一旦产生,除非明确的删除(某个有权限的进程或者用ipcrm命令)或者系统重启。否则,信号量会一直保留在系统中。而且,只要有权限,就可以对其进行操作。 ipcs –as命令可以查看Semaphore的状况: Semaphores: T ID KEY MODE OWNER GROUP CREATOR CGROUP NSEMS OTIME CTIME s 0 0x696e6974 --ra-r--r-- root system root system 8 9:52:53 9:59:30
T: 类型 s 表明这是个信号量
ID: 用户自己定义的,在调用semget时传送的参数。
Key: 系统返还的全局唯一的ID。
Mode: 权限,含义和文件权限基本一致 Owner, group: 队列建立者的名字和组 CREATOR, CGROUP:队列建立者和组的ID NSEMS: 本信号量上信号的数量。
OTIME: 最后一次操作(semop)的时间
CTIM: 建立或者最后修改的时间