linux kernel 代码相关
代码版本:linux-4.9.327
(最老的一个 long term 版)
多年来第一次鼓起勇气开 linux 源码
感觉也没有那么吓人(?)
不得不感慨 open source 以及 free software 真的是好文明
代码版本:linux-4.9.327
(最老的一个 long term 版)
多年来第一次鼓起勇气开 linux 源码
感觉也没有那么吓人(?)
不得不感慨 open source 以及 free software 真的是好文明
论文: Linux Block IO: Introducing Multi-queue SSD Access on
Multi-core Systems
IO 块设备的吞吐发展迅速,2012 年 SSD 4K 随机读写速度达到 785K IOPS (是不是有点高?)
SSD 随机读写速度与顺序读写持平 (不太清楚)
统一接口
两层队列
软件队列:每个 NUMA 上 或者每个核上 一个队列
硬件队列:每个块设备上 若干队列
tag : 指示 block IO 在 driver 提交队列中的位置,在 IO 完成时指示位置
hctx : hardware context
每个 request_queue 包含若干 request,包含一个 percpu 的 blk_mq_ctx (queue_ctx) ,包含若干 blk_mq_hw_ctx
每个 request 有一个 blk_mq_ctx
每个 blk_mq_hw_ctx 中包含若干 blk_mq_ctx
目前维护了 hardcoding 的 per-cpu 软件队列
使用 sbitmap 维护 pending work
struct blk_mq_hw_ctx { // include/linux/blk-mq.h
struct {
spinlock_t lock;
struct list_head dispatch;
unsigned long state; /* BLK_MQ_S_* flags */
}
struct blk_mq_ctx **ctxs;
struct blk_mq_tags *tags; // bitmap tag
}
struct blk_mq_ctx { // block/blk-mq.h
unsigned int cpu; // ctx 对应的 cpu ?
}
struct blk_mq_tags { // block/blk-mq-tag.h
struct request **rqs; // rqs[tag] 为下标 tag 对应的 request
}
struct request_queue { //include/linux/blkdev.h
struct percpu_ref q_usage_counter;
struct blk_mq_ctx __percpu *queue_ctx; // per cpu 的本队列 context
struct blk_mq_hw_ctx **queue_hw_ctx; // 所有 hardware dispatch queue context ?
unsigned int *mq_map; // 每个 cpu 对应的 hw_ctx 编号 ?
}
struct request { //include/linux/blkdev.h
struct request_queue *q;
}
暗黑的shell修改文件操作
几个命令: cut
, sed
, awk
echo [str] | cut -d [sep] -f [num] #使用分割符[sep]切分字符串[str]并返回第[num]段(从1编号)
sed -e '[desc] [str]' [file] #对文件[file]按照"[desc] [str]"进行修改,并将修改内容输出,原文件保持不变
其中 [desc]
部分格式为 [line][op]
,或 [start line],[end line][op]
,对 第[line]
行,或者 [start line]
到 [end line]
之间所有行进行 [op]
操作
其中行编号1-based,行区间为闭区间[op]
可以为以下操作:
a
: 新增行d
: 删除行c
: 替换(用 [str]
替换选中所有行)d
: 删除(一般没有 [str]
部分)i
: 插入s
: 替换("[start line],[end line]s/[old pattern]/[new pattern]/"
)全局替换: s/[old pattern]/[new pattern]/g
sed -n
: (--silent
) 只显示处理后的结果
cat [file] | sed -n '5,7p' #显示文件5到7行
cat [file] | sed '/oo/d' #删除所有包含"oo"的行,其他行输出
WSL 2 中虚拟机不再和主机共享网络配置,而是和主机在同一子网中
WSL 2 中获取主机 IP 可通过以下方式:
export DNS= `ip route list default | awk '{print $3}' `
或
export DNS= `cat /etc/resolv.conf | tail -1 | cut -d ' ' -f 2`
X11 forwarding 可以做一些好玩的事情,最简单的是 xclock
显示时钟和 xcalc
图形计算器
在之前的电脑用的是 MobaXterm 里自带的 cygwin 的 X11 forwarding 功能,在 MobaXterm 里开一个 cygwin 窗口,在 WSL 里直接 export DISPLAY=$DNS:0
新电脑想尝试一下不用 MobaXterm 的解决方案:首先装一个 win 端的 X11 服务器 VcXrv。装好后打开 XLaunch,注意打开 disable access control。 WSL 端还是 export DISPLAY=$DNS:0
,即可开启X11
通过 ssh -X
将本地端口转发到远程
一些奇妙X11应用:
https://cyber.dabamos.de/unix/x11/
<iframe width="312" height="176" src='http://embed.nicovideo.jp/watch/sm34871494?persistence=1&oldScript=1&referer=&from=0&allowProgrammaticFullScreen=1' frameborder="0"></iframe>
<iframe allowFullScreen={true} width="100%" height="450" scrolling="no"
sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts"
src={`//player.bilibili.com/player.html?aid=541205956&bvid=BV1tA411q7xi&cid=208099724&page=1&as_wide=1&high_quality=1&danmaku=1`}
frameBorder="0"></iframe>
<iframe width="1038" height="584" src="https://www.youtube.com/embed/GBS07vBBWlA" title="和楽器バンド / ロキ from 8th Anniversary Japan Tour ∞ -Infinity-" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>