当前位置: 首页 > news >正文

每日十题八股-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)。
在这里插入图片描述
在这里插入图片描述

  1. 水平触发(Level-Triggered, LT)
    触发机制
    当文件描述符(fd)就绪时,只要条件满足(如有数据可读或可写),每次调用 epoll_wait() 都会通知事件,直到操作完成。
    特点
    默认模式,兼容性好,容易实现。
    如果未处理完数据,下次调用 epoll_wait() 仍会返回该事件。
    示例
    读事件触发后,若未将所有数据读取完毕,epoll_wait() 会反复返回读事件,直到数据被完全读取。
    使用场景
    适用于大多数普通网络程序,编写逻辑简单,适合不频繁切换状态的连接。
  2. 边缘触发(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 语言会根据当前的容量来确定新的容量。一般来说&#xff…...

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

一 长度单位 代码实现&#xff1a; <!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应用程序开发中&#xff0c;实现用户登录及界面跳转功能是构建交互式应用的重要步骤之一。下…...

记录一次关于spring映射postgresql的jsonb类型的转化器事故,并使用hutool的JSONArray完成映射

事件的起因是这样的&#xff0c;那次事故发生的起因是因为WebFlux和postgreSQL去重新做鱼皮的鱼图图项目&#xff08;鱼图图作业&#xff09;。 在做到picture表的时候&#xff0c;发现postgreSQL中有个jsonb的类型可以更好的支持json数组。 出于锻炼新技术的目的&#xff0c;…...

基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day2

为了使 2048 游戏的设计更加美观和用户友好&#xff0c;我们可以进行以下几项优化&#xff1a; 改善颜色方案&#xff1a;使用更温馨的颜色组合。添加动画效果&#xff1a;为方块的移动和合并添加渐变效果。优化分数显示&#xff1a;在分数增加时使用动画效果。 以下是改进后…...

Django框架:python web开发

1.环境搭建&#xff1a; &#xff08;a&#xff09;开发环境&#xff1a;pycharm &#xff08;b&#xff09;虚拟环境&#xff08;可有可无&#xff0c;优点&#xff1a;使用虚拟环境可以把使用的包自动生成一个文件&#xff0c;其他人需要使用时可以直接选择导入包&#xff…...

MySQL、HBase、ES的特点和区别

MySQL&#xff1a;关系型数据库&#xff0c;主要面向OLTP&#xff0c;支持事务&#xff0c;支持二级索引&#xff0c;支持sql&#xff0c;支持主从、Group Replication架构模型&#xff08;本文全部以Innodb为例&#xff0c;不涉及别的存储引擎&#xff09;。 HBase&#xff1…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…...

shell脚本质数判断

shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数&#xff09;shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数&#xff09; 思路&#xff1a; 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...