Linux高性能服务器编程 进程间通信方式 共享内存 System V IPC 和POSIX
进程间通信方式—共享内存(System V IPC 和POSIX)System V IPC共享内存共享内存的基本原理 共享内存是一种进程间通信(IPC)机制。当多个进程需要共享数据时,可以创建一块共享内存区域。通过shmget函数创建共享内存段后,这块内存区域就存在于系统的内存空间中。 然后,各个进程可以通过shmat函数将这块共享内存连接到自己的进程地址空间。连接后,进程就可以像访问自己的本地内存一样访问共享内存中的数据。 共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输,这种高效率带来的问题是,我们必须用其他辅助手段来同步进程对共享内存的访问,否则会产生竞态条件,因此,共享内存通常和其他进程间通信方式一起使用。 Linux共享内存的API都定义在sys/shm.h头文件中,包括4个系统调用shmget、shmat、shmdt、shmctl。 1.shmget 系统调用shmget 系统调用创建一段新的共享内存,或者获取一段已经存在的共享内存。 12#include <sys/shm.h>int shmget(key_t key, size_t...
Linux高性能服务器编程 进程间通信方式 消息队列System V IPC
进程间通信方式—消息队列(System V IPC)消息队列1.消息队列进程间通信原理System V IPC 消息队列是一种进程间通信(IPC)机制,它允许不同进程通过发送和接收消息来进行通信。消息队列就像是一个邮箱系统,进程可以将消息(信件)发送到队列(邮箱)中,其他进程可以从这个队列中接收消息。 消息队列是在两个进程间传递二进制数据块的方式,每个数据块都有一个特定类型,接收方可以根据类型来有选择地接收数据,而不一定像管道和命名管道那样必须以先进先出的方式接收数据。 原理:多个进程通过共享消息队列的标识符(msqid)来访问同一个消息队列。发送进程将消息放入消息队列后,消息队列会按照一定的规则(如先进先出)存储这些消息。接收进程可以根据消息类型等条件从消息队列中取出消息。这样,不同进程之间就可以通过消息队列进行数据传输和通信,实现进程间的同步和信息共享。例如,在生产者 -...
Linux高性能服务器编程 各种进程间通信方式详解
各种进程间通信方式详解1.基本原理 进程地址空间的3g-4g是内核空间,0-3g是进程自己的,但是每个进程的3-4g是内核空间就一份,大家都相同的。 所以通信就是进程在内核空间中的一块缓冲区进行写而另外一个进程读从而完成了通信。这两个进程可以是父子进程,也可以不是。 2.基本概念“IPC” 全称是 “Inter - Process Communication”,即进程间通信。 1.进程间通信的重要性 在操作系统中,每个进程都有自己独立的地址空间。这使得进程之间的数据是相互隔离的,这种隔离性在保证进程独立性和安全性的同时,也带来了进程间共享数据和协同工作的困难。进程间通信机制就是为了解决这个问题,使得不同的进程能够相互交换信息、同步操作,从而共同完成复杂的任务。 2.IPC...
Day54 | 灵神 | 相向双指针:两数之和II-输入有序数组&&三数之和
Day54 | 灵神 | 相向双指针:两数之和II-输入有序数组&&三数之和两数之和 三数之和【基础算法精讲 01】_哔哩哔哩_bilibili 167.两数之和II-输入有序数组167. 两数之和 II - 输入有序数组 - 力扣(LeetCode) 思路: 数组给咱们的是排序好的,那自然而然定义两根指针,一个在数组头l,一个在数组尾r 这样定义的好处是 两根指针中间的数字一定比头指针要大,一定比尾指针要小 如果两指针之和大于target的话,那中间某个数加上尾指针肯定也比target要大,那说明两个数加起来大了,那就把右边大的数字减小一点 如果两指针之和小于target的话,那头指针加上中间某个数肯定也比target要小,那说明两个数加起来小了,那就把左边大的数字增大一点 如果两指针之和等于target的话,那说明我们找到了答案直接返回就行 举例: 2 4 6 8 9 target=12 一开始 2 +...
Linux高性能服务器编程 11. 多进程编程
11. 多进程编程 复制进程映像的fork系统调用和替换进程映像的exec系列系统调用。 僵尸进程以及如何避免僵尸进程。 进程间通信(Inter Process Communication,IPC)最简单的方式:管道。 三种System V进程间通信方式:信号量、消息队列、共享内存。它们是由AT&T System V2版本的UNIX引入的,所以统称为System V IPC。 在进程间传递文件描述符的通用方法:通过UNIX本地域socket传递特殊的辅助数据。(关于辅助数据,参考《Linux 高性能服务器编程》P85) 0.前置知识1.PCBPCB进程控制块本质是一个task_struct结构体 进程id,每个进程唯一一个 进程切换时需要保存和恢复的一些CPU寄存器 描述虚拟地址空间的信息 进程状态: 初始态、就绪态、运行态、挂起态、终止态。 进程工作目录位置 umask掩码 ...
Linux高性能服务器编程 12. 多线程编程
12. 多线程编程06-线程概念_哔哩哔哩_bilibili 早期Linux不支持线程,直到1996年,Xavier Leroy等人开发出第一个基本符合POSIX标准的线程库LinuxThreads,但LinuxThreads效率低且问题多,自内核2.6开始,Linux才开始提供内核级的线程支持,并有两个组织致力于编写新的线程库:NGPT(Next Generation POSIX Threads)和NPTL(Native POSIX Thread Library),但前者在2003年就放弃了,因此新的线程库就是NPTL。NPTL比LinuxThreads效率高,且更符合POSIX规范,所以它已经成为glibc的一部分,本书使用的线程库是NPTL。 本章要讨论的线程相关的内容都属于POSIX线程(简称 pthread)标准,不局限于NPTL实现,包括: 创建线程和结束线程; 读取和设置线程属性; POSIX线程同步方式:POSIX信号量、互斥锁和条件变量。 1.线程概念1.什么是线程**LWP:**light weight process...
Linux高性能服务器编程 信号 信号量 条件变量三者辨析
信号,信号量,条件变量三者辨析1.信号(Signal) 概念 信号是一种软中断机制,用于通知进程发生了某个特定的事件。它是一种异步事件通知方式,进程在收到信号时可以采取相应的动作,如终止进程、暂停进程或者忽略信号等。信号是由操作系统内核发送给进程的。 举例 当用户在终端中按下Ctrl + C组合键时,内核会向当前正在运行的前台进程发送一个SIGINT(中断信号)。如果进程没有对这个信号进行特殊处理,默认情况下会终止运行。例如,下面是一个简单的 C 程序来处理SIGINT信号: 123456789101112131415161718192021#include <stdio.h>#include <signal.h>#include <stdlib.h>void signal_handler(int signum) { printf("Received signal %d\n", signum); // 在这里可以进行更复杂的处理,比如清理资源等}int main() { ...
Linux高性能服务器编程 10. 高性能I/O框架库Libevent
10. 高性能I/O框架库LibeventLinux服务器程序必须处理三类事件(I/O、信号和定时事件),在处理这三类事件时需要考虑以下问题: **统一事件源。**统一处理这三类事件既能使代码简单易懂,又能避免一些潜在的逻辑错误。实现统一事件源的一般方法:利用 I/O复用系统调用来管理所有事件。 **可移植性。**不同的操作系统有不同的I/O复用方式,如Solaris的dev/poll文件、FreeBSD的kqueue机制、Linux的epoll系列系统调用。 **对并发编程的支持。**在多进程和多线程环境下,我们需要考虑各执行实体如何协同处理客户连接、信号、定时器,以避免竞态条件。 开源社区提供了很多优秀的开源I/O框架库,它们不仅解决了以上问题,让开发者可以将精力完全放在程序的逻辑上,而且稳定性、性能等各方面都相当出色,如ACE、ASIO 和...
Linux高性能服务器编程 10. 高性能I/O框架库Libevent
Ubuntu安装libevent库Libevent是一个高性能事件通知库,它在网络编程中非常有用。它可以用于开发各种网络应用程序,包括服务器和客户端。在本篇博客中,我们将介绍如何在Linux系统上安装libevent库,以便你可以开始编写高性能的网络应用程序。 1.准备工作在开始安装libevent之前,确保你的Linux系统已经安装了以下工具和库: gcc编译器 make工具 2.下载libevent你可以从libevent的官方网站(https://libevent.org/)下载最新版本的libevent。在终端中,使用`wget`命令下载libevent的源代码压缩包: wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz 也可以下载好安装包用XFTP传输过去 3.解压并编译libevent解压下载的libevent源代码: 1tar zxvf...
Linux高性能服务器编程 Libevent实现TCP客户端服务器
Libevent实现TCP客户端服务器17-libevent实现Tcp服务器流程_bilibili_哔哩哔哩_bilibili 1.服务器端实现流程1.创建 event_base 2.创建服务器连接监听器 evconnlister_new_bind() ; 3.在 evconnlister_new_bind 的回调函数中,处理接受连接后的操作 4.回调函数被调用,说明有一个新客户端连接上来。会得到一个新fd,用于跟客户端通信(读、写) 5.使用 bufferevnet_socket_new()创建一个新bufferevnet事件,将fd 封装到这个事件对象中 6.使用 bufferevent_setcb 给这个事件对象的 read、write、event 设置回调 7.设置 bufferevnet 的读写缓冲区 enable/disable 8.接受、发送数据 bufferevent_read()/bufferevent_write()...