IPC 进程间通信

IPC

InterProcess Communication

The concept of IPC

Each process has a differnt user addess space,and local variables 各自看不见,so 进程间通信 need kernel(内核), so a buffer is opened in the kernel,process 1 copies data from user space to this buffer,and process 2 reads the data from the kernel buffer,this mechanism 机制 calls IPC,InterProcess Communication
在这里插入图片描述

7 ways of IPC

Pipe

也叫做匿名管道

管道,traditional Unix communication mechanism

  • The pipes are half-duplex 半双工,data can only flow in one direction,when two sides need to communicate,we should create 2 pipes
  • this way can only use between parente-child(父子) or sibling(兄弟) processes(具有血缘关系的进程)
  • 管道单独构成一个独立的文件系统,对于管道两头来说,它可以看作是一个文件系统,专门来传输东西的,并且pipes only exists in memory
  • 数据的读写,we know, pipes are flow in one direction,so a process writes to the pipeline, and the other process reads from the other sides,one wirtes,one read,in one direction

管道的实质

  • The essence of a pipeline is kernel buffer,一个内核缓冲区,进程是先入先出来存数据进去,管道一端顺序写入,other side,顺序read
  • The buffer can be seen as a circular queue,the read and write positions are automatically grown,after reading it,it no longer exists in buffer.
  • when a buffer is empty or full,there are some rules to controll the relevant read process or write process,当有新数据写入,or 旧数据读出,就会唤醒在waiting queue里边的process

LImitations of the pipeline

管道的主要的局限性正在于它的特点上

  • only one-way data streams are supported
  • only use between process that are related to each other 为什么只能用于亲缘关系啊?
  • no name 为什么没有名字属于是局限性呢?
  • The buffor of the pipeline is limited,the buffer exists in the memory, so it’s limited
  • The pipeline transmit an unformatted byte stream,无格式字节流,也就是说,管道的输入输出,必须在读写之前规定好数据的格式

这里需要知道的是,为什么说没名字,就只能用于有亲缘关系的进程呢,因为,如果没名字的化,we get two processes, process 1 have pipes, but process 2 don’t know the address of the kernel buffer,so process 2 can’t communicate with process 1. 像父子进程啊,一般都是子process 会copy all parent resouces,including the file decriptor,文件描述符,so they use same pipeline;

Named Pipeline

有名管道 FIFO,就是因为匿名管道,只用于亲缘关系之间,to overcome it,the Named Pipeline was proposed.提出

两者不同之处 在于 named pipeline provides a pathname 与之关联,以有名管道的形式存在于file system中,so two processes 没亲缘关系,也可以互相通信,他们只要访问这个路径就ok了,named pipeline exist in file system,the content exists in the memory

Summary

  • 管道是特殊的文件,并且满足在先入先出的原则进行读写,但是不能进行定位读写
  • 匿名管道是单向的,只能在亲缘关系的process之间通信,有名管道不用,都可以通信
  • 无名管道的blocking 问题,读写的时候,需要确认对方存在,不存在, exit,当前线程向无名管道writre data,必须other sides 有process,不然exit,写入的data,超过max data,blocking. 没数据,blocking. If the pipe lines finds the other 断开, 自动exit
  • 有名管道的blocking 问题,named pipelines must confirm 对方存在,否则blocking,也就是说,当我们读管道的时候,必须在此之前,有一个process 在写管道,否则blocking 此外,我们通过读写模式(O_RDWR)打开有名管道,也就是当前进程读,当前进程写,不会block

Signal

信号

  • Signaling is a mechanism(机制) usedi in Linux to communicate or maniplulate(操作) between processes,signals 任何时候都能发给某个process,and 不用知道它的状态如何
  • If the process is not currently executing, the kernel will save the signal until the process reples to execution and passes it on. 没执行的化,信号会被保存起来,然后等他恢复之后,再传回来
  • If the process is blocking,信号就延迟传递,until its blocking canceled ,然后再发给他.

Common singals in LInux.

(1) SIGHUP: 用户从终端logs out,all 启动的process 都收到
(2) SIGINT: 程序终止信号,while the program is running , press CTRL + C key will传递改sigal
(3) SIGQUIT: 程序退出,运行的时候,按 CTRL + \
etc

