线程基础

来源:互联网 发布:扫描二维码抽奖软件 编辑:程序博客网 时间:2024/05/16 11:01

一.多任务系统与进程

        进程指运行中的应用程序,每一个进程都有自己独立的内存空间,使得进程之间的地址空间隔离即多任务系统。
        多任务系统里操作系统接管了所有的硬件资源,并本身运行在一个受硬件保护的级别。

二.线程的概念

        线程也被称为轻量级进程,是程序执行流的最小单元,一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成。通常意义上一个进程由多个或者一个线程组成,各个线程共享程序的内存空间及一些进程级的资源。
        如图为在进程内的线程
                                    

三.多线程

        在大多数软件应用中,线程的数量都不止一个。多线程可以互不干扰的并发执行,并共享进程的全局变量和堆的数据。那么多线程的进程与单线程的进程相比有哪些优势呢?
        多线程的优势如下:
        1.有效的利用等待时间:某个操作可能会陷入长时间的等待,等待的线程会进入睡眠状态,无法继续执行,而多线程执行可以有效利用等待的时间。
        2.避免中断:某个操作会消耗大量的时间,如果只有一个线程,程序和用户之间的交互会中断。多线程可以让一个线程负责交互,另一个线程负责计算。
        3.实现并发操作:有时候程序逻辑要求实现并发操作,只能在多线程时才能实现。
        4.尽可能的发挥计算机的能力:多cpu或者多核的计算机,本身具备同时执行多个线程的能力,单线程就无法有效的利用计算机的计算能力。
        5.数据共享能力高:相对于多进程的应用,多线程在数据共享方面效率要高很多。

四.线程的访问权限

        
       线程的访问非常自由,它可以访问进程内存里的所有数据,甚至包括其他线程的堆栈,但实际运用中线程也拥有自己的私有储存空间。
       1.栈:一般情况下可以认为是私有的数据。
       2.线程局部储存:线程具备储存是某些操作系统为线程单独提供的私有空间,通常容量有限。
       3.寄存器:寄存器是执行流的基本数据,因此线程私有。
       在c程序员的角度来看,在同一个进程里数据在线程之间共享的部分有:
       1.全局变量。
       2.堆上的数据。
       3.函数中的静态变量。
       4.代码。
       5.打开的文件。
       线程私有的部分有:
       1.局部变量。
       2.函数的参数。
       3.线程局部储存的数据。

五.线程调度与优先级

        线程是并发执行的,但在单处理器对应多线程的情况下,并发是模拟出来的,每次仅让一个线程执行一小段时间,这样每个线程就看起来是并发执行。这样在处理器上切换不同线程的行为称为“线程调度”在线程调度中有三种状态:
        1.运行,此时线程正在执行。
        2.就绪,此时线程课立刻执行,但cpu已被占用。
        3.此时线程正在等待某一事件发生,无法执行。
        线程调度状态间的关系:

                                  
        运行中的线程拥有的执行时间即时间片。
        在这种调度中线程优先级就决定了线程按照什么顺序轮流执行,系统也会自动调整优先级,使得调度更有效率。同时线程也存在一种饿死的情况,即总有优先级高于它的线程要执行,是该线程无法运行。为了避免,当一个线程长时间没有运行,系统会调高其优先级。
        在优先级调度的环境下,线程优先级改变有三种:
        1.用户指定。
        2.根据进入等待的频繁程度提升或降低优先级。
        3.长时间得不到运行而被系统调高优先级。

0 0
原创粉丝点击