zoukankan      html  css  js  c++  java
  • 第四章 线程

    第四章 线程

    一、定义:

    线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。

    一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。

    另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

    一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。

    线程也有就绪、阻塞和运行三种基本状态。

    就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

    线程是程序中一个单一的顺序控制流程。
    进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程

    2、线程的引入

    60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端

    一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;
    二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。

    因此在80年代,出现了能独立运行的基本单位——线程(Threads)。

    3、适用范围

    1.服务器中的文件管理或通信控制线程

    2.前后台处理

    3.异步处理

    4、特点

    在多线程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。
    

    线程具有以下属性:

    1)轻型实体
    线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。

    线程的实体包括程序、数据和TCB。

    线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。

    TCB包括以下信息:
    (1)线程状态。
    (2)当线程不运行时,被保存的现场资源。
    (3)一组执行堆栈。
    (4)存放每个线程的局部变量主存区。
    (5)访问同一个进程中的主存和其它资源。

    用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。

    2)独立调度和分派的基本单位。

    在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。

    3)可并发执行。

    在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。

    4)共享进程资源。

    线程在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。

    5、线程与进程区别

    进程是资源分配的基本单位。

    所有与该进程有关的资源,都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。

    另外,进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。

    与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。

    线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。

    通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。

    在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。

    由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。

    因而近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。

    线程与进程的区别可以归纳为以下4点:

    1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

    2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

    3)调度和切换:线程上下文切换比进程上下文切换要快得多。

    4)在多线程OS中,进程不是一个可执行的实体。

    6、多线程与多进程

    ■什么是多线程:

    多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。

    使用线程的好处有以下几点:

    •使用线程可以把占据长时间的程序中的任务放到后台去处理

    •用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

    •程序的运行速度可能加快

    •在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较游泳了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

    ====

    什么是多进程:

    进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。

    凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就不必我多讲了吧,所有由你启动的进程都是用户进程。进程是操作系统进行资源分配的单位。

    在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。

    在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。

    多任务带来的好处是明显的,比如你可以边听mp3边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。那么这里就涉及到并行的问题,俗话说,一心不能二用,这对计算机也一样,原则上一个CPU只能分配给一个进程,以便运行这个进程。我们通常使用的计算机中只有一个CPU,也就是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术

    实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。

    如果一台计算机有多个CPU,情况就不同了,如果进程数小于CPU数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行。但如果进程数大于CPU数,则仍然需要使用并发技术。

    在Windows中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这时情况更加复杂,但简单地说,有如下关系:

    **总线程数<= CPU数量:并行运行

    **总线程数 > CPU数量:并发运行

    并行运行的效率显然高于并发运行,所以在多CPU的计算机中,多任务的效率比较高。但是,如果在多CPU计算机中只运行一个进程(线程),就不能发挥多CPU的优势。

    二.线程的优缺点:

    1.优点:

    多线程处理可以同时运行多个线程。由于多线程应用程序将程序划分成多个独立的任务,因此可以在以下方面显著提高性能:

    1.1提高应用程序响应

    任何一个包含很多互不关联的操作(activity)的程序都可以被重新设计,使得每一个操作成为一个线程。例如,在一个GUI(图形用户界面)内执行一个操作的同时启动另外一个,就可以用多线程改善性能。

    1.2使多处理器效率更高

    典型情况下,有同时性需求的多线程应用程序不需要考虑处理器的数量。应用程序的性能在被多处理器改善的同时对用户是透明的。数学计算和有高度并发性需求的应用程序,比如矩阵乘法,在多处理器平
    台上可以用多线程来提高速度。

    1.3改善程序结构

    许多应用程序可以从一个单一的、巨大的线程改造成一些独立或半独立的执行部分,从而得到更有效的运行。多线程程序比单线程程序更能适应用户需求的变更。

    1.4占用较少的系统资源

    应用程序可以通过使用两个或更多的进程共享内存的办法来实现多于一个现成的控制。然而,每一个进程都要有一个完整的地址空间和操作系统状态表项。用于创建和维护多进程大量的状态表的开销与多线程方法相比,在时间上和空间上都更为昂贵。而且,进程所固有的独立性使得程序员花费很多精力来实现进程间的通信和同步。

    1.5把线程和RPC结合起来

    把多线程和RPC(remote procedure call,远程过程调用)结合起来,你可以使用没内存共享的多处理器(比方说一个工作站组)。这种结构把这组作站当作一个大的多处理器系统,使应用程序分布得更加容易。 例如,一个线程可以创建子线程,每一个子进程可以做RPC,调用另外一台机器上的过程。尽管最早的线程仅仅创建一些并行的线程,这种并行可以包括多台机器的运行。

    1.6 可以分别设置各个任务的优先级以优化性能,如线程创建时间和线程同步时间的改善。

    2.多线程的主要缺点包括:

    (1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。

    (2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。

    (3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。

    (4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。

    是否需要创建多个线程取决于各种因素。在以下情况下,最适合采用多线程处理:

    (1)耗时或大量占用处理器的任务阻塞用户界面操作;
    (2)各个任务必须等待外部资源 (如远程文件或 Internet连接)。

    三.线程的结构或分类

    在多线程操作系统中,各个系统的实现方式并不相同。在有的系统中实现了用户级线程,有的系统中实现了内核级线程

    1.内核级线程:

    (1)线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程。
    (2)这些线程可以在全系统内进行资源的竞争。
    (3)内核空间内为每一个内核支持线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在,并进行控制。

    在一定程度上类似于进程,只是创建、调度的开销要比进程小,有的统计是1:10

    内核线程的优点:
    (1)当有多个处理机时,一个进程的多个线程可以同时执行
    缺点:(1)由内核进行调度

    2.用户级线程:

    (1)用户级线程仅存在于用户空间。——>对比内核(3)

    (2)内核并不能看到用户线程。——>重要的区别

    (3)内核资源的分配仍然是按照进程进行分配的;各个用户线程只能在进程内进行资源竞争。

    (4) 每一个线程的下列状态在进程内部是惟一的:
    线程号;寄存器状态(包括程序计数器和堆栈指针);堆栈;信号掩码;优先级;线程私有的存储段。

    **用户进程的优点:**p117
    缺点:p118

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    基础语法 -实验楼
    JavaSE案例-Bank
    初识Java
    Java学习大纲-0412更新
    增量法
    蛮力法
    Host‘116.77.33.xx’is not allowed to connect to this MySQL server
    Maven坐标
    HotSpot虚拟机对象创建
    程序计数器为什么是线程私有的?
  • 原文地址:https://www.cnblogs.com/yangquanhui/p/4937502.html
Copyright © 2011-2022 走看看