江布豪意斯 2017-11-05 12:07 采纳率: 0%
浏览 901

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

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

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

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

  • 写回答

1条回答 默认 最新

  • 屁小猪 2017-11-06 16:03
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)