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

并发服务器

一、服务器

1.单循环服务器:同一时刻,只能处理一个客户端的任务;

2.并发服务器:同一时刻,可以处理多个客户端的任务;

3.TCP并发服务器:

(1)多进程:

(2)多线程:

多进程并发服务器

  1. 基本概念:

    • 采用多个进程来处理客户端请求,每个请求由一个独立的进程处理。
    • 通常使用操作系统的进程创建机制(如 fork)来生成新进程。
  2. 优点:

    • 进程间隔离:每个进程有独立的内存空间,进程崩溃不会影响其他进程,提高了稳定性和安全性。
    • 可利用多核处理器:在多核 CPU 上,多个进程可以并行执行,充分利用 CPU 性能。
  3. 缺点:

    • 创建和销毁进程的开销较大,相较于线程切换性能较差。
    • 进程间通信(IPC)相对复杂,性能较低。
    • 使用内存多,资源开销大。

多线程并发服务器

  1. 基本概念:

    • 采用多个线程来处理客户端请求,每个请求由一个独立的线程处理。
    • 线程共享同一进程的内存空间。
  2. 优点:

    • 线程创建和切换的开销较小,因此处理请求的响应速度更快。
    • 内存占用效率高,多个线程共享进程的内存空间。
    • 线程间通信相对简单,可以直接使用共享变量。
  3. 缺点:

    • 线程之间的同步和数据共享需要额外的机制,容易引起竞态条件、死锁等问题。
    • 由于共享内存,崩溃的线程可能会导致整个进程崩溃。
    • 不同操作系统对线程的支持和调度策略不同,可能会影响性能。
  4. 多进程和多线程区别:

    1. 效率角度
    多线程效率高(创建、任务切换)
    2. 安全角度
    多进程比多线程安全(进程空间独立)
    3. 资源消耗
    进程资源消耗比线程多
    4. 通信
    进程:IPC 线程:全局变量(互压锁、信号量(同步) -------- 》锁)

(3)IO多路复用

二、IO模型

1.阻塞IO:fgets、scanf、read、recv、getchar

(1)实现多个IO同步的效果

(2)cpu占有率低

2.非阻塞IO

(1)使用轮询的方法实现

(2)cpu占有率高

实现步骤:获取原文件描述符的属性->增加非阻塞属性->设置新属性

  fcntl

#include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ );

参数说明:fd:文件描述符,指向要进行操作的打开文件的描述符。

  • cmd:要执行的命令,可以是以下之一:

    • F_GETFD:获取文件描述符的标志。
    • F_SETFD:设置文件描述符的标志。
    • F_GETFL:获取文件状态标志。
    • F_SETFL:设置文件状态标志(例如,设置为非阻塞模式)。
    • F_GETLK:获取文件锁的状态。
    • F_SETLK:设置文件锁。
    • F_SETLKW:设置文件锁(如果锁被其他进程占用,则会阻塞)。
  • arg:可选参数,具体取决于 cmd 的值。如果 cmd 是 F_SETFDF_SETFL,则它是要设置的值;如果是 F_GETLK 或 F_SETLK,则它是指向一个 struct flock 的指针。

返回值:成功时返回 0 或文件描述符的一个标志值。失败时返回 -1,并设置 errno 以指示错误类型。

3.信号驱动IO

(1)异步通知的IO方式,节省CPU;

(2)只能监测少量IO;

        增加异步属性->关联信号和当前的进程->注册信号处理函数

4.IO多路复用

(1)多个IO复用一个进程;


http://www.kler.cn/news/284990.html

相关文章:

  • 代码随想录算法训练营第六十天 | 图论part10
  • SkyWalking部署(监控系统)
  • jquery下载的例子如何应用到vue中
  • 【秋招笔试】8.30饿了么秋招(算法岗)-三语言题解
  • MongoDB 中国用户大会8月31日 (MongoDB 8.0 发布)
  • 医院建筑的电气设计——保障医疗质量与安全的坚固基石
  • 深度学习100问20:什么是RNN
  • GPT带我学-设计模式-责任链模式
  • 力扣面试150 插入区间 模拟
  • 【经典面试题】Kafka为什么这么快?
  • Qt: QGraphicsView二维图形绘图框架
  • sql 4,创建表类型
  • HTML <template> 标签的基本技巧
  • flutter 开发中常用的 Widget
  • Metasploit漏洞利用系列(十):MSF渗透测试 - 震网三代(远程快捷方式漏洞)实战
  • Elasticsearch中别名的作用
  • .NET WPF 抖动动画
  • python 天气与股票的关系--第一部分,爬取数据
  • 新审视零阶优化在内存高效大模型微调中的应用
  • 你是如何克服编程学习中的挫折感的?——从Bug中找到成长的契机
  • Linux awk案例
  • Dataworks_PySpark开发流程
  • azure-search-openai-demo-csharp does not deploy correctly to azure clooad
  • vue项目打包压缩静态资源—使用compression-webpack-plugin
  • 是否应该使用WordPress自动更新的功能
  • ComfyUI使用Flux模型
  • 黑马JavaWeb开发笔记07——Ajax、Axios请求、前后端分离开发介绍、Yapi详细配置步骤
  • 网络压缩之参数量化(parameter quantization)
  • Spring Boot发送http请求
  • C语言补习课