进程初识

一:进程结构体

1
声明目录:include/linux/sched.h

进程的状态

1
2
3
4
5
6
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ 
//1. R:运行(正在运行或在运行队列中等待)
//2. S:中断(休眠中,受阻,在等待某个条件形成或接受到信号)
//3. D:不可中断(收到信号不唤醒和不可运行,进程必须等待直到有中断发生):
//4. T:僵死(进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放)
//5. Z:停止(进程收到SIGSTOP,STGSTP,SIGIN,SIGOU信号后停止运行)

进程的生命周期

进程的进程标识

1
2
pid_t pid;
pid_t tgid;

在linux系统中,所有进程都有直接或间接的联系,每个进程都有其父进程
linux把不同的pid与系统中的每个进程或轻量级线程关联,一个线程组所有线程与零头线程具有相同的pid,存入tgid中;

进程标记

1
unsigned int flags;

反应进程状态信息,但不是运行状态,用于内核识别进程当前的状态,以备下一步操作

表示进程亲属关系的成员

1
2
3
4
5
6
7
8
9
10
11
12
13
/*  
* pointers to (original) parent process, youngest child, younger sibling,
* older sibling, respectively. (p->father can be replaced with
* p->real_parent->pid)
*/
struct task_struct __rcu *real_parent; /* real parent process */
struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
/*
* children/sibling forms the list of my natural children
*/
struct list_head children; /* list of my children */
struct list_head sibling; /* linkage in my parent's children list */
struct task_struct *group_leader; /* threadgroup leader */

进程内核栈

1
2
struct thread_info thread_info;
void *stack;

ptrace系统调用

提供一种父进程可以控制子进程运行,并可以检查和改变它的核心image;

优先级

1
2
3
4
int prio,保存静态优先级,可以通过nice系统调用来进行修改
rt_prority,用于保存实时优先级
normal_prio 取决于静态优先级和调度策略
prio 用于保存动态优先级

调度策略相关字段

1
2
policy 调度策略
sched_class 调度类

task_struct的初始化

1
2
3
4
__mmap_switched_data  arch/arm/kernel/head-common.S
-->__mmap_switched_data
-->.long init_thread_union + THREAD_START_SP @ sp
--> INIT_THREAD_INFO(init_task) init/init_task

`

init进程

linux下有3个特殊的进程,idle进程(PID=0),init进程(PID=1)和kthreadd(PID=2)
ilde进程由系统自动创建,运行在内核态
idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。完成加载系统后,演变成为进程调度,交换;
init进程由idle通过kernel_thread创建,在内核空间中完成初始化后,加载init程序;

三:僵尸进程

其他

当一个进程在执行时,CPU的所有寄存器中的值,进程的状态以及堆栈中的内容被称为该进程中的上下文。当内核需要切换到另外一个进程时,它需要保存当前的所有状态,即保存当前进程的上下文;以便在再次执行该进程时,能够必得到切换时的状态执行下去。在linux中,当前进程上下文均保存在任务数据结构中;
当发生中断时,内核就在被中断的上下文中,在内核态下执行中断服务历程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行;

进程优先级

设置SCHED_FIFO和50 RT优先级

#chrt -f -a -p 50 10576
设置nice

#renice -n -5 -g 9394

#nice -n 5 ./a.out

参考资料

linux调度器发展简述
linux进程描述符task_struct结构体详解–linux进程的管理与调度(一)
Linux下0号进程的前世(init_task进程)今生(idle进程)—-Linux进程的管理与调度(五)