2024年5月25日发(作者:)
Linux
线程
第
10
章
线程控制
线程技术早在
20
世纪
60
年代就被提出,
20
世纪
80
年代中期多线程被应用到操作
系统中。目前,多线程技术已经被许多操作系统所支持,包括
Windows NT/2000
和
Linux
。
Linux
是一个多用户、多任务的操作系统。多用户是指多个用户可以在同一时间使
用计算机系统;多任务是指
Linux
可以同时执行几个任务,它可以在还没有执行完一个
任务时又执行另一项任务。在操作系统设计上,从进程(
Process
)演化出线程
(
Thread
),最主要的目的就是更好地支持多处理器,并且减小(进程
/
线程)上下文切换
的开销。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源。在
两个普通进程
(
非线程
)
间进行切换时,内核准备从一个进程的上下文切换到另一个进程
的上下文要有很大的花费,包括保存老进程
CPU
状态,并加载新进程的保存状态,用
新进程的内存映像替换老进程的内存映像。
10.1 Linux线程
根据操作系统的定义,进程是系统资源管理的最小单位,线程是计算机中程序执行
的最小单位,运行时占用的系统资源较少,一个进程可以拥有多个线程。本节介绍
Linux
线程的一些基本概念,包括线程和进程的关系、线程的分类等。
10.1.1 线程和进程的关系
线程和进程十分相似,不同的只是线程比进程小,每个线程所占用的
CPU
时间是
由系统分配的,也可以认为线程是操作系统分配
CPU
时间的基本单位,进程可以同时
使用多个
CPU
来执行各个线程,达到最大程度的并行,以提高效率。一个进程至少需
要一个线程作为它的指令执行体。从用户的角度看多个线程是同时执行的,从操作系统
的角度看各个线程是交替执行的。系统不停地在各个线程之间切换,每个线程只有在系
统分配的时间内才能获得
CPU
的控制权。
如果是在
CPU
多核的主机上,多个线程是可以同时运行的。
Linux
是支持多线程的,在一个进程内生成多个线程。一个进程可以拥有一个或多
个线程。线程和进程二者之间的关系有以下几点:
1
)线程采用了多个线程可共享资源的设计思想。在多进程情况下,每个进程都有
自己独立的地址空间,在多线程情况下,同一进程内的线程共享进程的地址空间。线程
和进程的最大区别在于线程完全共享相同的地址空间,运行在同一地址上。
2
)由于进程地址空间独立而线程共享地址空间,所以从一个线程切换到另一线程
所花费的代价比进程低。
1
0
第
10
章
线程控制
3
)进程本身的信息在内存中占用的空间比线程大。因此,线程更能充分地利用内
存。线程可以看作是在进程内部执行的指定序列。
4
)线程间的通信比进程间的通信更加方便和省时。进程间的数据空间相互独立,
彼此通信要以专门的通信方式进行,通信时必须经过操作系统,而同一进程的多个线程
共享数据空间,一个线程的数据可以直接提供给其他线程使用,不必进过操作系统。
线程机制支持并发程序设计技术,在多处理器上能真正保证并行处理。而在
Linux
实现线程很特别,
Linux
把所有的线程都当作进程实现。
Linux
下线程看起来就像普通进程
(
只是该进程和其他进程共享资源,如地址空间
)
。
上述机制与
Microsoft windows
或是
Sun Solaris
实现差异很大。这些系统提供专门支持
线程机制
(
轻量级进程
)
。
一个进程的组成实体可以分为两大部分:线程集和资源集。进程中的线程是动态的
对象,代表了进程指令的执行过程。资源,包括地址空间、打开的文件、用户信息等
等,由进程内的线程共享。线程有自己的私有数据:程序计数器,栈空间以及寄存器。
但是由于各线程共享进程的地址空间,因此可能会导致竞争,因此对某一块有多个线程
要访问的数据需要一些同步技术。
系统支持
POSIX
多线程接口,称为
pthread
(
Posix Thread
)。编写
Linux
下的多线程
应用程序需要使用头文件
pthread.h
,连接时需要使用库
libpthread.a
。
10.1.2 线程分类
线程是一些相关指令的离散序列,线程与其它指令序列的执行相互独立,每个程序
至少包括一个线程,即主线程。主线程负责程序的初始化工作,并且执行初始指令。此
后主线程会为执行各种不同的任务决定是分别创建其它线程还是由主线程独立承担。不
管哪种情况,每个程序至少都包含一个线程,并且每个线程都会维护自己当前的机器状
态。目前线程有用户线程和内核线程两种方法实现。
1.
内核线程
Linux
内核可以看作一个服务进程
(
管理软硬件资源,响应用户进程的种种合理以及
不合理的请求
)
。内核需要多个执行流并行,为了防止可能的阻塞,多线程化是必要的。
内核线程就是内核的分身,一个分身可以处理一件特定事情。
Linux
内核使用内核线程
来将内核分成几个功能模块,像
kswapd
、
kflushd
等,这在处理异步事件如异步
IO
时特
别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄
存器的空间。支持多线程的内核叫做多线程内核
(Multi-Threads kernel )
。内核线程的调
度由内核负责,一个内核线程处于阻塞状态时不影响其他的内核线程,因为其是调度的
基本单位。这与用户线程是不一样的。
内核线程(
Thread
)或叫守护进程
(Daemon)
,在操作系统中占据相当大的比例,当
Linux
操作系统启动以后,尤其是
X window
也启动以后,你可以用
”ps -ef”
命令查看系
统中的进程,这时会发现很多以
”d”
结尾的进程名,确切说名称显示里面加
"[]"
的,这
些进程就是内核线程。系统的启动是从硬件
->
内核
->
用户态进程的,
pid
的分配是一个往
前的循环的过程,所以随系统启动的内核线程的
pid
往往很小。
2


发布评论