转 【整理】服务器编程模型

简介:
最近在研究服务器编程相关内容,故将看到的有用内容进行记录。  


==================================== 

从线程的角度,可以将服务器编程分为两类:单线程和多线程。  

【单线程模型】  

       一个进程中只有一个线程,由于只有一个线程,所以要实现高性能,必须与 “non-blocking I/O + I/O multiplexing” 相结合,另外 libevent 本身也是单线程的。相对于多线程,单线程 server 没有线程切换以及加锁的开销,劣势是不能充分利用 CPU 的多核优势,不过,这可以通过多个进程来解决。  

另外,这种模型编程也很简单,因为简单,所以是编写高性能 server 的首选。  


【多线程模型】  

       一个进程中有多个线程,一般来说,可以将这些线程分成两类:I/O线程和工作线程。由此又可以将多线程模型大体分成两类:单一 I/O 线程 + 多个工作线程、多个 I/O 线程(工作线程)。另外,不论是单线程,还是多线程,non-blocking I/O + I/O multiplexing 都是必选的。  

(1) 单一 I/O 线程 + 多个工作线程  

       这种模型下,I/O 线程负责 event loop 和 I/O 两部分,工作线程负责实际的业务逻辑处理,I/O 线程与工作线程可以通过队列/共享内存等方式进行数据交换,队列/共享内存的访问需要加锁。  
实际上,这种模型本质上与上述单线程模型是类似的,只不过这里的业务逻辑交由单独的工作线程进行处理。该模型的另外一个名字是:半同步/半异步模型(HS/HA)。  

 半同步-半异步(Half Sync-Half Async)  
       一个侦听线程负责接收请求,并在某个队列中缓存他们。另外一组工作者线程负责处理请求。因此接收请求的线程并不是处理请求的线程。  
   

(2) 多个 I/O 线程(工作线程)  

       这种模型下,每个 I/O 线程都有一个 event loop ,此时工作线程可有可无,而且通常是没有,即 I/O 线程既处理 I/O ,又进行业务逻辑处理。大家熟悉的 leader/follower(L/F) 以及 muti-reactor(M-R) 模型都属于这类。其中,memcached 使用的 M-R ,ICE 使用的 L/F 。  

领导者-跟随者(Leader-Follower)  
       有一个线程是领导者,其余线程是这个线程的跟随者。当请求到达时,领导者首先获取请求,并在跟随者中选取一个作为新的领导者,然后继续处理请求。因此接受请求的线程就是处理请求的线程。  


【小结】

个人认为:  
  1. 单线程模型实现简单,如果业务逻辑不复杂,是实现高性能 server 的首选,比如 proxy 之类的 server 。
  2. HS/HA 很清晰,如果业务逻辑很复杂,比如 database ,可以考虑这种模型。
  3. 如果你想充分利用多 CPU ,当然可以考虑 L/F 或者 M-R 。但是值得一提的是,L/F 中会有锁的开销,而 M-R 中没有锁的开销,但 M-R 的线程切换的开销要高于 L/F 。根据同事的一些测试,对于短连接 L/F 的结果好于 M-R ,而对于长连接,M-R 要好于 L/F 。

目录
相关文章
|
10月前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
244 1
|
7天前
|
存储 人工智能 边缘计算
当 AI 进入「算力密集时代」:你的服务器能跑通大模型吗?
本文深入探讨AI服务器在技术落地中的核心瓶颈问题,结合实战经验解析从模型训练到端侧部署的算力优化策略。内容涵盖三大典型场景的算力需求差异、GPU服务器选型的五大反直觉真相、实战优化方法(如混合精度训练与硬件资源监控),以及边缘AI部署挑战和解决方案。同时提供算力弹性扩展策略、模型生命周期管理及合规性建议,帮助读者构建可持续发展的算力体系。文末附有获取更多资源的指引。
58 17
|
25天前
|
存储 弹性计算 测试技术
10分钟私有部署QwQ-32B模型,像购买Ecs实例一样快捷
虽然阿里云提供了基于 IaaS 部署 QwQ-32B 模型的方式,但传统的基于IaaS的部署方式需要用户自行配置环境、安装依赖、优化硬件资源,并解决复杂的网络与存储问题,整个流程不仅耗时耗力,还容易因操作失误导致各种不可预见的问题。 因此,阿里云计算巢提供了基于ECS镜像与VLLM的大模型一键部署方案,通过ECS镜像打包标准环境,通过Ros模版实现云资源与大模型的一键部署,用户无需关心模型部署运行的标准环境与底层云资源编排,10分钟即可部署使用QwQ-32B模型,15分钟即可部署使用Deepseek-R1-70B模型。
|
2月前
|
人工智能 负载均衡 数据可视化
阿里云出手了,DeepSeek服务器拒绝繁忙,免费部署DeepSeek模型671B满血版
阿里云推出免费部署DeepSeek模型671B满血版服务,通过百炼大模型平台,用户无需编码,最快5分钟、最低0元即可完成部署。平台提供100万免费Token,支持DeepSeek-R1和DeepSeek-V3等多款模型调用,有效解决服务器繁忙问题。新手零基础也能轻松上手,享受高效稳定的API调用和自动弹性扩展功能。教程涵盖开通服务、获取API-KEY及配置Chatbox客户端等步骤,详细指引助您快速实现DeepSeek自由。
285 18
|
7月前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
78 2
|
10月前
|
Java 应用服务中间件 开发者
【实战指南】Java Socket编程:构建高效的客户端-服务器通信
【6月更文挑战第21天】Java Socket编程用于构建客户端-服务器通信。`Socket`和`ServerSocket`类分别处理两端的连接。实战案例展示了一个简单的聊天应用,服务器监听端口,接收客户端连接,并使用多线程处理每个客户端消息。客户端连接服务器,发送并接收消息。了解这些基础,加上错误处理和优化,能帮你开始构建高效网络应用。
560 10
|
10月前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!
155 3
|
10月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
170 0
|
10月前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
168 0
|
6月前
|
数据可视化 Linux 网络安全
如何使用服务器训练模型
本文介绍了如何使用服务器训练模型,包括获取服务器、访问服务器、上传文件、配置环境、训练模型和下载模型等步骤。适合没有GPU或不熟悉Linux服务器的用户。通过MobaXterm工具连接服务器,使用Conda管理环境,确保训练过程顺利进行。
475 0
如何使用服务器训练模型

热门文章

最新文章

下一篇
oss创建bucket