现代操作系统笔记之 线程

发表于:2013-8-23 10:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:YetToCome    来源:51Testing软件测试网采编

  线程其实就像是对进程的进一步划分,每个进程都拥有自己的地址空间,而在这一个地址空间中可能存在多个控制线程。

  线程的使用

  为什么需要线程?以下是几点原因

  1、许多应用中同时有多个活动,某些活动可能会阻塞,将这些活动分配到不同的线程可以使程序设计模型更加简单。

  2、线程更加轻量级,创建和撤销比进程更快。

  3、如果存在大量计算和大量I/O处理,多线程允许活动重叠进行(流水线),加快活动执行。

  4、在多CPU系统中,可以实现真正的并行。

  下面参考一个例子,一个字处理软件假设只有一个线程,那么当用户准备对书本进行重新排版的时候,程序不能立即执行,这时候还在等待用户的进一步输入,而全部的交互完成之后,软件处理可能需要大量的等待时间。相反,假设这个程序拥有两个线程,一个负责与用户进行交互,一个负责后台的处理,那么,在用户与软件进行交互的过程中,另一个线程就能够处理大量的工作而不需要用户全部输入完毕,这样就节省了许多时间。当然,也可以同时拥有3个线程,还有一个负责与磁盘交互,随时进行数据的备份,如图:

  考虑另一个例子,一个万维网服务器,对页面的请求发送给服务器,所请求的页面发还给客户机。

  一种Web服务器的方式如下图所示,一个称为分派程序的线程从网络中读入工作请求,然后挑选一个被阻塞的工作线程,提交该请求,使工作线程处于就绪状态。然后,工作线程检查有关的请求是否在Web页面高速缓存中,如果没有,则该线程开始一个从磁盘调入页面的read操作,并且阻塞直到该操作完成。此时,分派线程可以挑选另一个线程完成其他工作,也可以把另一个当前就绪的工作线程投入运行。

  但是,假设没有多线程可以使用,而且又不能忍受单线程造成的低性能,那么可以使用read系统调用的非阻塞版本。当请求到来时,这个唯一的线程就去对请求进行考察,如果该请求能够在高速缓存中得到满足,那么一些都好,如果不能,那么就启动一个非阻塞的磁盘操作。

  服务器在当前表格中记录当前请求的状态,然后去处理下一个事件。可能是新工作的请求,或是磁盘对先前操作的回答。如果是新的工作,那么就去处理这个工作,如果是磁盘的回答,那么就从表中取出相应的回答。对于非阻塞磁盘I/O而言,这种回答通常以信号或中断方式进行。这种设计称为有限状态机。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号