0
点赞
收藏
分享

微信扫一扫

Linux:进程状态和优先级

一、进程状态

1.1 操作系统学科(运行、阻塞、挂起)



为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态


大多数操作系统都遵循以下原则


1.1.1 运行状态



    因为有一个调度器需要确保CPU的资源被合理使用,所以需要维护一个运行队列,他将进程的task_struct结构体连接起来,而被链接起来的进程就会按顺序被调度器调度,此时处于运行队列的这些进程就处于运行态,这说明运行态并不指的是正常运行的进程,而是处在运行队列中并且随时可以被调度的进程!


1.1.2 并发执行和进程切换

     调度器将进程放到CPU上去运行,并不代表必须要将进程全部运行完才会被放下来!!因为


(1)进程当中可能会存在一些死循环的进程 (2)调度器要尽量保证公平性,不能让一个进程占用CPU太长时间。    ——>那么什么时候应该把这个进程放下来,就要取决于时间片,当一个进程在超过时间片还没有结束的时候,就要把他放下去然后重新放在新的运行队列的位置。


  CPU运行速度是很快的,所以其实我们人所能感受到的,所以在一个时间段内必然所有的进程都会被执行,称之为并发执行。  而大量地把进程从CPU上拿上来在放下去的这个过程,称之为进程切换!


1.1.3 阻塞状态

     操作系统管理硬件的过程也是需要先描述再组织,因此不同的硬件设备都需要维护一个阻塞队列,当该硬件没有准备好的时间,该进程只能在阻塞队列中等待。




比如说scanf函数从键盘获取数据,但是如果我们一直不输入的话,这个进程就会被阻塞!!


1.1.4 挂起状态

      当操作系统的内部资源严重不足的时候,需要在保证正常运行的前提下想办法把一些内存里的资源置换到磁盘中来节省空间,我们将被置换的进程所处的状态叫做挂起状态。


(1)一般来说,导致内存资源不足的原因是因为存在大量处在阻塞队列的进程 ,所以我们要办法将一些资源置换到磁盘中,但是为了不影响阻塞队列的管理,所以大多数情况下并不止直接将task_struct结构体置换过去,而是将该进程的数据和代码先置换过去,而当执行到该进程的时候,再通过某种方式将其数据和代码置换回来。


(2)其实在我们的电脑中存在一个交换分区,该分区就是专门用来置换一些导致内存溢出的资源




1、挂起状态就是PCB在排队,但是他对应的代码和数据被暂时移到外设中,节省内存空间 。


2、一个进程是否被挂起并不需要让你知道,就跟你把钱存银行里一样,你并不知道自己的钱是被干什么用了,银行并不会告诉你,只是你想要的时候他能及时给到你就好!!


扩展知识:我们的电脑现在大多数使用的都是SSD固态硬盘,磁盘一般只有大公司的后端在使用,虽然比较慢但是便宜且容量更大。


1.2 Linux内核管理进程状态方法

下面的状态在kernel源代码里定义


/*

* 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 */

};

1.2.1 进程状态查看

ps aux / ps axj 命令




1.2.2 R状态

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


1.2.3 S状态

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。  ——>其实就相当于是阻塞状态(因为需要跟硬件保持联系)

 

举报

相关推荐

0 条评论