ToB企服应用市场:ToB评测及商务社交产业平台

标题: Linux:进程概念(三.详解进程:进程状态、优先级、进程切换与调度) [打印本页]

作者: 郭卫东    时间: 2024-6-24 23:34
标题: Linux:进程概念(三.详解进程:进程状态、优先级、进程切换与调度)
上次讲了进程这些内容:Linux:进程概念(二.检察进程、父进程与子进程、进程状态详解)


  

1.Linux中的进程状态

  1. static const char* const task_state_array[] =
  2. {
  3.         "R (running)", /* 0 */
  4.         "S (sleeping)", /* 1 */
  5.         "D (disk sleep)", /* 2 */
  6.         "T (stopped)", /* 4 */
  7.         "t (tracing stop)", /* 8 */
  8.         "X (dead)", /* 16 */
  9.         "Z (zombie)", /* 32 */
  10. };
复制代码
  
  1.1前台进程和后台进程

在Linux中,可以将进程分为前台进程和后台进程,它们的区别在于与终端的交互方式和实行状态。
运行状态

   运行状态(Running)是进程可以被调度实行的状态。当一个进程处于运行状态时,它的代码正在被 CPU 实行,即正在运行指令并处理各种任务。在 Linux 中,通常用 R 表示进程处于运行状态。
  1. int main()
  2. {
  3.         while (1)
  4.         {
  5.                 ;
  6.         }
  7.         return 0;
  8. }
复制代码

就寝状态

   就是我们上次学习的阻塞状态,在Linux中,进程的就寝状态(Sleeping)是指进程因等待某些变乱而临时制止实行。这个状态偶然也被称为可制止就寝(Interruptible Sleep),因为进程在这种状态下可以被制止,例如通过吸收信号来唤醒。
  就寝状态的进程通常在等待某些变乱的完成,例如:
  
  必要留意的是,就寝状态的进程是可以被制止的,也就是说,在等待变乱的过程中,假如吸收到一个信号,进程大概会被唤醒并处理该信号,之后大概会继承等待或实行其他操作。我们利用Ctrl+c可以制止进程,因此,这种状态也称为可制止就寝。
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. int main()
  4. {
  5.     int a=0;
  6.     while(1)
  7.     {
  8.         printf("%d",a);
  9.         sleep(2);
  10.     }
  11.     return 0;
  12. }
复制代码

   在这个程序中,主循环是一个无穷循环 while(1),它不会自动放弃 CPU,因此进程会一直处于运行状态(R)。但是,在每次循环迭代中,程序会调用 printf 函数打印 a 的值,并利用 sleep(2) 函数让进程休眠 2 秒。
  在 sleep(2) 调用期间,进程临时制止实行,等待指定的时间竣事后再继承实行。虽然进程在休眠期间处于不活动状态,但是它并没有自动释放 CPU。因此,进程会被标记为就寝状态(S),表示它正在等待特定变乱的完成,即等待 sleep 函数定时器计时竣事。
  但是假如我们把sleep()去掉后,会发现还是S状态
   在如许的程序中,主循环是一个无穷循环 while(1),它不会自动放弃 CPU,因此进程会一直处于运行状态(R)。但是,由于 printf 函数涉及输出操作,这大概会导致进程在等待标准输出设备的 I/O 操作完成时陷入就寝状态(S)。
  当程序运行时,printf 函数将数据输出到标准输出设备(通常是终端),而且在数据传输过程中,大概必要等待设备的响应。在这段等待期间,进程临时制止实行,处于就寝状态。因此,即使主循环一直在运行,但是由于进程在某些时刻必要等待设备响应,因此会被标记为就寝状态(S)。(CPU实行是很快的)
  

磁盘休眠状态

也是阻塞状态。D磁盘休眠状态(Disk sleep)是Linux体系中的一种进程状态,偶然也称为不可制止就寝状态(uninterruptible sleep)。进程进入这种状态通常是因为正在等待某些IO操作的完成,好比磁盘读写操作,网络哀求等。在D状态下的进程是无法被制止大概唤醒的,直到IO操作完成为止。
   也可以理解磁盘休眠状态的进程是有免死金牌的,能防止CPU因为资源不敷而删除这个正在等待的进程
  因此,即使体系资源告急或CPU负载高,磁盘休眠状态下的进程仍然会被体系保存,不会被强制删除。这种机制确保了IO操作的完整性和体系的稳定性。
  制止状态

   在Linux体系中,当一个进程吸收到SIGSTOP信号时,它会被暂停(制止)实行,进入制止状态。在这种状态下,进程的实行被临时挂起,不会继承实行,也不会被调度到CPU上运行。
  制止状态下的进程不会斲丧CPU资源,也不会响应任何信号,直到吸收到SIGCONT信号后才会继承实行。制止状态的进程可以通过ps下令大概类似的工具检察,通常会表现为T状态。
  要将一个进程从制止状态恢复到运行状态,可以向该进程发送SIGCONT信号。如许进程就会从制止状态恢复到运行状态,继承实行
  kill指令—向进程发送信号

