起因
今天复习了一下网络编程,里面就有一个然后复习一下多路复用。突然,我想到了一件事情,多路复用,肯定就要对存储了套接字的数据类型进行遍历,如链表数组二叉树等。但是遍历过程,就无法实现像tcp和udp那样堵塞等待了啊!那么怎么还能正常实现网络通讯呢!突然我想起来了,我刚学c语言的时候的烦恼。缓冲区!
缓冲区
顾名思义,就是作为数据缓冲,常见于输入和输出中,还记得刚学c语言的时候,printf scanf fput啥的,遇到\n清空缓冲区,刷新缓冲区等东西,都是的。当时就是,非常恼火,为啥要这个破缓冲区啊!现在,就明白,缓冲区是一个非常好的东西。
缓冲区基础作用
缓冲区,最基础的作用就是
输入方面,临时存放数据并告诉cpu来执行中断,防止cpu因为有高优先级任务导致数据丢失。
输出方面,快速连贯的发送,不需要来回执行发送,可以一步到位批量处理,减少硬件资源的消耗。
接收方面,甚至说还可以实现因为两者速率不对等,可以实现一个速率的缓冲,平衡速度差异。
比如两者都是9600波特率,但是硬件的时钟肯定是不可能都一致的。所以数据就可以全部存到缓冲区
等cpu过来拿就好了,哪怕多了一两帧也可以实现速率通信,注意不要太离谱了,而且接收端要采用定期拿走、中断空闲一次性接收拿走、轮询提取等方法。不然可能会导致通信堵塞卡死,数据丢失等诸多问题。
缓冲区系统层面作用
自然我们是离不开系统来分析的,其实缓冲区还有一点就是为了防止内核的多次调用了。我们的应用层一般是处于
用户状态,除了用户状态所有都是特权状态,此时用户状态是无法进行任何底层操作的,只有通过系统调用,软中
断,异常才能让cpu变为特权模式,此时才能去调用底层。
一般系统都是要防止,应用层随意调用底层,所以,容易出现很多段错误,总线错误等,就是为了保护底层,这也
是为了系统的稳定和文件系统的稳定,是非常合理的。所以应用层必须想要发送数据,那么就要使用系统调用,不
可能发一个字节,就调用一次系统调用,那么效率肯定是大打折扣的。同理接收也是这道理。
arm的特权一共有7种,如下图所示:
每次触发大量的接收,就会导致cpu被直接调度到特权模式,此时对于资源是一种极大的浪费,导致系统需要在两个状态反复切换,极大影响效率。所以引入缓冲区之后,输出可以一连串发送出去,这样进入内核的时候就少了,输入也是,可以选择空闲状态接收或者dma接收,这样就可以实现缓冲区收发,牺牲一些实时性,来换取效率和资源,是很赚的。
结语
因为有了缓冲区的存在,系统的资源和调度变得更好管理,效率和资源利用率也得到了提高,但是可不避免的损失了实时性。这也解决了很多因为cpu无法及时到来导致数据丢失问题。cpu毕竟是大家的。所以一开始的多路复用的问题也就是迎刃而解了