面试:什么叫Linux多路复用 ?

  • 多路: 是指多个网络连接(Socket)

  • 复用: 是指通过一个线程同时监控多个文件描述符的就绪状态。这样,程序可以高效地处理多个 I/O 事件,而不需要为每个连接创建单独的线程,从而节省系统资源。

  • 多路复用主要有三种技术:select,poll,epoll。其中,epoll 是最新且性能最优的实现,能够高效地处理大规模并发连接。

Linux多路复用是指一种能够同时监听多个IO事件的机制,使得一个进程能够同时处理多个输入和输出操作。使用多路复用可以避免使用多线程或多进程的方式来处理并发IO操作,提高程序的效率和性能。

在Linux中,常用的多路复用技术包括select、poll、epoll等。它们都是通过一个系统调用来实现的。

目前支持I/O多路复用的系统调用有select,pselect,poll,epoll。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。 I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

以下是一个使用epoll的示例代码:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/epoll.h>

#define MAX_EVENTS 10

int main() {

int epoll_fd, num_events;

struct epoll_event events[MAX_EVENTS];

// 创建一个epoll实例

epoll_fd = epoll_create1(0);

if (epoll_fd == -1) {

perror("epoll_create1");

exit(EXIT_FAILURE);

}

// 设置监听的文件描述符

struct epoll_event event;

event.events = EPOLLIN;

event.data.fd = STDIN_FILENO; // 监听标准输入

if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, STDIN_FILENO, &event) == -1) {

perror("epoll_ctl EPOLL_CTL_ADD");

exit(EXIT_FAILURE);

}

// 开始监听

while (1) {

num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);

if (num_events == -1) {

perror("epoll_wait");

exit(EXIT_FAILURE);

}

// 处理待处理的事件

for (int i = 0; i < num_events; i++) {

if (events[i].data.fd == STDIN_FILENO) {

char buffer[100];

fgets(buffer, sizeof(buffer), stdin);

printf("Received input: %s", buffer);

}

}

}

// 关闭epoll实例

close(epoll_fd);

return 0;

}

上述代码使用了epoll实现多路复用,监听标准输入(STDIN_FILENO),当有输入时,打印收到的输入内容。

注意:以上示例代码是使用C语言编写的,需在Linux环境中编译运行。

相关推荐
呉師傅13 分钟前
【使用技巧】Adobe Photoshop 2024调整缩放与布局125%后出现点菜单项漂移问题的简单处理
运维·服务器·windows·adobe·电脑·photoshop
云姜.14 分钟前
线程和进程的关系
java·linux·jvm
heartbeat..16 分钟前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范
小Tomkk43 分钟前
数据库 变更和版本控制管理工具 --Bytebase 安装部署(linux 安装篇)
linux·运维·数据库·ci/cd·bytebase
赌博羊43 分钟前
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found
linux·运维·gnu
木卫二号Coding1 小时前
第七十九篇-E5-2680V4+V100-32G+llama-cpp编译运行+Qwen3-Next-80B
linux·llama
getapi1 小时前
Ubuntu 22.04 服务器的系统架构是否为 amd64 x86_64
linux·服务器·ubuntu
消失的旧时光-19431 小时前
Linux 入门核心命令清单(工程版)
linux·运维·服务器
艾莉丝努力练剑1 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
小天源1 小时前
Cacti在Debian/Ubuntu中安装及其使用
运维·ubuntu·debian·cacti