每日十题八股-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࿱…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...