感谢支持
我们一直在努力

Linux 操作系统 – Advanced of 进程

由于进程都有自己的私有地址空间,只能由自己来访问,那就意味着其它进程不能访问这个进程的地址空间,下文将用通俗的话和图解细说进程间是怎么通信的。


共享内存


共享内存是linux IPC通信最快的,基本原理是:多个进程共享一个物理内存(物理内存映射到共享此内存的进程地址空间)(公共的),看下图:


Linux 操作系统 - Advanced of 进程 (IPC-共享内存)


一个进程向共享内存中写入数据,共享这块内存的进程可以立即看到,在共享的时候 数据是一直保存在共享内存中的,并没有写入数据就会把数据写入文件, 这里就是mmap()这个函数干的事了


Linux 操作系统 - Advanced of 进程 (IPC-共享内存)


对共享内存的访问的数据称为临界区,临界区也就意味着任何时候只有一个进程访问临界区,


Linux 操作系统 - Advanced of 进程 (IPC-共享内存)


A先T1时间进入临界区,然后B想进入的时候,被互斥在外,等A在T2离开的时候B顺利进入!

Linux下使用ipcs -a来查询当前系统的IPC对象信息


  1. [www.linuxidc.com@localhost ~]$ ipcs -a  
  2.   
  3. —— Shared Memory Segments ——–  
  4. key        shmid      owner      perms      bytes      nattch     status        
  5. 0x00000000 65536      crazybaby  600        393216     2          dest           
  6. 0x00000000 98305      crazybaby  600        393216     2          dest           
  7. 0x00000000 131074     crazybaby  600        393216     2          dest           
  8. 0x00000000 163843     crazybaby  600        393216     2          dest           
  9. 0x00000000 196612     crazybaby  600        393216     2          dest           
  10. 0x00000000 229381     crazybaby  600        393216     2          dest           
  11. 0x00000000 262150     crazybaby  600        393216     2          dest           
  12. 0x00000000 294919     crazybaby  600        393216     2          dest           
  13. 0x00000000 327688     crazybaby  600        393216     2          dest           
  14. 0x00000000 360457     crazybaby  600        393216     2          dest           
  15. 0x00000000 393226     crazybaby  600        393216     2          dest           
  16.   
  17. —— Semaphore Arrays ——–  
  18. key        semid      owner      perms      nsems       
  19.   
  20. —— Message Queues ——–  
  21. key        msqid      owner      perms      used-bytes   messages    
从上到下分别为 共享内存, 信号量, 消息队列.我这里 信号量和消息队列都是空的. 


shmid 为 IPC对象标识符 ,不同类型的IPC对象标识符可以相同,但在同类型中IPC中唯一的. 


key 为IPC对象关键字, 这个关键字你可以理解为文件的名称,而标识符理解为文件的i节点,在IPC中可以通过key找到对应的标识符,再通过标识符访问IPC对象


管道


管道是一个先进先出的队列,一个进程写,一个进程读,管道也可以理解为共享文件,,向管道的输入写进程,以字符流形式将大量数据送入管道,而接受管道输出的接受进程,则从管道中读取数据.


操作linux的童鞋,经常有这样的操作.


  1. Ps –ef | grep XXXX  


这个就是一个进程间通信(管道)的例子, 首先ps –ef 取出当前运行的所有进程,进程 grep XXXX 从所有进程中筛选出 XXXX 的进程,看下图:


 


管道分为命名管道(FIFO)和匿名管道,只有父子关系的进程才可以共享匿名管道,不相关的进程只能共享命名管道.,也可以这么去理解 在目录文件中记载了文件和i节点对应关系是命名管道,没有的是无名管道.


Linux c下提供一些创建管道的函数.


无名管道:


  1. int pipe(int fields[2]);  


有名管道创建需要使用mknode和 mkfifo 进行创建


 


消息队列


消息是一个有类型的文本,参与消息传递的进程提供snd 和 rcv 系统调用, 消息发送者指定发送的消息类型,类型在后面会被接收者作为选择的依据.所以,接收者可以按先进先出的顺序接受信息,还可以按类型来接受,当进程准备给一个满队列发送消息时,它会被阻塞,当进程试图从一个空队列读取时也会被阻塞, 另外多个进程可以同时向一个消息队列发送消息,也可以向同一个消息队列接受消息.消息队列主要是用于不同进程之间少量数据的顺序共享.


 





信号量


OS提供两个操作P和V, 进程申请临界资源时发出P操作,进程释放临界资源时发出V操作,


申请: 若信号量取值 > 0,则分配临界资源,,信号量值 – 1,否则进程阻塞直到有资源.


释放: 信号量的值 + 1


信号量作用:用于临界资源的读写控制和并发进程的同步和互斥控制


上面这张图就表明了Semaphore 的同步两个进程的作用.




这张图就起了互斥作用 对iphone的使用(临界区).其他人只能等待,等待GF使用完 我才能用. -: )

赞(0) 打赏
转载请注明出处:服务器评测 » Linux 操作系统 – Advanced of 进程
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