标签:多线程 产生 ndt address 程序 成本高 切换 中断机制 inux
早期的计算机只有一个单核CPU,操作系统把进程作为CPU调度单元。进程拥有独立的内存地址空间,那时候还没有线程的概念。
进程有3个状态,分别是阻塞、就绪、运行。当进程所需资源未到位时是阻塞状态,当进程拥有资源但未被CPU调度是就绪状态,当进程用有资源并且被CPU调度了就是运行状态。
随着程序越来越复杂,调度产生的上下文切换也越发昂贵,于是程序员寻思能不能在同一地址空间(Address Space)下,执行多个进程。但操作系统内核出于保护目的,禁止一个进程直接访问另一个进程的地址空间。
既然操作系统不支持,程序员决定在用户空间下维护一张线程表,实现可以自行调度的“进程”,这就是用户态线程,现在一般叫做纤程或协程。
用户态线程的优势有:
用户态线程的劣势有:
伴随多核CPU的出现,操作系统也开始支持线程了。内核空间维护了一张线程表,线程由内核调度,这就是内核态线程,也称作轻量进程(Light Weight Process,LWP)。今天说的线程,如非指定,都是内核线程。
内核态线程的优势有:
“单核CPU 在同一时间内只能够运行一个进程”,在过去很长一段时间是对的,直至同时多线程(SMT)的出现。超标量处理器(1个CPU物理核心)可以同时跑超过一个线程,例如 Intel 的 hyperthreading 支持一个物理核心跑两个线程。讲几核的 CPU的核心数一般指物理核心数,如果是指逻辑核心数一般直接会说线程数,几个逻辑核心就同时支持几套架构状态和几个线程。
“单进程多线程可以同时用到 CPU的双核心”,在主流操作系统上没问题。对操作系统内核而言,直接可见的CPU资源是逻辑核心,可以调度的任务一般直接实现成 CPU支持的线程,所以 单核CPU 可以同时跑多个任务。
不同操作系统中任务的概念不一样:
标签:多线程 产生 ndt address 程序 成本高 切换 中断机制 inux
原文地址:https://www.cnblogs.com/mougg/p/12319733.html