《CLR via C#》之线程处理——线程基础

《CLR via C#》之线程处理——线程基础
windows为什么要支持线程
线程开销
CPU发展趋势
CLR线程和Windows线程
使用专用线程执行异步的计算限制操作
线程调度和优先级

windows为什么要支持线程

早期的操作系统只有一个执行线程,但同时包含了操作系统代码和应用程序代码,一旦应用程序出现bug,整个主机必须重启,数据都会丢失。
微软后来发布了新的内核——Windows NT。决定在一个进程中运行应用程序的实例。进程实际是应用程序实例需要使用的资源的集合。保护了数据的安全性。但是如果发生死循环呢?如果机器只有一个CPU,他会执行死循环,虽然数据不会被破坏,系统依然会停止响应。微软的解决方案就是线程。它的职责是对CPU进行了虚拟化。每个进程都有专用的线程(相当于一个CPU)。

线程开销

和一切虚拟化机制一样,线程有空间(内存耗用)和时间(运行时的执行性能)上的开销:

  • 线程内核对象(thread kernel object)
    为每个线程分配的数据结构之一。包括描述线程的一组属性,线程上下文(CPU寄存器集合)。x86,x64,ARM CPU架构,上下文分别占约700,1240,350字节。
  • 线程环境块(thread environment block, TEB)
    TEB是用户模式中分配和初始化的内存块,占用一个内存页(三种架构都是4kB)。
  • 用户模式栈(user-model stack)
    存储传给方法的局部变量和实参。Windows默认分配1MB内存(保留地址空间,需要时换到物理内存。
  • 内核模式栈(kernel-model stack)
    用于向OS内核模式函数传递实参。Win32:12KB;Win 64:24KB。
  • DLL线程连接(attach)和线程分离(detach)通知
    Windows的一个策略是,任何进程在创建和终止线程时,都会调用进程加载的所有非托管DLL的DLLMain方法。

上下文切换开销
Windows大约每30ms执行一次上下文切换。这个动作不会带来任何内存或性能上的收益。事实上,上下文切换可能带来其它的性能损失,比如缺页中断,cache写入。
执行GC时,CLR必须挂起所有线程,遍历它们的栈查找根以便对堆中的对象进行标记(GC算法第一步),再次遍历它们的栈(更新它们的根),再恢复所有线程。所以减少线程的数量会显著提升GC的性能。
线程越多,调试体验越差(遇到断点时挂起所有线程)。


CPU发展趋势

除了提高CPU的速度外,还有多核——为了使用线程。
目前的三种多CPU技术:

  • 多个CPU;
  • 超线程CPU——芯片中包含两组架构状态,比如CPU寄存器,但只要一组执行资源;
  • 多核CPU。

CLR线程和Windows线程

目前,CLR线程完全等价于Windows线程。


使用专用线程执行异步的计算限制操作

应尽量使用线程池来执行异步的计算操作。但是如果满足以下任何条件,就可显式创建自己的线程。

  • 线程需要非Normal的优先级运行。
  • 需要线程是一个前台线程,防止应用程序在线程结束前终止。
  • 直接为长时间运行的任务创建专用线程。因为,线程池为了判断是否需要创建一个额外的线程,所采用的逻辑比较复杂。
  • 需要控制线程(启动,并可能调用Abort方法)。

线程调度和优先级

Windows是抢占式多线程操作系统,所有你不能保证自己的线程一直运行,也阻止不了其它线程的运行。
Microsoft知道开发人员 在为线程分配优先级时很难做到完全合理,因此公开了优先级系统的一个抽象层。

  • 进程优先级类(抽象概念):决定应用程序与其它应用相比的响应能力。
    6个进程优先级类:Idle,Below NormalNormal(默认),Above NormalHigh(绝对必要时使用),和Realtime(尽量避免使用)。
  • 优先级:线程优先级
    Windows支持7个相对线程优先级:IdleLowestBelow NormalNormalAbove NormalHighestTime-Critical

每个线程的优先级取决于两个标准:1)它的进程优先级类;2)在其进程优先级类中,线程的优先级。他俩合并构成一个线程的“基础优先级”。每个线程都有一个“动态优先级”,线程调度器根据 这个优先级决定执行哪个线程。最初,基础优先级和动态优先级相同。系统可以提升基础优先级在0到15之间的线程优先级(即,概念上非Realtime优先级类)。

事实上,Windows永远不会调度进程,它只调度线程。

