当前位置: 首页 > news >正文

进程——概念及状态

目录

概念

介绍

举例

进程状态

概念

解释

实例

R

S

T

 t

Z

孤儿进程


概念

介绍

    大多数初学者会认为进程就是从硬盘加载到内存的可执行文件(当可执行文件被加载到内存里称为程序),实际上并不是这样的,进程其实是操作系统里进程控制块(PCB)和程序。进程控制块是进程的“灵魂”。

    解释:

  1. 程序:它里面包含了代码和数据等
  2. 进程控制块:是操作系统用于管理进程的核心数据结构。其实就是描述进程的属性。PCB是统称,在Linux中具体是叫task_struct

    补充:我列举几个进程控制块里的内容:

  1. 标识符:用于其它进程区分
  2. 状态:进程有运行、挂起、阻塞状态等
  3. 优先级:被CPU执行的先后顺序
  4. 程序计数器:程序中即将执行下一条指令的地址
  5. 内存指针:包括指向程序的代码和相关数据,还有和其它进程共享的内存块
  6. 上下文数据:是进程运行时的状态信息,用于进程切换时保存和恢复状态

    因为OS要对进程进行管理,所以进程控制块要以双链表连接起来,这样对进程的管理,就变成了对双链表的增删查改。这其实就是我在上篇中提到的先描述再组织。

举例

    其实,我们历史上执行的所有的指令,工具包括我们自己的程序运行起来就都是进程。下面我就带大家一起来看看。不过在此之前我先介绍一下getpid()这个函数,这是用于获取当前进程的id号。

    通过使用man手册可以看到:

这是一个系统调用,并且知道了它在哪个头文件里,它下面的getppid()是用来获取父进程id的。pid_t是系统级类型,它表示一个有符号整数类型。

    死循环是为了防止程序运行完进程自动结束,sleep是不想让printf打印太快。运行上面的代码就可以看到下面

    我们可以通过/proc或者ps(这个后面在介绍)来查看进程。/proc是内存级文件,它实时改变。我们可以通过ls /proc来查看系统里所有进程

用cd /proc/pid可以进入到该进程里,用ll可以来查看进程的各种相关信息 

上面的图仅仅只是一部分但是我要说一下cwd和exe,exe表示该可执行文件的位置,cwd表示进程的当前工作目录,这表示进程实际在这个目录开始执行的并且如果后续想创建文件(在不指定路径的情况下)会在当前工作目录中创建。

    想结束进程可以用ctrl + c或者kill -9 pid,要注意ctrl + c杀不死后台进程。

    linux中的进程都是父进程创建的,一个父进程可以有多个子进程

    大家看每次重新启动该程序,它的pid是改变的但它的父进程是不变的。 其实在linux中一般在终端输入命令其父进程一般都是bash。我们启动的这个程序它的父进程就是bash。

    ps一般是用来查当前系统中的进程状态,-ef用来查详细信息。 

    光看子进程id和父进程id也挺没意思的,可以用fork()来创建一个进程。fork()也是一个系统调用,当是父进程时会返回子进程的pid,子进程时会返回0。可以看如下代码:

     运行结果:

    可以看到确实创建了一个进程,我相信大家一定会很疑惑,为什么fork要给父子返回两个不同的返回值?为什么它会返回两次?为什么既可以执行if也可以执行else if?一个一个来说哈。

    fork要给父子返回两个不同的返回值,这是因为父 : 子=1 : n,父进程需要知道子进程的id用来对子进程进行管理和追踪,子进程只需要被创建后完成特定任务而已,返回值不同也是为了更好区分父子进程。

    返回两次,返回语句是最后执行的,再返回前前子进程就已经被创建,创建后就会开始执行下面的内容。所以会返回两次,这其实就有点像浅拷贝。

    上面的解释通了那为什么既可以执行if也可以执行else if就不难理解了。其实就是这样:

    虽然它们是公用的,但进程具有独立性。如果一方的数据被修改,OS会在底层拷贝一份,让未修改数据一方用旧的,另一方用新的。这叫写时拷贝!

    运行结果如下: 

进程状态

概念

    再具体介绍之前我得先解释一下之前提到的运行、挂起、阻塞。

  • 运行:进程在调度队列时称为运行状态。调度是操作系统分配管理CPU等资源的机制 。它决定众多进程谁能获取 CPU 执行,目标是兼顾公平性、高效性等。

    你们可能会好奇task_struct不是以双链表的形式连接的吗?怎么就变成队列了,这个先放放我在后面的解释介绍。

  • 阻塞:等待某种设备或者资源就绪

    上图当进程被加载到CPU时,如果有一个scanf函数就会看看键盘有没有输入(看是否就绪),如果没有就会把task_struct给放入管理设备队列的wait_queue中,这就是阻塞状态,当就绪了就在放入调度队列中。

  • 挂起:在内存在吃紧时,它会把进程的代码和数据给唤出到硬盘里的swap交换分区里,并在适当的时机唤入。

    阻塞是主动等待资源和事件(如I/O完成),挂起是外部干预(如系统资源不足,用户手上暂停)。阻塞是进程的“被动等待”因依赖资源而暂停,保留内存,自动恢复。挂起是系统的“主动管理”为释放资源或人为控制而暂停,释放内存,需手动恢复。

    进程状态的变化 ,表现之一,就是要在不同的队列中进行流动,其本质上就是数据结构的增删查改。