在Linux体系中,kill指令用于向进程发送信号。通过kill指令,可以向指定的进程发送差别的信号,从而影响进程的行为。常用的kill指令格式如下:
  1. kill [options] <PID>
复制代码
此中,<ID>是要发送信号的进程的进程ID(Process ID)。可以利用ps指令大概pgrep指令来查找进程的进程ID。

   

  

殒命状态

对应的就是我们之前讲解的制止状态
   在Linux体系中,"殒命状态(dead)"通常指的是进程已经制止(terminated)而且退出,但其进程形貌符(process descriptor)还未被释放。这种状态通常在进程制止后,其父进程还未对其进行处理或采取资源时出现。
  当一个进程制止后,其进程形貌符会保存一段时间,直到父进程调用wait()或waitpid()等体系调用来采取子进程的资源。在这段时间内,进程的状态会被标记为"殒命状态(dead)"。一旦父进程采取了子进程的资源,进程形貌符就会被释放,进程完全被打扫。
  因为是一个瞬间的动作,我们很难看到该状态
  
2.僵尸进程

2.1僵尸状态

   在Linux体系中,当一个进程制止后,其进程形貌符==(PCB并不会立刻被释放)。此时,该进程会变成一个僵尸进程(Zombie Process)。僵尸进程是指一个进程已经制止==,但其父进程还未对其进行处理或采取资源。
  在Linux体系中,当父进程读取了子进程的退出状态后,子进程的状态会从僵尸状态(Zombie)变为制止状态(Terminated),通常用X表示。这意味着父进程已经处理了子进程的退出状态信息,而且子进程的资源已经被释放,不再占用体系资源。因此,及时处理子进程的退出状态好坏常重要的,可以避免僵尸进程的积累,进步体系的稳定性和性能。
  而bash会自动读取子进程的退出状态
  2.2僵尸进程

   
  2.3僵尸进程危害


3.孤儿进程

   孤儿进程是指父进程先于子进程竣事而竣事,导致子进程成为孤儿进程。在Linux体系中,孤儿进程会被init进程(进程ID为1的进程)接管。当父进程先于子进程竣事时,子进程的父进程ID会被修改为1,即init进程的进程ID,如许子进程就成为了孤儿进程。
    孤儿进程的产生通常发生在父进程没有等待子进程竣事就提前竣事的环境下。为了避免产生孤儿进程,父进程在创建子进程后应该等待子进程竣事,并及时处理子进程的制止状态。如允许以确保子进程在父进程竣事时能够正常退出,而不会成为孤儿进程。
  4.进程的优先级

概念

   
  
  1. task_struct
  2. {
  3.         //...
  4.         int PRI;
  5.         int nice;
  6.         //...
  7. };
复制代码
检察进程优先级

  1. ps -al
复制代码
  
  

   
  PRI(优先级)和NI(nice)

   
  为什么要有-20到19的这个限制?
     更改nice来间接改变优先级

   top:进入top后按“r”–>输入进程PID–>输入nice值
  利用 top 下令可以实时监视体系的运行环境,包罗进程的资源占用环境、进程列表等。按下 r 键后,可以对指定进程的优先级进行调整。
  在按下 r 键后,按照提示输入要调整优先级的进程的PID,然后输入要为其设置的新的 nice 值。输入完毕后,top 将会实验修改指定进程的优先级,根据新的 nice 值重新盘算其优先级。如允许以实现对指定进程实行优先级的调整。
  5.进程其他重要概念

   当代操作体系采取时间片轮转的方式来调度进程实行,而不是等待一个进程的代码完全实行完毕后再切换到下一个进程。这种方式能够实现多任务的并发实行,进步体系的响应速度和资源利用率。
    
6.进程的切换与调度

进程的切换与调度是操作体系中非常重要的部分,它涉及到怎样有效地利用CPU资源,保证体系的响应速度和吞吐量。
进程切换


进程切换指的是从一个正在实行的进程切换到另一个进程的过程。当操作体系决定将CPU的控制权从当进步程转移到另一个进程时,就必要进行进程切换。进程切换包罗以下几个关键步骤:
进程调度


进程调度是操作体系根据一定的调度计谋从就绪队列中选择下一个要实行的进程的过程。调度计谋的选择会影响体系的性能、响应速度和资源利用率。
   活动队列
  
    过期队列
  
  
好啦,进程干系的知识,也大概梳理完毕了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4