进程间通信

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bkf136114378/article/details/98989683

进程间通信: 

   原因:进程之间具有独立性。

   目的:1.数据传输:一个进程需要将它的数据发送给另一个进程。

             2.资源共享:多个进程之间共享同样的资源。

             3.通知事件:一个继承需要向另一个或一组进程发送消息,通知他们发生了某种事件。

             4.进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

 

     共享内存:主要用于进程间的数据共享。

 

程序运行后加载的东西都在共享区。

     原理:申请一块物理内存,将这块物理内存映射到进程的虚拟地址空间中;接下来进程通过虚拟地址访问这块物理内存,多个进程映射同一块物理内存就可以通过这块内存实现数据共享。

流程:

int shmget(key_t key, size_t size, int shmflg)

key:共享内存在操作系统中的标识符

size:共享内存大小

shmflag:

     IPC_CREAT 共享内存若存在则打开,否则创建。

     IPC_EXCL:与IPC_CREAT同时使用时,若共享内存存在则报错返回。

   mode:权限。

返回:正整数--共享内存的操作句柄。    

 

1.创建共享内存 shmget

 

void *shmat(int shmid, const void *shmaddr, int shmflg);

shmid:创建共享内存返回的操作句柄。

shmaddr:映射首地址通常置空

shmflg:SHM_RDONLY--映射之后,共享内存只读;通常置0--可读可写。

返回值:映射首地址。失败:(void*)-1;

2.将共享内存映射到虚拟地址空间shmat

 

memcpy/strcpy

3.直接通过虚拟地址进行内存

4.解除映射关系 shmat

 

5.删除共享内存 shmctl

共享内存的删除流程:共享内存在删除的时候,首先会判断当前映射链接数是否为0;若为0则直接删除;否则表示现在还有其他进程正在使用,则贡献内存不能被立即删除,但是会拒绝后续进程的映射链接,等待映射链接数为0时删除这块共享内存。

特性:进程间通信最快的方式--直接通过虚拟地址操作数据,相较于其他方式少了两步用户态与数据态之间的数据拷贝操作。

 

消息队列:用于多个进程间有类型的数据块的传输。

原理:内核中的一个优先级队列。

 

信号量:用于实现进程间的同步与互斥操作

    同步:保证多个进程之间对临界资源访问的时序合理性。

    互斥:保证多个进程之间同一时间对临界资源访问的唯一性。

本质:内核中的一个计数器 + 等待队列     等待 + 唤醒功能

原理:

     进程对临界资源访问前先进行资源计数判断

           若计数>0;表示可以操作;则计数-1;判断操作直接返回

           若计数<=0;表示不可操作;将进程pcb状态修改为阻塞状态;将pcb加入到等待队列中。

           其他进程创建一个资源;计数+1;唤醒等待队列上的所有进程。

 

 

   

 

展开阅读全文

没有更多推荐了,返回首页