-
2021-01-04 15:40:16
一、进程控制块
进程控制块是存放进程的管理和控制信息的数据结构称为进程控制块。它是进程管理和控制的最重要的数据结构,没一个进程都有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤销而撤销。
在不同的操作系统中对进程的管理和控制机制不同,PCB中的信息存在差异,通常PCB包含如下信息。
1、进程标识符:每个进程都必须有一个唯一的标识符,可以是字符串,也可以是数字,UNIX系统中就是一个整型数,在进程创建时由系统赋予。
2、进程当前状态:说明进程当前所处的状态,为了管理的方便,系统设计时会将相同状态的进程组成一个队列,如就绪进程队列,等待进程则要根据等待的事件组成多个等待队列,如等待打印机队列、等待磁盘I/O完成队列等等。
3、进程相应的程序和数据地址:将PCB与其程序和数据联系起来。
4、进程资源清单:列出除CPU以外的资源记录,如拥有的I/O设备,打开的文件列表等。
5、进程优先级:进程的优先级反映进程的紧迫程度,通常由用户指定和系统设置。UNIX系统采用用户设置和系统计算相结合的方式确定进程的优先级。
6、CPU现场保护区:当进程因某种原因不能继续占用CPU时(等待打印机),释放CPU,这时就要将CPU的各种状态信息保护起来,为将来再次得到处理机恢复CPU的各种状态,继续进行。
7、进程同步与通信机制:用于实现进程间的互斥、同步和通信所需的信号量等。
8、进程所在队列PCB的链接字:根据进程所处的现行状态,进程相应的PCB参加到不同队列中。PCB链接字指出该进程所在队列中下一个进程PCB的首地址。
9、与进程相关的其它信息:如进程记账信息,进程占用CPU的时间等。
二、Liunx进程控制块
在Liunx中每个进程都由task_struct数据结构来定义。task_struct就是我们通常所说的PCB。
struct task_struct { volatile long state; //说明了该进程是否可以执行,还是可中断等信息 unsigned long flags; // flags 是进程号,在调用fork()时给出 int sigpending; // 进程上是否有待处理的信号 mm_segment_t addr_limit; //进程地址空间,区分内核进程与普通进程在内存存放的位置不同 //0-0xBFFFFFFF for user-thead //0-0xFFFFFFFF for kernel-thread //调度标志,表示该进程是否需要重新调度,若非0,则当从内核态返回到用户态,会发生调度 volatile long need_resched; int lock_depth; //锁深度 long nice; //进程的基本时间片 //进程的调度策略,有三种,实时进程:SCHED_FIFO,SCHED_RR, 分时进程:SCHED_OTHER unsigned long policy; struct mm_struct *mm; //进程内存管理信息 int processor; //若进程不在任何CPU上运行, cpus_runnable 的值是0,否则是1 这个值在运行队列被锁时更新 unsigned long cpus_runnable, cpus_allowed; struct list_head run_list; //指向运行队列的指针 unsigned long sleep_time; //进程的睡眠时间 //用于将系统中所有的进程连成一个双向循环链表, 其根是init_task struct task_struct *next_task, *prev_task; struct mm_struct *active_mm; struct list_head local_pages; //指向本地页面 unsigned int allocation_order, nr_local_pages; struct linux_binfmt *binfmt; //进程所运行的可执行文件的格式 int exit_code, exit_signal; int pdeath_signal; //父进程终止时向子进程发送的信号 unsigned long personality; //Linux可以运行由其他UNIX操作系统生成的符合iBCS2标准的程序 int did_exec:1; pid_t pid; //进程标识符,用来代表一个进程 pid_t pgrp; //进程组标识,表示进程所属的进程组 pid_t tty_old_pgrp; //进程控制终端所在的组标识 pid_t session; //进程的会话标识 pid_t tgid; int leader; //表示进程是否为会话主管 struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr; struct list_head thread_group; //线程链表 struct task_struct *pidhash_next; //用于将进程链入HASH表 struct task_struct **pidhash_pprev; wait_queue_head_t wait_chldexit; //供wait4()使用 struct completion *vfork_done; //供vfork() 使用 unsigned long rt_priority; //实时优先级,用它计算实时进程调度时的weight值 //it_real_value,it_real_incr用于REAL定时器,单位为jiffies, 系统根据it_real_value //设置定时器的第一个终止时间. 在定时器到期时,向进程发送SIGALRM信号,同时根据 //it_real_incr重置终止时间,it_prof_value,it_prof_incr用于Profile定时器,单位为jiffies。 //当进程运行时,不管在何种状态下,每个tick都使it_prof_value值减一,当减到0时,向进程发送 //信号SIGPROF,并根据it_prof_incr重置时间. //it_virt_value,it_virt_value用于Virtual定时器,单位为jiffies。当进程运行时,不管在何种 //状态下,每个tick都使it_virt_value值减一当减到0时,向进程发送信号SIGVTALRM,根据 //it_virt_incr重置初值。 unsigned long it_real_value, it_prof_value, it_virt_value; unsigned long it_real_incr, it_prof_incr, it_virt_value; struct timer_list real_timer; //指向实时定时器的指针 struct tms times; //记录进程消耗的时间 unsigned long start_time; //进程创建的时间 //记录进程在每个CPU上所消耗的用户态时间和核心态时间 long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS]; //内存缺页和交换信息: //min_flt, maj_flt累计进程的次缺页数(Copy on Write页和匿名页)和主缺页数(从映射文件或交换 //设备读入的页面数); nswap记录进程累计换出的页面数,即写到交换设备上的页面数。 //cmin_flt, cmaj_flt, cnswap记录本进程为祖先的所有子孙进程的累计次缺页数,主缺页数和换出页面数。 //在父进程回收终止的子进程时,父进程会将子进程的这些信息累计到自己结构的这些域中 unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap; int swappable:1; //表示进程的虚拟地址空间是否允许换出 //进程认证信息 //uid,gid为运行该进程的用户的用户标识符和组标识符,通常是进程创建者的uid,gid //euid,egid为有效uid,gid //fsuid,fsgid为文件系统uid,gid,这两个ID号通常与有效uid,gid相等,在检查对于文件 //系统的访问权限时使用他们。 //suid,sgid为备份uid,gid uid_t uid,euid,suid,fsuid; gid_t gid,egid,sgid,fsgid; int ngroups; //记录进程在多少个用户组中 gid_t groups[NGROUPS]; //记录进程所在的组 //进程的权能,分别是有效位集合,继承位集合,允许位集合 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; //是否使用FPU char comm[16]; //进程正在运行的可执行文件名 int link_count, total_link_ count; //文件系统信息 //NULL if no tty 进程所在的控制终端,如果不需要控制终端,则该指针为空 struct tty_struct *tty; unsigned int locks; //进程间通信信息 struct sem_undo *semundo; //进程在信号灯上的所有undo操作 struct sem_queue *semsleeping; //当进程因为信号灯操作而挂起时,他在该队列中记录等待的操作 //进程的CPU状态,切换时,要保存到停止进程的task_struct中 struct thread_struct thread; struct fs_struct *fs; //文件系统信息 struct files_struct *files; //打开文件信息 spinlock_t sigmask_lock; //信号处理函数 struct signal_struct *sig; //信号处理函数 sigset_t blocked; //进程当前要阻塞的信号,每个信号对应一位 struct sigpending pending; //进程上是否有待处理的信号 unsigned long sas_ss_sp; size_t sas_ss_size; int (*notifier)(void *priv); void *notifier_data; sigset_t *notifier_mask; u32 parent_exec_id; u32 self_exec_id; spinlock_t alloc_lock; void *journal_info; }
更多相关内容 -
进程及进程控制块
2017-04-15 17:19:21在一个系统上可以同时运行多个程序。并发运行,一个进程的指令和另一个进程的指令是交错执行的。 进程的两个基本元素是程序代码(可能被执行相同程序的其他进程共享)和代码相关联的数据集。进程是一种动态描述...进程是程序的一个执行实例,是一个正在执行的程序。能分配处理器并由处理器执行的实体。
在一个系统上可以同时运行多个程序。并发运行,一个进程的指令和另一个进程的指令是交错执行的。
进程的两个基本元素是程序代码(可能被执行相同程序的其他进程共享)和代码相关联的数据集。进程是一种动态描述,但并不代表所有的进程都在运行(进程在内存中因策略或调度需求,会处于各种状态)。
从内核看进程担当分配系统资源(CPU时间,内存)的实体。广义上,所有的进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
进程控制块
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct的结构体。
task_struct是Linux内核的一种数据结构,它会被装载到RAM里并包含进程的信息。每个进程都把它的信息放在task_struct这个数据结构里面,而task_struct包含以下内容:
标示符:描述本进程的唯一标示符,用来区别其他进程。
状态:任务状态,退出代码,退出信号等。
优先级:相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和正在被进程使用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟总数,时间限制,记账号等。保存进程信息的数据结构叫做task_struct,并且可以在include/linux/sched.h里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。进程的信息可以通过/proc系统文件夹查看。要获取PID为400的进程信息,你需要查看/proc/400这个文件夹。大多数进程信息同样可以使用top和ps这些用户级工具来获取。
linux 中ps命令是Process Status的缩写。ps命令可以列出系统中当前运行的进程,所列出的进程是执行ps命令这个时刻正在运行的进程。
附上task_struct所定义在的头文件sched.h的链接吧:
-
进程控制块PCB
2019-04-10 22:56:55我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。 /usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_...我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。
/usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_struct 结构体定义。其内部成员有很多,我们重点掌握以下部分即可:- 进程id。系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
- 进程的状态,有就绪、运行、挂起、停止等状态。
- 进程切换时需要保存和恢复的一些CPU寄存器。
- 描述虚拟地址空间的信息。
- 描述控制终端的信息。
- 当前工作目录(Current Working Directory)。
- umask掩码。
- 文件描述符表,包含很多指向file结构体的指针。
- 和信号相关的信息。
- 用户id和组id。
- 会话(Session)和进程组。
- 进程可以使用的资源上限(Resource Limit)。
进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看。
循环创建n个子进程
一次fork函数调用可以创建一个子进程。那么创建N个子进程应该怎样实现呢?
简单想,for(i = 0; i < n; i++) { fork() } 即可。但这样创建的是N个子进程吗?
从上图我们可以很清晰的看到,当n为3时候,循环创建了(2^n)-1个子进程,而不是N的子进程。需要在循环的过程,保证子进程不再执行fork ,因此当(fork() == 0)时,子进程应该立即break;才正确。#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { int i; pid_t pid; printf("xxxxxxxxxxx\n"); for (i = 0; i < 5; i++) { pid = fork(); if (pid == 0) { break; } } if (i < 5) { sleep(i); printf("I'am %d child , pid = %u\n", i+1, getpid()); } else { sleep(i); printf("I'm parent\n"); } return 0; }
刚fork之后:
父子相同处: text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式…
父子不同处: 1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集子进程复制了父进程0-3G用户空间内容,以及父进程的PCB,但pid不同。真的每fork一个子进程都要将父进程的0-3G地址空间完全拷贝一份,然后在映射至物理内存吗?
当然不是!父子进程间遵循读时共享写时复制的原则。这样设计,无论子进程执行父进程的逻辑还是执行自己的逻辑都能节省内存开销。
cpu 为什么要使用虚拟地址空间与物理地址空间映射?解决了什么样的问题?1.方便编译器和操作系统安排程序的地址分布。
程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
2.方便进程之间隔离
不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程使用的物理内存。
3.方便OS使用你那可怜的内存。
程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,
内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。重点注意!躲避父子进程共享全局变量的知识误区! 每个有子集单独的date区
【重点】:父子进程共享:1. 文件描述符(打开文件的结构体) 2. mmap建立的映射区 (进程间通信详解)
fork之后父进程先执行还是子进程先执行不确定。取决于内核所使用的调度算法 -
进程和进程控制块(PCB)
2019-11-14 08:53:11进程控制块 进程概念 是程序的一次执行过程,是系统进行资源分配和处理机调度的一个独立单位。 是一个运行中程序的描述,通过描述信息中的内存指针可以找到内存中运行的程序代码及数据,并且通过上下文数据可以...目录
进程概念
是程序的一次执行过程,是系统进行资源分配和处理机调度的一个独立单位。
是一个运行中程序的描述,通过描述信息中的内存指针可以找到内存中运行的程序代码及数据,并且通过上下文数据可以保存程序调度切换时正在处理的数据,以及通过程序计数器保存进程切换时程序即将运行的一条指令……等,通过这些描述信息控制一个程序的运行。因此对于操作系统来说进程就是PCB。
进程的特征
- 并发性
- 独立性
- 异步性
- 结构特性:进程=程序段+数据段+PCB
那么进程和程序有何区别,两者又有什么联系?
- 进程是一个动态的概念,程序是一个静态的概念,而进程就是程序的运行实体
- 进程具有并发性,而程序没有
- 进程是资源分配和处理机调度的独立单位,其并发性受系统制约
- 一个程序,多次执行,对应多个进程,不同进程可对应同一程序
例如:我们的个人电脑上装有腾讯QQ,但是我有两个QQ号,大号和小号,当我打开一个QQ登录大号时,我再次打开一个QQ登录小号时,这里腾讯QQ就是程序。但是当你打开登录时,它就对应两个不同的进程,大号进程和小号进程;并且两个进程独立运行,互不影响。
进程状态
进程有三种状态:
- 就绪状态:等待处理机
- 执行状态:使用处理机
- 阻塞状态:让出处理机给其他进程 ,使用处理机状态被中断
状态演变图:
进程控制块
我们知道了进程的概念及生命历程,同时我们都知道现在基本都是多道批操作系统,多个进程同时运行,那么操作系统是如何使这些进程井然有序的运行而不发生冲突呢?他是如何对进程进行管理的呢?
我们知道每个明星都有自己的经纪人,负责明星的行程和活动安排,那么进程有自己的“经纪人”吗?有的,那就是进程控制块(PCB),每个PCB记录着对应进程的详细描述信息,其中有:
- 进程标识符:进程的唯一标识,相等于我们在学校中的学号
- 状态信息: 标识进程的状态
- 进程优先级:相比于其他进程的优先级,(进程调度时使用)
- 程序计数器:记录程序下一条指令的地址
- 内存指针: 程序代码和数据的指针,还有一些共享资源内存块的指针
- 上下文数据:进程执行过程中,CPU处理器中的数据
- I/O状态信息: 显式的I/O请求、分配给进程的I/O设备(例如磁带处理器)和被进程使用的文件列表
- 审计信息: 处理机时间总和,使用时钟数总和,时间限制,审计号等
PCB的作用:OS根据PCB来对并发执行的进程进行控制和管理,同时PCB也是进程存在的唯一标志
-
操作系统知识整理 - 进程控制块
2018-12-29 21:01:08进程的静态描述由3部分组成:进程控制块(Process Control Block,PCB),有关程序段和该程序段操作的数据结构集。 PCB是系统感知进程的唯一实体,用于描述进程的当前情况以及管理进程运行的全部信息,是操作系统中... -
进程控制块Task_struct
2021-11-23 23:45:00在进程执行时,任意给定一个时间,进程都可以唯一地被表征为以下元素: 标识符: 跟这个进程相关的唯一标识符,用来区别其他进程 状态: 进程的几个状态(等待、运行、停止) 优先级: 进程的优先级 -
操作系统中的进程控制块又起什么作用呢?
2020-01-14 09:34:22为了便于系统控制和描述进程的活动过程,在操作系统核心中定义了一个专门的数据结构,称为进程控制块( Process Control block,PCB)。 操作系统利用PCB来描述进程的基本情况以及进程的运行变化过程。PCB是进程存在的... -
PCB(进程控制块)讲解
2019-05-04 22:34:45PCB:进程控制块,实际是一个结构体,放在sched.h文件中,Linux下可以通过whereis sched.h命令查看具体路径 该结构体主要包含: 1.进程id 2.进程的状态:就绪、运行、挂起、停止 3.进程切换时需要保存和恢复的一些... -
PCB(进程管理块)_百度百科
2021-07-23 03:27:06PCB(进程管理块)语音编辑锁定上传视频为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。... -
进程控制块(PCB)的结构
2018-04-07 21:46:12进程控制块 PCB (Process Control Block): 存放进程的管理和控制信息的数据结构称为进程控制块。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,... -
操作系统-进程概念与进程控制块
2018-03-13 15:58:49进程 在学习操作系统时,对于进程我们经常能看到如下几个定义: 一个正在执行的程序。 一个正在计算机上执行的程序实例。 能分配给处理器并由处理器执行的实体...所以我们可以把进程看作由一组元素组成的实体,其... -
操作系统:进程控制块PCB
2020-12-07 15:27:06对于进程控制块PCB的作用、包含的信息以及组织方式进行了相应的介绍! -
进程控制块PCB(进程描述符)
2019-03-24 19:35:48每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。grep -r “task_struct” / 可以查找根目录下,包含task_struct的文件文件。或者 find /usr -name ... -
进程控制块、进程上下文
2016-11-07 23:06:29进程控制块 为了描述和控制进程的运行,系统为每个进程定义了一个数据结构——进程控制块(PCB)。 它是进程重要的组成部分,它记录了操作系统所需的、用于描述进程的当前状态和控制进程的全部信息。 ... -
进程控制块的组织方式及其优缺点?
2020-03-08 16:30:03进程控制块PCB(Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录型数据结构。PCB 中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息。进程控制块的作用是使一个在... -
Linux:进程控制块PCB
2018-04-20 13:10:42PCB:进程控制块 0.PCB是干什么的? 学了操作系统后,我们都知道操作系统要想管理一个对象,它不是直接进行管理的,而是通过得到被管理者的一些有效信息加以管理的,因此在这里我们也可以这样理解,操作系统... -
Linux C/C++编程之(十六)进程及进程控制
2020-07-07 11:47:436)进程控制块PCB 每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。 进程id。系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负... -
进程的概念、状态转换和进程控制块
2018-08-14 08:05:57为了使程序能够并发执行,并且对程序加以描述及控制,引入了进程的概念。 2. 进程的定义 进程是进程实体的运行过程,进程实体由程序段、相关的数据段和PCB三部分构成。在没有引入线程的操作系统中,进程是系统... -
进程控制块包含三类信息以及pcb和数据结构,进程的创建,切换描述
2019-02-18 23:33:43同时,系统可以利用PCB来控制和管理进程,所以说,PCB(进程控制块)是系统感知进程存在的唯一标志。 什么是数据结构: 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据... -
进程控制块包含的信息
2017-02-13 12:17:05进程控制块包含三类信息 1.标识信息。 用于唯一地标识一个进程,常常分由用户使用的外部标识符和被系统使用的内部标识号。几乎所有操作系统中进程都被赋予一个唯一的、内部使用的数值型的进程号,操作系统的其他... -
进程控制块组织方式
2017-02-13 20:35:04进程控制块PCB的组织方式 1)线性表方式:不论进程的状态如何,将所有的PCB连续地存放在内存的系统区。这种方式适用于系统中进程数目 不多的情况。 2)索引表方式:该方式是线性表方式的改进,系统按照进程的... -
linux下的进程控制块和文件描述符
2019-01-21 17:06:28进程—— 所有的进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。 PCB(process control block),进程控制块,是一个数据结构描述,它是对系统的进程进行管理的重要依据,和进程管理相关的... -
[操作系统]进程控制块PCB,进程的三种状态及其转换,进程控制原语
2019-10-16 22:23:28进程=程序段+数据段+进程控制块(PCB) PCB(进程控制块): 操作系统根据PCB对并发执行的进程进行控制和管理 通过PCB来感知进程的存在 一个进程仅有一个进程控制块 PCB组成: 标识符:与进程相关的唯一标识符... -
【OS笔记 7】进程控制块PCB详解
2020-08-16 20:40:12PCB是用以记录与进程相关信息的主存区,是进程存在的唯一标志。 二、PCB中的信息 1. 进程标识符 作用: 用于唯一地标识一个进程 • 进程本身:外标识、内部标识 • 家族信息:父进程、子进程信息 2. 处理机状态 ... -
操作系统——进程管理(进程的概念与进程控制)
2022-03-07 14:22:02进程的概念与进程控制 -
进程控制块PCB详解
2015-06-12 11:23:44PCB(process control block),进程控制块,是我们学习操作系统后遇到的第一个数据结构描述,它是对系统的进程进行管理的重要依据,和进程管理相关的操作无一不用到PCB中的内容。一般情况下,PCB中包含以下内容: (1... -
Linux进程控制(精讲)
2021-09-23 21:55:48文章目录进程创建fork函数初始fork函数返回值写时拷贝fork常规用法fork调用失败的原因进程终止进程退出场景进程常见退出方法_exit函数exit函数return退出进程等待进程等待的必要性进程等待的方法wait方法waitpid方法...