-
操作系统 PCB
2020-06-02 20:05:21参考: ...进程控制块,Process Control Block, PCB。...操作系统管理控制进程运行的信息集合,操作系统用 PCB 来描述进程的基本情况以及运行变化的过程,PCB 是进程存在的唯一标志。 进程的创建:为进程创建 PCB。参考:
https://www.jianshu.com/p/1e7397b4d80a
https://blog.csdn.net/IT_10/article/details/89819138
https://www.cnblogs.com/cjdty/p/10911490.html
进程控制块,Process Control Block, PCB。
操作系统管理控制进程运行的信息集合,操作系统用 PCB 来描述进程的基本情况以及运行变化的过程,PCB 是进程存在的唯一标志。
进程的创建:为进程创建 PCB。
进程的终止:回收其 PCB。
进程的组织管理:通过对 PCB 的组织管理实现。
进程控制块中的信息
1) 进程标识符
(1) 内部标识符
操作系统为每一个进程赋予的唯一数字标识符,系统使用。
(2) 外部标识符
由创建者提供,通常由字母与数字组成,往往是由用户(进程)在访问该进程时使用。
描述进程的家族关系,设置父进程标识及子进程标识,还可设置用户标识,以指示拥有该进程的用户。
2) 处理机状态信息
主要是由处理机的各种寄存器中的内容组成的,处理机被中断时,所有这些信息都必须保存在 PCB 中,以便在该进程重新执行时,能从断点继续执行。
通用寄存器、程序计数器 PC、程序状态字PSW。
栈指针:过程调用 / 系统调用 / 终端处理和返回时需要用到。
3) 进程调度信息
进程状态。
进程优先级。
进程调度所需的其它信息:与进程调度算法有关事件,指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因。
4) 进程控制信息
程序和数据的地址。
进程同步和通信机制。为支持进程通信与通信相关的各种标志、信号、信件等,这些信息存在接收方的进程控制块中。
资源清单:除 CPU 以外的、进程所需的全部资源及已经分配到该进程的资源,如打开的文件等。
链接指针:本进程所在队列中的下一个进程的 PCB 的首地址。
作用
PCB 可以被操作系统中的多个模块读或修改,如被调度程序、资源分配程序、中断处理程序以及监督和分析程序等读或修改。
OS 是根据 PCB 来对并发执行的进程进行控制和管理。
PCB 是操作系统中最重要的记录型数据结构。
Linux 系统中用 task_struct 数据结构。
1、作为独立运行基本单位的标志。
2、能实现间断性运行方式。
3、提供进程管理所需要的信息。
4、提供进程调度所需要的信息。
5、实现与其他进程的同步与通信。
组织方式
PCB 通常是系统内存占用区中的一个连续存储区。
线性方式
把所有 PCB 组织在一张线性表中,将该表的首地址存放在内存的一个专用区域中,每次查找时需要扫描全表。
适用于系统中进程数目不多的情况。
链表
把具有同一状态的 PCB,用其中的链接字链接成一个队列。
索引
各个索引表在内存单元中的首地址记录在内存中的专用单元中。添加索引表的方式记录具有相应状态下的某个 PCB 在 PCB 表中的地址。
-
操作系统PCB
2014-10-19 15:55:59以下是进程PCB的结构体。根据该PCB结构,模拟创建进程的就绪队列,可按先来先服务和优先级高者优先算法分别实现就绪队列,并打印出该队列。 -
PCB-操作系统实验
2010-04-07 15:15:37原创JAVA 通过链表实现 PCB静态模拟程序 适合java初学者或者操作系统初学者借鉴 程序通过运行可以直接使用 可以作为操作系统实验作品 决无雷同 内含C语言PCB模拟程序(非原创)可以作为学习参考 -
单片机最小系统 原理图详解 PCB操作 个人备忘
2018-04-18 14:47:34 -
单片机最小系统 原理图详解 PCB操作 备忘
2018-04-18 14:59:20画PCB板, 顺序: 布局 -> 布局原则 -> 电气连线 -> 在keep-out layer层裁剪板子形状 -> 覆铜 小技巧:局部排列有助于快速布局,而不用手动一个个移动 布局原则中很重要的一条是对电源线规则的设置 如何裁剪板子... -
[Linux操作系统]操作系统中关于进程PCB的那些知识
2020-08-16 11:20:26进程是操作系统粉配资源的基本单位,也是分配资源的最小单位 每个进程有自己独立的地址空间和运行状态 进程中一个重要的练习: int main(){ const int a =10; int* p=(int*)&a; *p=11; printf("p =%d,...
进程 PCB
1. 进程
进程是程序运行后所产生的,是操作系统分配资源的基本单位,也是分配资源的最小单位,每个进程都有自己独立的地址空间和运行状态;将进程看作一个链表,操作系统管理进程的话,只要抓住链表的头就可以。
操作系统里面用一个结构体来管理进程得多个信息:PCB
程序= 代码段+数据段
进程=代码段+数据段+堆栈+PCB
查看进程ps -ef
内核中断技术(上下文切换)
先运行A进程,当需要运行B进程时,将A进程得环境信息存放到内存之中,开始运行B进程,当需要再次运行A进程得时候,将B进程的环境信息存放倒内存之中,再从内存之中将A进程的环境信息恢复出来。2. 进程task_struct- PCB
- 进程的内部信息:在Linux中描述进程的结构体叫做task_struct,是Linux内核的一种数据结构包含着进程的信息,它会被装载到RAM(内存)。
task_struct 中管理的信息:
struct task_struct { //进程编号 //进程状态 //打开文件的相关信息 //内存 进程之间的通信信息 struct task_struct *next; struct task_struct *prev; };
task_struct中的mm成员 ,所对应的struct mm_struct管理内存的
mmap指向虚拟的内存空间,它是个链表,每个节点代表的是链表中的一个段, 如(有的节点代表数据段,有的节点代表代码段,有的节点代表映射段)每一段又拥有起始地址和结束地址
操作系统的内核的话:是想访问那个空间就访问那个空间;用户的代码是不能够这样做的。
- 局部性:在有限的物理内存中跑更多的进程(把当前运行的代码放到内存之中,当前尚未运行的代码放到交换分区当中,下一次需要运行的时候再从交换分区拉出来)
虚拟内存和对应的物理内存之间的模块 页表
- 虚拟内存之中连续的页表,到物理内存之中就不一定连续
- 如果需要访问的数据不在物理内存之中,则会出现缺页中断,需要将虚拟地址中的数据拉到物理内存之中
- 把一个不使用的页换出去的策略,FIFO,先进先出(最远最久没有被使用的,可能很久不用,就提前出去)
页表的好处: - 解决了狼多肉少的问题 (很多的进程,只把有用的放进物理内存)
- 进程与进程的隔离(fork再次创建出的进程,虚拟地址相同但所对应的物理内存是不同的),进程与操作系统的隔离
- 加载的代码更少,运行的更快
- 根据需求,可以让两个进程共享同一个物理内存(进程交互,使得其两个进程映射的物理内存相同)
查看环境变量env
自己定义环境变量export +自己定义的环境变量
系统预定义环境变量PATH
- 进程和程序的区别是什么?
- 进程是程序的一次动态执行过程
- 程序是静态的,进程是动态的
- 进程的生命周期相对短暂,程序相对永久
- 进程有PCB
- 一个程序可以对应多个进程,一个进程只能对应一个程序
- 进程的状态变迁
Linux中的7态
进程组:其中ls
和wc-l
是一个组,ls
是组长(终端就是一个会话session,进程组在一个会话之中,会话中有很多的进程组)
3.进程创建和回收
0号进程,负责创建1号和2号进程,负责交换内存和swap
环境变量(名字通常大写):envp for(i=0;i<envp[i]!=NULL;i++){ printf("%d : %s\n",i,envp[i]); } 获取环境变量,给一个环境名,打印出环境变量`getnev()` char* shell = getenv("SHELL"); //获取环境变量 printf("%s\n", shell == NULL ? "NULL" : shell); 设置环境变量: if (putenv("AAA=abc") == 0) { printf("putenv() ok\n"); } else { printf("putenv() error\n"); }
更改命令行参数时,需要将命令行参数和环境变量全部搬走
- 创建进程的一般过程:
分配一个唯一的标识符,在内核中创建出task_struct,复制父进程的环境信息,给新进程分配资源,栈,堆等等,拷贝父进程的地址空间内容,将新进程放入就绪队列
父进程返回的值是子进程的id,而子进程则返回的是0,如果返回-1,表示出错。fork的注意点:
- 父子进程交替运行(抢占运行,需要谁调谁)
- 如果父进程还活着,子进程死了,此时子进程是僵尸状态
- 如果父进程死了,子进程就是孤儿进程,由孤儿院1接管
关于写时拷贝:
其中在创建出子进程后,代码段是不需要再次进行拷贝的,可以共享同一个物理内存,而数据段如果我们只是想要看的话不需要拷贝,一份就够了,如果想要更改这个数据,则需要重新拷贝一份。
例:一个父进程,创建出两个子进程
- 刷新缓存区和exit结束
带有换行符的在结束时已自动刷新缓存,而没有换行符的则等待函数结束后刷新
exit 结束符
exit(0) 0-255 只有16位是保存退出码的
- 收取僵尸和父进程回僵尸子进程
收取僵尸:wait(NULL) 查看返回值
父进程进入僵尸子进程:是抛出异常解决异常的过程
小技巧:
readelf -h
查看头信息
其中text是代码段,data是初始化的数据段,bss未初始化的数据段- 栈空间的大小只有8M
- 如何将进程从磁盘拉到物理内存之中
从磁盘之中先拿出来后,之后将其放到虚拟地址空间之中,依据所对应的页表,放入到物理内存之中;如果切换时,将其放入交换区,将新的进程开始运行,再次使用时,从交换区再取出来。 - 亲缘性(最优化)
服务器都是专用的,不会存在中途切出去后被别的进程打断,数据被清楚掉的情况存在。 - 错误信息
setjmp
和longjmp
反馈错误信息,谁需要谁再在进行修改。
dowhile(0)的用法:
- 进程组
- exec
exec是将磁盘中的代码直接拉到进程之中,将进程之中的代码进行替换,覆盖;但进程的编号不会发生改变,不能够恢复(把之前进程空间全部用新的代码所代替,但再次启动时还是原本的运行代码)int execlp(const char* file, const char *arg)
,其中file时可执行程序的名字,arg为NULL
- 进程的内部信息:在Linux中描述进程的结构体叫做task_struct,是Linux内核的一种数据结构包含着进程的信息,它会被装载到RAM(内存)。
-
操作系统—进程PCB浅析
2018-07-15 17:19:48先了解PCB 进程就是一个运行当中的程序. 程序本来是存储在磁盘的,当我们需要执行它的时候,先把他读取到内存当中,再然后放入到寄存器中,最后让cpu执行程序,这个时候程序就变成了一个进程. 但是进程的生命...先了解PCB
进程就是一个运行当中的程序.
程序本来是存储在磁盘的,当我们需要执行它的时候,先把他读取到内存当中,再然后放入到寄存器中,最后让cpu执行程序,这个时候程序就变成了一个进程.
但是进程的生命周期其实不是很长,因为程序运行结束之后,进程的生命周期就终止了.
那么每一个进程肯定都是一个独立的个体,那么每个进程与进程直接肯定都拥有自己独有的一份管理自己的单独的任务结果
.而这个任务结果就是我们今天的PCB.
每个进程运行的时候都会拿到4G的虚拟内存。其中3G是交给用户的,然后剩下的1G内存存储内核的东西。PCB其实就存储在1G的内核系统空间里面。
它其实就是一个task_struct结构体,里面存储着进程的所有信息。不妨来看看进程task_struct结构体中存的东西吧
struct task_struct { volatile long state; //说明了该进程是否可以执行,还是可中断等信息 unsigned long flags; //Flage 是进程号,在调用fork()时给出 intsigpending; //进程上是否有待处理的信号 mm_segment_taddr_limit; //进程地址空间,区分内核进程与普通进程在内存存放的位置不同 //0-0xBFFFFFFF foruser-thead //0-0xFFFFFFFF forkernel-thread //调度标志,表示该进程是否需要重新调度,若非0,则当从内核态返回到用户态,会发生调度 volatilelong need_resched; int lock_depth; //锁深度 longnice; //进程的基本时间片 //进程的调度策略,有三种,实时进程: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 longsleep_time; //进程的睡眠时间 //用于将系统中所有的进程连成一个双向循环链表,其根是init_task struct task_struct *next_task, *prev_task; struct mm_struct *active_mm; struct list_headlocal_pages; //指向本地页面 unsigned int allocation_order, nr_local_pages; struct linux_binfmt *binfmt; //进程所运行的可执行文件的格式 int exit_code, exit_signal; intpdeath_signal; //父进程终止是向子进程发送的信号 unsigned longpersonality; //Linux可以运行由其他UNIX操作系统生成的符合iBCS2标准的程序 intdid_exec:1; pid_tpid; //进程标识符,用来代表一个进程 pid_tpgrp; //进程组标识,表示进程所属的进程组 pid_t tty_old_pgrp; //进程控制终端所在的组标识 pid_tsession; //进程的会话标识 pid_t tgid; intleader; //表示进程是否为会话主管 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_listreal_timer; //指向实时定时器的指针 struct tmstimes; //记录进程消耗的时间 unsigned longstart_time; //进程创建的时间 //记录进程在每个CPU上所消耗的用户态时间和核心态时间 longper_cpu_utime[NR_CPUS],per_cpu_stime[NR_CPUS]; //内存缺页和交换信息: //min_flt, maj_flt累计进程的次缺页数(Copyon Write页和匿名页)和主缺页数(从映射文件或交换 //设备读入的页面数);nswap记录进程累计换出的页面数,即写到交换设备上的页面数。 //cmin_flt, cmaj_flt,cnswap记录本进程为祖先的所有子孙进程的累计次缺页数,主缺页数和换出页面数。 //在父进程回收终止的子进程时,父进程会将子进程的这些信息累计到自己结构的这些域中 unsignedlong 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_tcap_effective, cap_inheritable, cap_permitted; int keep_capabilities:1; struct user_struct *user; struct rlimit rlim[RLIM_NLIMITS]; //与进程相关的资源限制信息 unsigned shortused_math; //是否使用FPU charcomm[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中 structthread_struct thread; //文件系统信息 struct fs_struct *fs; //打开文件信息 struct files_struct *files; //信号处理函数 spinlock_t sigmask_lock; struct signal_struct *sig; //信号处理函数 sigset_t blocked; //进程当前要阻塞的信号,每个信号对应一位 struct sigpendingpending; //进程上是否有待处理的信号 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; };
每一个进程都需要4G的虚拟内存,而物理内存就那么点,计算机当中有成千上万的进程,那么这些
进程都存自己的PCB,物理内存其实就只有那么一点,那么这些巨大数量的PCB是怎么存储的呢?我们可能需要了解一下物理内存和虚拟内存的关系
接下一章:物理内存与虚拟内存
-
操作系统:进程控制块PCB
2020-12-07 15:27:06对于进程控制块PCB的作用、包含的信息以及组织方式进行了相应的介绍! -
操作系统试验 处理机调度 PCB.
2013-04-25 17:40:38操作系统试验 处理机调度 PCB.下载代码后,Rebuild All即可编译运行,主要是模拟处理机的调度。开始运行有默认数据,根据系统作业的优先权对作业顺序进行排序,每执行一次,优先权会降低(权值+3【权值越低,优先权... -
操作系统3 ————PCB和进程控制
2019-02-02 17:27:28操作系统3 ————进程控制块(PCB)详解 一.目录 操作系统3 ————进程控制块(PCB)详解 一.目录 二. 进程控制块 1.概述 2.进程控制块中的信息 3.进程控制块的作用 4.进程控制块的组织... -
操作系统 进程调度PCB (C++)
2020-12-10 15:56:34一、实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就...(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为: 进程名 指 -
操作系统1_进程控制块PCB
2014-05-30 22:09:00在操作系统中,进程实体是指PCB+程序段+相关的数据段这里主要总结一下进程控制块作用: 使一个在多带程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程 或者... -
进程概念(含PCB)和操作系统以及Shell的简单介绍
2020-03-11 19:25:14进程:操作系统对一个运行中的程序的描述,通过这个描述实现对程序的调度,进程也可以理解成是一个PCB。 程序:一系列有序的指令集合。 二者的区别: 1)进程是动态的,而程序是静态的。 (2)进程有一定的生命期,而... -
操作系统中的JCB、PCB
2016-05-06 14:50:30作业就是用户在一次计算过程中或者一次事务处理过程中要求计算机系统所做的全部工作。一般情况下,一个作业可划分成若干个部分,每个部分完成某项功能,用户把要求计算机系统做的一项相对独立的工作称为一个作业步。... -
操作系统,实验一、基于PCB的进程管理
2020-11-25 21:00:45实验三、基于PCB的进程管理 一、实验目的 通过实验使学生进一步了解进程、进程状态、进程控制等基本概念。基本能达到下列具体的目标: 1、理解进程 PCB 的概念,以及 PCB 如何实现、如何组织以及管理。 2、复习数据... -
操作系统双语阅读 - PCB数据结构
2013-10-28 19:08:33the PCB is expanded to include information for each thread. PCB(进程控制块)被扩展为线程存储信息。 PROCESS REPRESENTATION IN LINUX 进程在Linux中的表示 The process control block in the Linux ... -
操作系统 第二章 进程与PCB--笔记*1
2018-10-14 20:33:54课前问题: ...答:用进程管理,进程有三种状态,就绪·执行和阻塞,而这些信息都记录在进程控制块PCB中,因此操作系统首先查看PCB获取状态,然后调度 3.操作系统怎么知道有几个进程可运行?又怎... -
用java实现操作系统进程调度问题 pcb rq bq
2018-06-03 14:49:01用java实现操作系统进程调度问题pcb.java main.java readyqueue,java blocked.javapackage Process; /* 进程就绪队列:fifo,实现进程调度,处理器从就绪队列选择进程, 是进程从就绪态转为运行态, 数据结构:队列... -
操作系统进程,进程实体,pcb详解
2020-12-22 09:16:22https://blog.csdn.net/qq_19018277/article/details/98292367 -
操作系统笔记 第二章 进程与PCB
2018-11-23 10:54:45** 第二章 进程管理 ** 1.进程的基本概念 1)引入前趋图 描述进程执行前后关系的图 有向无循环图(DAG) - Pi结点:描述一个程序段、进程... 处理机的操作严格按程序规定顺序执行 (2) 封闭性 程序一旦开始执行,其... -
操作系统学习笔记--进程控制块(PCB)
2018-04-02 14:09:50进程控制块(PCB)是OS中最重要的记录型结构(类似于结构体,含有信息:进程标识符、处理机状态、进程调度信息、进程控制信息) OS用PCB对并发进程进行管理和控制。PCB是进程存在的唯一标志。PCB常驻内存。OS专门... -
操作系统 第二章 1 进程与PCB
2018-09-20 22:21:411、前驱图:描述进程的顺序和并发执行的情况。是个有向前驱图。 多程序无序并发,则只会得到混乱的执行结果,多程序运行,符合前驱图,才是合理开发。 2、1)程序顺序执行:顺序性、封闭性、可再现... -
操作系统 第二章 进程与PCB--笔记*2
2018-10-17 20:23:34承接上次笔记– ...4·操作系统的检查和记录需要挂起进程。 进程实体:代码段+数据段+PCB 进程控制块:存放进程的管理和控制信息的数据结构称为进程控制块。 OS对进程进行控制和管理围绕PCB进行 OS调度...
-
matlab产生正弦波及.mif文件的程序-其它文档类资源
-
Leetcode 621. Task Scheduler (cpp)
-
PHP超全局变量
-
FFmpeg4.3黄金系列课程:c++版
-
基于Android的备忘录源码
-
【数据分析-随到随学】数据分析基础及方法论
-
超级好用老板键.rar
-
量化高频交易系统tick数据采集
-
ArcGIS Pro2.6和ArcGIS Enterprise学习
-
【2021】Python3+Selenium3自动化测试(不含框架)
-
flutter插件调用APP页面、使用原生aar,framework库
-
NSL-KDD.zip(KDDCUP99改进版)
-
我的Git笔记.pdf
-
Vue中如何实现代码高亮功能?
-
Centos 如何安装 git
-
初中数学竞赛专家讲座初等数论-2021.01.15.pdf
-
【数据分析-随到随学】数据可视化
-
20. Valid Parentheses
-
旋转LED电子时钟.zip
-
Leetcode 739. Daily Temperatures (cpp)