首页 > 其他 > 详细

多任务

时间:2014-02-22 04:36:56      阅读:304      评论:0      收藏:0      [点我收藏+]

  多任务操作系统已经存在一段很长的时间了,但即使都属于多任务操作系统,早期的多任务操作系统却采用的是不同于今天称为“抢先式多任务”(preemptive multitasking)的多任务处理机制。以windows为例,在windows95以前的多任务操作系统,其采用的是“协同式多任务”(cooperative multitasking)。那么这两者的区别在哪里呢?在现在的多任务系统中,当一个新的进程开始时,在它的时间片(timeslice)之内,cpu的使用权是在这个进程手里的,当时间片结束时,系统要收回cpu的使用权做下一轮分配;而在“协同式多任务”操作系统中,进程在执行过程中是可以不受限制的占用cpu的,此时也就不存在时间片的概念了,系统对cpu使用权的收回要靠进程主动上交。在“协同式多任务”系统为主流的年代,据说(因为我不是那个年代的用户,所以只能是道听途说)用户常常会出现开启多个程序后,由于某个程序出现“无法响应”而导致系统崩溃的情况,这就是因为该程序在某个部位长时间占用了cpu的结果。为了使各程序能够通畅的执行,“抢先式多任务”应运而生,但这是建立在复杂的硬件支持下的,“抢先式多任务”操作系统合理的分配给每个进程时间片,在时间片结束时便收回对cpu的使用权。如今“抢先式多任务”已经大行其道,但是否“协同式多任务”就注定要在计算机历史中从此销匿呢?或者又另有转机?有关这一点,将另文再述。

  事实上,即便是多任务操作系统,一个单核cpu在一个时刻是只能被一个进程占用的,也就是说,在一个特定的时间点,cpu是只能处理单个任务的。那为什么说是多任务呢?原来,多任务是一个宏观的概念,就好比我的嘴巴不能同时又唱歌又吃饭,但我可以吃一口饭,然后唱一句歌,然后又吃一口饭……于是在一个时间段里,我确确实实是又在吃饭又在唱歌的。同样的道理,cpu在特定的时刻只能处理任务A,但任务A不一定要不间断的一次性完成,cpu可能在一个时间段内奔波于任务A和任务B,或者更多的任务当中。只不过cpu工作时速度非常的快,用户感觉系统是在同一时间点做多个任务。

  那一个任务又是怎样定义的呢?在单任务操作系统时期,当人们运行一个写好的程序(program)时,这个程序既可以表示静态的软件实体,是一组指令的集合;也可以表示其动态的执行过程。此时,一个程序就是一个任务。到了多任务操作系统出现后,正如上面所述的,一个特定的任务是被间断性的执行的,此时,任务被细分了,出现了进程(process)这个概念,它是系统执行程序时加载到内存的数据单元。一个进程还可以细分成多个更小的任务,我们把这更小的任务称为线程(thread),可以把线程看成是轻量级的进程(lightweight process),一切进程可以做的事,线程也可以做。进程可以看成是由N个线程构成的线程集合,如果N等于1,则该进程为单线程进程;当N大于1时,该线程为多线程进程。

  虽说线程可以看成是轻量级的进程,但二者还是有什么区别的。最主要的一点就是:在内存中,进程与进程之间是分开的,即拥有各自的地址空间;而线程之间是共享地址空间的。所以当系统创建一个新的进程时,这个进程在内存中就会分配得到一块地址空间。我们从高级语言的角度去做类比,假设程序执行过程中有一个变量x,在进程A和进程B对变量x有任何的处理都是各行其是,毫不相干的,因为进程A中的变量x和进程B中的变量x是保存在不同的地址空间的。但是如果一个进程里面的某个线程C和线程D同时对程序的变量y进行写操作时,就会出现错误,因为两个线程是共享同一块内存地址空间的,它们所要操作的变量y是同一个物体来的。

  进程之间的地址空间是分开的,这在执行上增加了安全性,但却降低了系统资源的利用率。您可以想象,假如程序中有一个变量z,它在内存占用了较大的地址空间,现在需要新创建一个进程F,按照不同的进程分配不同的地址空间,所以进程F分配到的地址空间内也应该有变量z。但正如之前说的,变量z是个大家伙,复制内存空间时需要较长的时间,这就拖慢了程序的执行。有鉴于此,linux系统采用了一种叫做“copy on write”(COW)的技术,该技术的做法顾名思义,就是新的进程F在创建时,它在新分配到的内存地址空间中并没有实实在在的将变量z写入,而只是写入了指向进程E所属得到内存地址空间中的变量z的指针。当新进程要读取变量z时,直接到进程E所属的内存地址空间读就是了;如果进程F要对变量z进行写操作,此时方才将进程E所属内存地址空间的变量z实实在在的复制到进程F所属的地址空间。这就是“copy on write”技术。再一次要交代的是,以上描述都是从高级编程语言的角度做类比的,实际cpu对指令的操作并不会有变量这类的概念。

多任务

原文:http://www.cnblogs.com/sengnj/p/3559835.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!