记录 · 思考 · 实践

让思绪在这里停留。

关于技术、生活,以及一路走来的观察。

Understanding TCPIP Network Stack

概述 TCP & socket 总结, 网卡 network interface card 网卡需要有驱动才能工作,驱动是加载到内核中的模块,负责衔接网卡和内核的网络模块,驱动在加载的时候将自己注册进网络模块,当相应的网卡收到数据包时,网络模块会调用相应的驱动程序处理数据。 内核如何从网卡接受数据,传统的经典过 …

继续阅读

TCP的几个问题

IP header UDP header TCP header MTU & MSS MSS=MTU-IP包头长-TCP包头长 三次握手 交换初始序列号 交换TCP窗口大小信息 四次挥手 可以三次挥手吗,可以,ack+fin一起发就是三次,启用延迟确认就有三次挥手 2MSL等待状态 TIME_WAIT状态也称为 …

继续阅读

awk note

处理流程 当使用 awk 命令处理一个或者多个文件时,它会依次读取文件的每一行内容,然后对其进行处理,awk 命令默认从 stdio 标准输入获取文件内容,awk 使用一对单引号来表示一些可执行的脚本代码,在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块。awk 的每个花括号内同时可以 …

继续阅读

进程通信 & PIPE

历史 UNIX两大贡献者贝尔实验室和BSD,在进程之间通信侧重不同,前者基于内核对进程之间的通信手段进行了改进,形成了“System V IPC”,而后者则是基于网络形成了套接字。 而POSIX则是IEEE制定的标准,目的是为运行在不同操作系统上的软件提供统一的接口,实现者则是不同的操作系统内核开发人员。 System …

继续阅读

linux定时器时间轮算法

时间轮实现 Linux定时器分为低精度定时器和高精度定时器两种类型,内核对其均有实现。本文讨论的是我们在应用程序开发中比较常见的低精度定时器。作为常用的基础组件,定时器常用的几种实现方法包括:基于排序链表实现、基于小根堆实现、基于红黑树实现、基于时间轮实现。本文讲解的是时间复杂度最优,也是linux内核采用的基于时间轮 …

继续阅读

临界区、信号量、互斥锁、自旋锁与原子操作

临界区、信号量、互斥锁、自旋锁与原子操作 临界区 程序想要使用共享资源,必然通过一些指令去访问这些资源,若多个任务都访问同一资源,那么访问该资源的指令代码组成的区域称临界区。简而言之,临界区是代码 信号量 信号量简单的说是一种计数器,用P/V操作表示减和增。 增加操作包括两个微操作: 增加: 将信号量的值加一 唤醒此信 …

继续阅读

xargs note

作用 xargs,是execute arguments的缩写,它的作用是从标准输入中读取内容,并将 此内容传递给它要协助的命令,并作为那个命令的参数来执行。 与管道的区别 管道可以实现:将前面的标准输出作为后面的 标准输入 管道无法实现:将前面的标准输出作为后面的 命令参数 $ cat /etc/passwd | …

继续阅读

江湖爱情故事

【潇湘夜雨 莫大先生】 衡山派掌门人莫大先生一直没有婚娶。 有一回群雄聚会,刘正风忍不住问他:”师兄,你都一把年纪了,怎么还不娶妻生娃呢?” 莫大先生眼睛半开半闭,拉着他的胡琴,慢悠悠地说出一番话来: 要说成婚哪,首先得找个女人,对吧? 婚姻本来就是男人和女人的事。――东方不败脸色一沉,绣花的手倏然停下。 那么找个什么 …

继续阅读

写一个操作系统_15 内存管理初步

内存管理初步 物理内存 认为的先规划成两部分,用户的物理内存和内核的物理内存,专项专用,内核有方法去占用用户的内存,但是规定两部分内存是专用的,内核只使用自己的物理内存。 物理内存的内核、用户部分分别用 bitmap 来统计管理。 虚拟内存 首先,虚拟内存也是需要管理的,毕竟程序要申请堆上的内存,假定我们只支持512M …

继续阅读

写一个操作系统_14 C 链接与系统调用

用C语言写内核 无论什么语言,要编译成 ELF文件格式(或者定一个其他的标准) int main() { while(1){}; return 0; } 链接可以指定最终生成的可执行文件的起始虚拟地址,我们 指定 内核加载到 0x1500的地方,内核初始化的时候跳转内核要跳转到这个地方。 ld …

继续阅读