您的位置:首页 > 其它

关于线程的一点体会

2010-08-29 11:05 204 查看
历史总要向前发展。马克思主义哲学上讲,生产力决定生产关系,生产关系必须要适应生产力的发展,否则就必须以革命或者改革的方式对现有的生产关系进行调整以更好的适应生产力的发展。这一点在计算机技术的发展历史中其实也得到了充分验证。当多道程序设计出现以后,人们认识到程序已经具有了新的变化,拥有了一些新的特性,如并发性和动态性以及相互间存在的制约关系,这些新的特性与我们以往认识到的程序的静态性相比似乎显得有点格格不入,以往的具有静态属性的“程序”概念已经不能够正确地描述多道程序系统的特点。于是,在这样一个风雨飘摇的时代,“进程”这个新生的婴儿呱呱坠地,应运而生!
随着计算机技术的继续向前发展以及人们对于运算速度的执着而永恒追求,不断提高计算机系统的并行性成为大家公认的奋斗目标。谁能够在这个领域作出辉煌业绩,谁就将永载史册。在这最为原始的驱动力下,很快就出现了一系列新的技术,如硬件方面出现了流水线计算机、数据流计算机、并行处理器和流水存储器、多体交叉以及多端口存储器,软件方面的中断、通道、多道程序设计技术以及并发程序设计技术等等,这些技术的出现对于提高计算机系统的并行性都具有划时代意义。在并行技术的这条路上,人们似乎越走越远,然而请别忘了当初我们是怎么出发的?如果当初没有“进程”这个概念的提出,我想人们在并行这条路上走得可能并不会如此顺畅!
人们的认识总在不断深化。如果说“进程”的出现带来了计算机史上关于并行技术的第一次革命,那么“线程”的出现则开启了并行技术发展的第二次革命的大门。当并行技术发展到一定阶段以后,人们发现了一个非常令人头痛的问题。那就是进程的开关开销严重降低了并发进程所带来的利益。举个例子,进程在运行中免不了要提出访问管理程序(系统调用)的要求,如提出I/O请求、由于时钟中断打断当前进程而需要调用其他就绪进程运行。这个是时候就出现了进程的开关开销。进程的开关开销会要耗掉不少CPU时间,因为需要更改PCB表,以及各种队列,包括阻塞队列、就绪队列、运行队列或指针,还有存储有关的地址映射及表格、I/O文件的表格等。此外,将进程地址的空间转换为新进程的地址空间以及两次模式开关(用户模式->内核模式->用户模式)都会带来巨大的开销。这种开销让执着追求新技术和新突破的科学家们陷入了沉思。
经过思考,人们很快发现了进程的两个局限性。其一,应用希望并发执行彼此独立的各任务,然而却必须共享一个公共的地址空间和其他资源;其二,传统的进程不能利用多处理器,因为一个进程只能运行在一个处理器上。怎么解决?在进程中引入线程!
引入线程后,进程仅仅是资源分配的单位,线程取代进程成为系统调度的可执行单元。一个进程可以包含多个线程,这些线程共享进程所拥有的资源,同一进程内部的各线程之间以及不同进程的线程之间都可以并发执行。这就大大提高了程序的并发性和系统的吞吐率及效率。此外,相比进程线程还有下面两个显著的优点:其一,线程间的开关开销远远小于进程间的开关开销,因为开关的线程都在同一地址空间内(系统分配给进程的地址空间),只需要更改线程控制表或队列,不涉及地址空间的转换。其二,创建和撤销线程的系统开销要比创建及撤销进程的系统开销要小。如在创建进程的时候需要创建PCB表,给进程分配系统资源,还要将它放入就绪队列等。
正如我们讲“进程”概念的时候会要拿它和“程序”概念做一番比较,因为“进程”是在“程序”不能适应时代发展时产生的,同样讲到“线程”这个概念时也是很有必要将其与“进程”来对比一下的。
首先从概念上看,进程是资源分配的基本单位,是程序的一次动态执行过程;而线程是进程内相对独立的、可调度的执行单元。一个进程可以包含多个线程。
其次从执行过程来看,进程拥有独立的内存单元,而线程本身不拥有资源,多个线程共享进程的资源。每一个独立的线程都有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立的执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
其三从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但是操作系统并没有将多个线程看做独立的应用来实现进程的调度和管理及资源分配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: