计划每天看一个linux相关的知识点记录到这里
协程相关
cpu绑核
ps -Tp `pidof process_name`
taskset -cp coreid threadid
任务管理
父子任意一方写共享页面时,分配新页,将数据拷贝过去,并减少共享计数
linux系统编程
- Linux系统高级编程系列教程
- select,poll and epoll : 这篇讲的很好,里面介绍的epoll与select, poll的区别,从等待事件的角度,等待什么事件,在哪个地方等待。
- Linux 大页面使用与实现简介
- linux调试器
linux状态 2019.12.13
ps aux | grep D
能查到D状态进程,这些就是uninterruptable sleep
D state code means that process is in uninterruptible sleep, and that may mean different things but it is usually I/O.
父进程早于子进程先退出,那么子进程将变成孤儿进程(其被1号进程托管)
后台化进程(连续两次fork)也是利用第一次fork出的进程早于第二次fork出的进程先销毁来实现的。
每个进程退出时,都经历zombie状态;只是正常情况下被及时处理,难观察到
如何及时处理僵尸进程,分为三类方法
- 父进程启动时,注册SIGCHILD处理函数,可以设置IGNORE或者handler(在handler中wait子进程退出);
- 父进程中,显示调用wait函数,等待子进程退出
- 利用两次fork(后台化进程)方式,将孙子进程移交给1号进程,由1号进程负责在进程退出时回收资源
虚拟ip 2019.12.13
最开始没有arp缓存时,是怎么做到的呢
malloc 2019.12.14
os提供了brk, sbrk和mmap三个系统调用;malloc是glibc提供的分配内存api;glibc的malloc默认用的是ptmalloc2算法:
tcmalloc可以替换大多数系统、不同编译器环境下的内存分配函数(malloc/free/new/delete),针对不同的编译器和操作系统,替换的方式有所不同。
对于GCC编译的glibc的替换,则采用GNU C中提供的__attribute__(alias)别名机制,定义和glibc中实际调用的函数同名的函数,并将其声明为tcmalloc对应函数的别名。gcc glibc中内存分配的函数为弱符号(week symbol),在链接时便顺利被tcmalloc替代。
linux 网络
linux 网络源码分析
网络设备接收数据的主要方法是由中断引发设备的中断处理函数,中断处理函数中读取接收到的数据,分配sk_buff数据结构和数据缓冲区,将接收到的数据考入接收缓冲区,并调用netif_rx将sk_buff传递给上层
- 发包流程
网络设备从上层穿下的sk_buff中,将数据放入临时缓冲区中,然后驱使网络设备发送数据。
垃圾回收
实现了mark-sweep gc,挺有意思的
java
linux 文件系统
- 将/dev/sdx挂载到文件系统中
- 给/dev/sdx创建文件系统: mkfs -t type /dev/sdx
- 挂载到/home/abc目录:mount -t type /dev/sdx /home/abc
- 卸载:umount /home/abc
- devtmpfs
在早期的 Linux 版本中,/dev目录包含了所有可能出现的设备的设备文件。很难想象 Linux 用户如何在这些大量的设备文件中找到匹配条件的设备文件。现在 udev 只为那些连接到 Linux 操作系统的设备产生设备文件。
普通块驱动可参考drivers/block/brd.c
io调度层的入口应该是__make_request
scsi_add_device - __scsi_add_device -- scsi_probe_and_add_lun -- scsi_alloc_sdev -- scsi_alloc_queue
scsi驱动框架分析
这个博客中有很多关于linux io的文章,质量挺高
一张图
echo 1 > /proc/sys/vm/drop_cache 确实能减少free 显示的buff, cache
dd 往磁盘读或写数据,主要增长了free的cached列
ssd -> noop, deadline -> IO压力大的场景, cfq -> 多进程场景
linux中断相关
tasklet和工作队列区别:前者在中断上下文中运行,后者在进程上下文中运行,可休眠
linux调度相关
futex原理是多个线程间内存,通过CAS判断是否能拿到锁,如果拿不到,陷入内核,进行等待。
CAS是cpu指令,不涉及用户到内核的切换。
linux博客
TCP协议疑难杂症全景解析 --出自此人
linux使用
- 查看linux系统版本
cat /etc/issue
,查看linux内核版本uname -a
- 用十条命令在一分钟内检查 Linux 服务器性能
虚拟化
virtio driver插在guest os kernal中,可以将io保存到共享内存(可以是跟qemu之间,vhost-user之间的ring)
kvm是一个虚拟化组件,是linux具有hypervisoner的能力
virtio device作为后端,其实现方式从qemu, 到vhost-net(host kernal内),再到vhost-user发生多次变化,主要是为了减少数据拷贝和context switch。
资源隔离
- cgroup
- Everything You Need to Know about Linux Containers, Part I: Linux Control Groups and Process Isolation