多进程多线程简单说明,System V IPC 简介(本机IPC)【linux】(zz)

会有一股神秘感。 提交于 2020-03-08 10:04:16

多进程多线程简单说明

涉及管道通信的多进程和多线程说明

在使用有名管道实现双向通信时,由于读管道是阻塞读的,为了不让“读操作”阻塞“写操作”,使用了父子进
程来多线操作,
1)父进程这条线:读管道1
2)子进程这条线:写管道2

实际上我们后面在线程以后,凡是涉及到多线操作的,基本都使用多线程来实现,比如
1)主线程:读管道1
2)次线程:写管道2
我们这里通过进程间通信的管道方法实现,还会有线程实现的博客说明。
也就是说上面的管道通信,我们完全可以把父进程改为主线程,把子进程改为次线程

对比多进程和多线程各自使用的场合

线程和进程都是并发运行的,但是线程和进程各自的使用的场合有所不同。

线程

凡是涉及多线时,我们使用线程来并发实现,比如我们上面实现的“有名管道”双向通信的例子,这个多线操作理论上就应该使用多线程来实现。
因为多线使用线程更省计算机cpu和内存的开销。

也就是说创建出并发运行次线程的目的,是为了多线操作。

进程

一个简单的判断标准就是,如果你发现你的程序必须要去运行一个新程序时,此时必须涉及到多进程,因为此时如果你不创建一个子进程,你是没有办法来执行新程序的。

新创建的子进程和父进程肯定是并发运行的,只不过这里并发运行的主要目的并不是为了多线操作,而是为了单独的去执行新程序,执行新程序时,我们只能使用多进程来操作,没有办法使用多线程来操作的,因为线程是不可能去执行一个新程序的。

更直接的说线程只是进程里面的一个函数,并不是一个新程序
也就是说创建一个并发执行的子进程的目的,是为了执行一个全新的程序。

System V IPC(本机IPC)

有关System V IPC

无名管道和有名管道,都是UNIX系统早期提供的比较原始的一种进程间通信(IPC)方式,
早到Unix系统设计之初就有了。
后来Unix系统升级到第5版本时,又提供了三种新的IPC通信方式,分别是:
· 消息队列
· 信号量
· 共享内存

System V就是系统第5版本的意思,后来的Linux也继承了unix的这三个通信方式,Unix是非常早期的而且非常优秀OS,所以其它os也借鉴了这三种的System V IPC。

System V IPC的特点

管道(原始IPC)

管道的本质就是一段缓存,不过Linux OS内核是以文件的形式来管理的,所以我们操作管道时,不管是无名管道,还是有名管道,我们都是使用文件描述符以文件的形式来操作的。

所以我们操作管道时,除了pipe和mkfifo这两个函数外,其它的像read、write、open都是我们文件io函数,所以其实在学习管道时,会觉得比较容易。

System V IPC

System V IPC与管道有所不同,它完全使用了不同的实现机制,与文件没任何的关系,也就是说内核不再以文件的形式来管理System V IPC,所以不能再使用文件的方式来操作。
对于System V IPC,OS内核提供了全新的API。

使用System V IPC时,不存在亲缘进程的说法

任何进程之间通信时,都可以使用System V IPC来通信。

System V IPC标识符

我们前面说过,System V IPC不再以文件的形式存在,因此没有文件描述符这个东西,但是它有类似的“标识符”。

你完全可以认为这个“标识符”就是文件描述符的替代者,但是它是专门给System V IPC使用的,所以我们不能使用文件IO函数来操作“标识符”,只能使用System V IPC的特有API才能操作。

怎么才能得到这个“标识符”

调用某API创建好某个“通信结构”以后,API就会返回一个唯一的“标识符”。
比如创建好了一个“消息队列”后,创建的API就会返回一个唯一标识消息队列的“标识符”。

System V IPC标识符的作用?

比如,如果创建的是消息队列的话,进程通过消息队列唯一的标识符,就能找到创建好的“消息队列”,使用这个消息队列,进程就能读写数据,然后实现进程间通信。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!