每日十题八股-2025年1月18日
1.服务器处理并发请求有哪几种方式?
2.讲一下io多路复用
3.select、poll、epoll 的区别是什么?
4.epoll 的 边缘触发和水平触发有什么区别?
5.redis,nginx,netty 是依赖什么做的这么高性能?
6.零拷贝是什么?
7.了解哪些数据结构?
8.数组和链表区别是什么?
9.为什么数组查询的复杂度为O(1)?
10.说一下队列和栈的区别
1.服务器处理并发请求有哪几种方式?
1. 多线程(Thread-based)
方式:为每个请求分配一个线程进行处理。
优点:实现简单,适用于少量并发。
缺点:线程数量受限,线程切换开销大,容易出现线程资源耗尽问题。
2. 多进程(Process-based)
方式:为每个请求创建一个进程。
优点:进程隔离性强,适用于高安全性需求的任务。
缺点:进程的创建和销毁开销更大,占用更多系统资源。
3. 线程池/进程池
方式:预先创建一定数量的线程或进程来处理请求,避免频繁创建和销毁。
优点:资源管理效率更高,减少了系统开销。
缺点:需要合理配置池的大小,否则可能出现资源利用不足或过载问题。
4. 异步非阻塞 I/O
工作流程:
服务器使用一个主线程处理多个连接。
请求到达后,不等待 I/O 操作完成,而是注册事件回调函数。
当 I/O 操作完成时,事件循环通知回调函数,处理结果。
示例场景:
Node.js 处理 HTTP 请求。
Nginx 处理静态文件请求。
5. 事件驱动模型(Event-driven Architecture)
工作流程:
服务器维护一个事件循环和事件队列。
每个请求被封装成事件,放入队列中。
事件循环检测队列中的事件并触发相应的回调函数。
回调函数执行完毕后继续监听下一个事件。
示例场景:
JavaScript 的 async/await,Python 的 asyncio。
6. 协程(Coroutines)
工作流程:
请求处理通过协程调度器管理。
协程使用 yield 或 await 让出控制权,允许其他协程运行。
I/O 操作完成时,控制权返回给协程继续执行。
示例场景:
Python 的 asyncio 库,Go 语言的 goroutines。
7. 反应器模式(Reactor Pattern)
工作流程:
Reactor 线程等待 I/O 事件(例如,新的连接、读写就绪)。
事件发生时,调用相应的处理器(Handler)。
处理器完成任务后返回到 Reactor,继续等待其他事件。
示例场景:
Java 的 Netty 框架,Python 的 Twisted。

2.讲一下io多路复用
I/O 多路复用(I/O Multiplexing) 是一种高效的并发 I/O 处理机制,通过使用一个线程管理多个 I/O 操作,而不是为每个 I/O 连接创建独立的线程或进程,从而在网络服务器或其他 I/O 密集型场景中处理大量连接。
I/O 事件检测:监听多个文件描述符,当一个或多个描述符的状态发生变化(如有数据可读或可写),通知应用程序处理对应的 I/O。
I/O 多路复用的工作流程(以 epoll 为例)
创建 epoll 实例:使用 epoll_create 创建事件表。
注册事件:使用 epoll_ctl 添加或修改需要监听的文件描述符及其事件类型(如可读、可写)。
等待事件触发:调用 epoll_wait 进入阻塞,等待任何一个事件发生。
处理事件:当事件触发时,epoll 返回已就绪的文件描述符列表,服务器处理相应的 I/O 操作。
3.select、poll、epoll 的区别是什么?
更细节的部分还是要看小林coding的操作系统倒数的这一题。有细节讲select poll 和epoll是怎么操作的。
C10K 是计算机网络和服务器架构中一个著名的性能挑战概念,指的是如何在一台服务器上同时处理 10,000 个客户端连接的问题。它揭示了传统网络编程模型的性能瓶颈,并推动了现代高效网络服务器和框架的发展。
常见的 I/O 多路复用机制
select
支持平台:几乎所有操作系统。
工作原理:使用一个数组存储文件描述符 ,轮询检测 每个文件描述符的状态。
限制:
监听的文件描述符数量有限(通常为 1024)。
每次调用都需要重新传递所有文件描述符,效率较低。
poll
工作原理:类似 select,使用一个链表存储 文件描述符,因此支持更多连接。
改进点:文件描述符数量限制更高,但每次调用仍需遍历所有描述符。
epoll(Linux 专用)
工作原理:将文件描述符添加到一个内核事件表,只在事件发生时通知用户程序。
改进点:
采用事件通知机制,而非轮询。
处理大规模并发时性能更好,适用于高并发服务器。
4.epoll 的 边缘触发和水平触发有什么区别?
epoll 支持两种事件触发模式,分别是边缘触发(edge-triggered,ET)和水平触发(level-triggered,LT)。


