深入理解Linux内核之进程睡眠(上)
扫描二维码
随时随地手机看文章
1开场白
环境:- 处理器架构:arm64
- 内核源码:linux-5.10.50
- ubuntu版本:20.04.1
- 代码阅读工具:vim ctags cscope
- 睡眠的三种状态
- 睡眠的内核原理
- 用户态睡眠
- 内核态睡眠
- 总结
2. 睡眠的三种状态
任务睡眠有三种状态:浅度睡眠 中度睡眠 深度睡眠2.1 浅度睡眠
进程描述符的state使用TASK_INTERRUPTIBLE表示这种状态。为可中断的睡眠状态,这里可中断是可以被信号所打断(唤醒)。这里给出被信号打断/唤醒的代码路径:kernel/signal.c
SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)
->kill_something_info
->__kill_pgrp_info
->group_send_sig_info
->do_send_sig_info
->send_signal
->__send_signal
->complete_signal
->signal_wake_up
-> signal_wake_up_state(t, resume ? TASK_WAKEKILL : 0)
->wake_up_state(t, state | TASK_INTERRUPTIBLE)
->try_to_wake_up
可以看到在信号传递的时候,会通过signal_wake_up唤醒从处于可中断睡眠状态的任务。2.2 中度睡眠
进程描述符的state使用TASK_KILLABLE表示这种状态。可以被致命信号所打断。这里给出被致命信号打断/唤醒的代码路径:include/linux/sched.h
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
kernel/signal.c
SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)
->kill_something_info
->__kill_pgrp_info
->group_send_sig_info
->do_send_sig_info
->send_signal
->__send_signal
->complete_signal
->
if (sig_fatal(p, sig)