![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
CLR
文章平均质量分 86
JimCarter
与专业人员为伍,guyiming2011@126.com
展开
-
【CLR】.NET的GC垃圾回收
垃圾回收算法引用计数法:堆上的每个对象都维护了一个内存字段用来记录有多少个对象引用了自己,当这个字段的值变成0时,就意味着自己没有用了,可以被回收走了。当下一个GC周期到来时,他就会被回收走。这种算法存在因循环引用导致无法回收的问题。引用跟踪法:所有引用类型的变量都称作根。然后查看此根都引用了哪些对象,然后看这个对象里又有哪些根,这些根又引用了哪些对象。以此类推,这么一来就可以构建一个个引用跟踪图,这些树上的对象的同步块索引的某一位就标记为1。引用跟踪法回收流程除了回收线程之外,暂停其它所有线原创 2021-02-14 19:35:15 · 824 阅读 · 0 评论 -
【CLR】数据类型与装箱、拆箱
类型有:基元类型(int、long、bool等编译器直接支持的类型)、值类型、引用类型。所有的类型都派生自System.Object当我们new一个对象时,new操作实际做了这些事情:计算当前类型及其所有父类,一直计算到System.Object,中定义的所有实例字段需要的字节数,这些实例字段的“类型对象指针”和“同步块索引”对象所需要的字节数。从堆中分配这些字节,并初始化为0初始化类型对象指针和同步块索引调用类的构造函数类型对象指针:当我们想查看某个对象是属于什么类型时,一般会调用Get原创 2021-02-14 15:34:24 · 325 阅读 · 0 评论 -
【CLR】程序集查找与GAC
版本号如图:AssemblyVersion程序集版本号:存储在AssemblyDef清单元数据表中,虽然在文件属性面板中不显示,但是这个版本号对于CLR来说很重要,绑定强明明程序集时会用到这个,它唯一地标识了程序集。当A程序集引用了B程序集时,会将B程序集的AssemblyVersion嵌入到自己的AssemblyDef清单中,这样当CLR加载B的时候,就能准确的知道是程序集B的哪个版本。AssemblyFileVersion文件版本号:即属性面板中的文件版本,存储在Win32版本资源中,这个号仅原创 2021-02-13 21:49:32 · 474 阅读 · 0 评论 -
【CLR】JIT和NGen
JIT的工作流程JIT(Just in time)即时编译器:在执行时负责把编译生成的IL代码转换成本机代码(CPU指令)。对于以下代码来说:void Main(){ Console.WriteLine("hello"); Console.WriteLine("word");}当执行Main方法时,CLR会检测Main所使用到的类型,并分配一个数据结构用来存储对这些类型的访问。这段代码里只涉及到了Console类,所以Console类的所有方法都被存到了那个数据结构里,每个方法都是一个记录项原创 2021-02-06 18:16:29 · 386 阅读 · 0 评论 -
【CLR】C#线程池如何管理线程
前言线程池管理机制随着CLR的版本不断变化,最好将线程池看成一个黑盒。它不是针对某一种程序设计的,也不适合用某个程序去衡量它的性能。目前来看工作情况还是不错的,随着CLR版本的迭代也会不断进行优化,所以一般不需要对线程池做过多的调整。线程池如何管理工作者线程工作原理大致如图所示:其它线程将需要做的任务(task)放入到线程池的全局队列中,如ThreadPool.QueneUserWorkItem方法。工作者线程不断的消费本地队列,消费顺序是后进先出(类似于栈),每次从列头拿出一个task进行处原创 2020-10-13 09:26:28 · 1059 阅读 · 1 评论 -
【CLR】C#异步I/O
Windows如何执行I/O操作以读取磁盘文件类FileStream为例 ,展示下同步和异步I/O的执行流程同步IO调用FileStream类的Read方法后,你的线程将从托管代码转为win32用户模式代码。并调用win32的ReadFile函数,此函数将会非配一个叫做I/O请求包(I/O Request Packet,IRP)的数据结构,这个结构里包括:文件句柄,文件中的偏移量,Byte[]数组地址等信息。然后ReadFile会将你的线程从用户模式变为内核模式,向内核传递IRP数据,从而调用w原创 2020-10-18 00:11:08 · 769 阅读 · 7 评论 -
【CLR】C#线程基础
基础知识为什么要有线程?早期的操作系统没有线程的概念,也可以理解为一个操作系统只有一个线程在运行,这个线程既执行操作系统代码又执行应用程序代码。这样的设计会有一系列的问题:任务无法并行执行,长时间运行的任务会阻塞其他任务。有些程序的bug造成死循环,导致整个机器停止工作。所以,在后续的windows内核设计过程中引入了“进程”和“线程”。每个进程都被分配了一个虚拟的地址空间,而且一个进程使用到的代码和数据无法被其它进程所访问。进程也无法访问OS内核的代码和数据。这就保证了进程与进程之间,进程与原创 2020-11-22 17:34:00 · 420 阅读 · 0 评论 -
【CLR】C#线程同步和锁-----看这篇就够了
多个线程同时访问共享数据的时候,线程同步能够防止线程损坏。之所以强调同时,是因为线程同步问题其实就是访问时间问题。如果有些数据会被多个线程访问,但是这几个线程访问的时间都是错开的,不会同时接触到数据,那完全就用不到线程同步。线程同步会遇到几个问题,所以能避免使用就别用:使用繁琐,容易出错:你需要清楚的明白哪些数据可能是会被同时访问的,然后用一个锁锁住它,确保一次只有一个线程能够访问。如果任何一块数据被漏了,那就会有问题。没法确定你所有用锁的方式一定正确:只能靠测试和经验。损害性能:获取和释放锁时要原创 2020-12-13 18:40:53 · 4169 阅读 · 2 评论