进程与线程
进程
- 由于对操作系统多任务处理的需求,出现了进程的抽象概念
- 进程是对运行中的程序的抽象
线程
- 由于进程的粒度太大,为了进行更细粒度的控制,出现了线程的概念
- 线程指程序中的一个指令执行序列,此时进程退化为线程和硬件资源的容器
线程的出现实际上是代码执行(线程)与资源分配(进程)相分离的体现
线程在计算机系统各层次上的实现
- user thread:由于在用户空间中实现,这种线程的创建和管理的开销更小(不需要上下文切换),但是user thread需要与kernel thread相关联,因此被关联的kernel thread的阻塞会引起相关user thread的阻塞
- kernel thread:在内核空间中实现,被阻塞的kernel thread可以换出,但是需要上下文切换所以管理开销较大
- hardware thread:执行某个软件线程的硬件资源
digraph G {
compound = true
subgraph "cluster software thread" {
label = "software thread"
subgraph "cluster user thread" {
label = "user thread 定义线程"
{
rank = same
"user thread 1"
"user thread 2"
"user thread 3"
}
}
subgraph "cluster kernel thread" {
label = "kernel thread 调度线程"
{
rank = same
"kernel thread 1" [label = "kernel thread 1(阻塞中)"]
"kernel thread 2" [label = "kernel thread 2(未阻塞)"]
}
"kernel thread 1" -> "kernel thread 2" [label = "context switch"]
}
"user thread 2":sw -> "kernel thread 1":nw[ltail = "cluster user thread" label = "关联"]
"kernel thread 1":ne -> "user thread 2":se[lhead = "cluster user thread" label = "全部阻塞"]
}
subgraph "cluster hardware thread" {
label = "hardware thread 执行线程"
{
rank = same
"logic core"
"hyper-threading"
}
{
rank = same
"hardware thread 1"
"hardware thread 2"
"hardware thread 3"
}
"logic core" -> "hardware thread 1" [label = "执行"]
"hyper-threading" -> "hardware thread 2" [label = "执行"]
"hyper-threading" -> "hardware thread 3" [label = "执行"]
}
"kernel thread 2":sw -> "hyper-threading":ne[lhead = "cluster hardware thread" label = "调度到处理器硬件上执行"]
}
user thread 关联到 kernel thread 的映射模型
- 一对一:对每个user thread创建一个与其关联的kernel thread ,开销大
- 多对一:一个kernel thread 的阻塞会造成多个user thread的阻塞
- 多对多:前两种方法的折衷。一种实现方法是在kernel thread和user thread之间引入LWP(light-weight process)数据结构
多进程与多线程的比较
- 多进程和多线程都可以提高硬件的利用率(the overlapping use of hardware),增强程序的响应性
- 相比多进程,多线程的开销更小(因为粒度小),多线程可以使用比IPC(进程间通信)更快的共享内存
性能优化思想:通过更细粒度的控制来得到更好的性能