1. 进程的概念
为什么引入进程?
由于并发运行的程序,操作系统调用每个程序过程不确定导致程序运行结果不可再现(程序运行被干扰),所以要对操作系统调用程序运行过程施加相互制约,由此要引出进程的概念。
运行的程序称为进程,进程是描述和管理程序的“运行过程”。
进程是动态的:程序的一次执行过程;程序是静态的:一组指令的有序集合。
Linux上进程状态
由fork()初建的进程是处于就绪状态的。
1.1 进程的描述
操作系统要根据进程的状态的信息对其进行管理。进程的状态信息存储在进程控制块(Process Control Block,PCB)这个数据结构中(struct),其描述了进程状态、资源、和与相关进程关系的数据结构。PCB是进程的标志:创建进程时创建PCB;进程撤销后PCB同时撤销。
PCB一般包含:
name(ID):进程名称(标识符)
status:状态
next:指向下一个PCB的指针
start addr:程序地址
priority:优先级
cpu_status:现场保留区(堆栈)
comm_info:进程通信
process_family:家族
own_resource:资源
LinuxPCB信息:
Task_struct{
//linux/sched.h
Volatile long state;
Long counter;//counter:进程还可运行tick数量,减至0后进入就绪。
Long priority;
Unsigned long signals;//pending sigs 信号处理函数的入口。
Unsigned long blocked;//masked sigs 阻塞的信号
int pid,pgrp,uid,euid,gid,egid;
struct linux_binfmt;
struct task_struct p_opptr;//ptr to original parent(原始父进程)
struct struct task_struct p_pptr;//ptr to immediate parent(父进程)
task_struct p_cptr;//ptr to most recent child(最新子进程)
struct task_struct p ysptr;//ptr to following sibling(新兄弟)
struct task_struct p_osptr;//ptr to previous sibling(老兄弟)
struct task_struct*next task;//in process list
struct task_struct*prev_task;//in process list
struct task struct*next run;//in ready queue
struct task_struct*prev_run;//in ready queue
1.2 进程的切换
进程的上下文(Context):进程运行环境,主要指CPU环境(各个寄存器的值)。
进程切换过程::换入进程的上下文进入CPU(从栈上来);换出进程的上下文离开CPU(到栈上去)。
2. 进程控制
2.1 进程创建
创建进程的过程:
- 创建一个空白PCB
- 获得并赋予进程标