往往计算机的cpu只有一个,一个cpu有多个核心,一个cpu在同一时间只能被一个进程占用,又因为计算机的cpu数量总是少于进程数的,因此cpu是通过时钟轮片的方式处理每个进程的任务, 这些进程并不是凌乱的放在操作系统中的,他们是被一个数据结构有组织,有规律的管理起来的,所以一个进程处于运行状态,是往往是需要放在一个运行队列中,被CPU时钟轮片轮询处理他们的任务,这个处理过程中,在微观上是串行方式处理每个任务,但是在宏观上,我们看起来一个CPU是在并行处理的计算机中的多个任务,因为这个时钟轮片实在是太小了,小到我们察觉不到.
当一个程序处于运行状态时,它的PCB进程块会被放在一个运行队列中,于是这个进程就会处于运行状态,CPU作为电脑中的一个硬件,以这种方式来处理每个程序的任务.一个计算机中存在多个外设,例如键盘,显示器或者打印机,他们也都需要维护一个进程PCB的等待队列来处理进程的IO任务,当一个进程需要用到外设时,例如需要用到显示器时,他的PCB进程块,就可以被抽象的认为是放到了显示器的等待队列中,而不是CPU的等待队列中,因此可以认为这个程序不被称为是运行状态,而是被认为是处于一个状态阻塞,这就是一个进程的阻塞状态.
因为计算机的外设IO是远远慢于内存和CPU的,因此,当一个操作系统中的多个进程都需要用到打印机的外设时,这些进程的PCB都会被打印机的等待队列所指向并管理起来,此时这些进程的进程地址空间是被加载到内存中的,是占用内存的,但是这些进程并没有实质性的运行起来,只是在等待IO,因为一个计算机的内存是有限的,当这些进程到达一定程度时候,计算机的内存都就不够用了,操作系统会选择性的将一些等待的进程的内存中的数据移动到硬盘中,这样就释放了一些内存,而数据被移到硬盘中的这些进程,就会被称为挂起的进程,这就是进程的挂起状态.
以上是普遍操作系统的一些进程状态,而在linux操作系统中,常见的进程状态有running sleeping disksleeping stopped tracing stop zombie dead这些状态,使用ps ajx可以查看系统中当前正在运行的进程信息,包括查看进程的状态,Sleep状态就是进程阻塞状态,也就是当这个进程正在使用外设,Runing就是运行状态,Stopped就是进程的暂停状态,可以使用向进程发送信号的方式来使进程处于暂停状态,具体的命令是kill numsign PID来使特定进程处于暂停状态.Disk sleeping,这是一种特殊的进程状态,看这个名字就可以知道它是跟硬盘有关系的,事实也是如此.例如,当一些重要的数据需要从内存中写入到硬盘时,这些重要的数据可能很大,时间很长,在此期间可能因为操作系统的优化过程恰好将写入操作的进程杀死了,那么,当写入过程结束以后,写入的结果信息不会被进程所接收,数据有可能写出失败或者异常情况,若不合理的处理这些情况,可能会出现重大的损失,因此,可以让进程进入disk sleeping状态,让操作系统不要杀死这个进程,这就是disk sleeping状态的由来.
Linux中也有一个特殊的z状态,也就是经常处于僵尸状态,在linux中,一个进程一定是由一个父进程产生的,这个父进程,可以在子进程结束时回收子进程的退出信息,而一个子进程如果在自身运行结束后,父进程并没有回收子进程的结束状态,那么子进程会进入僵尸进城状态,等待父进程回收,这就是僵尸进程,如果一个子进程在运行过程中,父进程提前结束,而子进程还没有结束,那么这个子进程就会被称为孤儿进程,它会自动被PID为1号的操作系统进程领养.
进程优先级的概念,因为一个操作系统中的所有进程并不都是同等的地位,有些进程是比较重要的,有些进程是相对来说较为次要的进程,又因为计算机的CPU资源一定小于进程的资源,所以为了进程合理利用占用CPU,可以通过设置进程的优先级来让CPU的时间轮片更加倾向于某个进程,在linux中,可以用top 查看进程的优先级状态,初始进程的优先级为80,通过另一个nice对这个基础的优先级增加或减少来修改进程的,优先级数字越高,优先级越高,
进程在运行过程中是有独立性的,每个进程的运行,别的进程是互不干扰的,并行性是多个CPU运行多个进程,并发性是一个CPU运行多个进程
由并发性可知,一个CPU处于多个进程的任务,通过时间轮的方式分配给指定每个进程占用CPU的时间来使多个进程在宏观上达到同时推进的现象.
那这一个CPU是如何无缝衔接的?记录上一个进程的运行位置,且保证这个进程下一次来时还能从这个位置运行呢?
每个CPU核心只存在一套寄存器,其中有一个pc计数器的寄存器,他会按顺序来不断的执行每一条指令,进程在执行过程中会产生很多的临时数据,这些临时数据是会放在临时寄存器中的。对于不同的进程,这些临时寄存器中的数据是不一样的,当一个进程被切出CPU时,进程中的临时文件会被一些特定寄存器存起来,然后保存在当前进程PCB进程块中的某一个位置,然后切换下一个进程,当一个进程被切入时,特定的寄存器会从特定的PCB位置读入进程的临时数据,然后再向下继续执行,这个过程被称为上下文保护和上下文恢复