【操作系统】Linux进阶必须掌握的进程、线程及调度算法~进程学习

news2024/12/23 13:47:22

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 */
    };
    面这张图片展示了进程状态之间的关系,现在我们完全不知道这是什么东西!我们接下来逐一分析。
    在这里插入图片描述
    R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
    S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡(interruptible sleep))。
    D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
    T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
    X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

1. 进程各状态的概念

1.1 R-运行态(running)

运行态是进程正在CPU上运行,还是进程只要在运行队列中就叫做运行态呢?
答:所谓的运行态,是只要在运行队列中就叫做运行态,代表我已经准备好了,随时可以被调度!
在这里插入图片描述

1.2 终止状态(stopped)

终止状态是这个进程已经被释放,就叫做终止态?还是该进程还在,只不过永远不运行了,随时等待被释放?
答:进程还在,只不过不运行。

此时,我们想问,进程都终止了,为什么不立马释放对应的资源吗,而要维护一个终止态??
答:我们要释放进程需要花费时间,有没有可能,当前操作系统很忙呢。

1.3 运行阻塞

一个进程使用资源的时候,可不仅仅是在申请CPU资源!‘
进程可能申请更多的其他资源:磁盘,网卡,显卡,显示器资源,声卡/音响
如果我们申请CPU资源,暂时无法得到满足,需要排队的–运行队列

那么如果我们申请其他慢设备的资源呢? — 也是需要排队的!(tast_struct在进程排队)

当进程访问某些资源(磁盘,网卡),该资源如果暂时没有准备好,或者正在给其他进程提供服务,此时:1.当前进程要从runqueue中移除;当前进程放入对应设备的描述结构体中的等待队列!(wait_queue)

当我们的进程此时在等待外部资源的时候,该进程的代码不会被执行,此时进程处于的状态叫做进程阻塞。

阻塞是一种临时状态。

1.4 运行挂起

之前我们提到过,代码是存放在磁盘中的,当运行程序时,先将程序加载到内存,那么当内存不足了怎么办?
当内存不足的时候,操作系统会将该进程的代码进行辗转腾挪,如何辗转腾挪–短期内不会被调度的进程,他的代码和数据依然在内存中!就是在白白浪费空间!操作系统就会把该进程的代码和数据置换到磁盘上!此时被暂时置换到磁盘上的进程就叫做进程挂起。
在这里插入图片描述

2.Linux 进程状态

2.1 R运行状态

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。


