8.进程

进程管理

进程

进程 = 程序 + 执行

进程描述符——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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值