信号来源

信号是再软件上对终端机制的一种模拟,是一种asynchronous通信方式,signal can 直接在user space 和 kernel space直接进行交互,kernel can use the signal to inform the user space process of which system events have occured,and there are 2 main sources of signal events

  • 硬件来源: 用户press Ctrl + C,or hardware exception
  • 软件终止,终止进程信号,其他进程调用kill 函数,软件异常发出信号

信号的lifecycle and 处理流程

  • The signal is generated by a certain process, and 设置传递对象,然后传给OS
  • OS 通过接收process的设置选择性的发送给接收者,这个设置就是是否阻塞,也就是说,如果接收者对该信号是阻塞的,then OS will save this signal,不传递,until 它解除了对这个signal的block,If 接收者没blocking,那么OS will pass the signal
  • 目标进程,接收到之后,会根据当前线程对此信号设置的预处理方式,暂时终止当前代码执行,save context(主要包括 临时寄存器的data,当前program的position,以及cpu的status),然后去执行中断服务程序,执行完之后,回到中断位置.

Message Queue

消息队列

  • Message Queue is a linked list of messages stored in the kernel,每个Message Queue 用消息队列标识符表示
  • 消息队列存在于内核中,只有说内核重启或者显示的删除消息队列,才会删除消息队列
  • 和管道不同的是,消息队列在某个进程在写如消息的时候,不需要另外一个线程在那等,也就是说,消息队列是异步的

Summary of message queue features:

  • Message queue is a linked list ,有special format,stored in the memory,通过message queue标识符标识
  • allow multiple process to read or write
  • pipeline and message queue are on a first in first out basics
  • message queue可以实现message random 读取,message不一定是顺序读取,可以按照消息的type,进行分类读取,更有优势
  • The message queue overcomes the shortcomings of the signal carryin the small amout of information and the pipeline can only carry unformatted words,and the limits size of the buffer
  • Now,2 main type of message queue,POSIX message queues and System V message queues,System V message queues are widely used. Sysrtem V 生命周期和kernel 是一样的,只有说kernel重启,或者人工删除queues才会被删除

Share Memory

共享内存

  • Share memory allows multiple processes to read and write to the same memory space,是最快的IPC形式,就是为了针对其他IPC效率低设计的
  • 为了多个进程之间交换信息,kernel 专门流出一块内存区,可以由需要访问的进程将它映射到自己的私有地址space,process 可以直接写这一块区域,并且不用进行copy,从而大大提高效率
  • 因为是share momory,必须depend on a certain synchronization machanism ,like semaphores 信号量,来达到互斥

Semaphore

信号量是一个计数器,为了多进程对share data 的访问,就是进程间的同步

为了获取共享资源,需要干以下的事

  • create a semaphore,要求调用者specify an initial value,usually 1 or 0,对于2值信号量来说
  • wait for a semaphore,该操作会测试信号量的值,if < 0,block,也就是 P操作
  • 挂出一个信号量,该操作,会 将信号量 + 1,也叫做V操作

为了实现semaphore correctly,信号量的测试 + 减一 should be an atomic operation,so 信号量一般在kernel中实现
linux环境中,有三种类型,
Posix 可移植性操作系统接口,有名信号量
Posix 基于内存的信号量
System V信号量

信号量和普通整形变量的区别

  • 信号量事非负整型,除了初始化之后,它只能通过两个atomic operation, wait and singal来进行访问
  • 操作也叫做PV原语,对普通变量来说,什么语句块都能访问

互斥量和信号量之间的区别

互斥量会为了thread之间的互斥,信号量用于线程的同步,他们两的区别就是互斥和同步的区别

  • 互斥,也就是对于某个资源,在同一时间内,只allow 一个user进行访问,但是不能保证对资源的访问顺序,也就是互斥的访问是out of order
  • 同步,在互斥的基础上,通过其他机制,对资源进行有序的访问
  • 互斥量的加锁 + 解锁必须是同一个线程分别使用,信号量可以有一个线程释放,另外一个线程得到

Socket

