为什么要建设档案网站,如何将图片生成链接,女装网站建设计划书,沈阳市国际旅行社电话目录 进程是什么#xff1f;
描述进程#xff1a;进程控制块-PCB
task_struct
task_struct 是什么#xff1f;
task_struct内容分类
组织进程
查看进程
fork创建子进程
进程状态 僵尸进程
孤儿进程
进程优先级
其他概念 进程是什么#xff1f;
一般书上…目录 进程是什么
描述进程进程控制块-PCB
task_struct
task_struct 是什么
task_struct内容分类
组织进程
查看进程
fork创建子进程
进程状态 僵尸进程
孤儿进程
进程优先级
其他概念 进程是什么
一般书上说进程是运行当中的程序是担当分配资源的实体。
那么程序是如何被运行的呢
我们写好程序代码后会将程序文件存储到磁盘中要运行一个程序首先会将程序代码文件加载到内存中然后由cpu去运行。
但是只要程序被加载到内存它就是一个完整的进程吗进程和程序仅仅是存储位置不同吗
当然不是进程需要消耗资源那么它就一定会被操作系统所进行管理。
操作系统要管理首先要先描述再组织。
那么操作系统如何对进程进行管理呢
描述进程进程控制块-PCB
当程序被加载到内存后操作系统会为该程序创建进程控制块简称PCBPCB当中存储着该进程属性的集合。
所以完整的进程是什么 进程程序代码数据相关数据结构(也就是进程控制块)。 task_struct
task_struct 是什么
task_struct 是linux当中描述进程的结构体它存储着进程信息。
task_struct与PCB的关系就是task_struct是一种具体的PCB,它是linux环境下具体的PCB。
task_struct内容分类 标识符描述本进程的唯一标识简称PID。
状态任务状态退出代码退出信号等
优先级相对于其他进程的优先级。 程序计数器程序中即将被执行的下一条指令的地址。
内存指针 包括程序代码和相关数据的指针还有和其他进程共享的内存块指针。 上下文数据进程执行时处理器的寄存器当中该进程的数据。下文详解
I/O状态信息显示的IO请求分配给进程的IO设备和被进程使用的文件列表。
记账信息包括处理器时间总和使用的时钟数总和时间限制记帐号等。 其他信息
组织进程 每个进程都对应着一个进程控制块操作系统将这些进程控制块用链表形式组织起来这样对于进程的管理就变成了对链表的增删查改。 查看进程
获取PIDgetpid()
获取PPID:getppid(),PPID表示父进程的ID。
getpid(),getppid()属于系统调用头文件为sys/types.h
我们使用的XShell软件本质就是一款命令解释器我们输入指令后shell不会自己去解释指令而是会产生子进程bash去解释这条指令给内核。
为什么要这么做呢因为如果我们输入了错误指令产生了错误影响不能影响我xshell运行
就相当于某公司员工出了问题为了不影响公司声誉公司对外宣称该员工与公司无关。
这样即使出了问题也不影响公司的整体运行。
这样就由bash来解释这条指令bash进程就是该指令的父进程。 每个进程被创建后会在/proc目录下以该进程PID为名形成目录。
我们可以通过ls /proc/pid查看该进程 下面我们通过ls -l指令查看该进程详细信息。 两个重要概念cwd表示当前工作目录程序当中创建文件默认在该目录下。 exe表示当前执行的程序是谁。
我们也可以通过其他指令查看进程信息。 ps axj 或 ps ajx或 top fork创建子进程 fork属于系统调用作用是创建子进程。
fork函数有两个返回值对于父进程返回子进程pid对于子进程返回0 通过fork函数可以让一个程序产生两个不同的结果。
通过fork创建的子进程子进程的PCB以父进程为模板构建子进程的代码完全和父进程共享因为代码是不可以被更改的而父子进程的数据是临时共享的当父子进程数据要更新时会发生写时拷贝因为进程之间是相互独立的为了防止一个进程数据改变时影响另一个进程所以在数据发生改变时对数据拷贝再更改保证进程之间的独立性。
进程状态 下面展示linux状态源码
/*
* The task state array is a strange bitmap of
* reasons to sleep. Thus running is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] {
R (running), /* 0 */
S (sleeping), /* 1 */
D (disk sleep), /* 2 */
T (stopped), /* 4 */
t (tracing stop), /* 8 */
X (dead), /* 16 */
Z (zombie), /* 32 */
};
为什么要设置这么多状态
因为系统资源很少而进程又很多不是说进程想干嘛就干嘛为了保证平衡所以要合理分配系统资源。
而系统中调度模块就是为了较为平衡分配资源而存在的。 R状态并不意味着进程在被运行它表明进程要么在运行中要么在运行队列里。 S状态休眠状态等待事件完成可以被唤醒。 D状态深度休眠状态与S状态相似但是不可被操作系统杀死。 T状态暂停状态无法被唤醒。 X状态死亡状态 Z状态僵尸状态 当进程所需资源充足满足运行条件时该进程的PCB会被调度模块分配到运行队列中等待cpu运行而其他不满足运行条件的进程被放在等待队列中称为挂起或阻塞状态。
但是为什么R状态并不意味着该进程一直在运行呢
还是因为资源问题你这个进程要运行10s操作系统要是一直让你运行其他进程怎么办呢
所以我们从资源管理器中看到很多进程占用资源好像一直在运行这是错误的。
看似好多进程一直在运行其本质是操作系统根据时间片(单个进程的单次运行最长时间灰常短)快速切换进程运行的结果。 运行队列进程处于R状态而等待队列进程处于S或D或T状态。 当系统负载高时资源不够用操作系统可能会杀掉S状态而D状态进程处于深度睡眠不可中断即使你是操作系统也无法给他杀掉D状态就是爷不干事你也管不了我。 到这里问题又来了既然操作系统不让进程一直运行一直在切换那么我怎么知道你这个程序运行到哪一步呢
因为只有一份寄存器所以进程在离开时要将数据拷贝一份再下次回来运行的时候再把数据拷贝回寄存器然后接着运行。
这种与进程强相关的临时数据就被称作上下文数据。
T状态 我们可以通过发送SIGSTOP 使进程进入T状态也就是发送SIGCONT使进程退出T状态。 我们可以发现退出T状态后S少了号这表示该进程由前端运行变成后端运行后端运行时我们可以输入命令而前端不行。 X,Z状态
当程序执行完毕直接退出是不行的操作系统需要知道你这个程序是正常结束还是非正常结束要是没有这一步万一出错谁背锅
所以在程序执行完毕后该进程会先进入Z状态也就是僵尸状态此时由父进程读取其退出码
读取完毕后进入X状态也就是死亡状态接着才被操作系统释放。
我们无法观测到X状态因为一进入X状态该进程立马就被释放了。 僵尸进程 处于僵尸状态的进程就是僵尸进程。 下面举一个例子父进程一直处于运行态不读取子进程退出码此时子进程就会一直处于僵尸状态。 那么僵尸进程有什么危害呢 僵尸状态必须一直持续直到父进程读取它的退出码。 僵尸状态也需要被维护。维护僵尸状态就是要维护它的数据信息PCB。 那么一直不回收就是造成内存资源浪费造成内存泄漏。 孤儿进程 子进程没噶父进程先噶此时子进程会被1号进程接管。 这种进程就叫孤儿进程。 进程优先级 进程优先级表示cpu资源分配的先后。 优先级高先分配。 通过优先级可以极大提高系统性能。 查看系统进程优先级ps -al
进程优先级为PRI,值越小优先级越高。
而NI表示nice值表示优先级修正值。
默认PRI为80
PRInewPRI(old)默认为80 NI NI有40哥级别-20到19. 修改nice值top指令 进入后按r 其他概念 竞争性进程数目多而cpu只有几个甚至一个所以进程之间具有竞争属性为了高效运行便有了优先级。 独立性多个进程之间独立享受资源运行期间互不干扰。 并发性多个进程在一个cpu下通过切换不同时运行一段时间内让多个进程都得以推进。 并行性多个进程在多个cpu下分别执行同时运行。