《Linux内核分析》MOOC课程
创建新进程
如果同一个程序被多个用户同时运行,那么这个程序就有多个相对独立的进程,与此同时他们又共享相同的执行代码。在Linux系统中进程的概念类似于任务或者线程
创建进程,调用fork函数,这是一个系统函数。fork函数与系统函数的调用大体相同,但是fork之后产生了一个新的进程,会发生两次返回。
task_struct的数据结构
每个可以独立被调度的执行上下文都有一个进程描述符,不管是进程还是线程都有自己的 task_struct结构
task_struct的定义链接是,其代码很长,下面就列出一部分
1235struct task_struct {
1236 volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped 描述进程运行状态*/
1237 void *stack;
//指定进程的内核堆栈
1238 atomic_t usage;
1239 unsigned int flags; /* per process flags, defined below */
1240 unsigned int ptrace;
1241
1242#ifdef CONFIG_SMP
1243 struct llist_node wake_entry;
1244 int on_cpu;
1245 struct task_struct *last_wakee;
1246 unsigned long wakee_flips;
1247 unsigned long wakee_flip_decay_ts;
1248
1249 int wake_cpu;
1250#endif
1251 int on_rq;
//运行队列
1252
1253 int prio, static_prio, normal_prio; //定义优先级
1254 unsigned int rt_priority;
1255 const struct sched_class *sched_class;
//进程调度相关的定义
1256 struct sched_entity se;
1257 struct sched_rt_entity rt;
1258#ifdef CONFIG_CGROUP_SCHED
1259 struct task_group *sched_task_group;
1260#endif
1261 struct sched_dl_entity dl;
......