Linux操作系统和进程基本概念(下)

简介: Linux操作系统和进程基本概念

🎵三、进程状态


为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态,而一个进程可以有多少种状态呢?我们可以查看一下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 */
};

我们可以看到后面的注释,没错,其实进程状态没老铁想的那么复杂,在PCB内部就是简单的整数表示的。


查看进程状态的指令是 ps aux / ps ajx / ps axj 这些都可以。


🎈ⅠR状态


要了解什么是R状态,我们首先要明白进程具体在CPU如何执行的。


在操作系统CPU有它的运行队列,在这个队列中都是等待被CPU执行代码的进程,而正在被CPU处理或处于运行队列的进程所处的状态都称为R状态:运行状态。


1669271858654.jpg


这里需要阐明几点:


1、一个CPU在任何时刻只能运行一个进程,一个CPU一个运行队列。


2、让进程进入运行队列的本质就是将该进程的task_struct 结构体对象放入运行队列中。


3、进程PCB只要在runqueue,就是R状态,并不一定是这个进程在运行才是运行状态。

1669272151359.jpg


🎈Ⅱ S状态


👓①阻塞状态


S状态意味着进程在等待时间完成。比较常见的S状态就是阻塞状态。


那么什么是阻塞状态呢?很简单,我们的进程不会只占用CPU资源,它可能随时随地地占用外设,比如我们要打印一些字符到显示器,就是占用外设。那么我们都知道CPU的运行速度是远大于外设的,如果我们的进程需要访问外设而外设较慢,那么此时CPU会停下来等我们访问外设结束吗?这样显然太过于浪费CPU资源了,此时,为了追求效率,操作系统会把该进程连接到外设的等待队列,然后CPU调用执行别的进程。那么此时进程就不是R状态,而是阻塞状态,也称为S状态。


当然,当进程访问外设结束的时候,操作系统会得知然后把进程状态由阻塞(S)改为R状态,放在CPU队列。


1669272165631.jpg


可以看到这里我们需要打印到显示器就是进程在访问使用外设,这里是死循环不停调用外设显示器,当然中间也会调用CPU,但是访问外设可能占用99%的时间,剩下的1%时间调用CPU,所以我们查询显示一般都是S状态。


👓②挂起状态


什么是挂起状态呢?我们都知道内存空间是有限的,如果我们的内存空间充满了大量阻塞的进程导致内存空间不够用这时候怎么办呢?不够的空间我们要找哪里去借空间,去哪里呢?磁盘就是一个不错的地方,它的空间很大!没错,我们的操作系统也是这么处理的,它会把阻塞进程的代码和数据暂时保存到磁盘上为其他进程腾出空间。这种要等待很长时间,被暂时保存到磁盘的进程状态称为挂起。


1669272193002.jpg


🎈 ⅢT状态


T停止状态:可以通过发送SIGSTOP信号给进程来停止(T)进程,这个被暂停的进程可以通过SIGCONT信号让进程继续运行。


首先我们要搞清楚这两个信号是什么鬼?不知道老铁是否还有印象我上文提到的两个没有细说的kill指令呢?

1669272206916.jpg

没错,就是kill -19 和kill -18指令。


kill -19 指令停止进程。


1669272216017.jpg


kill -18 继续进程


1669272230047.jpg


差点忘记,这里还有一个点没说。不知道老铁注意到没有我们之前的进程状态是R+状态,现在是R状态,为什么少了+号,以及+号有什么用处呢?


🖊状态后带有+号的是前台,我们对它的输入无效,只能通过CTRL+c或者kill -9 终止进程。


🖊状态后没有+号的是后台,我们输入的指令有效,但是仍在运行程序,CTRL+c也不能终止,只能通过kill -9 终止进程。


演示:


1669272243521.jpg



通过演示相信老铁感受到了后台和前台的不同。


🎈ⅣD状态


D磁盘休眠状态有时候也叫不可中断睡眠状态,在这个状态的进程通常会等待IO的结束。


D状态叫做深度休眠,那它和S状态有什么区别吗?S状态是浅度睡眠,能够被终止,而D状态是不可被终止的。


那么D状态的应用情景是什么呢?我们有没有这样的一种情景:当操作系统严重内存不足,就连挂起也解决不了的时候,操作系统会采取终止进程的操作,否则操作系统会挂掉。而我们不想让操作系统挂掉某些重要的进程,就把这些进程标识为D状态,避免被终止。在该状态的进程无法被OS杀掉,只能通过断电,或者进程自己醒来来解决。


这种情形只有高IO的情形下才会出现。


🎈Ⅴ t状态


t (tracing sleep)状态 也是一种暂停状态。调试等待运行,当我们调试运行到断点处时我们发现gdb调试的状态为t状态。


插播一个小tip:


1669272284401.jpg


makefile的小技巧


1669272293715.jpg


🎈Ⅵ Z状态


Z(zombie)-僵尸进程。


🖊僵死状态是一种比较特殊的状态。当进程退出但是父进程或操作系统没有读取到子进程退出的返回代码时就会产生僵尸进程。


🖊僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程或操作系统读取退出状态代码。


🖊所以,只要子进程退出,父进程或操作系统还在运行,但父进程或操作系统没有读取子进程状态,子进程进入Z状态。


我们这里写一个脚本指令循环监控显示。


1669272309803.jpg


我们写一个函数,让父进程循环,子进程运行后就停止。


1669272318625.jpg


运行查询进程状态:


1669272327249.jpg


