江布豪意斯 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 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler