进程和线程的理解(1)——多任务

进程和线程的理解(1)——多任务

   多任务定义了一个操作系统同时运行多个程序的能力。但事实是,理想的多任务系统可以在几个应用程序之间如此快的切换,以至于用户可以认为所有的程序就象同时运行一样(多处理器系统除外)。考虑下面的简单程序。创建一个新的VB项目并在窗体上放一个按钮和一个标签控件,然后在窗体的Click事件中加入代码:

Private Sub Command1_Click()

   Dim cnt&

   For cnt& = 1 To 2500

       Label1.Caption = cnt&

       Label1.Refresh

   Next cnt&

End Sub

   单击按钮时,标签计数器会显示从1到2500的渐増数。将此程序编译成可执行程序,然后运行该程序的两个实例,并把它们并排。现单击一个程序让它运行,在它计数时,试着单击另一个程序的按钮。此试验的结果和正在运行的操作系统以及用的是16位还是32位的VB有关。这说明了操作系统间在多任务方面的关键性差异。Windows3.x支持一种被称为“非抢先式”也叫“协作式”多任务。在这种多任务中,应用程序尽力与另一个程序进行协作。操作系统分配给CPU一个程序,这个程序完全占用CPU直到它想让给其它的程序为止。在我们示例中的固定循环牢牢占用CPU,阻止了其它程序的运行。如果Windows3.x或Win95(或Windows NT)上使用16位的VB(只要这两个计数器没有被设成在独立的内存空间运行),当一个计数器计数时另一个计数器就会被冻结。它不会计数并且也不能单击它的命令按钮。如果在使用16位VB的Windows95或Windows NT上运行这个计数器程序的示例,同时点击某个32位的应用程序,如开始菜单,会发现那些32位的程序并没有被冻结。如果使用32位的VB来进行这个示例,会出现完全不同的结果。当一个计数器计数的同时点击第二个计数器,第二个计数器会开始全速工作,而第一个计数器会慢下来(但它不会停止,它速度的降低程度与系统给前台应用程序优先权大小有关)。

   在示例中的程序保持状态不变,没有退出Click事件或执行了DoEvents命令而释放CPU,那显然地,应有某些另外的机制使应用程序能释放CPU资源。其实,释放CPU资源并不是一件麻烦的事,操作系统会完成这项工作。这是一种称为“抢先式多任务”的多任务形式。在该形式中,CPU的时间是由操作系统专门分配的。当操作系统认为一个应用程序已用完它的时间额度时,它会挂起该程序并保存所有的处理器内部寄存器状态,然后转向下一个程序。应用程序也有能力在任何它不需要CPU的时间时挂起它自身。