C#可以通过设置Thread的Property属性,来设置相对线程优先级。ThreadPriority枚举:Lowest,BelowNormal,Normal,AboveNormal或者Highest。和Windows为自己保留了优先级0和Realtime范围一样,CLR为自己保留了Idle和Time-Critical优先级。

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/qianzi067/p/5808344.html

《CLR via C#》之线程处理——线程基础相关推荐

  1. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  2. c++ 线程池_基础篇:高并发一瞥,线程和线程池的总结

    进程是执行程序的实体,拥有独属的进程空间(内存.磁盘等).而线程是进程的一个执行流程,一个进程可包含多个线程,共享该进程的所有资源:代码段,数据段(全局变量和静态变量),堆存储:但每个线程拥有自己的执 ...

  3. java 线程 操作系统线程_线程基础:线程(1)——操作系统和线程原理

    1.概述 我在写"系统间通信技术专栏"的时候,收到很多读者的反馈.其中有一部分读者希望我抽空写一写自己关于对Java线程的使用经验和总结.巧的是,这个月我所在的技术团队也有很多同事 ...

  4. 《CLR via C#》之线程处理——线程池与任务

    <CLR via C#>之线程处理--线程池与任务 <CLR via C#>之线程处理--线程池与任务 线程池 线程池用法 任务 等待任务完成并获取结果(Wait方法和Resu ...

  5. Android线程和线程Handler基础一览

    线程概览 线程是任何多任务系统的基石.可以被认为是一个主进程的多个子进程.这样做的目的就是了增加应用的性能. 应用主线程 当一个Android应用被打开的时候,系统会默认开辟一个线程.这个线程就被叫做 ...

  6. python删除线程,python线程基础

    一 基本概念 1 并行和并发 1 并行,parallel 同时做某些事,可以互不干扰的同一时刻做几件事 如高速公路上的车道,同一时刻,可以有多个互不干扰的车运行 在同一时刻,每条车道上可能同时有车辆在 ...

  7. 【死磕Java并发】-----J.U.C之线程池:线程池的基础架构

    原文出处:https://www.cmsblogs.com/category/1391296887813967872 『chenssy』 经历了Java内存模型.JUC基础之AQS.CAS.Lock. ...

  8. 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)

    一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...

  9. python锁机制_python基础(锁机制,守护线程,线程队列,线程池)

    一. 互斥锁(Lock)与递归锁(RLock)机制 1.1 由互斥锁(Lock)产生的死锁现象: #互斥锁(死锁现象): #死锁现象: from threading importLock lock=L ...

最新文章

  1. 如何估算各种物体的重心
  2. webservice 测试窗体只能用于来自本地计算机的请求
  3. AAAI-19录用论文清单
  4. php 5.2.17 中文乱码,php5.2 Json中文乱码解决方法
  5. Kafka 和 RocketMQ 底层存储之那些你不知道的事
  6. Rust常用编程概念之变量和可变性
  7. Linux下安装anaconda,创建虚拟环境python3.7,并且安装深度学习框架pytorch进行模型训练
  8. 计算机会计学ufo报表,UFO报表管理实验报告.doc
  9. js根据本地文件路径上传文件(流上传)
  10. 【Java 8 新特性】Java Consumer示例
  11. html方框打勾字段,HTML+CSS入门 如何设置 checkbox复选框控件的对勾√样式
  12. zabbix4.4 使用自动发现监测web网站健康状态(通过mysql表获取web地址)
  13. 通过快递鸟如何接入韵达速递电子面单
  14. 宏文件下载_用一个宏文件,就一个轻松把SolidWorks的英文特征翻译成中文
  15. 二台电脑之间数据库文件进行备份
  16. 前端开发的流程与规范
  17. MongoDB迁移方案
  18. Redis geo计算距离
  19. 84岁老爷爷技术博客
  20. CSDN:0分下载的技术资料的地址列表(带链接)方便大家下载啦!第六期

热门文章

  1. python plt画半对数坐标_特征工程大传:对数变换
  2. 【算法竞赛学习】金融风控之贷款违约预测-赛题理解
  3. 关于计算机英语手抄报全国一等奖,英语手抄报:Walking to School
  4. .net framework与java,分布式事务:.NET Framework与.NET Core
  5. mysql字符集问题_mysql字符集问题
  6. mybatis-generator 逆向生成工具(实体、dao、sql)
  7. VS_QT中配置qDebug输出
  8. Introduction-to-React-JS -- 2 Helloworld
  9. Python中的线性回归:Sklearn与Excel
  10. 多媒体表示、描述、编码以及通信的相关规定和标准课程总结