计算机中的多线程问题

2013-08-15 00:52
科技传播 2013年22期
关键词:同步控制内核线程

张 蕊

天津师范大学计算机与信息工程学院,天津 300387

1 多线程的相关概述

1.1 进程与线程的区别

对并行计算的研究是当代高效计算机系统设计中至关重要的一部分,并行的效果往往依赖于支持并行性的系统所提供的并发机制。进程是计算机资源分配的单位。一个大任务一般可以分成多个子任务, 这些子任务的执行组成了整个任务功能。线程和进程的区别主要存在于创建线程的阶段, 线程相较于进程并不是复制父进程映象, 而是和父进程一起实现共享。多个线程一起共享各种资源和同一地址空间, 不同的只有代码段和私有栈。因此创建线程和调度线程的费用与原来的方式相比明显降低了。

1.2 线程

所谓线程(thread),简单地说就是指进程中的单一顺序控制流(a thread is a single stream of execution with in a process)。线程是程序的一个调度单位,同时也是计算机科学领域的术语之一。线程的另一个别称是轻量级进程(lightweight processes)。线程往往有自己的寄存器集、局部线程变量、栈、线程说明数据、程序计数器、状态信息以及线程说明信号掩码。一个进程里的多个线程之间往往要共享同样的的地址空间并共同构成一个大的进程,线程执行的基础是要先有进程的执行,也就是说线程其实是无法独立执行的。

1.3 多线程

多线程是从硬件或软件上实现多个线程并发执行的一种技术。有多线程能力的计算机往往具有强大的硬件支持,因而能够同时运行多于一个的线程,进而提升了整体处理的效能。引进多线程具有一定的必要性,因为多线程具有诸多优点。多线程可以提高系统的吞吐率和程序的响应效率,同时有助于改善程序的结构,从而使用户能够更加有效地利用好系统的资源。此外,多线程在降低资源的占用和加强用户间通信效果等诸多方面也有积极的作用。例如,我们在word 中打印文件的过程,对文件的编辑并不会影响到对文件的打印,编辑操作和打印操作其实是异步执行的,或者可以理解为打印操作是在后台完成的。这是因为系统创建了两个独立线程来分别完成对文件的编辑和对文件的打印,同时规定负责编辑文档的线程的优先级要高于负责打印文档的线程。在我们实际的应用中,多线程的方法非常适合用于解决多个独立任务组成的问题。

2 线程的分类

2.1 用户级线程

用户级线程(user level threads)是由用户程序来负责管理的,传统的操作系统内核只负责对进程的管理。

操作系统通常会提供一个能够在用户空间里执行的线程库,以方便用户程序对于用户级线程的管理工作。这个能够在用户空间里执行的线程库提供了包括线程的创建、线程的调度、线程的执行、线程的撤销、线程间通信以及存储上下文在内的一些功能。有了线程库提供的这些功能,用户级线程的实现就不再需要操作系统给予其他的特殊支持了。此外,对于操作系统分配的用户堆栈和用户寄存器,用户级进程只能使用其所属进程被分配的用户堆栈和用户寄存器。

用户级线程的上下文切换与内核无关,所以可能存在相关进程的状态是阻塞或等待的,而属于该进程的线程状态却是执行情况。

2.2 核心级线程

核心及线程与用户级线程的不同之处在于,前者不仅可以在同一个处理机上被并发执行,还可以在不同处理机上被并行执行。所以操作系统内核在负责同一进程内部的不同线程的调度工作的同时,可能也要进行不同进程之间的调度工作。这种工作机制有效地避免线程处于执行状态、进程处于等待或阻塞状态的情况发生。而另外,为了达到提高操作系统内核程序执行效率的效果,核心级线程技术也会用于内核程序自身。综上,和用户级线程进行比较,核心级线程在上下文切换上所用的时间要大于用户级线程。

3 JAVA 中的多线程机制

3.1 JAVA 中线程的创建

在JAVA 语言中,可采用两种方式产生线程。第一种方法是继承,即通过继承Thread 类的方法,重写和覆盖部分方法run(),然后即可创建和启用自己定义的线程实例,当然这些线程实例是在应用程序类里创建和启动的。另一种方法是实现Runnable 接口。这种方法也是目前是非常常用的创建线程的方法之一,它打破了第一种方法(即继承Thread 类)受到的的限制。在JAVA 的类库里,Runnable 接口中仅仅包含了一个run()方法。所有对象,只要属于能够实现该接口的类,就应该可以用线程的方式执行。当然,只是对类进行声明是无法对任何对线程提供支持的,因此还需要对Thread 类实例进行创建。

3.2 JAVA 对多线程的同步控制

JAVA 对多线程同步控制的方法主要是围绕关键字synchronized 展开,并配合wait、sleep、notify 等方法,来实现类似操作系统中PV 原语的信号量机制。因此将JAVA 对多线程的同步控制步骤归纳如下:

1) 对需要同步保护的几个方法或代码段增加synchronized 限制符,这就是加锁的过程;

2)对增加了synchronized 限制符的方法或代码中配合使用wait、sleep 等阻塞方法,来实现需要的功能;

3)在增加了synchronized 限制符的代码或方法最后用notif 或notifyall 等方法唤醒阻塞中的线程,实现线程间的通信。

目前,对计算机中多线程问题的研究主要应用于局域网服务器中的文件管理或通信控制、WWW 服务器的多线程并发研究两个方面。在局域网服务器的文件管理中,服务器进程会派生出相应的线程来处理用户访问文件的要求。为了能够应对同时接受到多个访问文件要求的情况,操作系统可以采取派生出多个线程的方法进行处理。当计算机的系统是多处理的情况下,线程还能在不同处理机上被执行。www 服务器分为重复服务器和并发服务器。重复服务器一般面向能在短时间内处理完成的请求, 并且是由服务器来对这些请求进行处理的。并发服务器则面向那些处理完成时间不定长的请求, 由服务器的进程或线程来处理每个请求。

[1]张玉蓉,蓝雯飞.Java的多线程技术探讨[J].计算机教育,2006(4).

[2]http://uule.iteye.com/blog/1106710.

猜你喜欢
同步控制内核线程
强化『高新』内核 打造农业『硅谷』
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
基于EtherCAT网络的金刚线多线切割机双主轴同步控制
浅谈linux多线程协作
微生物内核 生态型农资
基于云模型的舵机同步控制
基于广义预测的双转动扫描系统同步控制
基于上下文定界的Fork/Join并行性的并发程序可达性分析*
一个具有完全四翼形式的四维混沌系统同步控制