网站开发搜索功能怎么实现,门户网站的意义,网站建设的误区,做网站看什么书好1.服务器处理并发请求有哪几种方式#xff1f; 2.讲一下io多路复用 3.select、poll、epoll 的区别是什么#xff1f; 4.epoll 的 边缘触发和水平触发有什么区别#xff1f; 5.redis#xff0c;nginx#xff0c;netty 是依赖什么做的这么高性能#xff1f; 6.零拷贝是什么… 1.服务器处理并发请求有哪几种方式 2.讲一下io多路复用 3.select、poll、epoll 的区别是什么 4.epoll 的 边缘触发和水平触发有什么区别 5.redisnginxnetty 是依赖什么做的这么高性能 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/awaitPython 的 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使用一个链表存储 文件描述符因此支持更多连接。 改进点文件描述符数量限制更高但每次调用仍需遍历所有描述符。
epollLinux 专用 工作原理将文件描述符添加到一个内核事件表只在事件发生时通知用户程序。 改进点 采用事件通知机制而非轮询。 处理大规模并发时性能更好适用于高并发服务器。
4.epoll 的 边缘触发和水平触发有什么区别
epoll 支持两种事件触发模式分别是边缘触发edge-triggeredET和水平触发level-triggeredLT。
水平触发Level-Triggered, LT 触发机制 当文件描述符fd就绪时只要条件满足如有数据可读或可写每次调用 epoll_wait() 都会通知事件直到操作完成。 特点 默认模式兼容性好容易实现。 如果未处理完数据下次调用 epoll_wait() 仍会返回该事件。 示例 读事件触发后若未将所有数据读取完毕epoll_wait() 会反复返回读事件直到数据被完全读取。 使用场景 适用于大多数普通网络程序编写逻辑简单适合不频繁切换状态的连接。边缘触发Edge-Triggered, ET 触发机制 当文件描述符从未就绪变为就绪时epoll_wait() 只通知一次。 之后如果没有新数据到达或新状态变化即使还有未处理的数据epoll_wait() 也不会再次通知。 特点 更高效减少了多次触发降低系统调用次数。 需要程序保证将所有数据一次性读完或写完否则可能丢失事件通知。 示例 读事件触发后必须使用循环读直到返回 EAGAIN 或 EWOULDBLOCK否则可能错过后续数据。 使用场景 适合高性能服务器配合非阻塞 I/O 使用。 适用于处理大量连接和数据的场景如 Nginx、Redis。
5.redisnginxnetty 是依赖什么做的这么高性能
关键词就是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 和 teeLinux 特有 在不同文件描述符之间传输数据不经过用户空间。
DMADirect Memory Access是一种允许硬件设备直接访问内存的技术无需经过 CPU 参与数据的传输从而减少 CPU 的负载和延迟。
先明确非零拷贝是怎么样的 零拷贝
7.了解哪些数据结构
数组链表队列栈二叉树跳表红黑树B数。这三个谨慎说出口因为了解不深
8.数组和链表区别是什么
最主要的区别就是数组要求在一块连续的内存中而链表不要求。 基于此拓展出更多的不同如增删改查的时间复杂度的不同使用的场景也因为他们的时间复杂度的不同而各有不同。
数组可以通过索引直接访问任何位置的元素访问效率高时间复杂度为O(1)而链表需要从头节点开始遍历到目标位置访问效率较低时间复杂度为O(n)。 数组插入和删除操作可能需要移动其他元素时间复杂度为O(n)而链表只需要修改指针指向时间复杂度为O(1)。
9.为什么数组查询的复杂度为O(1)
数组必须要内存中一块连续的空间并且数组中必须存放相同的数据类型。 因此只要知道索引就能够根据基地址数据类型大小*索引直接找到对应的位置。 例如在初始地址为1000的int数组4字节int[5] 就是 10005*4 1020。
10.说一下队列和栈的区别
队列是先进先出栈是先进后出。 队列适用于按顺序执行的场景而栈用于像是递归函数调用的场景。