⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 200603091754305.html

📁 软件工程的红包书
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<P> &nbsp; 线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。</P>
<P> &nbsp; 发生进程切换与发生线程切换时相比较,进程切换时涉及到有关资源指针的保存以及地址空间的变化等问题;线程切换时,由于同不进程内的线程共享资源和地址 空间,将不涉及资源信息的保存和地址变化问题,从而减少了操作系统的开销时间。而且,进程的调度与切换都是由操作系统内核完成,而线程则既可由操作系统内 核完成,也可由用户程序进行。</P>
<P><IMG src="200639175134137.gif" tppabs="http://www.itisedu.com/manage/Upload/image/200639175134137.gif" border=0></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图1 多线程与进程之间的关系</P>
<P><STRONG>五、线程的适用范围</STRONG></P>
<P> &nbsp;  典型的应用</P>
<P> 1.服务器中的文件管理或通信控制</P>
<P> 2.前后台处理</P>
<P> 3.异步处理</P>
<P><IMG src="200639175342760.gif" tppabs="http://www.itisedu.com/manage/Upload/image/200639175342760.gif" border=0></P>
<P><BR><STRONG>六、线程的执行特性</STRONG></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个线程必须处于如下四种可能的状态之一:</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 初始态:一个线程调用了new方法之后,并在调用start方法之前的所处状态。在初始态中,可以调用start和stop方法。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Runnable:一旦线程调用了start 方法,线程就转到Runnable 状态,注意,如果线程处于Runnable状态,它也有可能不在运行,这是因为还有优先级和调度问题。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 阻塞/ NonRunnable:线程处于阻塞/NonRunnable状态,这是由两种可能性造成的:要么是因挂起而暂停的,要么是由于某些原因而阻塞的,例如包括等待IO请求的完成。 退出:线程转到退出状态,这有两种可能性,要么是run方法执行结束,要么是调用了stop方法。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后一个概念就是线程的优先级,线程可以设定优先级,高优先级的线程可以安排在低优先级线程之前完成。一个应用程序可以通过使用线程中的方法setPriority(int),来设置线程的优先级大小。 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 线程有5种基本操作:</P>
<P> 派生:线程在进程内派生出来,它即可由进程派生,也可由线程派生。<BR> 阻塞(Block):如果一个线程在执行过程中需要等待某个事件发生,则被阻塞。<BR> 激活(unblock):如果阻塞线程的事件发生,则该线程被激活并进入就绪队列。<BR> 调度(schedule):选择一个就绪线程进入执行状态。<BR> 结束(Finish):如果一个线程执行结束,它的寄存器上下文以及堆栈内容等将被释放。</P>
<P><IMG src="200639175353990.gif" tppabs="http://www.itisedu.com/manage/Upload/image/200639175353990.gif" border=0><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图2 线程的状态与操作<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 线程的另一个执行特性是同步。线程中所使用的同步控制机制与进程中所使用的同步控制机制相同。</P>
<P><STRONG>七、线程的分类</STRONG></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 线程有两个基本<a href="200603051002565.html" tppabs="http://www.itisedu.com/phrase/200603051002565.html" target="_new">类型</a>:</P>
<P>&nbsp;&nbsp;&nbsp;  用户级线程:管理过程全部由用户程序完成,操作系统内核心只对进程进行管理。</P>
<P>&nbsp;&nbsp;&nbsp;  系统级线程(核心级线程):由操作系统内核进行管理。操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行、撤消线程。</P>
<P><STRONG>附:线程举例</STRONG></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. SUN Solaris 2.3</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Solaris支持内核线程、轻权进程和用户线程。一个进程可有大量用户线程;大量用户线程复用少量的轻权进程,轻权进程与内核线程一一对应。 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户级线程在调用核心服务时(如文件读写),需要“捆绑(bound)”在一个LWP上。永久捆绑(一个LWP固定被一个用户级线程占用,该LWP移到LWP池之外)和临时捆绑(从LWP池中临时分配一个未被占用的LWP)。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在调用系统服务时,如果所有LWP已被其他用户级线程所占用(捆绑),则该线程阻塞直到有可用的LWP。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果LWP执行系统线程时阻塞(如read()调用),则当前捆绑在LWP上的用户级线程也阻塞。<BR><IMG src="20063917547737.gif" tppabs="http://www.itisedu.com/manage/Upload/image/20063917547737.gif" border=0>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图3&nbsp; 用户线程、轻权进程和核心线程的关系</P>
<P>&nbsp;¨&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有关的C库函数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 创建用户级线程&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; int thr_create(void *stack_base, size_t stack_size,<BR>&nbsp;&nbsp;&nbsp; void *(*start_routine)(void *), void *arg, long flags,<BR>&nbsp;&nbsp;&nbsp; thread_t *new_thread_id);&nbsp; <BR>&nbsp; 其中flags包括:THR_BOUND(永久捆绑), THR_NEW_LWP(创建新LWP放入LWP池),若两者同时指定则创建两个新LWP,一个永久捆绑而另一个放入LWP池。<BR>&nbsp;&sup2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有关的系统调用<BR>&nbsp;&nbsp; /* 在当前进程中创建LWP&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp; int _lwp_create(ucontext_t *contextp, unsigned long flags,</P>
<P>&nbsp; lwpid_t *new_lwp_id);<BR>&nbsp; /* 构造LWP上下文&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp; void _lwp_makecontext(ucontext_t *ucp,<BR>&nbsp;&nbsp; void (*start_routine)( void *), void *arg,<BR>&nbsp; void *private, caddr_t stack_base, size_t stack_size);<BR>&nbsp; /* 注意:没有进行“捆绑”操作的系统调用 */</P>
<P>&nbsp;&nbsp;&nbsp; 2. Windows NT<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NT线程的上下文包括:寄存器、核心栈、线程环境块和用户栈。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NT线程状态<BR>&nbsp;&nbsp; (1) 就绪状态:进程已获得除处理机外的所需资源,等待执行。<BR>&nbsp;&nbsp; (2) 备用状态:特定处理器的执行对象,系统中每个处理器上只能有一个处于备用状态的线程。<BR>&nbsp;&nbsp; (3) 运行状态:完成描述表切换,线程进入运行状态,直到内核抢先、时间片用完、线程终止或进行等待状态。<BR>&nbsp;&nbsp; (4) 等待状态:线程等待对象句柄,以同步它的执行。等待结束时,根据优先级进入运行、就绪状态。<BR>&nbsp;&nbsp; (5) 转换状态:线程在准备执行而其内核堆栈处于外存时,线程进入转换状态;当其内核堆栈调回内存,线程进入就绪状态。<BR>&nbsp;&nbsp; (6) 终止状态:线程执行完就进入终止状态;如执行体有一指向线程对象的指针,可将线程对象重新初始化,并再次使用。</P>
<P><IMG src="200639175419984.gif" tppabs="http://www.itisedu.com/manage/Upload/image/200639175419984.gif" border=0><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图4&nbsp; Windows NT的线程状态<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NT线程的有关API<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CreateThread()函数在调用进程的地址空间上创建一个线程,以执行指定的函数;返回值为所创建线程的句柄。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExitThread()函数用于结束本线程。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SuspendThread()函数用于挂起指定的线程。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResumeThread()函数递减指定线程的挂起计数,挂起计数为0时,线程恢复执行。</P>
<P>&nbsp;</P>
<P></FONT>&nbsp;</P></div>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -