进程控制块(PCB)结构

一、进程控制块(PCB)结构

进程控制块(PCB)是系统为了管理进程设置的一个专门的数据结构。系统用它来记录进程的外部特征,描述进程的运动变化过程。同时,系统可以利用PCB来控制和管理进程,所以说,PCB(进程控制块)是系统感知进程存在的唯一标志。

Linux系统的PCB包括很多参数,每个PCB约占1KB多的内存空间。用于表示PCB的结构task_struct简要描述如下:

include/linux/sched.h
struct task_struct {
 volatile long state;
 struct thread_info *thread_info;
 atomic_t usage;
unsigned long flags;
unsigned long ptrace;

 int lock_depth;

 int prio, static_prio;
 struct list_head run_list;
 prio_array_t *array;

 unsigned long sleep_avg;
 long interactive_credit;
 unsigned long long timestamp;
 int activated;

 unsigned long policy;
 cpumask_t cpus_allowed;
 unsigned int time_slice, first_time_slice;

struct list_head tasks;
 struct list_head ptrace_children;
 struct list_head ptrace_list;

 struct mm_struct *mm, *active_mm;
...
 struct linux_binfmt *binfmt;
 int exit_code, exit_signal;
 int pdeath_signal;
...
 pid_t pid;
 pid_t tgid;
...
struct task_struct *real_parent;
struct task_struct *parent;
struct list_head children;
 struct list_head sibling;
 struct task_struct *group_leader;
...
 struct pid_link pids[PIDTYPE_MAX];

 wait_queue_head_t wait_chldexit;
 struct completion *vfork_done;
 int __user *set_child_tid;
 int __user *clear_child_tid;

 unsigned long rt_priority;
 unsigned long it_real_value, it_prof_value, it_virt_value;
 unsigned long it_real_incr, it_prof_incr, it_virt_incr;
 struct timer_list real_timer;
 unsigned long utime, stime, cutime, cstime;
 unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw;
 u64 start_time;
...
 uid_t uid,euid,suid,fsuid;
  gid_t gid,egid,sgid,fsgid;
 struct group_info *group_info;
 kernel_cap_t cap_effective, cap_inheritable, cap_permitted;
 int keep_capabilities:1;
 struct user_struct *user;
...
 struct rlimit rlim[RLIM_NLIMITS];
 unsigned short used_math;
 char comm[16];
...
 int link_count, total_link_count;
...
 struct fs_struct *fs;
...
 struct files_struct *files;
...
 unsigned long ptrace_message;
 siginfo_t *last_siginfo;
...
 };

调度数据成员:

1) vo latile long state
表示进程的当前状态。进程运行时, 它会根据具体情况改变状态。进程状态总共有TASK RUNN ING ( 可运行状态)、TASK INTERRUPT IBLE ( 可中断的等待状态)、TASK UNINTERRUPT IBLE(不可中断的等待状态)、TASK ZOMB IE( 僵死状态)、TASK STOPPED(暂停状态) 等5种。

2) long pr io rity进程优先级, prio rity 的值给出了进程每次获取CPU 后, 可使用的时间片长度( 单位是jiffies)。

3) unsigned long rt_priority rt_priority 的值给出了实时进程的优先级, rt_priority 
1000给出进程每次获取CPU 后, 可使用的时间片长度(单位是jiffies)。

4) long counter在轮转法调度时counter表示当前进程还可运行多久。在进程开始时被赋为priority的值, 以后每隔一个时钟中断递减1,减到0时引起新一轮调度。

5) unsigned long policy表示该进程的进程调度策略。调度策略有:

SCH ED_OTHER 0, 非实时进程, 用基于优先权的轮转法。

SCH ED_FIFO 1, 实时进程, 用先进先出算法。
SCH ED_RR 2, 实时进程, 用基于优先权的轮转法

进程队列指针:

1) struc t task_struct* next_task, * prev_task
在Linux 中所有进程(以PCB 的形式)组成一个双向链表,
next_task和prev_task是链表的前后向指针。

2) struct task_struct* p_opptr, * p_pptr
struct task_struc t* p_cptr, * p_ysptr, * p_osptr
以上分别是指向该进程的原始父进程、父进程、子进程和新
老兄弟进程的指针。

3) struct task_struct* pidhash_next
struct task_struct** pidhash_pprev
用于链入进程hash表的前后指针。系统进程除了链入双
向链表外, 还被加到hash表中。

进程标识:

uid_t uid  gid_t gid uid和gid分别是运行进程的用
户标识和用户组标识。

pid_t pid  pid_t pgrp pid和pgrp分别是运行进程的
进程标识号和进程组标识号

时间数据成员:

long per_cpu_utime [ NR_CPUS ] per_cpu_stime
[ NR_CPUS]
per_cpu_utime 是用户态进程运行的时间, per_cpu_
stime是内核态进程运行的时间

进程创建时间unsigned long start_time

文件系统数据成员:

struct fs_struct* fs
fs保存了进程本身与VFS( 虚拟文件系统)的关系信息。
struct fs_struct
{
 atom ic_t count;
 rw lock_t lock;
 int umask;
 struct dentry* root, * pwd, * altroot;
 struct vfsm ount* rootmnt, * pwdmnt, * altrootmnt;
}
其中root、rootm nt是根目录的dentry 和其mount点的vfsmount。
pwd、pwdmnt 是当前工作目录的dentry 和其mount 点的vfs..
mount。altroot、altrootmnt是保存根节点被替换之后原来根目标
的dentry和其mount点的vfsmount。

内存数据成员:

1) struct mm_struct* mm
在Linux 中, 采用按需分页的策略解决进程的内存需求。
task_struct的数据成员mm 指向关于存储管理的mm_truc t结
构。