因为我们的代码是子进程只打印一次就停止,父进程是不断循环打印,所以父进程未结束而子进程结束时父进程处于S+状态,而子进程处于Z+状态。


当然,我们不只这种方式使子进程先停止,如果我们使用kill指令终止子进程,子进程也会处于僵尸状态等待父进程运行结束。


1669272336374.jpg


僵尸进程的危害:


🖊进程的退出状态只要不被父进程或操作系统读取就会一直维持僵尸状态下去,内存也一直要分配空间给它。那么要是一个父进程创建很多子进程,而子进程早早结束父进程不回收就会造成内存资源的浪费,可能造成内存泄漏。


至此,我们的进程有三种状态是无法被杀死的状态:D X Z


🎈Ⅶ 孤儿进程


之前是子进程先于父进程结束而处于Z状态,那么有没有可能父进程先结束呢?有的,这种父进程提前结束的子进程被称为孤儿进程。


1669272351663.jpg


注意啊,这里并不是在一个窗口执行指令的,我是同一个用户Gyh开了三个窗口,一个窗口执行运行进程,一个窗口查询进程状态,一个窗口执行杀死父进程指令。


1669272404775.jpg


这里有一个疑问,我们在杀掉父进程之后,为什么不显示父进程为僵尸状态(Z)呢?原因很简单,因为父进程也有它的父进程,在它的父进程显示为Z状态,这里我们更加关注子进程。我们发现子进程有父进程,它的父进程pid为1,那么这个父进程是谁呢?


1669272374069.jpg


🖊我们要明白,父进程先结束这种现象一定是存在的,而子进程也会被操作系统(1号进程)领养,如果不领养,那么子进程退出的时候,对应的僵尸进程,便无法回收了。


我们这里还发现孤儿进程的状态由S+状态变为S状态,由前台切换为后台,所以要想杀死,得用kill -9 指令杀死。


🎵四、进程优先级


🎈Ⅰ基本概念


进程在都能被执行的情况下,我们先做哪个进程和它的优先级有一定关系,优先级高的进程先执行。这个道理很容易明白,因为我们的CPU资源总是有限的,而进程的数量可能很多,我们优先执行比较重要的进程。配置进程优先权对多任务环境的Linux很有用,可以改善系统性能。而Linux优先级的本质也就是PCB里面的整数数字。


🎈Ⅱ查看进程优先级


我们在Linux下使用ps -la 指令会输出以下内容:


1669272427521.jpg


除了我们已经介绍过的pid和ppid,我们Linux进程优先级主要和PRI(Priority)和NI(Nice)有关.那么它们又代表什么意思呢?


🖊PRI即进程的优先级,它的值越小,进程的优先级别越高。


🖊NI 就是我们要说的nice值,它表示进程可被执行的优先级的修正数值。


简单来说,Linux下有一套优先级计算公式:


最终优先级= 固定优先级数80 + nice值


也就是说Linux支持进程运行中,进行优先级调整的,调整的策略就是更改nice值。那么nice值是否可以任意修改呢?当然不是,它的范围是[-20,19]的整数,如果你输入大于19或者小于-20那么按照19和-20处理,也就是说我们最终优先级的范围有40个值,区间是[60,99]。


说了这么多,我们怎么更改进程优先级呢?


用top指令更改nice值。


top --> 按"r"--> 输入进程PID-->输入nice值


演示:


1669272441986.jpg



🎵五、其他概念


🖊竞争性:系统进程数目众多,而CPU资源只有少量,比较老的甚至只有一个,所以进程之间是有竞争属性的。为了高效完成任务,更合理竞争相关资源,便有了优先级。


🖊独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰


🖊并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。


🖊并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。


这里其他都好理解,需要着重强调的是并发的概念。


这里一个CPU时,一个进程并不是直到运行完才被拿下来,单CPU采用时间轮转片的策略,不管进程执行完花多长时间,每个进程比如说只给10ms的时间在CPU上运行,时间到了不管有没有运行结束都必须从CPU上剥离下来,然后放在运行队列,多个进程不断切换,实现单CPU在一个时间段内多个进程同时进行,我们称为并发。


这是具体并发是如何单核实现多进程的。当然这其中还有很多细节需要阐述。


①如果进程没有运行结束就被剥离下来,那么再次被放到CPU上是重新开始运行,还是继续执行之前的进度,如果执行之前的进度,那么产生的临时数据文件被寄存在哪里呢?


②单CPU在任一时间段进行多进程,那么任一时刻呢?


🖊先来回答第一个问题:首先我们要明白单个CPU只有一套寄存器,而且它的空间很小,负责当前正在运行的进程。它当然是继续之前的进度,那么它的临时数据不是由寄存器保管,记住,寄存器只保存当前进程的数据,不会去保存之前进程的数据,之前进程的数据专门保存在内存的某一特定区域。寄存器被所有的进程共享,但是寄存器内的数据,是每个进程私有的,仔细品品。


🖊第二个问题很简单,任一时刻单个CPU只能进行一个进程。

相关文章
|
1月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
82 1
|
11天前
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
78 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
11天前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
13天前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
75 20
|
3天前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
41 7
|
4天前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
25 5
|
5天前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
|
17天前
|
编解码 自然语言处理 JavaScript
智谱发布GLM-OS概念及Agent产品,CogAgent-9B模型开源助力GUI交互场景
11月29日,智谱正式提出 GLM-OS 概念,并发布 AutoGLM 和 GLM-PC 两款 Agent 产品。近期GLM-PC 的基座模型—— CogAgent-9B 开源,供社区进一步开发。
|
1月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
105 13
|
1月前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具