Clr Via C#读书笔记---线程基础
趣闻:我是一个线程:http://kb.cnblogs.com/page/542462/
进程与线程
进程:应用程序的一个实例使用的资源的集合。每个进程都被赋予了一个虚拟地址空间。
线程:对CPU进行虚拟化,可以理解为一个逻辑CPU.windows为每个进程提供了专用的线程(如果代码进入了无线循环,进程就会被“冻结”)
线程要素,开销
线程包括以下要素:
1. 线程内核对象, 其中包含
1)一组对线程进行描述的属性
2)线程上下文,即包含CPU寄存器的集合的一个内存块
2. 线程环境块(TEB),在用户模式中分配和初始化的一个内存块,其中包含
1)线程的异常处理链首(head)
2)线程的"线程本地存储数据"
3)由GDI和OpenGL图形使用的一些数据结构
3. 用户模式栈
1)用于存储传给方法的局部变量和实参
2)包含一个地址,指出当前方法返回时,线程接着执行的地址
4. 内核模式栈
1)用于应用程序代码想操作系统中的一个内核模式函数传递实参。Windows将实参从线程的用户模式栈复制到线程的内核模式栈
5. DLL线程连接和线程分离通知
window进程创建一个线程,调用进程中所有的加载dll的DllMain方法,并且传递一个Dll_Thread_attach标志。当线程终止的时候,就会禁止所有DLL的dllMain方法,传递一个Dll_Thread_Detach标志。有了这些通知,为进程中创建/销毁的每一个线程执行特殊初始化或(资源)清理操作。
上下文切换(所有线程(逻辑cpu)之间共享物理cpu)
上下文切换(30毫秒):线程运行的时间片(用于计算时间)也叫量程。
1. 保存CPU寄存器的值到线程内核对象的一个上下文结构中。还要考虑CPU的高速缓存(cache).
2. 调度线程。
3. 加载所选上下文结构中的值到CPU的寄存器中。
线程的优先级
1. 线程优先级从0(最低)-31(最高),系统启动时有个为0的零页线程的特殊线程,唯一一个0的线程,在没有其他进程要调度时,将系统RAM所有空闲页清零。
一个时间片后,windows检查现有所有线程内核对象,有资源的适合调度。从spy++可以查看切换的次数。线程在任何时间可以被抢占,windows调度另一个。你不能阻止其他线程的运行。 所以,windows是抢占式操作系统,不是实时操作系统,CLR使托管代码的行为更不实时。比如:DLL的JIT加载,代码的JIT编译,GC无法预测的介入。
2.系统采用有限调度优先级别高的线程,采用“饥饿”机制(抢占式操作系统,使用算法判断在什么时间调度哪些线程多少时间。)
3.系统启动会创建一个零页线程,这个特殊线程优先级别为0,系统唯一一个0的线程,负责没有线程的时候,将ram所有的空闲页清零
4.微软为了解决分配线程合理性,微软公开优先级系统抽象层。支持6个进程优先类 Idel,Below Normal,Normal,Above Normal,High,RealTime
优先级类(priority class) :Idle,Below Normal,Normal,Above Normal,High和Realtime。 优先级类是用于进程的。每个线程的优先级取决于 他所属的进程的优先级类和在该进程内他自身的优先级——俩者合成基础优先级——动态优先级是OS确保线程可响应,不一直饥饿所产生。但是16-31之间的线程,系统不提升他们的优先级。0-15的才提升。
应用开发人员永远不直接处理优先级。Normal的Normal是8,大多数程序都是8的优先级。Windwos永远不会调度进程,只调度线程。进程根据启动它的进程来分配一个优先级。大多数进程都是windows资源管理器启动的,属于Normal。
5,。优先级类与优先级区别:
线程的优先级两个标准:1,它的进程优先级类。2,在其进程优先级类中,线程的优先级类。优先级类和优先级合并构成一个线程的“基础优先级”
6.相对线程优先级:Idel,Lowest,BelowNormal,Normal,Above Normal,Highest,Time-Critical
7.托管应用程序不应该表现为拥有自己的进程;相反,他们应该表现为在一个AppDomain中运行。 可以更改他的线程相对优先级,设置Thread的Priority属性。System.Diagnostics命名空间包含一个Process类和ProcessThread类,提供进程和线程的windows视图。AppDomain和Thread类,公开了应用域和线程的CLR视图。
使用线程的理由:
可以使用线程将代码同其他代码隔离;可以使用线程来实现并发执行;可以使用线程来简化编程;
显示创建线程
非普通优先级运行,表现为前台线程,需要长时间运行, 需要提前终止。
现在一个CLR线程直接对应一个Windows线程,将来LCR可能引入它自己的逻辑线程概念,使得一个CLR逻辑线程并非一定映射到一个物理Windows线程。
一个进程中所有的前台进程停止运行时,CLR强制终止仍在运行的任何后台进程。因此,前台进程应该用于执行确实想完成的任务。
线程在CLR中要么是前台,要么是后台。一个进程中的所有前台停止时,CLR强制终止扔在运行的任何后台线程。--直接终止,不抛出异常。在线程生存期内,随时可前后变换。应用的主线程以及通过Thread对象显
Clr Via C#读书笔记---线程基础的更多相关文章
- (CLR via C#学习笔记)线程基础
一 使用线程的理由 1.可响应性(通常是对于客户端GUI应用程序);2.性能,多个CPU(或多核CPU)能并发执行多个线程,同时执行多个操作能提升性能. 二 线程开销 线程有空间(内存耗用)和时间(运 ...
- CLR via C# 读书笔记-26.线程基础
前言 这俩个月没怎么写文章做记录分享,一直在忙项目上线的事情,但是学习这件事情,停下来就感觉难受,clr线程这章也是反复看了好多遍,书读百遍其义自见,今天我们来聊下线程基础 1.进程是什么,以及线程起 ...
- The art of multipropcessor programming 读书笔记-硬件基础1
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...
- The art of multipropcessor programming 读书笔记-硬件基础2
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...
- Clr Via C#读书笔记---计算限制的异步操作
线程池基础 1,线程的创建和销毁是一个昂贵的操作,线程调度以及上下文切换耗费时间和内存资源. 2,线程池是一个线程集合,供应你的用程序使用. 3,每个CLR有一个自己的线程池,线程池由CLR控制的所有 ...
- Clr Via C#读书笔记---垃圾回收机制
#1 垃圾回收平台的基本工作原理: 访问一个资源所需的具体步骤: 1)调用IL指令newobj,为代表资源的类型分配内存.在C#中使用new操作符,编译器就会自动生成该指令.2)初始化内存,设置资源的 ...
- CLR via C#读书笔记二:类型基础
1.CLR允许将对象转换为它的(实际)类型或者它的任何基类型. 2.is操作符检测对象是否兼容于指定类型,is操作符永远不抛出异常. 3.as操作符返回对同一个对象的非null引用.如果对象不兼容,a ...
- [Clr via C#读书笔记]Cp6类型和成员基础
Cp6类型和成员基础 成员 常量:字段(静态字段和实例字段):实例构造器:类型构造器(用于静态字段的构造):方法(静态方法和实例方法):操作符重载(本质是一个方法):转换操作符:属性(本质还是方法): ...
- [Clr via C#读书笔记]Cp4类型基础
Cp4类型基础 Object类型 Object是所有类型的基类,有Equals,GetHashCode,ToString,GetType四个公共方法,其中GetHashCode,ToString可以o ...
随机推荐
- Unity手游之路<八>自动寻路Navmesh之入门
http://blog.csdn.net/janeky/article/details/17457533 在的大部分mmo游戏都有了自动寻路功能.点击场景上的一个位置,角色就会自动寻路过去.中间可能会 ...
- 客户端安全-xss-2解决方案
1.需求 提供xss解决方案 2.方式 对需要显示在html中的用户代码进行编码 3.处理方案 1.用户的数据到后端前用下面的编码层代码进行编码. function htmlEncodeCharact ...
- Android 异步消息处理机制解析
Android 中的异步消息处理主要由四个部分组成,Message.Handler.MessageQueue.Looper.下面将会对这四个部分进行一下简要的介绍. 1. Message: Messa ...
- 思科 vlan 相关操作
添加或者修改VLAN Switch(config)# vlan vlan-id Switch(config-vlan)# name vlan-name 删除VLAN Switch(config)# n ...
- mysql根据汉字拼音排序查询
例如现在有一张数据表label,字段为id.name,此表的字符集设置为gb2312,以gb2312_chinese_ci整理. 设置InnoDB引擎的字符集也为简体中文,且整理为gb2312_chi ...
- php搜索分页
最近做搜索分页的时候,发现第一页显示正常,点击到下一页的时候,显示结果变成了搜索全部内容. 仔细查看代码,发现当第一次输入关键词,提交到查询控制器的时候,表单提交的关键字不为空,可是点击到下一页的时候 ...
- git 忽略文件权限
git config --add core.filemode false 发现.git/config 中新增了一行: [core] ... filemode = false ref: http://b ...
- 浅谈python的import
动态加载模块: 使用__import__ c=__import__('sys') 等价于 import sys 不过前者可以在执行时决定. 静态加载: 也就是常规的import from xxx im ...
- 【Storage】Ubuntu LVM 安装配置
参考资料: https://www.centos.bz/2012/02/installation-and-usage-of-lvm/ http://blog.chinaunix.net/uid-206 ...
- c#.netGr idView1在div不局中
<div style="margin:0 auto;text-align:center;" >//可以用GridView剧中 <asp:GridView ID=& ...