套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发,既可以在本地单机上运行,也可以跨网络运行,换句话说,它可以通过不再统一计算机上通过connect network 进行通信

套接字是支持TCP/IO的网络通信的基本操作单元,可以看作是2个不同之间之间进程进行双向通信的断电,简单来说,就是一种约定,用套接字种的相关函数完成通信

Socket features

Socket are determined by three attributes, domain ,port number and protocal type
域,端口号,协议类型

  • domain指定socket 通信的网络介质,2 common domains ,One is AF_INET,指的是Internet网络,当客户使用socket来跨网络连接的时候,需要用到服务器computer的ip地址and port来指定一台联网机器上的特定服务,使用socket作为通信的终点,服务器应用程序在通信之前,需要绑定一个port,在指定的port下wait user connect. 另外一个domain AF_UNIX,标识Unix文件系统,他就是文件的输入输出,而他的地址是文件名
  • port number: 每一个基于tcp/ip网络通讯的程序或进程都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用户保留Socket中的输入输出信息,端口号是一个16位无符号整数,范围是0 - 65535,用来区别主机的不同程序,低于256的端口号被用来给标准应用程序,比如pop3的port number是110,每一个socket都组合进了ip地址,port,这样就可以新参整体,以来区分每一个socket
  • socket protocol type: internet provides 3中通信机制,第一种是流套接字,流套接字在domain中通过tcp/ip连接实现,同时还是AF_UNIX中常用的套接字类型,流套接字提供的是一个有序,可靠,双向字节流的连接,因此发送的数据确保不丢失,重复,乱序到达,而且还有一定的出错后的重新发送机制 第二个是数据报套接字,通过udp/ip实现,它对发送的数据有限制,数据报作为一个单独的网络信息被传输,有可能丢失复制或者错乱到达,所以udp不是一个可靠的协议,但是他快 三是原始套接字原始套接字允许对较低层次的协议直接访问,比如IP、 ICMP协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/510646.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

易语言控件绑定数据库

易语言是一门中文编程语言&#xff0c;由国人开发&#xff0c;虽然比较冷门&#xff0c;但是在有些场合却非常流行&#xff0c;比如自动化脚本&#xff0c;还有开发外挂。 在易语言中&#xff0c;只要控件的属性里有数据源的都可以与数据库的数据绑定&#xff0c;以下将演示易…

消息存储与同步策略设计

消息存储与同步策略 https://github.com/robinfoxnan/BirdTalkServer 思路&#xff1a; 私聊写扩散&#xff0c;以用户为中心&#xff0c;存储2次&#xff1b;群聊读扩散&#xff0c;以群组为中心&#xff0c;存储一次&#xff1b;scylladb易于扩展&#xff0c;适合并发&…

蚁剑流量分析

蚁剑流量分析 在靶机上面上传一个一句话木马&#xff0c;并使用蚁剑连接&#xff0c;进行抓包, 一句话木马内容 <?php eval($_POST[1]); defalut编码器 在使用蚁剑连接的时候使用default编码器 连接之后进行的操作行为是查看当前目录(/var/www/html)下的文件&#xff0…

网易云首页单页面html+css

网页设计与网站建设作业htmlcss 预览 源码查看https://hpc.baicaitang.cn/2083.html

书生 浦语 大模型趣味 Demo

目录 一. 部署 InternLM2-Chat-1.8B 模型进行智能对话 1. 环境准备 2. 下载模型参数 3. 运行Demo 二. 部署实战营 八戒-Chat-1.8B 模型 1. 下载Demo仓库 2. 启动web服务端加载八戒模型&#xff1a; 3. 将SSH远程端口映射到本地 4. 在本地浏览器打开&#xff1a;http:/…

【C++第二阶段】案例-职工管理系统

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 案例>职工管理系统0.退出功能1.增加职工功能2.显示职工信息3.删除职工信息4.修改职工信息5.查找职工信息6.排序职工7.清空所有文档 案例>职工管理系统 首先写一个workmanager…

Adobe ColdFusion 任意文件读取漏洞复现(CVE-2024-20767)

0x01 产品简介 Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言,将可扩展、改变游戏规则且可靠的产品的愿景变为现实。 0x02 漏洞概述 由于 Adobe ColdFusion 的访问控制不当,未经身份认证的远程攻击者可以构造恶…

