共享内存

简介: 共享内存

共享内存

共享内存是针对其他通信机制运行效率较低而设计的,它可以让多个进程可以可以直接读写同一块内存空间,是最快的IPC形式。
为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。
由于多个进程共享一段内存,因此需要依靠某种同步机制来达到进程间的同步和互斥。
信号量

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它是一种类似于锁的机制,就是防止某进程正在访问共享资源时,其他进程也访问该资源。参考这里。

Socket

Socket就是套接字,套接字也是一种通信机制,凭借这种机制,可以让不在同一台主机上的两个进程,通过网络进行通信,一般可以用在客户端和服务器之间的通信。
实际上,Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 协议的传输层里面复杂的操作,抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。
延伸问题:Socket通信流程是怎样的?

概括地说,就是通信的两端都建立了一个 Socket ,然后通过 Socket 对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。
对于客户端,它的的过程比较简单,首先创建 Socket,通过TCP连接服务器,将 Socket 与远程主机的某个进程连接,然后就发送数据,或者读取响应数据,直到数据交换完毕,关闭连接,结束 TCP 对话。
对于服务端,先初始化 Socket,建立流式套接字,与本机地址及端口进行绑定,然后通知 TCP,准备好接收连接,调用 accept() 阻塞,等待来自客户端的连接。如果这时客户端与服务器建立了连接,客户端发送数据请求,服务器接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,直到数据交换完毕。最后关闭连接,交互结束。
延伸问题:从TCP连接的角度说说Socket通信流程。

首先是三次握手的Socket交互流程。

服务器调用 socket()、bind()、listen() 完成初始化后,调用 accept() 阻塞等待;
客户端 Socket 对象调用 connect() 向服务器发送了一个 SYN 并阻塞;
服务器完成了第一次握手,即发送 SYN 和 ACK 应答;
客户端收到服务端发送的应答之后,从 connect() 返回,再发送一个 ACK 给服务器;
服务器 Socket 对象接收客户端第三次握手 ACK 确认,此时服务端从 accept() 返回,建立连接。
接下来就是两个端的连接对象互相收发数据。
然后是四次挥手的Socket交互流程。

某个应用进程调用 close() 主动关闭,发送一个 FIN;
另一端接收到 FIN 后被动执行关闭,并发送 ACK 确认;
之后被动执行关闭的应用进程调用 close() 关闭 Socket,并也发送一个 FIN;
接收到这个 FIN 的一端向另一端 ACK 确认。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
存储 安全 Java
Java 集合框架详解:系统化分析与高级应用
本文深入解析Java集合框架,涵盖List、Set、Map等核心接口及其常见实现类,如ArrayList、HashSet、HashMap等。通过对比不同集合类型的特性与应用场景,帮助开发者选择最优方案。同时介绍Iterator迭代机制、Collections工具类及Stream API等高级功能,提升代码效率与可维护性。适合初学者与进阶开发者系统学习与实践。
456 0
在Linux中,如何挂载远程NFS共享或iSCSI目标?
在Linux中,如何挂载远程NFS共享或iSCSI目标?
|
Linux
CentOS 7安装 NVIDIA 独立显卡驱动(禁用nouveau)
CentOS 7安装 NVIDIA 独立显卡驱动(禁用nouveau)
5890 0
|
分布式计算 DataWorks Java
DataWorks产品使用合集之怎么选择Doris或StarRocks作为DataWorks的OLAP解决方案
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
域名解析 网络协议 网络虚拟化
【计算机网络】—— 中小型网络构建与配置
【计算机网络】—— 中小型网络构建与配置
633 0
|
网络协议 Linux 网络安全
Macos 配置ProxyChains设置网络代理
Macos 配置ProxyChains设置网络代理
1907 0
|
Kubernetes Cloud Native 调度
OpenKruise 如何实现 K8s 社区首个规模化镜像预热能力
OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目。它来自阿里巴巴多年来容器化、云原生的技术沉淀,是阿里内部生产环境大规模应用的基于 Kubernetes 之上的标准扩展组件,也是紧贴上游社区标准、适应互联网规模化场景的技术理念与最佳实践。
OpenKruise 如何实现 K8s 社区首个规模化镜像预热能力
|
弹性计算 运维 监控
一文读懂 Serverless 的起源、发展和落地实践
Serverless 适合哪些业务场景?它可以对业务产生何种价值呢?
16112 6
一文读懂 Serverless 的起源、发展和落地实践
|
消息中间件 资源调度 Kubernetes
深入解析 Flink 细粒度资源管理
阿里巴巴高级开发工程师郭旸泽 (天凌) 在 FFA 2021 的演讲
深入解析 Flink 细粒度资源管理