天天看点

2.2 线程

1、为什么要引入线程?

减少程序在并发执行时所付出的时空开销,提高操作系统的并发执行。

2、线程概念

线程从属于进程,是程序的实际执行者,被称为“轻量级进程”。它是比进程更小的独立运行的基本单位,是被操作系统独立调度和分配的基本单位。一个进程至少包含一个主线程,也可以有更多的子线程,线程拥有自己的栈空间。

对操作系统而言,线程是最小的执行单元,进程是最小的资源管理单元。无论是进程还是线程,都是由操作系统所管理的。

3、进程与线程区别

(1)同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间;

(2)同一进程内的线程共享本进程的资源,但是进程之间的资源是独立的;

(3)一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程崩溃,所以多进程比多线程健壮;

(4)进程切换,消耗的资源大。所以涉及到频繁的切换,使用线程要好于进程;

(5)两者均可并发执行;

(6)每个独立的进程有一个程序的入口、程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

4、进程与线程联系

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源;

(3)处理机分给线程,即真正在处理机上运行的是线程;

(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

5、线程实现方式

线程实现分为用户级线程(User-Level Thread,ULT)和内核级线程(Kernel-Level Thread,KLT)两类。

在用户级线程中,线程的所有管理工作(线程的创建、撤销、切换等)的都由应用程序完成,内核意识不到线程的存在。应用程序通过使用线程库(pthread,Linux)来实现多线程程序。通常应用程序从单线程开始运行,在某一时刻通过调用线程库中的派生例程创建相同进程中的另一个新线程,如ORB-SLAM2源码中。

在内核级线程中,线程的所有管理都有内核完成,应用程序没有管理内核线程的代码,只有到内核级线程的编程接口。

继续阅读