千家信息网

网络I/O模型

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,一、I/O一个I/O,两个过程(等待,数据搬迁 【都由自己执行】)。二、I/O 模型 --- Unix下共有5种I/O模型I/O中,同步和异步关注的是消息通信机制。同步:由 调用者 主动等待这个 调用
千家信息网最后更新 2024年11月19日网络I/O模型

一、I/O

一个I/O,两个过程(等待,数据搬迁 【都由自己执行】)。

二、I/O 模型 --- Unix下共有5种I/O模型

I/O中,同步和异步关注的是消息通信机制。

同步:由 调用者 主动等待这个 调用的结果。

异步:当一个异步过程调用发出后,调用者不会立刻得到结果。而是在 调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用,因而 没有返回结果。

(一)类型

1. 阻塞I/O模型

应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。

如果数据没有准备好,一直等待。数据准备好了,从内核拷贝到用户空间。

2. 非阻塞I/O模型

把一个套接口设置为 非阻塞,即 告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试 数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。

3. I/O复用模型

(1) I/O复用模型会用到 select或者poll函数,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

(2) 相关函数

#include

int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

// 参数timeout 为结构timeval,用来设置select()的等待时间

//timeout:特定的时间值:如果在指定的时间段里没有事件发生,select将超时返回

NULL:select()没有timeout,select将一直被阻塞,直到某个文件描述符上发生了事件。

0:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生。

返回值:

执行成功则返回文件描述词状态已改变的个数.

如果返回0代表在描述词状态改变前已超过timeout时间,没有返回;

当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds,exceptfds和timeout的值变成不可预测。

void FD_CLR(int fd, fd_set *set);//清除描述词组set中相关fd 的位

int FD_ISSET(int fd, fd_set *set);//测试描述词组set中相关fd 的位是否为真

void FD_SET(int fd, fd_set *set);//设置描述词组set中相关fd的位

void FD_ZERO(fd_set *set);//清除描述词组set的全部位

int pselect(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds,

const struct timespec *timeout,const sigset_t *sigmask);


4. 信号驱动I/O模型

首先允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。


5. 异步I/O模型

(1) 调用aio_read函数,告诉内核描述字,缓冲区指针,缓冲区大小,文件偏移以及通知的方式,然后立即返回。当内核将数据拷贝到缓冲区后,再通知应用程序。

(2) 相关函数

#include

int aio_read(struct aiocb *aiocbp); Link with -lrt

返回值:成功 0,失败 -1

(二)比较

同步I/O:

阻塞I/O模型:一直等待

非阻塞阻塞I/O模型:在等待过程中还可以执行其他进程/线程

【以上两者:仅等待方式不同,其他相同】

信号驱动I/O模型:等待方式以 信号驱动

I/O复用模型:一个进程等待多个线程

异步I/O:

异步I/O模型:由其他线程执行 等待和数据搬迁,自己只关注 结果


函数 模型 阻塞 数据 信号 准备 进程 时间 内核 多个 状态 用者 结果 词组 过程 处理 测试 驱动 两个 事件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全是属于安全生产么 软件开发内控审查 手机怎么控制家庭服务器 平谷区品牌软件开发要求 七日杀服务器为什么很卡 27岁开始学软件开发 调用服务器脚本 nfs 接网线连服务器登录 分布式数据库与集中式开销 网络安全手抄报加文字一年级 上海忒亚网络技术有限公司 地下城勇士服务器维修时间 科技公司服务器为什么要放在海里 王者荣耀qq服务器滞后 万得行业数据库app 福建叁壹壹互联网科技现状 数据库 目关系是什么意思 snmp服务器干啥用的 常州推广网络技术报价 阿拉德之怒不同服务器哪里下载 数据库如何备份表并清空数据 绿云数据库在哪里 2019年网络安全市场数字 玩家怎么自建arma3服务器 中智总部招聘软件开发 荒野行动plus服务器升级 沂水租房软件开发 自主可控数据库技术路线 网络安全攻防技术课程视频 佛山水电煤缴费软件开发团队
0