一,什么是线程
线程是进程中可执行代码流的序列,它被操作系统调用,并在处理器或内核上运行。所有进程都有一个主线程,主线程是进程的控制流或执行路线。线程分为用户线程和系统线程,线程在创建,维护和管理方面给系统带来的负担要轻得多。线程用于执行系统中的并发任务,可以简化系统中固有的并发的程序的结构。
用户级线程和内核级线程
线程有三种实现模型: 用户级或应用程序级,内核级,用户级和内核级混合线程。
他们之间主要的区别在于他们的模式以及要指派给处理器的线程的能力。
用户模式下,线程驻留在用户空间,是执行程序或连接库中的指令,由库调度器进行调度。
内核模式下,线程驻留在系统空间,可以进行系统调用,由操作系统调度器调度。
用户线程在运行时,任意给定时刻,每个进程只有一个线程在运行,而且只有一个处理器内核被分配给该进程。运行时调度库从进程的多个线程中选择一个,然后该线程和进程允许的一个内核线程关联起来,用户级线程是一种多对一的线程映射。
内核级线程驻留在内核空间,它们是内核对象,由操作系统调度器管理。有了内核线程,每个用户线程被映射或绑定到一个内核线程。 用户线程在其生命期内都会绑定到该内核线程。一旦用户线程终止,两线程都将离开系统。从内核线程到用户线程是一种一对一映射。
混合线程是用户线程和系统线程的交叉,使得运行库和操作系统都可以管理线程。在这种实现中进程有自己的内核线程池。可运行的用户线程由运行时库分派并标记为准备好执行的可用线程。操作系统选择用户线程并将它映射到线程池中可用的内核线程。
线程的上下文
操作系统管理很多进程的执行。它们来着不同的程序或系统。当一个进程从内核中移出,另一个进程成为活动的,这些进程之间便发生了上下文切换。操作系统必须记录重启进程和启动新进程使之活动所需要的所有信息。线程也有相同的处理方式。上下文保存的内容。
上下文内容 | 进 程 | 线 程 |
---|---|---|
指向可执行文件的指针 | X | |
栈 | X | X |
内存(数据段和栈) | X | |
状态 | X | X |
优先级 | X | X |
程序 IO 的状态 | X | |
授予权限 | X | |
调度信息 | X | |
审计信息 | X | |
有关资源的信息 - 文件描述符 - 读/写 指针 |
X | |
有关事件和信号的信息 | X | |
寄存器组 - 栈指针 - 指令计数器 - 诸如此类 |
X | X |
二, 线程和进程的比较
线程和进程都能提供并发的程序执行,在决定使用进程或线程时可以从上下文切换开销,吞吐量,实体间通信,程序简化等方面进行考虑。
- 上下文切换:如果只有一个处理器,线程的上下文切换的开销较小。
- 吞吐量:使用多个线程可以增加程序的吞吐量,否则只有一个线程时,线程的IO将使整个程序被阻塞。
- 实体间通信:线程与同一进程间其他线程通信时不要求特殊的通信机制,可以直接进行数据的传输。进程间则必须建立和维护它们之间的通信机制。
- 破坏进程的数据:线程可以很轻松的破坏整个进程的数据。进程有自己的地址空间,相互隔离,数据也受到保护。
- 删除整个进程:线程出错时可以导致整个进程的终止,它导致的错误往往比进程导致的错误代价更大。
- 重用性:线程依赖于进程,不能从它所属的进程分离,不可以直接被重用,进程则更加的独立。