正在加载图片...
或某种其他原因而引起的,此时它是被强行终止的。可见,线程如同进程一样,具有一定的生命 周期。 3.线程的同步 在多线程os中通常提供多种同步机制,如互斥锁、条件变量、信号量机制以及多读、单 写锁等,它们可支持不同频率的交互操作和不同程度的并行性。 (1)互斥锁 互斥锁有开锁和关锁两种状态,并能进行关锁和开锁两种操作。当一个线程需要访问某个 临界资源时,线程首先应对为该资源所设置的互斥锁 mutex进行关锁操作 mutex enter:判别 mutex的状态,如果它已处于关锁状态,则试图访问该资源的线程将被阻塞;而如果mtex处于 开锁状态,则将mtex关上后便可访问该资源。在线程完成对共享资源的访问后,必须执行开 锁操作 mutex-exit:如果有线程阻塞在该互斥锁上,则唤醒其中的一个线程;而如果没有阻塞 的线程,则将互斥锁的状态置成开锁状态。为了降低线程被阻塞的频率,在有的系统中还提供 了一种不阻塞的关锁操作 mutex tryenter,当 mutex处于关锁状态时, mutex tryenter并不阻 塞线程,而只是返回一个指示操作失败的状态码。 互斥锁是一种比较简单的同步机制,而且是严格括入的( bracketing),一个线程去打开被 另一线程关闭的互斥锁将是错误的,因此它只适用于实现线程对资源的互斥访问。由于操作互 斥锁的时间和空间开销都较低,因而它较适合于高频度使用的关键共享数据和程序段。 (2)条件变量 条件变量必须和互斥锁配合起来使用,它用于等待,直到某一特定条件为真。对条件变量 的 cv walt操作将使线程阻塞,直到所等的条件信号成立后,才能由 cv signal操作将其中的 个阻塞线程唤醒。 cv wait操作在阻塞线程前将对相应的互斥锁执行开锁操作,并在返回前 重新对互斥锁进行关锁操作。条件变量可用来实现互斥或同步,它的典型使用方式为 mutex enter(&mutex) hile(some condition)( cv wait(&cv, &mutex) mutex exit(&mutex) 这里允许条件是一个复杂的表达式,因为它受互斥锁的保护。 (3)信号量机制 信号量机制也可用于多线程os中,实现诸线程或进程之间的同步。为了提高效率,可为线程和 进程分别设置相应的信号量。 当某线程利用信号量来实现同一进程中各线程之间的同步时,可调用创建信号量命令来创 建一私用信号量,其数据结构被存放在应用程序的地址空间中。私用信号量属于特定的进程所 有,0S并不知道私用信号量的存在,因此,一旦发生私用信号量的占用者异常结束或正常结束, 但并未释放该信号量所占用的空间时,系统无法使它恢复为0(空),也不能将它传送给下一个 请求它的线程 当要实现不同进程间或不同进程中各线程之间的同步时,则可由系统为它们创建一个公用 信号量,其数据结构存放在受保护的系统存储区中,并由os为它分配空间并进行管理,故也称 其为系统信号量。如果信号量的占有者在结束时未释放该公用信号量,则0S会自动将该信号 量空间回收,并通知下一个进程。可见,公用信号量是一种比较安全的同步机制 4.内核支持线程和用户级线程 线程己在许多系统中实现,但实现的方式并不完全相同。有些系统中,特别是一些数据库或某种其他原因而引起的,此时它是被强行终止的。可见,线程如同进程一样,具有一定的生命 周期。 3.线程的同步 在多线程 os 中通常提供多种同步机制,如互斥锁、条件变量、信号量机制以及多读、单 写锁等,它们可支持不同频率的交互操作和不同程度的并行性。 (1)互斥锁 互斥锁有开锁和关锁两种状态,并能进行关锁和开锁两种操作。当一个线程需要访问某个 临界资源时,线程首先应对为该资源所设置的互斥锁 mutex 进行关锁操作 mutex_enter:判别 mutex的状态,如果它已处于关锁状态,则试图访问该资源的线程将被阻塞;而如果mutex处于 开锁状态,则将 mutex 关上后便可访问该资源。在线程完成对共享资源的访问后,必须执行开 锁操作 mutex-exit:如果有线程阻塞在该互斥锁上,则唤醒其中的一个线程;而如果没有阻塞 的线程,则将互斥锁的状态置成开锁状态。为了降低线程被阻塞的频率,在有的系统中还提供 了一种不阻塞的关锁操作mutex_tryenter,当mutex处于关锁状态时,mutex_tryenter并不阻 塞线程,而只是返回一个指示操作失败的状态码。 互斥锁是一种比较简单的同步机制,而且是严格括入的(bracketing),一个线程去打开被 另一线程关闭的互斥锁将是错误的,因此它只适用于实现线程对资源的互斥访问。由于操作互 斥锁的时间和空间开销都较低,因而它较适合于高频度使用的关键共享数据和程序段。 (2)条件变量 条件变量必须和互斥锁配合起来使用,它用于等待,直到某一特定条件为真。对条件变量 的 cv_wait 操作将使线程阻塞,直到所等的条件信号成立后,才能由 cv_signal 操作将其中的 一个阻塞线程唤醒。cv_wait 操作在阻塞线程前将对相应的互斥锁执行开锁操作,并在返回前 重新对互斥锁进行关锁操作。条件变量可用来实现互斥或同步,它的典型使用方式为: mutex_enter(&mutex); ┇ while(some_condition){ cv_wait(&cv,&mutex); } ┇ mutex_exit(&mutex); 这里允许条件是一个复杂的表达式,因为它受互斥锁的保护。 (3)信号量机制 信号量机制也可用于多线程 os 中,实现诸线程或进程之间的同步。为了提高效率,可为线程和 进程分别设置相应的信号量。 当某线程利用信号量来实现同一进程中各线程之间的同步时,可调用创建信号量命令来创 建一私用信号量,其数据结构被存放在应用程序的地址空间中。私用信号量属于特定的进程所 有,OS 并不知道私用信号量的存在,因此,一旦发生私用信号量的占用者异常结束或正常结束, 但并未释放该信号量所占用的空间时,系统无法使它恢复为 0(空),也不能将它传送给下一个 请求它的线程。 当要实现不同进程间或不同进程中各线程之间的同步时,则可由系统为它们创建-个公用 信号量,其数据结构存放在受保护的系统存储区中,并由 os 为它分配空间并进行管理,故也称 其为系统信号量。如果信号量的占有者在结束时未释放该公用信号量,则 OS 会自动将该信号 量空间回收,并通知下一个进程。可见,公用信号量是一种比较安全的同步机制。 4.内核支持线程和用户级线程 线程己在许多系统中实现,但实现的方式并不完全相同。有些系统中,特别是一些数据库
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有