进程:执行中的一个程序,它是动态的实体。、
操作系统原理: 进程是进程调度和资源分配的基本单位,线程是进程调度的基本单位。
进程四要素:
1.有一段程序供其执行。这段程序不一定要某个进程所有,可以与其它进程共用。
2.有进程专用的内核空间堆栈。
3.在内核中有一个task_struct 结构,我们通常称为进程控制块。有了这个结构进程才能成为内核调度的基本单位。进程和线程都有这个结构。
4.有独立的用户空间。
有独立的用户空间--------Y----进程
有用户空间-----Y---用户线程
-----N--内核线程
在linux中,线程,进程都使用struct task_struct 来表示,它 包含大量描述进程,线程的信息,其中比较重要的有:
pid_t pid;
进程号,最大值10亿。
volatile long state 进程状态
1-TASK_RUNNING
进程正在被cpu执行,或者准备就绪,随时可以执行。当一个进程被创建时,就处于此状态。对应操作系统原理中的就绪和执行。
2-TASK_INTERRUPTIBLE
处于等待中的进程,待等待条件为真时被唤醒,也可以被信号或者中断唤醒。
对应操作系统原理中的阻塞。linux中把阻塞分为几种阻塞。
3-TASK_UNINTERRUPTIBLE
处于等待中的进程,待资源有效时唤醒,但不可以由其它进程通过信号signal或中断唤醒。
4-TASK_STOPPED
进程终止执行。当接受到SIGSTOP SIGSTP等信号时,进程进入该状态,接受到SIGCONT信号后,进程重新回到TASK_RUNNING。
5-TASK_KILLABLE
被SIGKILL唤醒。
6-TASK_TRACED
正处于被调试状态的进程。
7-TASK_DEAD
进程退出时(调用do_exit)state字段被设置为该状态。
int exit_state进程退出时的状态。
EXIT_ZOMBIE(僵死进程)
表示进程的执行被终止,但是父进程还没有发布外waitpid()系统调用来收集有关死亡的进程信息。
EXIT_DEAD(僵死撤销状态)
表示进程的最终状态。父进程已经使用waitpid()系统调用来收集信息,因此进程将由系统删除。
struct mm_struct *mm
进程用户空间描述指针,内核线程该指针为空。
unsigned int policy
进程的调度策略
int prio
优先级
int static _prio
静态优先级
struct sched_rt_entity rt;
rt->time_slice
时间片,进程的缺省时间片与进程的静态优先级相关。
创建进程--用户空间--fork vfork
调度---从就绪的进程中选出最适合的一个来执行。
SCHED_NORMAL:普通的分时进程。
SCHED_FIFO:先入先出的实时进程
SCHED_RR:时间片轮转的实时进程
SCHED_BATCH:批处理进程
SCHED_IDLE:只在系统空闲时才能够被调度执行的进程。
撤销进程--exit()
调度类:
CFS调度类(kernel/sched_fair.c中实现)用于以下调度策略SCHED_NORMAL.SCHED_BATCH.SCHED_IDLE.
实时调度类(kernel/sched_rt.c中实现)用于SCHED_RR SCHED_FIFO