2) struct mm_struct* active_mm
active_mm 指向活动地址空间。

3) mm_segm ent_t addr_ lim it
表示线程空间地址。
用户线程空间地址: 0..0xBFFFFFFF。
内核线程空间地址: 0..0xFFFFFFFF

4) spinlock_t alloc_ lock
用于申请空间时用的自旋锁。自旋锁的主要功能是临界区
保护。

页面管理:

1) int swappable: 1
进程占用的页面是否可换出。swappab le为1表示可换出。
2) unsigned long min_flt, maj_ flt
该进程累计minor缺页次数和major缺页次数。
3) unsigned long nswap
该进程累计换出页面数。
4) unsigned long swap_cnt
下一次循环最多可换出的页数。

 

二、makefile

makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具.

Makefile来告诉make命令如何编译和链接这几个文件。规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

下面举一个简单的例子:(进度条的实现)

1.vim proc.c写入(进度条的实现)

2、vim Makefile写入

第一行中并没有任何参数,只是在冒号(:)后列出编译中所需的文件,当第一行中的任何文件中更改时,make就知道需要重新编译了。

其中.PHONY意思表示clean是一个“伪目标”,清除 所有 .o文件 ,.o文件就是目标文件

3、执行make指令就可以编译proc.c这个程序

时间: 2024-11-10 07:05:20

进程控制块(PCB)结构的相关文章

操作系统1_进程控制块PCB

在操作系统中,进程实体是指PCB+程序段+相关的数据段 这里主要总结一下进程控制块 作用: 使一个在多带程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程 或者,OS是根据PCB来对并发执行的进程进行控制的. PCB常被OS访问,因此其应常驻内存中: 描述方式:linux用task_struct描述,windows用执行体进程块EPROCESS描述 组成成分: 1)进程标示符 (1)内部标示符    OS赋予,唯一的数字标示符 (2)外部标示符 

【Linux】进程控制块PCD结构(tack_struct)

tack_struct结构图: 一.task_struct 结构描述 1.进程状态(State) 进程执行时,它会根据具体情况改变状态.进程状态是调度和对换的依据.Linux 中的进程主要有如下状态,如表4.1 所示. (1)可运行状态 处于这种状态的进程,要么正在运行.要么正准备运行.正在运行的进程就是当前进程(由current 宏 所指向的进程),而准备运行的进程只要得到CPU 就可以立即投入运行,CPU 是这些进程唯一等待的系统资源.系统中有一个运行队列(run_queue),用来容纳所有

Linux中进程控制块PCB-------task_struct结构体结构

Linux中task_struct用来控制管理进程,结构如下: struct task_struct { //说明了该进程是否可以执行,还是可中断等信息    volatile long state;   //Flage 是进程号,在调用fork()时给出 unsigned long flags;   //进程上是否有待处理的信号 int sigpending;    //进程地址空间,区分内核进程与普通进程在内存存放的位置不同 mm_segment_t addr_limit; //0-0xBF

操作系统笔记-进程的组成-进程控制块2015-6-5

进程控制块  PCB(Processing Control Block) 1.进程控制块的概要:进程控制块(Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态.其作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位或与其它进程并发执行的进程.或者说,OS是根据PCB来对并发执行的进程进行控制和管理的. PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息,它使一个

进程控制块的task_struct结构

>进程控制块 在linux中进程信息存放在叫做进程控制块的数据结构中,每个进程在内核中都有?个进程控制块(PCB)来维护进程相关的信息,Linux内核的 进程控制块是task_struct结构体.在Linux中,这个结构叫做task_struct.      task_struct是Linux内核的一种数据结构,它会被装载到RAM?并且包含着进程的信息. 每个进程都把它的信息放在 task_struct 这个数据结构?, task_struct 包含了这些内容: >>>>&g

PCB(进程控制块)--‘task_struct’

在介绍PCB(进程控制块)前,先实现一个'进度条',然后根据编写的程序,分析PCB的具体实现原理.'进度条'的功能是能够在一行中显示出来,同时进度条中有动态的增长变化,能够知道进度条中的比率,同时也需要能够将 显示的知道程序是否正在执行. ◆下面是编写的程序: ●利用'='来动态的显示进度条的变化,通过使用"|/-\\"来表示程序运行的状态,如果想要将进度条进行动态的增长,输出缓冲区是遇到'\n'时,系统会将缓冲区的内容进行输出,但是在编写缓冲区的程序中,使用'\n'肯定是不行的,因为

进程控制块(PCB)

进程控制块PCB 我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体. /usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_struct 结构体定义.其内部成员有很多,我们重点掌握以下部分即可: * 进程id.系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数. * 进程的状态,有就绪.运行.

Linux下的进程控制块—task_struct

Linux下的进程控制块 进程:程序的执行就是进程.也可以把进程看成一个独立的程序,在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代码只属于自己.进程是资源分配的基本单位,也是调度运行的基本单位. 进程控制块(PCB)(系统为了管理进程设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程.系统利用PCB来控制 和管理进程,所以PCB是系统感知进程存在的唯一标志.进程与PCB是一 一对应的).是进程存在和运行的唯一标志,在Linux中用task_struct这个

进程(二) —— 进程控制块

进程(二) —— 进程控制块 进程控制块(PCB, Process Control Block) 定义: 操作系统管理和控制进程运行所用的信息集合 操作系统用 PCB 来 描述进程的 基本情况 以及 运行变化 的过程 PCB是进程存在的唯一标志 每个进程都在 操作系统 中有一个对应的PCB 进程控制块的使用 进程创建 生成 该进程的 PCB 进程终止 回收它的PCB 进程的组织管理 通过对PCB的组织管理来实现 进程控制块内容 进程标志信息 处理机现场保存 进程控制信息 进程控制信息 调度和状态