Midk9t's Blog

睡前笔记 527期

关于这个系列 这是一个记录B站睡前消息系列内容的系列。在这里我会摘写一些有保存意义的新闻、马督工对它们的评论以及我对二者的思考。睡前消息对我的世界观和分析问题的方法一直有十分深远的影响。

写在27岁的第3天

今年生日恰逢国内抗疫三年的终幕,12月以来原本层层加码的防疫政策,被以迅雷不及掩耳之势取消,奥密克戎终究还是击穿了地球上最后一个抵抗的国家。最开始时只是陆续刷到b站up主报🐏的动态,后面病毒仅用了三天就蔓延到微信朋友圈,现在小区也报🐏了,或许很快就到我吧,也不知道月初赶紧接种的bioTech有没有用。

浅谈为什么进程阻塞时不占用CPU

内核接收数据流程 讨论这个问题,我们需要先大致回顾一下内核接收数据时的过程: 网卡接收数据后,通过DMA写入内核的ring buffer,然后通过软中断和硬中断通知内核有数据到达。 内核派出一个专门线程ksoftirqd 从ring buffer中获取数据帧,用sk_buff表示,然后传入网络协议栈进行处理。 协议栈按照MAC→IP→TCP/UDP的顺序逐层校验sk_buff的报文头,判断是否是发给本机用户程序的数据。 内核按照源目端口和源目IP四元组找到对应的Socket,把数据写入Socket的接收缓冲区。 用户进程对应的系统调用把内核Socket缓冲区的数据拷贝到应用层的缓冲区,然后唤醒用户进程。 Linux的进程调度 在Linux中,进程大致有7种状态:

Go编程模式:Functional Options

函数选项问题 在日常开发中,我们经常遇到需要将业务实体初始化的场景,此时必然会定义一些可变参数,如下图Server结构体这个例子: type Server struct { Addr string Port int Protocol string Timeout time.Duration TLS *tls.Config } 其中,只有Addr和Port是必须的,那么我们应该如何去实现初始化Server对象的函数呢?

Go项目惯用结构

前言 无论我们用什么语言,做什么项目,都应该事先对项目的整体文件夹布局做长远考虑:什么文件应该放哪里,这其实十分重要,一个清晰简洁的项目结构让其他贡献者更容易上手,也让自身的维护与拓展更加方便(还能让开发者显得专业懂行)。Go生态圈里有一个项目的常用结构,它十分普遍且广受认可,今天在这里记录一下,以后新建项目时好当个cheatsheet来用。