线程

来源:互联网 发布:细说PHP答案 编辑:程序博客网 时间:2024/06/05 08:40

引入线程的目的

为了提高CPU利用率。线程给操作系统带来的创建维护和管理负担要轻。因为与线程相关的信息比较少,交情的负担意味着线程的代价或开销比较少。当处理器除一个进程并激活另一个进程时,就要发生上下文切换。为了发生上下文切换,操作系统必须启动和重新启动每个进程所需的信息。这就意味着必须保存描述进程存在状态的有关信息,在进程再次激活时,就可以从离开的地点继续执行。那么系统在进程切换时需要保存那些信息呢?下面一一列举

1、所需信息包括可执行程序、堆栈、以及静态与动态分配变量内存的指针。

2、寄存器组中包含执行下一条指令的指针这样的信息 。

3、重新任命进程时需要进程的状态(进程是被挂起还是被阻塞)和优先权。同时程序的I/O状态也被保存。

4、保存进程的规划信息,内存管理信息以及计数信息。

5、进程需要文件描述器和读写指针来继续使用资源。

而线程同样需要上下文。当线程被抢先时同样也会发生上下文切换。

与进程相比线程的优势如下:

1、线程不需要地址空间。线程包含在进程的地址空间中。(所以在重新任命进程时所需的线程都不需要

2、线程的上下文只包含一个堆栈、一个寄存器组和一个优先权。

3、寄存器组包含程序或指令指针以及堆栈指针。

4、线程的文本包含在他的进程的文本中。

5、进程拥有的所有资源都属于线程。所以与资源相关的所有信息不是线程上下文的部分。

6、其他信息如规划、计数等都是由进程所定义。无需包含在线程的上下文中。

线程与进程的相同之处是:都有ID,寄存器组、状态、以及优先权。线程与子进程共享父进程的资源。

他们的不同之处是:

1、线程没有自己的地址空间,如果进程创建了多个所有的线程都将包含在他的地址空间中。

2、父进程和子进程之间必须通过进程间通信机制来进行通信。而进程中的多个线程之间是通过读取和写入数据到进程变量来通信。

3、子进程对其他子进程不施加控制,而进程的线程被看做同位体(peer)并对进程的其他的线程施加控制。

总结:进程有两大特性:(1)进程是一个可拥有资源的独立单位。(2)进程同时又是一个可以独立调度和分派的基本单位。而进程由于自身具有这两个特性,在进程创建撤销和切换系统需要付出较大的时空开销。而如果将其中的一个特性分给线程(即将独立调度和分派的基本单位赋给线程),这样就做到了调度和分派线程时不用切换进程的资源。

也可以从以下几个方面来分析线程的优势:

(1)调度———线程的调度不需要重新分配资源。只有进程切换时才会引起资源的重新分配。

(2)并发性——进程中的线程具有并发性,这样提高了系统资源利用率和吞吐量。

(3)拥有资源——线程只具有很少的一点系统资源。可以直接访问其进程的资源。

(4)系统开销——进程的创建切换和撤销要远比线程的大。

线程的终止有两种:1、线程完成自动退出。2、线程运行出错

线程间的同步和通信:同进程一样线程中的同步机制有:互斥锁(可能会引起死锁,如线程A进入临界区C,A想访问C中的资源R,而R由线程B控制,,此时线程B想访问C,便导致死锁),条件变量(引入条件变量,每一个条件变量都与一个互斥锁一起使用,用来保证对临界区的互斥进入),计数信号量(私用信号量(进程特有,操作系统不知道其存在),公用信号量(位实现不同进程间或不同进程个线程之间的同步而设置的。))等。

线程实现的方式:

1、用户级线程:仅存在于用户空间中,其创建撤销切换不需要系统调用来实现。其调度是以线程为单位。它运行在一个中间系统上。当前有两种中间系统:运行时系统(一组管理和控制线程的函数集合,这些都在用户空间中)和内核控制线程。

2、内核支持线程:其创建,撤销,切换都是利用内核。调度是以线程为单位。这种线程称为轻型进程(LWP),用户级线程运行时只要将它连接到一个LWP,此时它便具有了内核支持线程的所有的属性。用户级线程与内核控制线程的连接方式有:一对一(建立之后就连接),多对一(用户级线程当需要访问内核时才连接),多对多模型(内核控制线程小于等于用户线程)。

 

 

 

原创粉丝点击