操作系统之线程的基础知识

    在传统操作系统中,每个进程有一个地址空间和一个控制线程。不过,经常存在在同一个地址空间运行多个控制线程的情形,线程就像是分离想进程,不过他们共享着地址空间。

为什么需要线程?

    人们需要多线程的主要原因是,在许多应用中同时发生着多种活动。其中某些活动随着时间的推移会被阻塞。通过将这些应用程序分解成多个准并行运行的顺序线程,程序设计模型会变得更简单。需要线程的理由如下:
1)有了多线程的概念,我们才加入了一种新的元素:并行实体共享一个地址空间和所有可用数据。这是多进程模型无法表达的(他们具有不同的地址空间)、
2)线程比进程更加轻量级,创建线程比创建进程通常快10-100倍。
3)如果存在大量IO操作,多线程允许这些活动彼此重叠进行,从而加快应用程序的执行速度。
4)在多CPU系统中,多线程使得真正的并行有了实现的可能。

经典线程模型

    进程基于两种独立的概念:资源分组与执行。将这两个概念分开,即引入了线程这一概念。
    理解进程的一个角度是,用某种方法把相关的资源集中在一起。进程有存放程序正文和数据以及其他资源的地址空间。把他们都放到进程中更容易管理。
    另一个概念是,进程拥有一个执行的线程,通常简写为线程(thread)。线程中有一个程序计数器记录接着要执行哪个指令,一个堆栈记录执行历史,其中每一帧保存了一个已调用但还没返回的方法。进程用于把资源集中到一起,线程则是在CPU上被调度执行的实体。
    由于各个线程都可以访问进程地址空间中的没一个内存地址,所以一个线程可以读也可以写或者清除另一个线程的堆栈。线程直接是没有保护的,原因是1)不可能,2)没必要。
    线程概念试图实现的是,共享一组资源的多个线程的执行能力,以便这些线程可以为完成某一任务而共同工作。
    线程也有若干种状态:运行,就绪,阻塞或终止。

线程的实现

    有两种主要的方式实现线程:在用户空间中和在内核中。
    1)在用户空间中实现线程,内核对线程一无所知。从内核的角度看,仍然是单线程进程。在用户空间管理线程时,每个进程需要专用线程表。它的明显的问题是,如何实现阻塞系统调用。另一个问题是,一个线程运行,另一个就不能运行,除非主动放弃。
    2)在内核中实现线程,内核中有记录所有线程的线程表。
    3)混合实现,编程人员可以决定有多少个内核线程和多少个用户级线程彼此多路复用。

猜你喜欢

转载自blog.csdn.net/u010771890/article/details/73823737