进程和进程块
什么是进程?
进程就是一个正在执行的程序
进程就是正在计算机上执行的程序实例
能分配给处理器并由处理器执行的实体
什么是进程控制块?
当一个程序被加载到内存中会为它分配一个进程控制块,这个进程控制块(PCB)由操作系统创建和管理.在Linux下PCB就是一个task_struct的结构体,这个结构体就是用来描述进程的信息。操作系统是如何管理所有进程呢,就是通过每个进程的描述信息(也就是一个个描述每个进程信息的结构体)用某种数据结构将所有的结构体链接起来进行管理。
简化的进程控制块里有:
1、标识符:跟这个进程唯一相关的标识符
2、状态:如果进程正在执行,那么进程处于运行态
3、优先级:相对于其他进程的优先级
4、内存指针:包括程序代码和进程相关的数据指针,还有和其他进程共享内存块指针
5、上下文数据:进程执行时处理器的寄存器中的数据
6、I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
7、记账信息:可能包括处理器时间总和,使用的时钟数总和、时间限制、记账号
….
那task_struct这个结构体的内容究竟是什么?
struct task_struct {
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
void *stack;
atomic_t usage;
unsigned int flags; //每个进程的标记
int lock_depth; //锁的深度
int prio, static_prio, normal_prio;
unsigned int rt_priority;
const struct sched_class *sched_class;
struct sched_entity se;
struct sched_rt_entity rt;
unsigned int policy;
cpumask_t cpus_allowed;
struct list_head tasks;
struct plist_node pushable_tasks;
struct mm_struct *mm, *active_mm; //进程内存信息
//任务状态
int exit_state;
int exit_code, exit_signal;
int pdeath_signal;
unsigned int personality;
unsigned did_exec:1;
unsigned in_execve:1;
unsigned in_iowait:1;
unsigned sched_reset_on_fork:1;//恢复到默认优先级
pid_t pid; //进程标识符
pid_t tgid;
//表示进程的亲属关系成员
struct task_struct *real_parent; //指向其父进程,如果创建它的的进程不存在,则指向pid为1的init进程
struct task_struct *parent; //指向其父进程,当它终止时,必须向它的父进程发送信号,它的值通常和real_parent相同
struct list_head children; //表示链表的头部,链表中所有的元素都是它的子进程
struct list_head sibling; //用于把当前进程插入到兄弟链中
struct task_struct *group_leader; //指向其所在进程的领头进程
//进程调度
unsigned int ptrace;
struct list_head ptraced;
struct list_head ptrace_entry;
unsigned long ptrace_message;
siginfo_t *last_siginfo;
/* PID/PID hash table linkage. */
struct pid_link pids[PIDTYPE_MAX];
struct list_head thread_group;
struct completion *vfork_done; //供fork()使用
int __user *set_child_tid;
int __user *clear_child_tid;
//cpu时间信息
cputime_t utime, stime, utimescaled, stimescaled;
cputime_t gtime;
cputime_t prev_utime, prev_stime;
unsigned long nvcsw, nivcsw; //上下文切换项
struct timespec start_time;
struct timespec real_start_time;
int link_count, total_link_count;//文件系统信息
struct thread_struct thread;//进程的cpu状态,切换时要保存到停止进程的task_struct
struct fs_struct *fs;//文件系统信息
struct files_struct *files;//打开文件信息
//信号句柄
struct signal_struct *signal;
struct sighand_struct *sighand;
sigset_t blocked, real_blocked;
sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */
struct sigpending pending;
unsigned long sas_ss_sp;
size_t sas_ss_size;
udit_context;
seccomp_t seccomp;
//线程组跟踪
u32 parent_exec_id;
u32 self_exec_id;
//保护数据结构
spinlock_t alloc_lock;
spinlock_t pi_lock;
void *journal_info;日志文件系统信息
struct bio *bio_list, **bio_tail;//堆块设备信息
//虚拟机状态
struct reclaim_state *reclaim_state;
struct reclaim_state *reclaim_state;
struct backing_dev_info *backing_dev_info;
struct io_context *io_context;
struct task_io_accounting ioac;
};