• 线程基础


    计算机早期,操作系统都没有线程的概念,整个系统只运行着一个执行线程,同时包含操作系统代码和应用程序代码。所以就存在一个问题,长时间运行的任务会阻止其他任务执行。例如:在16位Windows的那些日子,打印文档会“冻结“整台机器。
    随后微软为了解决这部分问题,引入进程概念。但是CPU本身呢,应用程序发生死循环呢?所以线程应运而生,它是对CPU的虚拟化,为每个进程提供进程专用的线程。

    总体概览

    开销

    1. 线程内核对象 (thread kernel object),包含线程上下文,上下文中保存CPU寄存器集合的内存块,在x64位系统中占1240字节
    2. 线程环境块 (thread environment block TEB),耗用一个内存页4KB。
    3. 用户模式栈 (user-mode stack),系统保留1MB的地址空间。
    4. 内核模式栈 (kernel-mode stack),针对从用户模式的代码传递给内核的任何实参。x64 占用 24KB。
    5. DLL 线程连接(attach)和 线程分离(detach)通知。

    线程上下文切换

    1. 将CPU寄存器的值保存在当前正在运行的线程内核对象内部的一个上下文结构中。
    2. 从现有线程集合中选出一个线程供调度。如果该线程由另一个线程拥有,系统在开始执行任何代码或者接触任何数据之前,还必须切换CPU看见的虚拟地址空间。
    3. 将所选上下文结构中的值加载到CPU的寄存器中。

    上下文切换大约耗时 30ms,一个时间片结束后,如果系统决定再次调用同一个线程,系统不会执行上下文切换。所以,你懂的,要尽量避免切换,4核最理想是4个线程同步执行。初衷,微软在设计OS的时候,决定侧重于可靠性与相应能力,而非侧重于速度和性能。

    使用线程理由

    1. 可响应性
    2. 性能
      • 计算限制的异步操作
      • I/O限制的异步操作

    线程调度和优先级

    Windows 又被称之为抢占式多线程(preemptive multi-threaded)操作系统,是因为线程可在任何时间停止被抢占并调度另一个线程。线程分0到31的优先级,其中0为零页线程,在没有其他线程工作的时候,零页线程将系统内存中的所有空闲页清零。一般线程优先级为Normal,如图与线程存在Normal进程中的Normal线程,也就是8。

    相对线程优先级进程优先级类
    Idle
    Below NormalNormalAbove NormalHighRealtime
    Time-Critical 15 15 15 15 15 31
    Highest 6 8 10 12 15 26
    Above Normal 5 7 9 11 14 25
    Normal 4 6 color{red}8 10 13 24
    Below Normal 3 5 7 9 12 23
    Lowest 2 4 6 8 11 22
    Idle 1 1 1 1 1 16

     

    前台线程和后台线程

    CLR将每个线程要么视为前台线程,要么视为后台线程。一个进程所有前台线程停止运行时,CLR强制终止仍然在运行的后台线程,并不抛出异常。关键字:Background。

  • 相关阅读:
    形态学操作
    形态学腐蚀膨胀操作
    图像模糊操作
    OpenCV像素操作和图形绘制
    c++中char类型的取值范围
    二叉树基本操作
    剑指27 二叉树的镜像
    剑指26 树的子结构
    剑指24: 反转链表
    剑指22 链表倒数第k个节点
  • 原文地址:https://www.cnblogs.com/weilai1917/p/11809359.html
Copyright © 2020-2023  润新知