关于网络编程中的缓冲问题

学了网络编程有半年了 但是存在两个疑惑
1、行缓冲,全缓冲,不缓冲,缓冲是为了减少系统调用的次数,我自己认为这三个都是和写有关,和读没关系,我能理解的是
当往缓冲里面写的时候,当缓冲满了就调用write(全缓存),当有换行符的时候就调用write(行缓存),这样可以减少了write系统调用次数,我能理解啊,但是这三个机制和读有啥关系,我自己也有看过实现readline的函数版read向内核请求缓冲大小的数据放到缓冲中,之后进程从缓冲中读取一行,或者一个一个字符读,或者一下子都读取,
但是这跟上述三个缓冲有什么联系,是不是可以这么理解行缓冲,全缓存,不缓存就是和写有关和读没啥关系啊
2、关于终端设备和内核之间的数据传递问题,同样写我能理解,因为行缓冲用于终端设备嘛,当你调用标准库函数将数据从进程写到io缓冲中的时候,如果有换行符就调用write函数写到内核中去,内核在和底层打交道,发送到终端设备中去,但是我也只不理解敲键盘是怎么到程序中去的,我目前的理解是,键盘设备自身是有设备缓冲的,你敲键盘的时候是先放到你设备缓冲中,这时候你可以删除啊修改啊之类的,当你回车的时候,数据就被送往内核缓冲中了,之后唤醒阻塞到read调用的相应进程,将数据读走,我理解的有问题吗?
其实还有个问题和UNP书中区分同步异步方式有关系,unp中说,读IO设备有5种IO模型,阻塞 非阻塞 多路复用 信号驱动 异步 前四种是同步后一种是异步 区分的方式是这样的 unp针对网络IO的操作,可以分成两个阶段,准备阶段和操作阶段。

1,准备阶段是判断是否能够操作(即等待数据是否可用),在内核进程完成的;

2,操作阶段则执行实际的IO调用,数据从内核缓冲区拷贝到用户进程缓冲区。
图片说明
图中就是以第二步骤中的实际IO操作是否阻塞区分同步异步 我想问下,数据都到内核中了,相应的阻塞不应该都是被唤醒了吗??在socket中我能想到是不是低水位线的原因,除了这个还有啥原因啊,调度的原因???

1个回答

阻塞和相应的阻塞函数功能有关,比如wait当一个进程退出时,才会由阻塞变为不阻塞,还线程结合式函数

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!