进程间通信:
原因:进程之间具有独立性。
目的: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;唤醒等待队列上的所有进程。