线程一

线程一

一、什么是线程

​ 线程是进程轨迹的不同分支。进程拥有两个特点,一是资源所有权,即存放进程映像的虚拟地址空间;二是调度、分派的实体。线程将二者分离。我们称分派的单位称为线程,将资源所有权的单位成为进程。

二、多线程

​ 在多线程环境中,进程定义为资源分配单元和一个保护单元。

​ 一个进程中有一个或多个线程,每个线程拥有单独的栈和控制块。控制块中包含寄存器值、优先级和其他与线程相关的控制信息。进程中的线程共享该进程的状态和资源。

线程的优点

​ 1.同一进程内切换线程的时间要小于进程间切换的时间

​ 原因:此我们可以形象的认为线程是处在同一个屋檐下的,这里的屋檐就是虚拟地址空间,因此线程间切换无需虚拟地址空间的切换;而进程则不同,两个不同进程位于不同的屋檐下,即进程位于不同的虚拟地址空间,因此进程切换涉及到虚拟地址空间的切换,同时,线程切换需要保存的上下文内容要小于进程切换。这也是为什么进程切换要比线程切换慢

​ 2、线程间通信效率高

​ 原因:线程可以使用条件变量和锁来通信,这种通信都在同一进程的用户地址空间中,共享内存和文件。不需要内核介入。

三、线程分类

​ 线程根据调度者的不同,可分为三类:用户级线程、内核级线程、混合调度线程。

1.用户级线程

​ 用户级线程的管理工作都由应用程序完成,内核意识不到线程存在。当线程切换的时候,由线程库保存上下文,上下文包括:用户寄存器的内容、程序计数器、栈指针。

​ 当操作系统调度进程的时候,若进程阻塞,则其所有线程实际上是阻塞的。但在线程库看来,线程是运行态的。

优点

​ 1.线程切换不需要内核模式的特权,减少了两次状态转换(用户态->内核态,内核态->用户态),切换开销少

​ 2.可以为应用 程序量身定做调度算法,灵活度高

​ 3.跨平台性好,可以在任何操作系统中运行。

缺点

​ 1.当进程执行系统调用的时候,所有线程都会被阻塞。

​ 解决办法:使用套管技术。把一个阻塞的系统调用变成非阻塞的系统调用。如使用一个应用级的IO套管例程,它先检查IO设备是否忙,若忙,则阻塞当前线程,切换另一个线程。这个线程重新获得控制权后,套管例程会再次检查IO设备

​ 2.内核一次只能把一个进程分配给一个处理器。所以单个进程的线程无法做到并行执行。

2.内核级线程

​ 内核级线程所以管理工作均由操作系统完成。内核未进程和进程中的每个线程维护上下文信息。它克服了用户级线程的缺点,同时,内核例程也可以是多线程的。但用户级线程的优点变成了内核级线程的缺点。

四、一些面试题

1.线程和进程之前共享那些资源

​ 1.进程空间内开辟的,所以被共享

​ 2.全局变量。与某一函数无关,与特定线程无关

​ 3.静态变量。静态变量存放位置和全局变量一样,都存在于堆中开辟的.bss和.data段,是共享的

​ 4.其他一些共用资源,比如文件。

​ 同一进程的所有线程独享以下资源:

​ 1.栈。

​ 2.寄存器。

​ 3.程序计数器

线程运行的本质就是函数的执行,而函数的执行总会有一个源头,这个源头叫做入口函数,cup从入口函数开始一步一步向下执行,这个过程就叫做线程。由于函数运行时信息是保存在栈中的,比如返回值,参数,局部变量等等,所以栈是私有的。

​ cpu执行指令的信息会保存在寄存器中,这个寄存器叫做程序计数器。由于操作系统可以随时终止线程的运行,所以保存和恢复程序计数器的值就知道线程从哪里暂停的以及从哪里开始运行。

2.进程和线程的联系与区别

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

​ 资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

​ 包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

​ 内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

​ 影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

​ 执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行