之前总发现usb闪存盘明明标注速度快,实际拷文件有时还不如旧硬盘快,还有时候看直播网络突然卡住,电脑死活没反应。原来这些设备在linux系统里都被当成了"特殊文件",和普通的文档照片摆在一起,但它们背后的操作完全不同。硬盘、u盘这些存储设备属于块设备,就像固定尺寸的包装盒,每次得整盒搬动数据。如果只需要里面一小部分,就得把整盒搬出来改完再塞回去,这就是为啥频繁改小文件可能更慢。打印机鼠标这类字符设备就简单,数据像自来水一样连续流动,想关掉就得按紧急键比如Ctrl+C。系统给每个设备都配了驱动,用主设备号和次设备号区分。比如同样用sd做主号的硬盘,通过次号知道是哪个盘。驱动和硬件中间有个叫设备控制器的中介,cpu要跟设备打交道,得通过这个中介转达指令。读写数据时,系统会先在内存里找缓存。找到直接用,找不到才去磁盘调。写数据也是先存缓存,攒够一批再一起刷到硬盘,这样效率高很多。不过有时候缓存太久不写导致断电数据丢了,这也是个问题。为了减少硬盘读写次数,内核用了电梯调度算法。想象楼里的电梯,乘客按的楼层先排好顺序再上下,避免反复横跳。但有时候读写请求太多会卡住,后来改成 deadline 算法,给每个请求设定截止时间,超时的优先处理。网络其实也是通过套接字传递数据包。tcp协议像快递公司,每包都确认收到才能继续发,udp就直接扔出去不管。选哪个要看需求,直播选udp不怕丢包,文件传输得用tcp确保完整。linux系统可以把驱动做成模块,开机后随时加载。比如装新声卡驱动不用重装系统,插上设备自动装驱动就行。但有时候模块冲突会导致系统卡住,得重启修复。最近听说有些新显卡驱动可以直接在运行时更新,打游戏中途换驱动都不会卡顿。不过不是所有设备都支持,老设备还是得忍受重新插拔的风险。其实这些设备和系统一直在较劲。硬件更新换代快,软件得不断调整兼容。就像新出的ssd比机械硬盘快很多,但系统默认调度策略还是按老旧设备设计。现在不少系统开始给nvme固态单独优化了,速度又翻倍。网络设备更是麻烦,数据包乱飞还得按顺序组装。防火墙规则稍不对,视频就会卡成ppt。不过现在很多网卡支持零拷贝技术,数据直接在硬件间传输,不用经过cpu,这下总算轻松点。