Linux进程理解( 五 )


那么fork可就有的说了,fork这里面核心的代码执行完了,可以理解为执行了两次.
进程状态
进程的状态这里我们要好好说说,都是干货,先去网上找一些图片,你会发现它们是真的复杂,而且有些书谈的很官方,这里我们要想办法把它们拉到尘埃中去,让我们真真切切的感受和理解究竟什么是进程的状态.
所谓的状态我们可以理解为反映一件事物的情况,对于进程也是如此.在Linux中,进程的状态本质就是一个整数,每一个状态对应的值是不一样的,我们先来拨开本质.
在Linux中我们只谈四种进程的状态的大类,这里先初步认识下.
运行态
这里我们还要退一下边角的知识,我们知道OS通过结构体来描述进程,通过一个链表来组织进程.,但是这不意味着哦们没有其他的类似数据结构的方式来组织,这里就有一运行队列需要我们考虑,关乎着运行态的概念理解.
我们知道,自己电脑一般的CPU个数远远小于自己运行进程的个数 , 那么一些运行的进程可能会放在一个运行队列中,那么我们就疑惑了,运行态是在CPU运行的状态还是在这个运行队列中状态,究竟是哪个是运行态?
这里我要解释一下,只要一个进程的在这个运行队列中(代码等在另一个地方),这个进程就处于运行态,当然在CPU里面的肯定也是运行态.
终止态
这个就比较好理解了,结束了肯定是这个进程不用了.我想问的是如果一个进程处于终止态是不是这个进程就已经被释放了,还是这个进程的空间还可能存在,只不过这个进程永远不会再再次运行了?.我们想一个例子,你去外面下馆子,吃完饭了,准备付钱,你叫了一下老版,老板回应你了,但是生意实在是太好了,抽不开手,但是对于老版来说,你这个顾客已经没事了,也没有什么要求了,等下过来把钱收了就可以了.对于CPU也是如此,如果一个进程要结束,那么肯定要把该进程所处的空间给释放了,但是CPU实在太忙了,它想着我先把你置为终止态,反正你也不用了,等我有点闲的时候就去把空间释放了就可以了.
阻塞态
阻塞态和后面的挂起态都是比较难以理解的,这个还有需要考虑一下其他的硬件,我们要好好的分析一下.一个进程要运行起来,可不只需要申请CPU的资源,它还有可能需要申请类似磁盘,网卡等这样的资源,那么这里就开始存在问题了.要知道这些硬件的数据处理效率可是远远低于CPU的效率,记住这个基本的理论,后面要用.
我们前面说过,OS是管理硬件的,那么管理,我们肯定要描述硬件,OS会把这些硬件做成一个类似于的结构体,这个结构体其他的我不想谈,只谈一点,存在一个* ,好了就是一个类似于运行队列的的等待队列,这就有意义了.
现在我们就可以谈谈阻塞态了,当一个进程准备运行的时候,CPU已经准备好资源了 , 但是这个进程如果还需要申请硬件的资源 , 这就开始出现了问题,要知道硬件的资源可是很慢的,我这便CPU都准备好了,抬头一看,我去,这硬件怎么这么拉,操作系统心里面一想,别说了,这个进程你还是离开运行队列吧,你这硬件实在是太慢了,我把你这个进程放在你这还没有准备好的硬件对应的队列里面,啥时候准备好了,我就把这个进程放在运行队列里面.那么处于里面队列就处于阻塞态.
挂起态
挂起态这里面我们需要总另一个角度来讨论,不过我们需要这么谈一下,有的书可能会把挂起态看作阻塞态的一种特殊情况,这个也对,但是这里我们把它们分开.
现在我们就可以谈谈挂起态了,不过我们需要解释一下什么是swap分区,在我们的硬盘中,不仅仅存在C盘,D盘一类的,极有可能存在一个名为swap的分区.Swap分区在系统的物理内存不够用的时候 , 把硬盘内存中的一部分空间释放出来 , 以供当前运行的程序使用.