GNU Stow wget https://ftp.gnu.org/gnu/stow/stow-2.3.1.tar.gz tar xf stow-2.3.1.tar.gz cd stow-2.3.1 ./configure --prefix=$HOME/.local make install prefix=$HOME/.local/stow/stow-2.3.1 cd $HOME/.local/stow perl -I stow-2.3.1/share/perl5 stow-2.3.1/bin/stow stow-2.3.1/ stow -R stow-2.3.1/ bash-completion wget https://github.com/scop/bash-completion/releases/download/2.11/bash-completion-2.11.tar.xz tar xf bash-completion-2.11.tar.xz cd bash-completion-2.11 ./configure --prefix=$HOME/.local mv $HOME/.local $HOME/.local~ make && make install mv $HOME/.local $HOME/.local~/stow/bash-completion-2.11 mv $HOME/.local~ $HOME/.local cd $HOME/.local/stow stow bash-completion-2.11 Git wget https://www.kernel.org/pub/software/scm/git/git-2.41.0.tar.gz tar xf git-2.41.0.tar.gz cd git-2.41.0 ./configure --prefix=$HOME/.local make DESTDIR=tempdir install mkdir -p tempdir/$HOME/.local/share/bash-completion/completions cp contrib/completion/git-completion.bash tempdir/$HOME/.local/share/bash-completion/completions/git mv tempdir/$HOME/....
Linux 进程、线程、调度算法
本文是学习宋宝华老师《Linux 进程、线程和调度》视频的笔记。视频中相关的代码位于 21cnbao/process-courses。 第一部分 进程是资源分配的单位;线程是调度的单位。 进程控制块 PCB:Linux 中为结构体 task_struct。 如何组织系统中的所有 task_struct:同时使用了链表、树、哈希表等数据结构,以适应不同的需求场景(以空间换时间)。 进程生命周期:Linux 中的进程有六种状态:就绪、运行、浅度睡眠、深度睡眠、僵尸、暂停。 就绪:进程刚被 fork 出来或者处于可以被调度的状态。 运行:真的有在被 CPU 执行呢。 睡眠:正在等待资源(阻塞)。深浅睡眠都可以在资源就绪时唤醒,浅度睡眠还可以在收到信号时唤醒。深度睡眠不响应信号,适用于某些需要避免无限递归的情形,例如发生 page fault 时。 僵尸:进程刚死的时候,其所依附的资源已经释放了,但是 task_struct 还没有消失,目的是让父进程有机会通过调用 wait4() 获取子进程的死因。如果父进程总是不调用 wait4(),那么子进程会继续处于僵尸状态,且没有办法用信号 9 等杀死子进程,此时释放僵尸进程的唯一方法是把父进程也干掉。 暂停:收到 STOP 信号,如被 Ctrl+Z 或 gdb 调试时。 内存泄漏:不是指进程死了,内存没释放;而是指进程活着,运行越久,耗费内存越多。 fork():父进程返回子进程的 PID;子进程中返回 0;失败返回 -1。 第二部分 fork():调用后操作系统为子进程创建 task_struct,但最开始其中的资源相关的字段与父进程的 task_struct 中一样(复制了一份),除了 mm,它需要进行写时复制(Copy-On-Write)。 写时复制:最开始,MMU 负责映射进程的虚拟地址 virt1 到物理地址 phy1 上,此时内存的权限是 R+W。调用 fork() 之后,父子进程的 virt1 依然映射到物理地址 phy1 上,但是将对应的页表权限修改为只读,在此之后,无论是父进程还是子进程,在试图修改内存时都会导致 CPU 收到缺页中断。在处理此中断时,Linux 修改写内存的进程的页表,将 virt1 指向新分配的内存,物理地址为 phy2,并将 phy1 中的内容复制到 phy2 中,之后两个进程的页表权限都恢复成 R+W。...
Hello World
这是一篇平平无奇的 Hello World。