- 水平触发(Level-Triggered, LT)
触发机制
当文件描述符(fd)就绪时,只要条件满足(如有数据可读或可写),每次调用 epoll_wait() 都会通知事件,直到操作完成。
特点
默认模式,兼容性好,容易实现。
如果未处理完数据,下次调用 epoll_wait() 仍会返回该事件。
示例
读事件触发后,若未将所有数据读取完毕,epoll_wait() 会反复返回读事件,直到数据被完全读取。
使用场景
适用于大多数普通网络程序,编写逻辑简单,适合不频繁切换状态的连接。 - 边缘触发(Edge-Triggered, ET)
触发机制
当文件描述符从未就绪变为就绪时,epoll_wait() 只通知一次。
之后,如果没有新数据到达或新状态变化,即使还有未处理的数据,epoll_wait() 也不会再次通知。
特点
更高效,减少了多次触发,降低系统调用次数。
需要程序保证将所有数据一次性读完或写完,否则可能丢失事件通知。
示例
读事件触发后,必须使用循环读直到返回 EAGAIN 或 EWOULDBLOCK,否则可能错过后续数据。
使用场景
适合高性能服务器,配合非阻塞 I/O 使用。
适用于处理大量连接和数据的场景,如 Nginx、Redis。
5.redis,nginx,netty 是依赖什么做的这么高性能?
关键词就是Reactor模式用得好。
回答:Redis、Nginx 和 Netty 的高性能依赖于Reactor 模式,这种模式在I/O 多路复用接口的支持下实现了异步非阻塞处理 ,大幅减少了线程/进程切换和锁竞争带来的开销,使它们在处理大规模并发请求时表现出色。
主要是依赖Reactor 模式实现了高性能网络模式,这个是在i/o多路复用接口基础上实现的了网络模型。
Redis 6.0 之前使用的 Reactor 模型就是单 Reactor 单进程模式。
Netty 是采用了多 Reactor 多线程方案。
nginx 是多 Reactor 多进程方案。
Redis 6.0 之前使用的 Reactor 模型就是单 Reactor 单进程模式。

Netty 是采用了多 Reactor 多线程方案。

nginx 是多 Reactor 多进程方案。

6.零拷贝是什么?
零拷贝实现了从两次CPU拷贝,两次DMA拷贝,到只要两次DMA拷贝就能够实现从硬盘读取数据,然后再通过网卡向外发送。零拷贝技术可以把文件传输的性能提高至少一倍以上。
零拷贝技术跳过了多个中间步骤,减少了内存数据复制。具体实现方式如下:
sendfile 系统调用(Linux):
直接从文件描述符读取数据并发送到网络套接字,跳过用户空间。
mmap 文件映射:
将文件内容映射到用户空间地址,通过共享内存方式避免拷贝。
splice 和 tee(Linux 特有):
在不同文件描述符之间传输数据,不经过用户空间。
DMA(Direct Memory Access)是一种允许硬件设备直接访问内存的技术,无需经过 CPU 参与数据的传输,从而减少 CPU 的负载和延迟。
先明确非零拷贝是怎么样的:

