linux共享内存信号量
‘壹’ linux系统编程学习笔记——进程间的同步:信号量、互斥锁、信号
Linux系统编程学习笔记——进程间的同步:信号量、互斥锁、信号信号量: 用途:用于同步进程或线程间的动作。 内核维护:一个整数,其值限制为大于等于0。 操作:可执行增减值操作,这些操作可能导致进程阻塞。 类型: 未命名信号量:位于内存共享区域,通过sem_post唤醒阻塞进程,sem_wait阻塞当前进程。若用于进程间,需置于共享内存上,使用mmap函数映射。 命名信号量:拥有唯一名字,通过sem_open函数创建并访问,可用于进程间通过名字共享信号量实现同步。 注意事项:信号量的初始值会影响进程的执行流程。
互斥锁: 用途:用于任务间的同步。 功能:确保共享资源在访问时只有一个线程执行,侧重于加锁和解锁状态。 应用:主要应用于线程之间,通过互斥锁实现共享资源的访问控制,避免并发修改问题。
信号: 用途:事件通知机制,内核、其他进程或自身可向进程发送信号。 处理:接收信号后,进程可选择忽略、挂起或在特定信号处理函数后恢复执行。 应用: 通过kill命令向进程发送信号,影响进程的执行流程。 创建父子进程时,子进程可以定期打印信息,父进程可以延迟后杀死子进程,或通过指定信号处理函数实现更复杂的进程间交互。 信号处理函数用于响应特定信号,如中断或异常情况处理。
以上是对Linux系统编程中进程间同步的三种机制——信号量、互斥锁和信号的简要总结。
‘贰’ 濡备綍鍦↙inux涓阃氲繃semget鍜宻emctl鍑芥暟鍒嗛厤骞堕喷鏀句俊鍙烽噺锛
Linux 绯荤粺涓锛屼俊鍙烽噺镄勭$悊阃氲繃 semget 鍜 semctl 杩欎袱涓绯荤粺璋幂敤𨱒ュ畬鎴愶纴瀹冧滑镄勪綔鐢ㄧ被浼间簬 shmget 鍜 shmctl 瀵瑰叡浜鍐呭瓨镄勫勭悊銆傝佷娇鐢ㄤ俊鍙烽噺锛屼綘闇瑕侀栧厛璋幂敤 semget 鍑芥暟锛屼紶鍏ュ弬鏁板寘𨰾淇″彿閲忕粍镄勯敭鍊笺佷俊鍙烽噺镄勬暟閲忎互鍙婃潈闄愭爣璇嗐傞敭鍊肩敤浜庡敮涓镙囱瘑淇″彿閲忕粍锛屽嵆浣胯繘绋嬮鍑猴纴淇″彿閲忎篃浼氩湪绯荤粺涓鎸佷箙瀛桦湪銆傝幏鍙栧凡瀛桦湪镄勪俊鍙烽噺镞讹纴鍙浠ヤ紶鍏0浣滀负缁勫归噺銆
淇″彿閲忕殑鐢熷懡锻ㄦ湡闇瑕佹坠锷ㄧ$悊锛屽綋链钖庝竴涓浣跨敤淇″彿閲忕殑杩涚▼阃鍑烘椂锛岄渶瑕佽皟鐢 semctl 鍑芥暟𨱒ュ垹闄や俊鍙烽噺缁勚傝繖涓鍑芥暟闇瑕佸洓涓鍙傛暟锛氢俊鍙烽噺缁勬爣璇嗙︺佽佹搷浣灭殑淇″彿閲忕紪鍙凤纸鍦ㄨ繖涓渚嫔瓙涓鏄1锛夈佸父閲 IPC_RMID 鍜屼竴涓 union semun 绫诲瀷镄勭粨鏋勪綋锛埚疄闄呮搷浣滀腑蹇界暐锛夈傚垹闄ゆ搷浣滆佹眰璋幂敤钥呬笌淇″彿閲忕粍鍒涘缓钥呮潈闄愮浉钖岋纴鎴栬呮嫢链 root 𨱒冮檺銆备笌 shmget 涓嶅悓锛屽垹闄や俊鍙烽噺缁勪细绔嫔嵆閲婃斁绯荤粺璧勬簮銆
鍦ㄤ唬镰佸眰闱锛屽备唬镰 5.2锛坰em_all_deall.c锛夋墍绀猴纴链変袱涓鍏抽敭鍑芥暟锛氢竴涓鐢ㄤ簬鍒嗛厤浜屽厓淇″彿閲忥纸binary_semaphore_allocation锛夛纴阃氲繃 semget 鍑芥暟銮峰彇鎴栧垱寤猴绂鍙︿竴涓鐢ㄤ簬閲婃斁浜屽厓淇″彿閲忥纸binary_semaphore_deallocate锛夛纴浣跨敤 semctl 鍑芥暟杩涜屽垹闄ゆ搷浣滐纴纭淇濊祫婧愮殑姝g‘閲婃斁銆
鍒嗛厤浜屽厓淇″彿閲忥细 int binary_semaphore_allocation (key_t key, int sem_flags)锛岃繑锲 semget 镄勭粨鏋滐纴濡傛灉闇瑕佸垯鍒涘缓淇″彿閲忋
閲婃斁浜屽厓淇″彿閲忥细 int binary_semaphore_deallocate (int semid)锛岃皟鐢 semctl 鍑芥暟鍒犻櫎淇″彿閲忥纴鍙傛暟鍖呮嫭淇″彿閲忕粍镙囱瘑绗﹀拰甯搁噺 IPC_RMID銆
镓╁𪾢璧勬枡
Linux 鎻愪緵镄勫悇绉岖郴缁熻皟鐢ㄦ潵瀹炵幇涓涓鍏锋湁涓ょ岖姸镐佺殑淇″彿閲忥纸binary semaphore锛夈
‘叁’ linux共享内存使用的过程
Linux共享内存使用的过程?
一、什么是共享内存
顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。
二、共享内存的使用
与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件 sys/shm.h中。
1、shmget函数
该函数用来创建共享内存,它的原型为:
int shmget(key_t key, size_t size, int shmflg);
第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.
不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符(shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。
第二个参数,size以字节为单位指定需要共享的内存容量
第三个参数,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存。
‘肆’ linux查看共享内存命令
共享内存查看
使用ipcs命令,不加如何参数时,会把共享内存、信号量、消息队列的信息都打印出来,如果只想显示共享内存信息,使用如下命令:
[root@localhost ~]# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1867776 root 600 393216 2 dest
0x00000000 1900545 root 600 393216 2 dest
0x00030021 1703938 zc 666 131104 1
0x0003802e 1736707 zc 666 131104 1
0x00030004 1769476 zc 666 131104 1
0x00038002 1802245 zc 666 131104 1
0x00000000 1933318 root 600 393216 2 dest
0x00000000 1966087 root 600 393216 2 dest
0x00000000 1998856 root 600 393216 2 dest
0x00000000 2031625 root 600 393216 2 dest
0x00000000 2064394 root 600 393216 2 dest
0x0014350c 2261003 cs 666 33554432 2
0x00000000 2129932 root 600 393216 2 dest
0x00000000 2162701 root 600 393216 2 dest
0x00143511 395837454 root 666 1048576 1
其中:
第一列就是共享内存的key;
第二列是共享内存的编号shmid;
第三列就是创建的用户owner;
第四列就是权限perms;
第五列为创建的大小bytes;
第六列为连接到共享内存的进程数nattach;
第七列是共享内存的状态status。其中显示“dest”表示共享内存段已经被删除,但是还有用户在使用它,当该段内存的mode字段设置为SHM_DEST时就会显示“dest”。当用户调用shmctl的IPC_RMID时,内存先查看多少个进程与这个内存关联着,如果关联数为0,就会销毁这段共享内存,否者设置这段内存的mod的mode位为SHM_DEST,如果所有进程都不用则删除这段共享内存。