#include <stdio.h>
#include <unistd.h>
int main()
{
	while(1)
	{
		printf("这是一个进程  %d\n",getpid());
		sleep(1);
	}
	return 0;

(base) [jianming_ge@localhost ~]$ ps ajx | head -1 && ps ajx | grep "rrr" | grep                                      -v grep
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
20470 29827 29827 20470 pts/7    29827 S+    1002   0:21 ./rrr.o

在这里插入图片描述
发现运行的进程怎么是S呢? 这是因为printf函数太快了,而显示器显示速度太慢啦,因此这个进程看似实在死循环,其实大多数时间都在等待显示器。那么怎么才能进入运行态呢,我们屏蔽掉printf函数,只保留while循环再次进行查看发现已经处于运行态了。
在这里插入图片描述

2.2 S 睡眠状态

s对应的状态一般叫做阻塞状态!
如何把睡眠状态叫醒呢?只需要把进程状态从S睡眠态转换成R运行态即可。
我们常常把S状态叫做浅度睡眠(也叫做可中断睡眠),浅度睡眠可以被唤醒或者杀掉他。

在这里插入图片描述

3. 其它

cpulimit 就是不断地把它xx 在running 在两个状态切换。

  1. cpulimit
    cpulimit是一个用于限制进程CPU使用率的工具。它使用cgroups进行管理。
    在这里插入图片描述
main()
{
	while(1);
}

常驻进程的死循环,一直占用100%的cpu。那么我们不像让他占用cpu这么多,所以需要cpulimit来限制它

要在CentOS 7上安装cpulimit,请遵循以下步骤:

  1. 打开终端并使用root用户登录系统。

  2. 运行以下命令以更新系统软件包:

    yum update
    
  3. 安装EPEL存储库。运行以下命令:

    yum install epel-release
    
  4. 安装cpulimit。运行以下命令:

    yum install cpulimit
    
  5. 验证cpulimit是否已成功安装。运行以下命令:

    cpulimit --version
    

此命令应该返回cpulimit的版本信息,表示已成功安装。


(base) [jianming_ge@localhost ~]$ climit 20509
-bash: climit: 未找到命令
(base) [jianming_ge@localhost ~]$ cpulimit 20509
Error: You must specify a cpu limit percentage
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 3200 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --include-children limit also the children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Report bugs to <marlonx80@hotmail.com>.
(base) [jianming_ge@localhost ~]$ cpulimit -p 20509
Error: You must specify a cpu limit percentage
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 3200 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --include-children limit also the children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Report bugs to <marlonx80@hotmail.com>.
(base) [jianming_ge@localhost ~]$ cpulimit -p 20509 -l 40
Process 20509 found

(base) [jianming_ge@localhost ~]$ cpulimit -p 15452 -l 40

在这里插入图片描述

通过这个命令,就把它限制到了40%,其实就是不断的ctrl+z, fg 实现的!!
2. 僵尸进程

#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>

int main(void)
{
    pid_t pid,wait_pid;
    int status;
    printf("hello world!!!!");
    if (pid==-1){
        perror("cannot create new process");
        exit(1);
    } else if(pid==0){
        printf("a\n");
        return 2;
    } else {
        printf("b\n");
    }
    printf("c\n");
    while(1);
    return 1;

}

这段代码中添加了进程的创建和等待,父进程创建了一个新进程并打印输出 ‘b’,子进程打印输出 ‘a’,然后父进程和子进程都打印输出 ‘c’,并进入了一个死循环,没有正常结束程序的方式。程序中中途没有调用 wait 等待子进程结束,因此子进程的结束状态无法得知,会变成一个僵尸进程。
pid==0 返回的是子进程 else 返回的是父进程

(base) [jianming_ge@localhost process-courses]$ ps aux | grep fork2
jianmin+ 28999 92.9  0.0   4216   356 pts/7    R+   15:59   0:10 ./fork2.o
jianmin+ 29000  0.0  0.0      0     0 pts/7    Z+   15:59   0:00 [fork2.o] <defunct>
jianmin+ 29088  0.0  0.0 112828   992 pts/2    S+   15:59   0:00 grep --color=auto fork2

ref:https://blog.csdn.net/qq_58325487/article/details/126997978

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【TA100】图形 2.6伽马(Gamma)校正

很好的视频 https://www.bilibili.com/video/BV15t411Y7cf/?spm_id_from333.788.b_636f6d6d656e74.96&vd_source6f3a5e0ac931d869aee3d7c9bb6847e0 一、Gamma校正 1.前言&#xff1a;颜色空间 ● 一些颜色空间的举例&#xff0c;&#xff08;具体参考2.1节内容&#xff0…

最大似然估计(MLE)VS 最大后验概率估计(MAP)

1、概率和统计是一个东西吗&#xff1f; 概率&#xff08;probabilty&#xff09;和统计&#xff08;statistics&#xff09;看似两个相近的概念&#xff0c;其实研究的问题刚好相反。 一句话总结&#xff1a;概率是已知模型和参数&#xff0c;推数据。统计是已知数据&#x…

普通学校计算机毕业生,从事网络安全行业可以吗?

如果你是普通大学、大专的计算机专业应届生&#xff0c;还在迷茫找工作&#xff0c;这篇内容希望你能认真看完&#xff0c;很可能会决定你的人生方向。 现在的高薪行业&#xff0c;除了明星就只能是程序员了。不信你问问身边的人想学哪个专业&#xff0c;他们肯定不假思索的说…

C++基础(三) —— 内存分配

文章目录 概念01 物理地址内存的分配与释放02 虚拟用户进程空间内存的分配与释放 03 allocator模板类04 new delete05 malloc free06 strcpy 与 memcpy 与 memsetstrcpymemcpymemset 概念 01 物理地址内存的分配与释放 主要采用链表结构 使用了一个名叫page的结构体管理物理…

基于nodejs实现text/event-stream简单应用案例,SSE

基于nodejs实现text/event-stream简单应用案例&#xff0c;SSE text/event-stream代码实现服务器端前端 效果 text/event-stream 是一种用于服务器向客户端推送事件的媒体类型&#xff08;Media Type&#xff09;。它是基于 HTTP 协议的一种流式传输技术&#xff0c;也被称为 …

揭秘新一代云数仓技术架构与最佳实践

从传统数仓到湖仓一体&#xff0c;历经三十多年发展&#xff0c;技术的浪潮快速迭代&#xff0c;以云原生数仓为中心的现代数据栈时代已然到来。 背后的核心的原因在于&#xff0c;企业正在加速走向数字化、智能化&#xff0c;对数据的应用也提出了全新要求&#xff0c;特别是对…

每日一练 | 华为认证真题练习Day55

1、RSTP协议配置BPDU中的Flag字段使用了哪些STP协议未使用的标志位&#xff1f;&#xff08;多选&#xff09; A. Agreement B. TCA C. TC D. Proposal 2、RSTP中Backup端口可以替换发生故障的根端口。 A. 对 B. 错 3、如下图所示的网络&#xff0c;在RouterA设备里面存在…

更适合中国打工人体质的报表工具,零代码自动生成老板满意模板!

“中国职场上大家公认最头疼的是什么&#xff1f;” “加班&#xff1f;裁员&#xff1f;薪资&#xff1f;” “一切的根源来源于哪&#xff1f;” “是因为做大大小小报表加班到深夜、是同事都在卷报表制作有人只能被动裁员&#xff0c;也是千篇一律的报表汇报决定了这职业…

FreeRTOS学习笔记(五)——应用开发(三)

文章目录 0x01 软件定时器应用场景定时器精度运作机制软件定时器控制模块函数接口xTimerCreate()prvInitialiseNewTimer()xTimerStart()xTimerGenericCommand()xTimerStartFromISR()xTimerStop()xTimerStopFromISR()xTimerDelete()软件定时器任务创建以及执行原理软件定时器实验…

如何优化档案库房管理?一招学会轻松提升效率

在现代企业运营中&#xff0c;档案库房扮演着重要的角色&#xff0c;承载着大量宝贵的纸质档案资料。这些档案包含着企业的历史、客户信息、法律文件等重要数据&#xff0c;对于企业的正常运转和决策制定至关重要。然而&#xff0c;传统的档案库房管理方式存在一系列的挑战和难…

深度刨析指针Advanced 1

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《系统解析C语言》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白…

浅谈智能微电网供电系统的谐波治理

摘要&#xff1a;智能微电网供电系统的特性容易引发谐波&#xff0c;而谐波导致电力损耗加大&#xff0c;降低供电质量。本文从谐波的产 生原因和危害做出详细阐述&#xff0c;并结合智能微电网提出了治 理谐波的方法和措施。 关键词&#xff1a;智能微电网&#xff1b;谐波危害…

手术麻醉信息管理系统源码:全面监护,支持多设备采集

手术、麻醉是医院非常重要的一个组成部分&#xff0c;外科医生为病人进行手术的好与坏直接会危及到病人的生命&#xff0c;所以病人在手术麻醉过程中每一个环节都是非常重要的。随着现在高科技的发展&#xff0c;大量的医疗监视辅助仪器设备在手术过程中也得到广泛的应用&#…

Jenkins使用Docker(Podman)安装部署web应用

https://blog.csdn.net/onePageKownAll/article/details/128182290 https://blog.csdn.net/weixin_45647685/article/details/127825728 https://zhuanlan.zhihu.com/p/562495608 最终效果&#xff1a;在jenkins对某个项目进行构建&#xff0c;jenkins先通过git拉取最项目的…

MySQL基本知识复习补充

MySQL基本知识复习补充 SQL分类 DDL&#xff1a;数据定义语言。create、alter、drop、rename、truncate(清空表) DML&#xff1a;数据操作语言。insert、delete、update、select DCL&#xff1a;数据控制语言。commit、rollback、savepoint、grant、revoke 因为查询语句使…

最后机会!桥接 LAND 可以获得返还奖励!

经过 1 年的服务&#xff0c;The Sandbox 向我们的社区成员分发了超过 40 万 SAND&#xff0c;LAND 桥接返还奖励计划即将结束。 该计划是为了减轻土地持有者从以太坊桥接到 Polygon 的成本。每块土地的桥接都可获得 10 SAND 的奖励。 最后机会&#xff01;再次呼吁各位桥接 LA…

从小白到大神之路之学习运维第36天---第三阶段---mysql数据库之企业级mysql部署方案

第三阶段基础 时 间&#xff1a;2023年6月8日 参加人&#xff1a;全班人员 内 容&#xff1a; 企业级mysql部署方案 目录 企业级MySQL部署方案 企业级mysql部署主要步骤 Linux系统初始化设置&#xff08;做公司服务器&#xff09; 企业级MySQL高可用集群部署方案 企业…

Keysight是德MSOS604A高清晰度示波器1 GH

Keysight是德MSOS604A S系列示波器配备 6 GHz 存储器、15 英寸 XGA 电容触摸屏和 10 位模数转换器。主要特性与技术指标 1 GHz带宽和平坦的频率响应确保高信号保真度 20 GSa/s 最大采样率 10 位模数转换器&#xff08;ADC&#xff09;保证高垂直分辨率 低噪声前端&#xff…

【React】setState原理,SCU,不可变对象,Ref,受控组件,高阶组件

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 setState原理setState异步更新 SCU不可变对象RefRef获取DOMRef获取组件 受控组件高阶组件(HOC)作…

告别 Spread 运算符:使用默认 Composer

在 JavaScript 中处理对象时&#xff0c;通常需要为空的strings// objects、或属性设置默认值。在处理嵌套对象时&#xff0c;这会变得更加复杂并且需要复杂的编程逻辑。然而&#xff0c;有了“ default-composer ”库&#xff0c;这项任务变得简单易行。arraysnullundefined …