进程管理
进程
进程 = 程序 + 执行
进程描述符——PCB
它主要记录了
- 进程的运行状态
- 程序计数器
- CPU寄存器
- CPU调度信息
- 内存管理信息
- 统计信息
- 文件相关信息
struct task_struct {
// 进程的属性
// 进程间的关系
// 进程调度相关信息
// 内存相关信息
// 文件管理相关信息
// 信号相关信息
// 资源限制相关信息
}
进程属性的相关信息:
TASK_RUNNING, TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE, EXIT_ZOMBIE, TASK_DEAD
调度相关的信息:
prio, static_prio, normal_prio, rt_priority, sched_class, se, rt, dl, policy, cpus_allowed
进程间关系:
real_parent, children, sibling, group_leader
内存管理
mm, fs, files
进程的生命周期
创建态, 就绪态, 执行态, 阻塞态, 终止态。
TASK_RUNNING, TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE, __TASK_STOPPED, EXIT_ZOMBIE
#define set_task_state(tsk, state_value) \
set_mb( (tsk)->state, (state_value) )
#define set_current_state(state_value) \
set_mb(current->state, (state_value) )
进程标识
getpid() --> tgid
gettid() --> pid
#define next_task(p) \
list_entry_rcu( (p)->tasks.next, struct task_struct, tasks)
#define for_each_process(p) \
for( p=&init_task ; (p = next_task(p)) != &init_task ; )
获取当前进程
#define get_current() ( current_thread_info()->task )
#define current get_current()
进程的创建和终止
fork, vfork, clone, 内核线程
do_fork
fork --> sys_fork --> do_fork --> copy_process
vfork --> sys_vfork --> do_fork --> copy_process
clone --> sys_clone --> do_fork --> copy_process
kthread_create --> do_fork --> copy_process
进程调度
进程切换
__schedule()
static void __sched __schedule(void)
{
next = pick_next_task(rq, prev);
if(likely(prev != next)) {
rq = context_switch(rq, prev, next);
}
}
static inline struct rq *
context_switch(struct rq *rq, struct task_struct *prev,
struct task_struct *next)
{
struct mm_struct *mm, *oldmm;
mm = next->mm;
oldmm = prev->active_mm;
switch_mm(oldmm, mm, next);
// 切换进程上下文
switch_to(prev, next, prev);
barrier();
return finish_task_switch(prev);
}