首页 > 系统相关 >进程间通信的六种方式

进程间通信的六种方式

时间:2024-03-14 21:32:51浏览次数:14  
标签:信号量 AF 六种 通信 间通信 队列 进程

每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核

一、管道

匿名管道通过 fork() 系统调用创建的子进程与父进程之间的通信通道,另外还可以通过以下操作实现非父子进程之间的通信

cat xxx | wc -l

命名管道是一种特殊类型的文件,它允许进程之间进行通信。与匿名管道不同,命名管道在文件系统中有一个相关的路径名,因此允许不相关的进程通过该路径名进行通信

mkfifo my_pipe
echo "Hello, this is a message from the writer!" > my_pipe
cat < my_pipe

特点:

1. 一次性通信: 管道通常用于一次性的通信,一旦数据被读取,它们就会被丢弃。

2. 单向通信: 管道是单向的,不能直接支持双向通信,需要建立多个管道来实现双向通信。

二、消息队列

消息队列是一种进程间通信的方式,允许不同进程之间通过在共享的消息队列中发送和接收消息来进行通信。消息队列允许进程异步地进行通信,即发送方将消息放入队列后即可继续执行,而不需要等待接收方立即接收消息。

特点

1. 异步通信: 发送方和接收方可以以异步的方式进行通信,不需要即时的相互等待。

2. 消息队列不适合比较大数据的传输,因为在内核中每个消息体都有一个最大长度的限制

3. 消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销

三、共享内存

共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。

四、信号量

信号量是一种用于进程同步和互斥的机制,它允许多个进程之间通过对共享的信号量进行操作来实现对共享资源的访问控制。信号量通常用于解决多个进程竞争共享资源的并发访问问题,可以保证多个进程之间的数据一致性和正确性。

信号量通常具有两种操作:

1. P(等待)操作: 这个操作会将信号量减一,相减后信号量如果小于0,则表示资源已经被占用了,进程需要阻塞等待;如果大于等于0,则说明还有资源可用,进程可以正常执行。

2. V(释放)操作: 这个操作会将信号量加一,相加后信号量如果小于等于0,则表明当前有进程阻塞,于是会将该进程唤醒;如果大于0,则表示当前没有阻塞的进程。

信号量通常与其他进程间通信机制(如共享内存)结合使用,以实现对共享资源的互斥访问和同步操作。使用信号量可以避免进程之间竞争共享资源而导致的数据不一致或错误。

五、信号

信号通常由操作系统或进程内部的异常处理机制发送,可以用于处理如下事件:

1.外部事件: 例如用户按下Ctrl+C中断键,操作系统会向前台进程发送一个 SIGINT 信号,通知进程终止执行。

2.内部事件: 例如某个进程访问了非法内存地址,操作系统会向该进程发送一个 SIGSEGV 信号,通知进程出现了段错误。

3.其他进程的请求: 一个进程可以通过系统调用(如 kill 函数)向另一个进程发送信号。

六、Socket

前面提到的管道、消息队列、共享内存、信号量和信号都是在同一台主机上进行进程间通信,那要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。

实际上,Socket 通信不仅可以跨网络与不同主机的进程间通信,还可以在同主机上进程间通信。

根据创建 socket 类型的不同,通信的方式也就不同:

1. 实现 TCP 字节流通信: socket 类型是 AF_INET 和 SOCK_STREAM;
2. 实现 UDP 数据报通信:socket 类型是 AF_INET 和 SOCK_DGRAM;
3. 实现本地进程间通信: 「本地字节流 socket 」类型是 AF_LOCAL 和 SOCK_STREAM,「本地数据报 socket 」类型是 AF_LOCAL 和 SOCK_DGRAM。另外,AF_UNIX 和 AF_LOCAL 是等价的,所以 AF_UNIX 也属于本地 socket;

标签:信号量,AF,六种,通信,间通信,队列,进程
From: https://blog.csdn.net/weixin_52862995/article/details/136715190

相关文章

  • 3/14学习进程
    大二学期第三周日报 第一天第二天第三天第四天第五天所花时间(包括上课) 210min90min 150min 0min 代码量(行) 350 200 250 0 博客量(篇) 1 1 1 1 了解到的知识点编写安卓增删改查,使用sqlite存储数据 ......
  • 在Linux中,如何查看系统当前运行的进程以及它们的状态?
    在Linux中查看当前系统运行的进程以及它们的状态,可以使用多种命令工具,以下是一些常用的方法:ps命令:最基础的查看进程信息方式是使用ps命令。简单查看当前终端下的进程,可以输入:ps若想查看所有进程,包括其他终端下的进程,可以加上-e参数:ps-e若要查看详细的进程信......
  • Linux进程状态
    目录1.R运行状态(running)2.S睡眠状态(sleep)3.T或t状态(stopped或tracingstop)4.Z状态(zombie)(僵尸进程)1.R运行状态(running)并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。在CentOS7中,当查看进程状态时,可能会注意到很少看到进程处于状态为"R"(Ru......
  • 第二章操作系统进程与线程
    一、进程的概念组成特征    程序的概念:静态的,存放在磁盘内的可执行文件,一系列的指令集合        进程的概念:动态的,程序的执行过程    进程创建时,会被操作系统分配一个唯一的、不重复的编号                进程实体(进程映像)的组成......
  • Windows下一个普通权限的账户,怎么启动一个有管理员权限的进程
    我们知道,如果Windows下一个普通权限的账户,直接启动管理员权限的进程,会弹出输入管理员账号密码的提示窗。但是如果我想通过自启动一个管理员权限的进程怎么办呢,既然都自启动了,还要我输入账号密码就说不过去了。一开始尝试了任务计划程序中的“运行任务时,请使用下列用户账户”,赋值......
  • 基于k8s的Kubernetes进程管理
    鱼弦:公众号【红尘灯塔】,CSDN内容合伙人、CSDN新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)基于Kubernetes的Kubernetes进程管理1.简介基于Kubernetes的Kubernetes......
  • 揭秘操作系统内核:深入浅出进程阻塞与唤醒
    一、进程与线程        操作系统要运行一个可执行的程序,首先要将程序文件加载到内存,然后CPU去读取和执行这些指令,而一个进程就是“一次程序执行的过程”,内核会给每一个进程创建一个名为task_struct的数据结构,而内核也是一段程序,系统启动时就被加载到了内存中。  ......
  • 微前端qiankun框架子应用主和应用之间通信方法
    子应用主应用间如何通信qiankun官方提供了actions通信,qiankun内部使用initGlobalState(state)定义全局状态,该方法执行后返回一个MicroAppStateActions实例,实例中包含三个方法,分别是onGlobalStateChange、setGlobalState、offGlobalStateChange。MicroAppStateActionsonGlob......
  • 进程间通信的方式及原理
    进程间通信(Inter-ProcessCommunication,IPC)是指在多进程环境下,操作系统提供的一种机制,使得不同进程之间能够交换信息或同步它们的执行。由于每个进程都有自己的独立地址空间,并且操作系统为了保证进程的隔离性,一个进程无法直接访问另一个进程的数据,因此需要通过内核支持的特定......
  • 3/13学习进程
    大二学期第三周日报 第一天第二天第三天第四天第五天所花时间(包括上课) 210min90min 150min  代码量(行) 350 200 250  博客量(篇) 1 1 1  了解到的知识点编写安卓增删改查,使用sqlite存储数据 验收增删......