要讲进程和线程就太难了,我自己都是半斤八两,这个东西还是蛮难的,不过我们先大致了解!

首先,一般进程都是开头首讲的内容,为什么这个概念这么重要?就像操作系统这个东西出来,有它的原因和意义,那为什么我们要提出这样一个概念!不知道大家有没有想过这个问题,其实对于原来的pc来讲,是不需要这样一个东西的,因为只有一个程序在跑,也不需要维护什么东西,但是到了多道程序来讲,假设一个程序的执行为一个活动,我们需要在活动之间切换,但是程序只是一个代码,它是一个静态的模型,就像人一样,没有进程这个模型,我们看到的都是差不多的木偶,很难知道彼此的区别,引入了这个概念之后,我们可以看到大大小小高矮胖瘦的实体,我们看到的是活的模型,通过他的外表我们知道它现在的状态,而另外一方面,为什么进程如此重要?因为我们最重要的就是要干什么,进程是实现我们思想的载体,它代表了我们的意志,其他的文件系统和内存之类的只是一个附件,只是一个看热闹的!

而这里你也需要体会进程和程序的区别,在没有进程模型的时代,程序就是一串串代码,顺序执行下去,这里还要提一下单道程序和多道程序,前者就是几个程序按顺序依次执行,这样相当于批处理,可以保证时间的可再现,是封闭的过程,但是一个程序霸占整个时间段,功能简单,多道程序不可再现,有不确定性,但是可以提高资源利用率,(当然没有绝对的好与坏,具体看需求),进程是把程序作为一个食谱在做得一序列动作,是一个活的实体,程序是死的,是一个算法,而进程是活的,是一个程序的动态执行过程,这样应该说清楚了。

这样来看,我们的进程具有动态性(程序的动态执行过程),并发性,独立性和不可再现性,进程就是社会上的一个个人的存在,是资源和调度的最小分配单位!

所以我们打开wps,其实可能会创建不止一个进程,一件事情有时候需要几个人来做!那我们什么时候创建进程?

  1. 操作系统初始化,操作系统初始化的时候启动了若干个进程,我们有我们的意志,操作系统也有它想要做的事情,它也需要创建进程来做它需要做的事情。

  2. 用户进程调用了fork系统调用,这是我们主动地想要创建一个进程来帮忙做事。

  3. 响应用户的shell命令行需求

  4. 批命令处理初始化(了解即可)

    。。。

    从本质上说,这些进程的创建都是由于被已有进程通过系统调用创建的新进程,至于创建的过程,暂时不详细说。

    对应创建,必然要谈一下什么时候会导致进程的终止?

《1》进程已经执行结束了,正常退出,其实本质是调用exit系统调用

《2》进程出错退出(有自愿和非自愿)

《3》被其他进程用kill命令杀死

在unix等系统,进程创建子进程,子进程创建子进程,如此下去,形成了一颗进程树,树的顶端是一个init进程,这个也是了解即可,另外一个需要了解的东西是进程的状态,这个还是很重要的概念:

人每天的状态都不一样,进程也会因为各种事情产生状态的变化,这种状态的区分在多道程序设计里面更加重要,因为我们需要在这些进程之间调度,对于他们的状态的了解凸显重要!

一般来讲,我们认为有三个状态:运行态,就绪态,阻塞态,这三者,运行态最容易理解,就是进程此时占用cpu,后面两个需要区分,就绪态是说进程此时可以运行,但是没有时间片,也就是说我可以跑下去,但是现在别人用着cpu呢,我还得等会,而阻塞态一般比如我现在正在等待你输入某个数据,在你输入之前我跑不下去,你给我cpu我现在也没办法往下跑!至于进程状态转换图,这里不想探讨了,只是注意有6个转换,一般书上给4种,从阻塞直接到运行这种也可以,但是不能从就绪到阻塞,因为就绪态的进程无法因为I/O等阻塞,此时跑都跑不了,怎么可能有逻辑阻塞?