linux每日知识整理

计划每天看一个linux相关的知识点记录到这里

协程相关

cpu绑核

ps -Tp `pidof process_name`
taskset -cp coreid threadid

任务管理

父子任意一方写共享页面时,分配新页,将数据拷贝过去,并减少共享计数

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状态;只是正常情况下被及时处理,难观察到
如何及时处理僵尸进程,分为三类方法

  1. 父进程启动时,注册SIGCHILD处理函数,可以设置IGNORE或者handler(在handler中wait子进程退出);
  2. 父进程中,显示调用wait函数,等待子进程退出
  3. 利用两次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挂载到文件系统中
  1. 给/dev/sdx创建文件系统: mkfs -t type /dev/sdx
  2. 挂载到/home/abc目录:mount -t type /dev/sdx /home/abc
  3. 卸载:umount /home/abc
  4. 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 -> 多进程场景

块设备驱动 通知 设备控制器尽心IO, 设备控制器 设置 DMA进行IO, DMA io完成后 触发中断。

linux中断相关

tasklet和工作队列区别:前者在中断上下文中运行,后者在进程上下文中运行,可休眠

linux调度相关

futex原理是多个线程间内存,通过CAS判断是否能拿到锁,如果拿不到,陷入内核,进行等待。
CAS是cpu指令,不涉及用户到内核的切换。

linux博客

TCP协议疑难杂症全景解析 --出自此人

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。

资源隔离

书籍列表

posted @ 2020-04-13 11:22  holidays  阅读(217)  评论(0编辑  收藏  举报