57--windows进程和线程(2)
这一章要细细的说说一下进程,在winodws的OS系统首先会创建一个地址空间为自己创建运行的环境,而线程实际上就是在这个环境中执行的序列。每个进程至少都有一个线程,在windowsOS中可提供并发执行的多个任务环境。所以这里面就有我们熟悉的并发处理概念,实际上用轮询的方式调用进程实际上也不是真正意义上的并发。在多核没出来之前,我们一直强调的并发实际上都是假并发,都是采取时间片轮询的方式完成的。但多核出现后,真正的并发应该是有的。所以在winodows的OS中就有专门的调度算法来做这个事情。每个进程实际上就是一个独立的任务,它有自己的内存空间及执行过程顺序。其实执行的过程不是一下子就完成的,但凡执行的时候就会占用CPU,每个进程都有一个执行的时间片段,OS负责来调度和切换这些进程,让他们得以轮流的执行。当一个进程执行一段时间以后,系统通过某种机制获得控制权,将这个进程运行的环境信息,寄存器及指令信息保存下来,然后再指向下一个将要执行的进程,并将控制权交予它。因此在OS中是有一个进程列表的,这个表中就会记录着有哪些进程正在执行,哪些在等待中。调度算法的核心其实就是把时间分成相应的片段,很多时候OS都通过硬件的时钟中断来实现进程间的切换。所以在进程的执行过程中,每个进程实际上是很容易被中断的,但由于OS中的调度算法能够准确的维护好每个进程的执行环境,所以我们看到的现象就是自己的进程仍在持续的进行。
每个进程都是为了完成特定的任务而存在的,所以进程在执行时是需要内存和寄存器的帮助。进程在运行中所须的内存实际上是可以理解为静态、动态、调用区域。静态的很好理解,这里面存储的就是全局变量及静态信息,动态数据则是进程在运行过程中所须要分配的区域。调用区域很好理解,就是让这个进程在执行过程中保存的指令空间。当然你可以理解这个区间就是存在进程执行所需要的函数,这么一说你就会明白其实这部分的内容就是栈的概念。调用栈的过程实际上相当于在传递函数参数。静态区域的数据是进程预先设定好的,动态和调用区域则是在进程执行过程中一直处于变化的状态。调用区域所涉及到的栈,在进程启动时就用二进制的表现出来。这个我们比较熟悉,早起的DOS游戏中,我们用FPE修改数据,看到的都是这样的地址区间。所以进程存在的意义就在于它能够实现特定的任务,所以它肯定对应了一个二进制的模块,这个模块再形象一点的话,那就是执行的程序。在OS中,每个执行程序实际运行其实也需要其它模块的支撑才能完成的。在windowsOS中就是我们熟悉的exe或者是dll。所以这里我们一定要严格定义好进程和程序的区别,进程是很容易理解,程序往往比较模糊一点。进程包含了代码和数据,以及在执行过程中的信息。当执行时需要内存可以从动态区域获取,当不需要时又可以释放掉。而OS的作用就是维护这些基本的信息,以便统筹进程管理,这里面最为主要的就是管理分配好每个进程的时间片以及进程之间的切换。
好了,我们梳理一下!进程的生存周期吧!首先创建一个进程,OS就会为其建立一个它执行所需的环境,并把它加入全局进程的列表中,这样就让其有机会和其它进程一样被调度或共享资源。当然有些时候,进程也会根据实际情况创建另一个进程,这里就是所说的父子进程关系。这些都是在运行过程中加载的。当一个进程完成预定的功能之后,它便走向了生命周期的末端,这个时候,OS就会要将它OVER掉。OS接到请求后先会将该进程所占用的各种资源回收然后再将该进程从进程列表里面kill掉。当然这是最为理想的情况,很多时候我们也会强制关掉一个进程。
(未完待续.............)