先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
正文
本期学习目标:理解操作系统下进程状态,Linunx下进程状态,认识僵尸进程和孤儿进程及进程的优先级和进程切换。
在学习进程状态的之前,我们先简单复习一下,什么是进程:进程其实就相当于进程控制模块(pcb)加上磁盘上的可执行程序。
一、操作系统下进程的状态
1、进程状态的分类
对于一个操作系统来说,他其实会有非常多种状态,但是最常见的还是就绪、执行、阻塞。
- 就绪:当进程已经分配好除CPU外的所以资源,只要再获取CPU后就能够马上运行。
- 执行:进程已经获得CPU,其程序正在被执行
- 阻塞:正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃CPU而处于暂停状态,亦即进程的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。比如进程当中调用wait()函数,会使得进程进入到阻塞状态。
但是为了满足一些操作系统的需求,就又出现了一些其他的状态:挂起状态、创建状态、终止状态。
对于挂起状态他是一种特殊的请求,下面简单聊聊为什么要有挂起状态:
(1) 终端用户的请求。当终端用户在自己的程序运行期间发现有可疑问题时,希望暂时使自己的程序静止下来。
(2) 父进程请求。有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程间的活动。
(3) 负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
(4) 操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账
而对于其他的二种状态:
- **创建状态:**为一个新进程创建PCB(进程控制块,它是系统为了管理进程设置的一个专门的数据结构,主要表示进程的状态),把该进程转入到就绪状态并插入到就绪队列之中。
- **终止状态:**等待操作系统进行善后处理,然后将其PCB清零,并将PCB空间返还系统
二、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 */
};
- R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
- S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
- D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。
- T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。
- X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
进程状态查看:
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虽然被杀死了,但是我们在进程查看中还是能看到他的运行状态。
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲) 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
僵尸进程危害
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-FB67Odwc-1713334369658)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!