目录
1、什么是进程?
课本概念:程序是一个执行实例,正在进行的程序等
内核观点:担当分配系统资源(CPU时间、内存)的实体
长什么样子?就是下面
你会发现,一个操作系统内部,可以同时存在多个进程
有多个进程,就要管理
怎么管理?
先描述,再组织。
运用前面博主关于操作系统从管理角度的理解的文章,延展出来,将之逻辑套用在进程的进行理解。
按照这个逻辑,什么是进程?
进程 = PCB + 进程本身的数据和代码
要管理进程,首先要描述
用c语言描述,就是一个名为PCB的结构体(process control block 进程控制模块)
注意,一个进程必须对应一个PCB
这个结构体包含该进程的所有信息,例如执行时间、数据代码位置、进程id等等信息
即:
struct PCB
{
//所有属性
struct PCB* next;
//内存指针(指向进程所在内存的代码和数据位置)
};
这样,用一个统一的PCB结构体,完成了一个进程的描述
A进程,创建A的PCB结构体
B进程,创建B的PCB结构体
C进程,创建C的PCB结构体
以此类推,每一个进程对应创建一个PCB进程
所有的进程都同属于一个PCB类型对象,不同只是各自的属性值和数据
为什么要有PCB?因为操作系统对进程要进行管理
如此,对象类型描述完毕,接下来就是组织
每一个PCB都有一个next指针
我们每新创建一个新的进程,就将这个进程加入进程链表
A->B->C->…….
到此,对进程的管理,就变成了对进程链表的管理,即增删查改
也变成了对进程数据的管理,类似于上文校长对学生的管理。
这个链表数据结构存在操作系统内部,称为内核数据结构
操作系统的代码和数据本身也是存在磁盘,
电脑开机的时间,其实就是把操作系统的代码和数据加载到内存中运行的时间
到此,对于进程的基本理解就已经有了
同时,上述对操作系统的管理理解部分,也是为了引出PCB这个概念的合理性
不显的那么突兀,理解顺畅
而PCB是一个操作系统学科上,对进程控制模块的一个统称,是一个抽象的概念
事实上各个操作系统有不同的命名,例如Linux对PCB的命名为task_struct
同时,进程的执行,就是把一个一个进程队列的对头拷到CPU内部执行的过程
这个就是进程的调度
2、task_struct内部的属性
(1)PID:process_id 进程id
(2)进程状态:int status;
进程状态对应着task_struct内部的一个属性值
例如:
#define RUN 0
#define SLEEP 1
#define STOP 2
....
status = RUN / SLEEP / STOP
内部的细节,有如下图表所示:
在 Linux 内核中,task_struct 结构体包含了大量的属性来描述和管理进程的状态、资源和行为。以下是一些主要的 task_struct 内部属性的表格组织:
属性 | 描述 |
---|---|
pid_t pid | 进程的唯一标识符 |
volatile long state | 进程的当前状态(运行、等待、停止等) |
struct task_struct *real_parent | 父进程的指针 |
struct list_head children | 子进程链表 |
struct list_head sibling | 兄弟进程链表 |
struct mm_struct *mm | 进程的内存管理信息 |
struct files_struct *files | 进程打开的文件列表 |
struct signal_struct *signal | 进程的信号处理信息 |
struct sighand_struct *sighand | 进程的信号处理方法 |
struct nsproxy *nsproxy | 进程的命名空间代理 |
struct cred *cred | 进程的安全凭证信息 |
unsigned long flags | 进程的标志位,如运行在用户态还是内核态等 |
char comm[TASK_COMM_LEN] | 进程的名称 |
int prio | 进程的调度优先级 |
int static_prio | 进程的静态优先级 |
int normal_prio | 进程的普通优先级 |
unsigned int time_slice | 进程的时间片大小 |
unsigned int rt_priority | 进程的实时优先级 |
struct sched_entity se | 进程的调度实体信息 |
struct timer_list real_timer | 实时定时器,用于实时进程的调度 |
struct task_struct *group_leader | 进程组的领导者 |
unsigned long policy | 进程的调度策略 |
struct sched_param sched_param | 进程的调度参数 |
struct timer_list *timer | 进程的定时器列表 |
struct pid_link pids[PIDTYPE_MAX] | 进程的 PID 链接列表 |
struct user_struct *user | 进程的用户信息 |
这些属性组织在 task_struct 中,为内核提供了管理和控制进程的各种信息和能力。具体的结构和属性可能会因不同的 Linux 内核版本而有所不同。
3、内核原码
有兴趣的同学,还可以自己去查看原码,网站地址如下