并发服务器

一、服务器

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复用一个进程;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值