OS内核以及进程间通信方式IPC
一、内核
1. 概念
计算机由各种外部硬件设备组成,如内存,cpu,硬盘等。如果每个程序要访问某个硬件,那它必须知道如何和这个硬件设备对接通信协议,那这样太麻烦了,因此这项工作交给了中间人-内核来负责,应用程序只需关心与内核交互,无需关心硬件细节
2. 内核的功能
- 管理进程、线程,决定哪个进程,线程使用cpu,即cpu调度能力
- 决定内存的分配和回收,即内存管理能力
- 管理硬件设备,为进程和硬件设备之间提供通信能力,即硬件通信能力
- 提供系统调用,如果应用程序要运行更高权限运行的服务,就需要有系统调用,它是用户程序与操作系统之间的接口
3. 内核如何工作
早期OS中,程序员设计代码直接访问硬件,以改进应用程序总体性能,这种方式可以使硬件快速响应,但是存在严重缺陷:
- 通常需要内存以直接管理硬件,如果编程使用的内存块与被其他硬件或操作系统使用的内存块相冲突,涉及的硬件设备可能会变得不稳定,或者操作系统可能奔溃
- 直接访问硬件设备将使系统更容易受到恶意软件破坏,如可能导致损坏磁盘或者磁盘文件 因此后面通过划分开用户程序工作内存与OS工作内存的方式避免上面的问题
内核具有很大的权限,可以控制 cpu、内存、硬盘等硬件,应用程序具有的权限很小,因此大多数操作系统,把内存分成了两个区域:
- 内核空间:该内存空间只有内核程序可以访问
- 用户空间:该内存空间专门给应用程序使用
用户空间的代码只能访问一个局部的内存看空间,而内核空间代码可以访问所有内存空间。因此,当程序使用用户空间时,我们常说该程序在用户态执行,而当程序使用内核空间时,程序则在内核态执行
应用程序如果需要进入内核空间,就需要通过系统调用,如下图 内核程序执行在内核态,用户程序执行在用户态。当应用程序使用系统调用时,会发生一个中断。发生中断后、cpu会中断当前正在执行的用户程序,转而跳转到中断处理程序,也就是开始执行内核程序。内核处理完毕后、主动触发中断,把cpu执行权限交还给用户程序,回到用户态继续工作
二、进程间通信方式IPC
每个进程的用户地址空间都是不同的,一般而言不能互相访问,但是内核空间是每个进程共享的,所以进程之间通信必须通过内核
1. 管道
有匿名管道和命名管道两种 匿名管道:无名字标识,是特殊文件只存在于内存中,不存在于文件系统中,shell命令中的【|】竖线就是匿名管道,通信数据是无格式的字节流且大小受限,通信方式是单向的,只能用于存在父子关系的进程间通信,匿名管道声明周期随着进程创建而建立,随着进程终止而消亡 命名管道:可以在非亲缘关系进程间通信,因此使用命名管道前提就是在文件系统中创建类型为p的设备文件,那么毫无关系的进程就可以通过该设备文件进行通信,其他和匿名管道相同
匿名管道和命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据自然也是从内核中读取,同时通信数据遵循FIFO原则,不支持文件定位操作
2. 消息队列
客服了管道通信的数据是无格式的字节流的问题,消息队列是保存在内核的消息链表,消息体可以是用户自定义的数据类型,消息队列通信的速度不是最及时的,毕竟每次数据的写⼊和读取都需要经过⽤户态与内核态之间的拷贝过程
3. 共享内存
可以解决消息队列通信中⽤户态与内核态之间数据拷贝过程带来的开销,它直接分配1个共享空间,每个进程都可以直接访问,就像访问进程自己的空间一样快捷方便,不需要进入内核态或者系统调用,大大提高了通信的速度,是最快的进程间通信方式。但是带来新的问题,多进程竞争同个共享资源会造成数据的错乱
4. 信号量
保护共享资源,以确保任何时刻只能有⼀个进程访问共享资源,这种方式就是互斥访问。信号量不仅可以实现访问的互斥性,还可以实现进程间的同步,信号量其实是1个计数器,表示的是资源个数,其值可以通过两个原子操作来控制,分别是 P 操作和 V 操作 互斥信号量: 同步信号量:
5. 信号
信号是进程间通信机制中唯1的异步通信机制,信号可以在应用进程和内核之间直接交互,内核也可以利用信号来通知用户空间的进程发⽣了哪些系统事件,信号事件的来源主要有硬件来源(如键盘 Cltr+C )和软件来源(如 kill 命令) 有两个信号是应用进程无法捕捉和忽略的,即 SIGKILL 和 SEGSTOP ,这是为了方便我们能在任何时候结束或停止某个进程
6. socket
前面说到的通信机制,都是⼯作于同⼀台主机,如果要与不同主机的进程间通信,那么就需要 Socket 通信了。Socket 实际上不仅⽤于不同的主机进程间通信,还可以用于本地主机进程间通信,可根据创建Socket 的类型不同,分为三种常见的通信方式,1个是基于 TCP 协议的通信方式,1个是基于 UDP 协议的通信方式,1个是本地进程间通信方式 TCP 需要注意的是,服务端调用accept 时,连接成功了会返回1个已完成连接的 socket,后续用来传输数据。 所以,监听的 socket 和真正⽤来传送数据的 socket,是「两个」 socket,1个叫作监听 socket,1个叫作已完成连接 socket。 成功连接建立之后,双⽅开始通过 read 和 write 函数来读写数据,就像往1个文件流里面写东西一样 UDP
UDP 是没有连接的,所以不需要三次握手,也就不需要像 TCP 调⽤ listen 和 connect,但是 UDP 的交互仍然需要 IP 地址和端⼝号,因此也需要 bind。 对于 UDP 来说,不需要要维护连接,那么也就没有所谓的发送方和接收方,甚至都不存在客户端和服务端的概念,只要有1个 socket 多台机器就可以任意通信,因此每1⼀个 UDP 的 socket 都需要 bind。 另外,每次通信时,调用 sendto 和 recvfrom,都要传入目标主机的 IP 地址和端口
本文由博客一文多发平台 OpenWrite 发布!
OS内核以及进程间通信方式IPC相关推荐
- IPC 进程间通信方式——管道
进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...
- 几种常见进程间通信(IPC)方式之共享存储
几种常见进程间通信(IPC)方式-共享存储 前言 进程间通信是指在不同进程之间传播或交换信息,在Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间,进程之间不能相互访问.必须通过 ...
- 进程间通信方式(三)-- IPC对象(消息队列、共享内存、信号灯集)
IPC对象 1. IPC对象 2. 查看IPC对象命令 3. 消息队列 3.1 概念 3.2 相关函数 3.2.1 msgget() 创建或者打开消息队列 3.2.2 ftok() 获取键值 3.2. ...
- 进程间通信(IPC)的几种方式
进程间通信(IPC) 1.常见的通信方式 2.低级IPC方法 文件 3.常用于本机的IPC机制 3.1无名管道pipe 3.2命名管道FIFO 3.3消息队列MessageQueue 3.4共享内存S ...
- IPC(进程间通信方式的介绍)
进程间通信(IPC)介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号 ...
- 【HarmonyOS HiSpark IPC DIY Camera试用连载4 】 鸿蒙OS内核liteos-a如何启动第一个用户进程init_lite
[HarmonyOS HiSpark IPC DIY Camera试用连载4 ] 鸿蒙OS内核liteos-a如何启动第一个用户进程init_lite 1. 鸿蒙OS编译知识 2. 从编译过程看鸿蒙O ...
- 进程间通信(IPC -- InterProcess Communication)的五种方式
目录 0. 前言 1. 管道通信(Pipe) 2. 消息队列(Queue) 3. 共享内存 4. 信号量(信号灯集) 5. socket套接字 0. 前言 0.1 进程间通信的必要性 进程间空间独立, ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...
- linux进程间通信方式及比较
进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 2.信号(sig ...
最新文章
- awk 以列为域提取文件内容
- mfc 静态框接收tab焦点_目标检测中焦点损失的入门指南
- 交换机4种网络结构:级联、端口聚合、堆叠、分层—Vecloud微云
- yarn client 提交任务
- libsvm matlab 调参数,matlab – 使用libsvm调整svm
- Vue项目实战07:引入Normalize.css样式初始化
- 如何在FPGA设计环境中加时序约束 SDC (Z)
- C、C++和MFC中文件的操作
- 单词排序(信息学奥赛一本通-T1185)
- Android 系统(269)---native保活5.0以上方案推演过程以及代码详述
- C语言——负数据强制类型转换注意事项
- 无法打开包括文件: “type_traits”
- CC00088.CloudKubernetes——|KuberNeteskubeadm.V17|5台Server|——|kubernetes验证|dashboard配置|
- Android结课大作业报告
- 组合数 Counting Arrays
- cdh6 添加新主机后,出现 Error sending messages to firehose
- 【云周刊】第125期:高考恢复40年!你们要的大数据解读来啦
- Problem K. Road Network - ACPC2015(求树的直径 dp)
- Cyclen-PEG-Bodipy;大环配体-聚乙二醇-氟化硼二吡咯;大环配体-PEG-Bodipy
- HJ95 人民币转换
热门文章
- 手机微信里面接收好友的文档怎么打印
- python数据排序代码_Python-数据结构-最全六种排序代码实现
- C语言编写程序输出循环字母,用C语言编写一个程序,从键盘上输入一个小写字母,将其本身及对应的大写字母输出....
- 相关性的显著性检验——cocor package
- 网络系列--参考互联网的发展历史,分析物联网的发展现状与未来。
- CentOS下安装Python3.7报错ModuleNotFoundError: No module named '_ctypes'的解决方案
- idea导入springboot项目运行教程
- pyqt5 app基本设计框架_PyQt5设置for Python3.8.0 amp; PyCharm 2018.2.4
- 牛客编程巅峰赛S2第10场 - 青铜白银黄金题解报告
- 详解矩阵的特征值和特征向量