how and why epoll better
前两天睡不着的时候想到有次面试
Q: Redis 最多支持多少连接?A: 65535? (其实不对)Q: 不是这个,巴拉巴拉然后我开始走神了,后面想想他想说的是这个 select/epoll心情难以言表,不过正好今天水一下
What is I/OIO (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作,通常用户进程中的一个完整IO分为两阶段:用户进程空间<–>内核空间、内核空间<–>设备空间(磁盘、网络等)。IO有内存IO、网络IO和磁盘IO三种
What is I/O Model一般来说分为五种类型:
Blocking IO 阻塞IO在 I/O 操作完成之前,应用程序会一直阻塞等待。
NonBlocking IO 非阻塞IO应用程序不会阻塞等待 I/O 操作完成,可以继续执行其他操作。
IO Multiplexing IO复用一个线程可以同时监视多个 I/O 操作的状态,当有 I/O 操作完成时,内核会通知该线程。
Signal ...
select-译文
select(2) – System Calls Manual
Source
Nameselect, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO, fd_set – 同步 I/O 复用
LibraryC标准库 ( libc, -lc )
Synopsis12345678910111213141516171819#include <sys/select.h>typedef /* ... */ fd_set;int select(int nfds, fd_set *_Nullable restrict readfds, fd_set * _Nullable restrict writefds, fd_set * _Nullable restrict exceptfds, struct timeval * _Nullable restrict timeout);void FD_CLR(int fd, fd_set *set);int FD_ISSET(int fd, fd_set *set);void ...
epoll-译文
epoll(7) – Linux Manual Page
Source
Nameepoll – I/O 事件通知工具
Synopsis1#include <sys/epoll.h>
Descriptionepoll API 执行的任务与 poll(2) 类似:监控多个文件描述符以查看是否有任何可以进行I/O操作的。epoll API 可以用作边缘触发或水平触发接口,并且可以很好地扩展到大量被监控的文件描述符。
epoll API 的核心概念是 epoll 实例 ,这是一个在内核中的数据结构,从用户空间的角度来看,可以将其视为包含两个列表的容器:
兴趣 列表(有时也称为 epoll 集合): 进程已注册感兴趣监控的文件描述符集合。
准备 列表: 一组 “准备就绪” 用于 I/O 的文件描述符。准备列表是兴趣列表中文件描述符的一个子集(或更准确地说,是一组指向这些文件描述符的引用)。准备列表是由内核动态填充的,这是由于这些文件描述符上的 I/O 活动所致。
以下系统调用用于创建和管理 epoll 实例:
epoll-creat ...
daily note
近来一直在看乐子,没想到自己成乐子了,MotherFuck.
昨天做个小面试,做个题:
用两个 goroutine 分别输出 A 1 B 2 … Z 26。
然后我满脑子都是:
1str := "A 1 B 2 ... Z 26"
过了十几分钟脑子里还是这个,属实被自己整笑了。
不过结束后我想了想,其实也不是不行,就是奇怪了点(反正这题也挺奇怪的)
如果要控制输出次序,那就要手动调度,最后本质上是个串行代码,不需要默认的 goroutine 调度。也不需要锁。这个概念就很适合单线程的 Js 的事件驱动,EventLoop。所以这个题的解法就可以乱七八糟的
比如:
123456789101112131415161718192021222324252627282930func main() { res := make(chan rune) wg := sync.WaitGroup{} wg.Add(2) go func() { defer close(res) de ...
go update 1.22
最近 Golang 更新到 1.22 了,这里简单介绍下。我目前是 1.21.5,正好作为对比。
for-loop 变量问题之前的 range 只会生成一个变量,现在每次迭代都会生成新变量。
12345678910111213141516171819202122232425262728293031package mainimport ( "fmt" "time")func main() { names := []string{"Jane", "Max", "Joe"} for _, name := range names { go func() { fmt.Println(name) }() } time.Sleep(time.Second)}// go version: 1.21.5// output:// ...
setup emacs
前一阵子 Emacs 抽风了打不开,我用着 vscode 也凑合就没管。今天正得闲,重新配置一遍。
首先,下载
进入 GNU Emacs download 页。根据自己的系统选择合适的下载方式即可。
比如我是用的 ubuntu,就是:
1sudo apt-get install emacs
配置
下载完正常就可以打开了,不过这时候都是默认配置。方便起见,我 fork 了 purcell 的 emacs.d。然后进入根目录下载即可:
123cd git clone https://github.com/Guaderxx/emacs.d.git .emacs.d
然后打开 Emacs GUI,运行 M-x package-refresh-contents
这个配置是没有包含 golang 的配置的
下载需要的包通过 melpa,也就是在 Emacs 中运行: M-x package-install [package-name]
所以重启一下再下载:
go-mode
gopls
go install golang.org/x/tools/gopls@latest
...
sd_notify
new-source
名称sd_notify, sd_notifyf, sd_pid_notify, sd_pid_notifyf, sd_pid_notify_with_fds, sd_pid_notifyf_with_fds, sd_notify_barrier, sd_pid_notify_barrier – 通知服务管理器关于启动完成以及其他服务状态变化。
概述12345678910111213141516171819202122232425262728293031323334int sd_notify(int unset_environment, const char *state);int sd_notifyf( int unset_environment, const char *format, …);int sd_pid_notify( pid_t pid, int unset_environment, const char *state);int sd_pid_notifyf( pid_t pid, int unset_envi ...
cgroup-v2 译文
原文
这是关于cgroup v2的设计、接口和约定的权威文档。它描述了 cgroup 的所有用户可见的方面,包括核心和特定控制器行为。未来的所有变更都必须反映在本文件中。v1 的文档可在 Documentation/cgroup-v1/ 下找到。
1. Introduction1.1 Terminologycgroup 代表 control group 并且从来不大写。单数形式用于指定整个功能,也用作 cgroup controller 中的限定符。当明确指代多个单独的对照组时,使用复数形式 cgroups。
1.2 What is cgroup ?cgroup 是一种按层次结构组织进程并以受控和可配置的方式沿层次结构分配系统资源的机制。
cgroup 大体上由两部分组成 - 核心和控制器。cgroup 核心主要负责分层组织进程。cgroup 控制器通常负责沿层次结构分配特定类型的系统资源,尽管还有一些实用程序控制器可用于资源分配以外的目的。
cgroup 形成一种树形结构,系统中的每个进程都属于一个且唯一的 cgroup。一个进程的所有线程都属于同一个 cgrou ...
cgroups-v1 译文
原文
1. Control Groups1.1 What are cgroups ?控制组提供了一种聚合/分区任务及其所有后续子任务集的机制,按专门的行为以等级分组。
定义:
cgroup 将一组任务与一个或多个子系统的一组参数相关联。
子系统 是一个模块,它利用 cgroup 提供的任务分组功能以特定方式处理任务组。子系统通常是一个“资源控制器”,用于调度资源或应用每个 cgroup 的限制,但它也可以是任何想要对一组进程执行操作的东西,例如 虚拟化子系统。
hierarchy 是一组排列在树中的 cgroup,这样系统中的每个任务都恰好位于层次结构中的一个 cgroup 中,并且是一组子系统; 每个子系统都具有附加到层次结构中每个 cgroup 的系统特定状态。每个层次结构都有一个与其关联的 cgroup 虚拟文件系统实例。
在任一时刻,可能存在多个活动的任务 cgroup 层次结构。每个层次结构是系统中所有任务的一个分区。
用户级代码可以在cgroup虚拟文件系统的实例中按名称创建和销毁cgroup,指定和查询任务被分配到哪个cgroup,并列出分配给cgroup的任务 ...
memory 译文
原文
内存资源控制器
注意:这份文件已经过时了,它要求提供完整的信息改写。它仍然包含有用的信息,因此我们在这里保留它,但如果您需要更深入的了解,请务必检查当前最新代码。
注意:本文档中内存资源控制器通常被称为内存控制器。不要混淆这里的内存控制器和硬件中使用的内存控制器。
(对于编辑)在本文档中: 当我们提到带有内存控制器的cgroup(cgroupfs的文件夹)时,我们称之为“memory cgroup”。当你看到 git-log 和源代码时,你会看到补丁的标题和函数名称倾向于使用“memcg”。在本文档中,我们避免使用它。
内存控制器的优点和用途内存控制器隔离一组来自系统的其余部分任务的内存行为。LWN 上的文章提到了一些可能的内存控制器的用法。内存控制器可用于:
隔离一个应用程序或一组应用程序。内存消耗大的应用程序可以被隔离并限制在较小的内存使用量范围内.
创建一个内存有限的cgroup;这个可以用作启动是调用参数 mem=XXXX 的一个很好的替代方案。
虚拟化解决方案可以控制他们想要分配给虚拟机实例的内存量。
CD/DVD 刻录机可以控制系统的其余部分所使用的内存量 ...