PCB进程控制块

PCB(process control block)称为进程控制块。

一个程序并不是从头到尾一次执行的。进程控制块可以保存进程的上下文。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//进程控制块
struct task_struct {
/* these are hardcoded - don't touch */
long state; /* -1 unrunnable, 0 runnable, >0 stopped */
long counter;
long priority;/*优先级*/
long signal;
struct sigaction sigaction[32];
long blocked; /* bitmap of masked signals */

/* various fields */
int exit_code;
unsigned long start_code,end_code,end_data,brk,start_stack;
long pid,father,pgrp,session,leader;
unsigned short uid,euid,suid;
unsigned short gid,egid,sgid;
long alarm;
long utime,stime,cutime,cstime,start_time;
unsigned short used_math;

/* file system info */
int tty; /* -1 if no tty, so it must be signed */
unsigned short umask;
struct m_inode * pwd;
struct m_inode * root;
struct m_inode * executable;
unsigned long close_on_exec;
struct file * filp[NR_OPEN];

/* ldt for this task 0 - zero 1 - cs 2 - ds&ss */
struct desc_struct ldt[3];
/* tss for this task */
struct tss_struct tss;
};

进程控制块的核心

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct task_struct{
long pid;
long state;


/*信号相关*/
struct signal_struct *signal;
struct sighand_struct __rcu *sighand; /*信号处理函数*/
sigset_t blocked; /*64位屏蔽信号字*/
sigset_t real_blocked;
sigset_t saved_sigmask;
struct sigpending pending; /*未决信号集合*/
unsigned long sas_ss_sp; /*信号处理函数的栈地址*/
size_t sas_ss_size; /*信号处理函数的栈空间大小*/
unsigned int sas_ss_flags;
}

进行抽象

1
2
3
4
5
6
7
8
9
10
11
task_struct{
pid_t pid;
struct mm_struct *mm;/*内存管理*/
files_struct *file;/*文件*/
fs_struct *fs;

}
struct mm_struct{
struct vm_area_struct *mmap;
pgd_t *pgd;
}

一个进程应该具有的属性应该包括

  • 唯一标识
  • 操作的文件集
  • 内存地址空间
  • 信号处理

进程的唯一标识PID与PCB的关系。

用什么数据结构来统一管理进程呢?

进程与进程之间存在父子关系,pid使用树来存储。

链表是一种线性结构,表示进程的先后顺序

哈希表的检索速率高,可以快速查找。

那能不能使用多个数据结构来存储同一块数据,用空间换时间的。

进程的状态

进程的状态为什么不能是开始,运行,结束呢?

进程是一段程序。不断的在交替运行,那当进程被别的进程抢占,暂时停止运行的时候,进程处于睡眠态

  • 就绪

    • 使用fork后加入就绪态

    • 运行后时间片完

  • 运行:

  • 睡眠

    • 深睡眠
    • 浅睡眠:可以被signal唤醒
  • 僵尸:task_struct还没有被释放

  • 暂停

==僵尸态存在的意义==父进程通过查看task_struct的exit_code可以知道子进程死因

作业调度算法

FIFO:先来先服务

RR:轮转

CFS:完全公平调度

调度相关的系统调用