解释

   我们认为的双链表是数据和前驱指针(prev)和后继指针(next),但在这里它把这两个指针放在一个结构体里,然后把这个结构体给放进task_struct里。这样的话就可以实现多种组织方式。

    但是有的时候我们想访问task_struct的其它元素那就需要结构体的起始位置,那在创建一个元素用来存储起始位置?其实不用通过上面的结构体里的指针就可以算出来。具体如下:next/list - ((struct task_struct*)0 -> link)。link是task_struct里上面提到的结构体名,next/list表示结构体的地址,减去是因为在结构体里偏移量时逐渐增加的。

实例

    在linux中具体有:R、S、D、T、t、X、Z这几种:

  1. R:运行状态,进程在运行时或者在运行队列时
  2. S:睡眠状态,其实也就是上面的阻塞状态
  3. D:深度睡眠状态,即深度阻塞,通常由进程自己解除。为什么要存在它呢?就比如一个进程在向硬盘里拷贝内容,它处于阻塞状态,如果这时候内存紧张的话,OS是有可能直接把这个进程给结束的,如果它并没有拷贝完,但由于它结束了就没有人告诉用户,这就很糟糕了,所以才会有这个
  4. T:暂停状态,表示进程已停止运行,通常是进程接收到了停止信号,他将不再占有CPU资源
  5. t:暂停状态,它通常表示进程正在被调试器跟踪时暂停
  6. X:结束状态,当进程执行完后就会是此状态
  7. Z:僵尸状态,它在子进程在推出之后到父进程获得退出信息之前的时间段,如果父进程不读取退出信息那他就会一直存在

    下面我带大家看看在Linux中各种状态。我们用ps来查看,选项a表示所有进程,j表示进程归属的进程组id、会话id、父进程id等,u表示以用户为中心的格式显示进程,提供进程的详细信息,如用户、CPU和内存使用信息。

R

    用ps ajx | head -1 ; ps ajx | grep code来查看进程状态,; 可以实现一行执行两条命令用&&也可以。

    +号表示这是终端进程,不是后台进程,在启动进程时在后面接&会变为后台进程。

S

    上面的其实也是有R的只是它执行的时间太短了,一般查不到。该进程的大多数时间都是在等待往显示屏写入。

T

    用Ctrl + Z暂停进程,想恢复到前台运行用fg,后台用bg。

 t

    用gdb暂停程序,T,t是Linux独有的。

Z

    上面的代码,子进程在两秒后就会结束但父进程并没有对它做任何动作。 

     上面的指令是每隔一秒打印一次进程状态。

孤儿进程

    产生孤儿进程是由于父进程比子进程先挂,这时子进程就会被1号进程领养,子进程就会被称为孤儿进程。此时的该进程就会变为后台进程。1号进程是系统进程它是OS的一部分。

相关文章:

  • NHANES最新指标推荐:NHR
  • DP2 跳台阶【牛客网】
  • win版mysql8.0和redis,解压即用
  • YOLO模型初次训练体验(+实测)
  • 时态--07--过去完成時
  • 探秘「4+3原型驱动的交付模式」如何实现软件快速定制
  • 现代计算机图形学Games101入门笔记(十八)
  • 《算法笔记》11.8小节——动态规划专题->总结 问题 B: 拦截导弹
  • 第二届帕鲁杯时间折叠(TimeFold Paradox)
  • 2025年电工杯新规发布-近三年题目以及命题趋势
  • vLLM框架高效原因分析
  • 游戏开发实战(三):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
  • 【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite
  • Unity3D仿星露谷物语开发47之砍树时落叶特效
  • 四元数中 w xyz 的含义及应用
  • 一文掌握 LoRA 常见变体
  • Ubuntu操作系统里面安装Docker Compose
  • 大模型高效微调技术全面解析:从PEFT原理到实战应用
  • 简单理解 LightRAG
  • 力扣-快乐数
  • 百年前淮北乡村的风俗画卷——读郑重 《九十自述》
  • 北证50年内涨超42%,创历史新高!后市机构怎么看?
  • 中国社科院国际合作局副局长廖凡调任世界经济与政治研究所所长
  • 欧盟就逐步放松对叙利亚制裁达成一致
  • 取得金奖西瓜品种独家使用权的上海金山,为何要到异地“试种”?
  • 西域都护府博物馆今日在新疆轮台县开馆