零拷贝:

7.了解哪些数据结构?
数组,链表,队列,栈,二叉树,跳表,红黑树,B+数。(这三个谨慎说出口,因为了解不深)

8.数组和链表区别是什么?
最主要的区别就是数组要求在一块连续的内存中,而链表不要求。
基于此拓展出更多的不同,如增删改查的时间复杂度的不同,使用的场景也因为他们的时间复杂度的不同而各有不同。
数组可以通过索引直接访问任何位置的元素,访问效率高,时间复杂度为O(1),而链表需要从头节点开始遍历到目标位置,访问效率较低,时间复杂度为O(n)。
数组插入和删除操作可能需要移动其他元素,时间复杂度为O(n),而链表只需要修改指针指向,时间复杂度为O(1)。
9.为什么数组查询的复杂度为O(1)?
数组必须要内存中一块连续的空间,并且数组中必须存放相同的数据类型。
因此只要知道索引就能够根据(基地址+数据类型大小*索引)直接找到对应的位置。
例如,在初始地址为1000的int数组(4字节),int[5] 就是 1000+5*4 = 1020。
10.说一下队列和栈的区别
队列是先进先出,栈是先进后出。
队列适用于按顺序执行的场景,而栈用于像是递归,函数调用的场景。
相关文章:
每日十题八股-2025年1月18日
1.服务器处理并发请求有哪几种方式? 2.讲一下io多路复用 3.select、poll、epoll 的区别是什么? 4.epoll 的 边缘触发和水平触发有什么区别? 5.redis,nginx,netty 是依赖什么做的这么高性能? 6.零拷贝是什么…...
海康威视摄像头RTSP使用nginx推流到服务器直播教程
思路: 之前2020年在本科的时候,由于项目的需求需要将海康威视的摄像头使用推流服务器到网页进行直播。这里将自己半个月琢磨出来的步骤给大家发一些。切勿转载!!!! 使用网络摄像头中的rtsp协议---------通…...
搭建一个基于Spring Boot的书籍学习平台
搭建一个基于Spring Boot的书籍学习平台可以涵盖多个功能模块,例如用户管理、书籍管理、学习进度跟踪、笔记管理、评论和评分等。以下是一个简化的步骤指南,帮助你快速搭建一个基础的书籍学习平台。 — 1. 项目初始化 使用 Spring Initializr 生成一个…...
Go 语言的slice是如何扩容的?
Go 语言中的 slice 是一种灵活、动态的视图,是对底层数组的抽象。当对 slice 进行追加元素等操作导致其长度超过容量时,就会发生扩容。 一、扩容的基本原理 当 slice 需要扩容时,Go 语言会根据当前的容量来确定新的容量。一般来说ÿ…...
Apache Hive--排序函数解析
在大数据处理与分析中,Apache Hive是一个至关重要的数据仓库工具。其丰富的函数库为数据处理提供了诸多便利,排序函数便是其中一类非常实用的工具。通过排序函数,我们能够在查询结果集中为每一行数据分配一个排名值,这对于数据分析…...
Java 接口安全指南
Java 接口安全指南 概述 在现代 Web 应用中,接口(API)是前后端交互的核心。然而,接口的安全性常常被忽视,导致数据泄露、未授权访问等安全问题。本文将详细介绍 Java 中如何保障接口安全,涵盖以下内容&am…...
合合信息名片全能王上架原生鸿蒙应用市场,成为首批数字名片类应用
长期以来,名片都是企业商务沟通的重要工具。随着企业数字化转型,相较于传统的纸质名片,数字名片对于企业成员拓展业务、获取商机、提升企业形象等方面发挥着重要作用。近期,合合信息旗下名片全能王正式上线原生鸿蒙应用市场&#…...
38.【3】CTFHUB web sql 报错注入
进入靶场 按照提示输入1 显示查询正确 既然是报错注入,先判断整形还是字符型注入 先输入1 and 11 再输入1 and 12 都显示查询正确,可知此为字符串型注入,不是数字型注入 然后就不会了 求助AI和其他wp 由以上2张搜索结果知updatexml是适用…...
RC2在线加密工具
RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。RC2是一种分组加密算法,RC2的密钥长度可变,可以从8字节到128字节,安全性选择更加灵活。 开发调试上,有时候需要进行对…...
NVIDIA 下 基于Ubuntun20.04下 使用脚本安装 ros2-foxy 和 使用docker安装 ros2-foxy
一、前提介绍: 本文主要采用两种方式在NVIDIA 下基于 Ubuntun20.04安装 ros2-foxy。 使用环境: NVIDIA 为 Jetson 系列下 Jetson Xavier NX; Ubuntun版本:20.04 二、安装方法: 1、使用脚本编译方式: 使…...
STL容器-- list的模拟实现(附源码)
STL容器-- list的模拟实现(附源码) List的实现主要考察我们对list这一容器的理解,和代码的编写能力,通过上节对list容器的使用,我们对list容器已经有了一些基本的了解,接下来就让我们来实现一些list容器常见…...
python——句柄
一、概念 句柄指的是操作系统为了标识和访问对象而提供的一个标识符,在操作系统中,每个对象都有一个唯一的句柄,通过句柄可以访问对象的属性和方法。例如文件、进程、窗口等都有句柄。在编程中,可以通过句柄来操作这些对象&#x…...
KubeSphere 与 Pig 微服务平台的整合与优化:全流程容器化部署实践
一、前言 近年来,为了满足越来越复杂的业务需求,我们从传统单体架构系统升级为微服务架构,就是把一个大型应用程序分割成可以独立部署的小型服务,每个服务之间都是松耦合的,通过 RPC 或者是 Rest 协议来进行通信,可以按照业务领域来划分成独立的单元。但是微服务系统相对…...
ESP8266-01S、手机、STM32连接
1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块,主要模式如下图: 上节说到,我们需要用到AT固件进行局域网应用(ESP8266连接的STM32和手机进行连接)。 ESP8266为一个WiFi透传模块,和…...
Web开发 -前端部分-CSS-2
一 长度单位 代码实现: <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...
【QT用户登录与界面跳转】
【QT用户登录与界面跳转】 1.前言2. 项目设置3.设计登录界面3.1 login.pro参数3.2 界面设置3.2.1 登录界面3.2.2 串口主界面 4. 实现登录逻辑5.串口界面6.测试功能7.总结 1.前言 在Qt应用程序开发中,实现用户登录及界面跳转功能是构建交互式应用的重要步骤之一。下…...
记录一次关于spring映射postgresql的jsonb类型的转化器事故,并使用hutool的JSONArray完成映射
事件的起因是这样的,那次事故发生的起因是因为WebFlux和postgreSQL去重新做鱼皮的鱼图图项目(鱼图图作业)。 在做到picture表的时候,发现postgreSQL中有个jsonb的类型可以更好的支持json数组。 出于锻炼新技术的目的,…...
基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day2
为了使 2048 游戏的设计更加美观和用户友好,我们可以进行以下几项优化: 改善颜色方案:使用更温馨的颜色组合。添加动画效果:为方块的移动和合并添加渐变效果。优化分数显示:在分数增加时使用动画效果。 以下是改进后…...
Django框架:python web开发
1.环境搭建: (a)开发环境:pycharm (b)虚拟环境(可有可无,优点:使用虚拟环境可以把使用的包自动生成一个文件,其他人需要使用时可以直接选择导入包ÿ…...
MySQL、HBase、ES的特点和区别
MySQL:关系型数据库,主要面向OLTP,支持事务,支持二级索引,支持sql,支持主从、Group Replication架构模型(本文全部以Innodb为例,不涉及别的存储引擎)。 HBase࿱…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
