0
点赞
收藏
分享

微信扫一扫

[Linux打怪升级之路]-进程的状态

天涯学馆 2022-11-15 阅读 208
linux

目录

一、操作系统下进程的状态

1、进程状态的分类

二、Linux下的进程状态

三、僵尸进程和和孤儿进程

1、僵尸进程

2、孤儿进程 

四、进程优先级 

1、基本概念

 2、PRI and NI

3、其他的概念


本期学习目标:理解操作系统下进程状态,Linunx下进程状态,认识僵尸进程和孤儿进程及进程的优先级和进程切换。

在学习进程状态的之前,我们先简单复习一下,什么是进程:进程其实就相当于进程控制模块(pcb)加上磁盘上的可执行程序。

一、操作系统下进程的状态

1、进程状态的分类

对于一个操作系统来说,他其实会有非常多种状态,但是最常见的还是就绪、执行、阻塞。

  但是为了满足一些操作系统的需求,就又出现了一些其他的状态:挂起状态、创建状态、终止状态。

 对于挂起状态他是一种特殊的请求,下面简单聊聊为什么要有挂起状态:

而对于其他的二种状态: 

二、Linux下的进程状态

前面我们说的哪些状态是所以操作系统进程状态的统称,下面我们来看看Linux这些状态是如何体现的;为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在 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 */
}; 

进程状态查看:

ps ajx | head -1 && ps ajx | grep 'test'

  由于在test.c文件中我们是用fork创建子进程的,也就是说在fork函数运行前只有父进程,而运行后就既有子进程也有父进程。我们知道如果进程创建成功,就将0返回回给子进程,将子进程的pid返回给父进程。这里我们就只打印出子进程,并休眠2秒。

这里我们观察到父进程一直在运行,而子进程反而处于休眠状态,这是为什么呢?

其实父子进程都在运行的,由于父进程不需要打印到屏幕中,也将不用调用外设资源。所以就处于运行状态,而子进程要打印到屏幕上,所以要调用外设资源,而CPU的运行速度是远大于外设的,所以cpu就会将子进程移除运行队列进行等待,子进程就进行休眠状态了。

这里我们要注意状态的上的+号,表示进程前台,这式我们在进程在跑的时候,输入指令是没有用的但是可以按ctrl+c强制将进程终止,但是如果我们把进程kill -9(杀死后在运行),+号就会消失,我们也就变成了前台进程,这时候输入指令都是有用处的,但是我们就不能按ctrl+c让进程强制终止。

//暂停进程
kill -19 进程的pid
//进程继续
kill -18 进程的pid


下面我们继续来见一见进程的暂停和启动

那我们能见见死亡进程吗?

//杀死进程
kill -9 进程的pid

 我们可以看到这里怎么没有子进程的状态变成X状态,反而变成了Z状态,这又是个什么状态呢?

其实这是是僵尸状态,下面我们一起来看看僵尸状态吧

三、僵尸进程和和孤儿进程

1、僵尸进程

改进程听起来好奇怪,其实他就是当子进程退出了,而父进程没退出,父进程要接受子进程的各种信息时,子进程存在的一种状态,已经死去了但是基本信息海存在等这父进程用wait()接受。

 这里的test虽然被杀死了,但是我们在进程查看中还是能看到他的运行状态。

 僵尸进程危害

2、孤儿进程 

上面我们说到子进程退出,还有父进程可以回收子进程的信息,子进程只要维持僵尸状态等父进程来回收就可以了,但是如果父进程先退出了,那子进程退出后处于Z状态又该谁来回收呢?

有的,子进程这时候会被1号init进程(os)领养,在由1号init进程回收。

四、进程优先级 

1、基本概念

 我们先输入这个命令认识一下进程优先级:

ps -l

 

 2、PRI and NI

这里我们要重点关注这二个标识,上面说了PRI他的值越小那么他进程的优先级就会越高,也就说他的进程会被CPU优先跑,而NI只要是可以影响PR从而影响进程的优先级。

总结:

那么我们是通过什么来修改优先级的呢?

下面我们就用top命令来修改进程的nice:

当我们输入top + r +输入你要修改进程的pid回车后在输入你要修改nice的值是多少,但是我们输入-100时(这里的top要用sudo提权):

 这里的nice最低就修改为-20,因为我们不可能一直提供进程的优先级,这也要是有一个限度的。

3、其他的概念

这里我们重点来理解进程是怎么在CPU下进程切换的。

我们应该明白一个操作系统不可能就一个进程在跑,但是一CPU是只能一下完成一个工作的,那我们拿window操作系统来举例:我电脑上为什么既可以登QQ、微信、听歌,敲代码。这些我们都可认为是进程,难道这些进程都在跑吗?这显然不是的,那操作系统是如何做到呢?

这就要依靠进程切换了,一个CPU中不仅仅存在在PCB用来管理进程,还存在这大量可见和非可见的寄存器。那这些寄存器有什么用呢?进行对正在运行的进程,取指令、分析指令、执行指令(注意:寄存器中的数据是属于但前进程)

假设操作系统现在有三给进程A,B,C都要跑,CPU会先根据这三个进程的进程优先级,决定那个进程先跑,假设A<B<C,那么C进程就会先跑,CPU中会有一个时间片,当C进程的时间片到了后就会换B进程跑,而且会把A进程跑的信息都会保存到PCB中(暂时可以怎么理解),等下次轮到C进程跑的时候就继续上次的进程,这样就完成了进程的切换,也就是并发。

 

举报

相关推荐

0 条评论