vscode 浏览内核代码

  1. 插件: ms-vscode.cpptools
  2. 配置文件: .vscode/c_cpp_properties.json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
    "configurations": [
        {
            "name": "linux",
            "includePath": [
                "${workspaceFolder}/include",
                "${workspaceFolder}/arch/x86_64"
            ],
            "defines": [
                "__GNUC__",
                "__KERNEL__"
            ],
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++14"
        }
    ],
    "version": 4
}

进程管理

  • 说 linux 没有线程并不准确,为了存储进程/线程的信息,比如地址空间和打开的文件资源,需要某处结构体来存储。而 linux 的进程和线程使用同一数据结构体 task_struct。据说是因为这个结构体本身已经足够轻量(2.6中大小约为1.7k)、所以不用像其它操作系统那样设计一个轻量化的线程结构体专门用来存储线程信息。
  • 内核也有后台线程,不同的是这些线程没有地址空间的限制,也不会切换到用户态
  • linux 使用 fork() + exec() 来实现子进程创建,unix 使用 spawn()
  • 父进程没有对子进程(线程)调用 wait() 会导致产生 zombie 进程(线程),zombie 不会消耗系统资源(相关资源已释放,只有 process descriptor 留着),但会占用 pid 号。干掉父进程可释放相应的 zombie
  • mutex lock 会使 task 进入睡眠状态,spinlock 则不会,多核或单核抢占的情况下才需要 lock

进程调度

  • multi-tasking:
    1. preemptive : 给每个进程一定的时间片运行,由调度器决定下一个执行的进程,抢占的单位就是时间片
    2. cooperative : 进程自己决定什么时候让出 cpu (yielding),不需要调度器做太多的事情。(Mac OS 9 / Windows 3.1)
  • 两个冲突的目标:low latency / high throughput ,要低延迟就得多切换,则会导致时间浪费使得吞吐量降低
  • nice 值(NI) 优先度 ,real-time priority(RTPRIO) 值 优先度
  • task_struct.sum_exec_runtime 是实际运行的时间, task_struct.vruntime 是与 NICE 值加权后的时间,CFS 会挑选 vruntime 值最小的进程作为下一个执行的任务
  • update_curr 用于更新相关的 runtime 值,它会被 system timer 定时调用,也会在进程状态发生变化时被调用。
  • CFS 使用红黑树(自平衡有序树)存储调度信息 红黑树