9.1 I/O模型

目录

I/O基本概念

同步和异步

阻塞和非阻塞

五种I/O模型

五种I/O模型比较


I/O基本概念

I/O即数据的读取(接收)或写入(发送)操作

通常用户进程中的一个完整I/O分为两个阶段
用户进程空间<-->内核空间
内核空间<-->设备空间(磁盘、网卡等)

I/O分为内存I/O、网络I/O和磁盘I/O三种

同步和异步

对于一个线程的请求调用来讲,同步和异步的区别在于是否要等这个请求出最终结果
对于多个线程而言,同步或异步就是线程间的步调是否要一致、是否要协调
同步也经常用在一个线程内先后两个函数的调用上
异步就是一个请求返回时一定不知道结果,还得通过其他机制来获知结果,如:主动轮询或被动通知


阻塞和非阻塞

阻塞与非阻塞与等待消息通知时的状态(调用线程)有关

阻塞和同步是完全不同的概念。同步是对于消息的通知机制而言,阻塞是针对等待消息通知时的状态来说的

进程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态
线程在运行过程中,可能由于以下几种原因进入阻塞状态:

线程通过调用sleep方式进休眠状态

线程调用一个在I/O上被阻塞的操作,即该操作在输入/输出操作完成前不会返回到它的调用者

线程试图得到一个锁,而该锁正被其他线程持有,于是只能进入阻塞状态,等到获取了同步锁,才能恢复执行

线程在等待某个触发条件
可能阻塞套接字的Linux Sockets API调用分为以下四种

输入操作 输出操作 接受连接 外出连接

五种I/O模型

 

 

 

五种I/O模型比较


笔记

同步与阻塞

同步是程序运行的程序

阻塞是程序运行的状态

五种IO模型

4种同步IO:

阻塞IO、非阻塞IO、多路复用IO、信号驱动式IO

1种异步IO:

异步IO

recvfrom

recvfrom 是一个在网络编程中用于接收数据的函数,主要用于在一个已经建立的套接字上接收数据。

函数原型如下:

int recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

参数说明:

  • sockfd:套接字描述符(socket file descriptor),指定接收数据的套接字。
  • buf:接收数据的缓冲区地址,用于存储从套接字接收的数据。
  • len:接收数据的最大字节数,即缓冲区的大小。
  • flags:可选的标志参数,可以使用 0 或者特定的标志来控制接收操作的行为。
  • src_addr:用于返回发送数据的对端地址信息,是一个 sockadd 结构体的指针。
  • addrlen:作为输入参数时,指定 src_addr 缓冲区的长度;作为输出参数时,返回实际填充的地址长度。

返回值为接收到的数据的字节数,如果有错误发生,则返回 -1,并设置对应的错误码。

recvfrom 函数常用于 UDP 协议的通信,通过监听某个套接字接收数据报文。在调用函数时,src_addr 参数用于获取发送方的地址信息,以便进行回复或其他处理。同时,通过设置合适的标志参数,可以影响函数的行为,如设置 MSG_DONTWAIT 可以将套接字设置为非阻塞模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值