夜晚兼职好选择:六大副业助你增收

晚上兼职&#xff0c;无疑是许多寻求额外收入人群的理想选择。以下为您精心推荐的六个副业&#xff0c;既适合晚间操作&#xff0c;又能让您在轻松愉悦中赚取额外收益。 网络调查与市场研究&#xff1a;利用晚上的闲暇时光&#xff0c;参与网络调查与市场研究&#xff0c;为企业…

《QT实用小工具·七》CPU内存显示控件

1、概述 源码放在文章末尾 CPU内存显示控件 项目包含的功能如下&#xff1a; 实时显示当前CPU占用率。实时显示内存使用情况。包括共多少内存、已使用多少内存。全平台通用&#xff0c;包括windows、linux、ARM。发出信号通知占用率和内存使用情况等&#xff0c;以便自行显示…

思腾合力与中科创达联合推出的迅思代码生成一体机产品

思腾合力与中科创达联合推出的迅思代码生成一体机产品&#xff0c;基于思腾合力强大算力底座&#xff0c;搭载中科创达自研国产大模型&#xff0c;面向众多有编程开发需求的客户&#xff0c;简化编程和软件开发过程 &#xff0c;降低编程门槛&#xff0c;全方位提升开发和生产效…

群晖NAS使用Docker部署大语言模型Llama 2结合内网穿透实现公网访问本地GPT聊天服务

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&#xff0c;包括聊天机…

ssm018简易版营业厅宽带系统+jsp

营业厅宽带系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间…

【饿了么笔试题汇总】-2024-04-02-饿了么春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新饿了么近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x…

整型之韵,数之舞:大小端与浮点数的内存之旅

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱’博客 所属栏目&#xff1a;人工智能 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 1.0 整形提升 我们先来看看代码。 int main() {char a 3;char b 127;char …

枚举---算法

1、定义 枚举算法&#xff1a;也称之为穷举算法&#xff0c;这种算法就是在解决问题的时候去使用所有的方式去解决这个问题&#xff0c;会通过推理去考虑事件发生的每一种可能&#xff0c;最后推导出结果。优点&#xff1a;简单粗暴&#xff0c;它暴力的枚举所有可能&#xff…

算法学习——LeetCode力扣图论篇1(797. 所有可能的路径、200. 岛屿数量、695. 岛屿的最大面积)

算法学习——LeetCode力扣图论篇1 797. 所有可能的路径 797. 所有可能的路径 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特…

STM32 DWT数据观察触发器作为延时函数的使用

STM32 DWT数据观察触发器作为延时函数的使用 &#x1f4d1;DWT(Data Watchpoint and Trace数据观察触发器&#xff09;描述 &#x1f4dd;DWT是属于处理器内核单元中的调试组件之一&#xff0c;由四个比较器组成。它们可配置为&#xff1a;硬件监视点或对ETM或PC采样器或数据地…

Ubuntu20.04安装MatlabR2018a

一、安装包 安装包下载链接 提取码&#xff1a;kve2 网上相关教程很多&#xff0c;此处仅作为安装软件记录&#xff0c;方便后续软件重装&#xff0c;大家按需取用。 二、安装 1. 相关文件一览 下载并解压文件后&#xff0c;如下图所示&#xff1a; 2. 挂载镜像并安装 2…

06 | Swoole 源码分析之 Coroutine 协程模块

首发原文链接&#xff1a;Swoole 源码分析之 Coroutine 协程模块 大家好&#xff0c;我是码农先森。 引言 协程又称轻量级线程&#xff0c;但与线程不同的是&#xff1b;协程是用户级线程&#xff0c;不需要操作系统参与。由用户显式控制&#xff0c;可以在需要的时候挂起、或…

回顾快速排序

快速排序 快速排序的核心&#xff1a; 找到一个key 通常左边的数比key小&#xff0c;右边的数比key大。 找key通常有三种方法&#xff1a; 1. 挖坑法&#xff1a; 代码实现&#xff1a; // int _pivot(int* a, int left, int right) {int begin left, end right;int in…