01 2022 档案
摘要:背景 由于枚举器存在遍历二叉树不方便的问题。才有了迭代器。在了解了迭代器之前必须了解枚举器。 迭代器就是带了状态机的枚举器。 基本介绍 1)迭代器模式( lterator Pattern)是常用的设计模式,属于行为型模式2)如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还
阅读全文
摘要:总结: 1、枚举器就像是序列中的“游标”或“书签”。可以有多个“书签”,移动其中任何一个都可以枚举集合,与其他枚举器互不影响。用来遍历数据结构(单项表链、数组、集合类成员等)。 2、可以使用foreach 遍历枚举器。foreach 用来遍历鸭子类型.点击查看foreach详细用法 什么是枚举器 实
阅读全文
摘要:背景..什么是继承? 「继承」是对象导向编程的其中一个基本属性。 它可让您定义子类,重复使用(继承)、扩充或修改父类别行为。 其成员可供继承的类别称为基底类别。 继承基底类别成员的类别则称为「衍生类别」。 C# 和 .NET 只支持「单一继承」。 也就是说,类别只能继承自单一类别。 不过,继承可以转
阅读全文
摘要:CoreCLR是微软新出的跨平台公共语言运行时,和之前的CLR不同的是前者砍掉了大部分不常用功能,优化了代码,而且不依赖于类似于iis这样的软件,是由线程来进行维护的,程序集领域也是由线程来管理,在吞吐量和运行效率上来说都大大提升。 不过你们也不要担心之前学的CLR会不会没用,白学了,做了无用功,这
阅读全文
摘要:as(OpCodes.Castclass)功能:测试对象引用(O 类型)是否为特定类的实例。相当于:expression is type ? (type)expression : (type)null 做类型检测判断,如果类型兼容则转换,否则返回null只是as 只被计算一次。 使用规则: 1、as
阅读全文
摘要:"面向对象设计五大原则"和良性依赖原则在应付变化方面的作用。 SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转) 单一职责原则(Single-Resposibility Principle)。"对一个类而言,应该仅有一个引起它变化的原因。"本原则是我们非常熟悉地"高内聚性原则"的引申,
阅读全文
摘要:字节码(英语:Bytecode)将虚拟机可以读懂的代码称之为字节码。将源码编译成虚拟机读的懂的代码,需要虚拟机转译后才能成为机器代码的中间代码 叫做字节码。 字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机。编译器将源码编译成字节码,特定平台上的虚拟机将
阅读全文
摘要:编程范型、编程范式paradigm(philosophy)或程式設計法(英語:Programming paradigm),是指软件工程中的一类典型的编程风格。常见的编程范型有:函數式編程、指令式编程、过程式编程、面向对象编程等等。 编程范型提供并决定了程序员对程序执行的看法。例如,在面向对象编程中,
阅读全文
摘要:重载 同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。而返回值类型不同是不能构成重载的。 作用: 重载必须发生在一个类中,函数名相同,参数类型或者个数可以不同,返回值类型可以不同。根据参数选择调用方法。重载就是让类以统
阅读全文
摘要:今天,我们再来学习 SOLID 中的“L”对应的原则:里式替换原则。 里氏替换原则 里氏替换原则(Liskov Substitution Principle):派生类(子类)对象能够替换其基类(超类)对象被使用。通俗一点的理解就是“子类是父类”,举个例子,“男人是人,人不一定是男人”,当需要一个父类
阅读全文
摘要:根据 TaskCreationOptions 的不同,出现了三个分支 LongRunning:独立线程,和线程池无关 包含 PreferFairness时:preferLocal=false,进入全局队列 不包含 PreferFairness时:preferLocal=ture,进入本地队列 进入全
阅读全文
摘要:windows消息机制框架原理 结合两张图理解 窗口和窗口类 Windows UI 应用程序 (e) 具有一个主线程 (g)、一个或多个窗口 (a) 和一个或多个子线程 (k) [工作线程或 UI 线程]。 应用程序必须指定窗口类并向 Windows (d) 注册,然后才能创建窗口 (a) 并显示。
阅读全文
摘要:一、什么是HOOK(钩子) API Windows消息传递机制,当在应用程序进行相关操作,例如点击鼠标、按下键盘,操作窗口等,操作系统能够感知这一事件,接着把此消息放到系统消息队列,然后到应用程序的消息序列中,应用程序通过Getmessage函数取出消息,然后调用DispatchMessage函数将
阅读全文
摘要:什么是TaskScheduler? SynchronizationContext是对“调度程序(scheduler)”的通用抽象。个别框架会有自己的抽象调度程序,比如System.Threading.Tasks。当Tasks通过委托的形式进行排队和执行时,会用到System.Threading.Ta
阅读全文
摘要:背景 用到的知识点 1、windows消息机制 备注:鼠标点击、键盘等事件产生的消息要放入系统消息队列,然后再分配到应用程序线程消息队列。软件PostMessage的消息直接进入应用程序线程消息队列,不需要经过系统消息队列。软件SendMessage()的消息直接进入 DispatchMessage
阅读全文
摘要:起因 在看操作系统消息机制的时候,看到一句化:全局消息队列把消息发送到窗口所在的线程消息队列。突然就怀疑起了窗口的意思。于是就有这边基类。 文章来源:https://docs.microsoft.com/zh-cn/windows/win32/learnwin32/what-is-a-window-
阅读全文
摘要:句柄是指针的“指针” 指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用A
阅读全文
摘要:里氏转换 子类可以赋值给父类。(如果有一个地方需要一个父类作为参数,我们可以给一个子类 ) 如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。 创建几个类帮助我们理解: using System; using System.Collections.Generic; using System
阅读全文
摘要:案例是模仿java https://blog.csdn.net/bjfu170203101/article/details/109322590 改用C#:开发环境 vs2022/vscode .net6.0 C#10 开发时长:完全掌握知识点一天就可以完成 、新手估计要2-3周,因为很多知识点 必须
阅读全文
摘要:这种情况可能发生在当两个线程尝试获取其他资源的锁,而每个线程又陷入无线等待其他资源锁的释放,除非一个用户的进程被终止。线程死锁可能发生在以下的情况:当两个线程相互调用Thread.join();当两个线程使用嵌套的同步块时,一个线程占用了另一个线程的必需的锁,互相等待时被阻塞,就有可能出现死锁。举例
阅读全文
摘要:详细情况:https://www.cnblogs.com/wucy/p/15128365.html 背景 为什么引入取消令牌? Thread.abort()方法会破坏同步锁中代码的原子逻辑,破坏锁的作用。以下代码说明了Thread.abort()方是如何破坏锁的 :代码的功能:每个线程进入锁内都会休
阅读全文
摘要:EventWaitHandle 继承:Object->WaitHandle-> EventWaitHandle派生:System.Threading.AutoResetEvent\System.Threading.ManualResetEvent AutoResetEvent、 ManualRese
阅读全文
摘要:概念 Mutex出现的比monitor更早,而且传承自COM,当然,waitHandle也是它的父类,它继承了其父类的功能,有趣的是Mutex的脾气非常的古怪,它 允许同一个线程多次重复访问共享区,但是对于别的线程那就必须等待,同时,它甚至支持不同进程中的线程同步,这点更能体现他的优势,但是劣势也是
阅读全文
摘要:信号量(Semaphore) Semaphore 一般译作 信号量,它也是一种线程同步工具,主要用于多个线程对共享资源进行并行操作的一种工具类。它代表了一种许可的概念,是否允许多线程对同一资源进行操作的许可,使用 Semaphore 可以控制并发访问资源的线程个数。 Semaphore 的使用场景
阅读全文
摘要:线程模式是微软的COM基础中的极其重要的概念.一定要吃透!初始一个STA套间实际上是相当于开了一个消息窗口,所有调用经此窗口过程调度到组件内. [STAThread] 可以理解成CoInitialize(NULL); 初始一个STA套间实际上是相当于开了一个消息窗口,所有调用经此窗口过程调度到组件内
阅读全文
摘要:规则 com组件以接口的方式对外开放。 1:所要导出的类必须为公有; 2:所有属性、方法也必须为公有; 3:要导出的属性、方法必须用接口方式; interface IName { [DispId(1)]//为函数的标识:C#代码中必须定义了接口,才可以按照此方法实现调用。 void ShowAge(
阅读全文
摘要:转自:https://blog.csdn.net/black_bad1993/article/details/53906252 Com组件 1.线程模型是干嘛用的?解决”多个线程”“同时”调用你的COM组件的并发控制。客户没有你的COM的源代码,它不知道你的组件是怎么写的,是不是线程安全的(是否用C
阅读全文
摘要:理论 Windows的线程同步方式可分为2种,用户模式构造和内核模式构造。内核模式构造:是由Windows系统本身使用,内核对象进行调度协助的。内核对象是系统地址空间中的一个内存块,由系统创建维护。 内核对象为内核所拥有,而不为进程所拥有,所以不同进程可以访问同一个内核对象, 如进程,线程,作业,事
阅读全文
摘要:NET上下文的概念 应用程序域是进程中承载程序集的逻辑分区,在应用程序域当中,存在更细粒度的用于承载.NET对象的实体,上下文是用来确定对象的逻辑归属,那就.NET上下文Context。所有的.NET对象都存在于上下文当中,每个AppDomain当中至少存在一个默认上下文(context 0)。 即
阅读全文
摘要:转载自 Windows系统机制之对象管理器 设计的几个目的: 提供一种公共统一的机制来使用系统资源 将对象保护隔离到OS中的一个地方,从而确保统一的一致的对象访问策略 提供一种机制来管理进程对对象的使用 支持各种OS环境需求,比如一个进程能够从父进程继承资源 建立统一的规则来维护对象的保持力 提供为
阅读全文
摘要:总结: 1、句柄就是进程句柄表中的索引。2、句柄是对进程范围内一个内核对象地址的引用,一个进程的句柄传给另一个进程是无效的。一个内核对象可用有多个句柄。Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用
阅读全文
摘要:详细:http://lzltool.com/doc/csharptocaddadd
阅读全文
摘要:IntPtr类由来 .NET提供了一个结构体System.IntPtr专门用来代表句柄或指针。句柄是对象的标识符,当调用这些API创建对象时,它们并不直接返回指向对象的指针,而是会返回一个32位或64位的整数值,这个在进程或系统范围内唯一的整数值就是句柄(Handle),随后程序再次访问对象,或者删
阅读全文
摘要:marshal:直译为“编排”, 在计算机中特 指将数据按某种描述格式编排出来,通常来说一般是从非文本格式到文本格式的数据转化。unmarshal是指marshal的逆过程。比如在WebService中,我们需要把java对象以xml方式表示并在网络间传输,把java对象转化成xml片段的过程就是m
阅读全文
摘要:转载自:https://www.cnblogs.com/silverb/p/5300255.html 句柄的基本概念 1、句柄就是进程句柄表中的索引。2、句柄是对进程范围内一个内核对象地址的引用,一个进程的句柄传给另一个进程是无效的。一个内核对象可用有多个句柄。Windows之所以要设立句柄,根本上
阅读全文
摘要:RPC服务的基本架构图如上,可以很清楚地看到,一个完整的RPC架构里面包含了四个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub大家可以理解为存根。分别说说这几个组件: 客户端(Client): 服务的调用方。 服务端(Server):真
阅读全文
摘要:一、IOCP(I/O Completion Ports)简介 要实现异步通信,必须要用到一个很风骚的I/O数据结构 ,叫重叠结构“Overlapped”,Windows里所有的异步通信都是基于它的,完成端口也不例外。 Overlapped重叠结构 这里可以简单的将其理解为一个操作系统和用户之间的参数
阅读全文
摘要:overview 这个字符到底是什么含义呢?其实它的意思就是当程序在等待设备操作的时候,可以继续往下做而不必阻塞到那个地方等待设备操作的返回,这就造成了程序运行和设备操作时间上的重叠。 Overlapped I/O也称Asynchronous I/O,异步I/O模型。异步I/O和同步I/O不同,同步
阅读全文
摘要:总结:IOCP :我的打印文件放在店里面排队,轮到我打印了,店长帮我打印一下,打印好了通知我来拿 Epoll :我的打印文件放在店里面排队,轮到我叫我一下,我自己来打印。 直入正题:Epoll 是Linux系统下的模型;IOCP 是Windows下模型;Epoll 是当事件资源满足时发出可处理通知消
阅读全文
摘要:Overview 如今的应用程序越来越复杂,我们常常需要使用《异步编程:线程概述及使用》中提到的多线程技术来提高应用程序的响应速度。这时我们频繁的创建和销毁线程来让应用程序快速响应操作,这频繁的创建和销毁无疑会降低应用程序性能,我们可以引入缓存机制解决这个问题,此缓存机制需要解决如:缓存的大小问题、
阅读全文
摘要:案例如下的。我个人理解是不会出现出现0,0的结果,但是很明显出现了。 说明对我对 Volatile\内存屏障\乱序排序的理解是不对。 今天就通过这个案例,理清这些概念。 using System; using System.Threading; using System.Threading.Task
阅读全文
摘要:正如在第一篇文章中提到的,编译器可能通过对内存操作进行重新排序来优化代码。 在 .NET Framework 4.5 中,将 C# 编译为 IL 的 csc.exe 编译器并不执行大量的优化操作,因此该编译器不会对内存操作进行重新排序。 但将 IL 编译为机器码的实时 (JIT) 编译器实际上将执行
阅读全文
摘要:无序执行指令(Out-of-Order,简称OoO)模式允许CPU充分利用指令周期,避免由于某个指令延迟导致指令周期被浪费。在这种模式下,处理器根据输入数据的可用性来安排指令的执行顺序,而不是程序原先输入数据的顺序。通过这种执行顺序上的调整,处理器可以避免由于指令等待数据可用带来的空闲,转而执行数据
阅读全文
摘要:overview 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁)、SpinLocked(自旋锁)、易变构造(volatile关键字、volatile类、Thread.VolatitleRead|Thread.VolatitleWrite)、MemoryBar
阅读全文
摘要:在.NET Framework中,System.Convert类中提供了较为全面的各种类型、数值之间的转换功能。 其中的两个方法可以轻松的实现各种进制的数值间的转换: Convert.ToInt32(string value, int fromBase): 可以把不同进制数值的字符串转换为数字,其中
阅读全文
摘要:什么是优先级反转(翻转)优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即: 高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。-- 从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。具体来说:当高优先级任务正
阅读全文
摘要:由于.net core 是开源的。所以可以让.net库文件参与程序调试。具体vs2022配置如下 1、设置VS2022 加载程序数据文件(.pdb俗称符号文件) 1)选择工具>选项>调试>符号,并确保已选中“ Microsoft符号服务器(.NET框架相关的库)和NuGet.org符号服务器”选项。
阅读全文
摘要:CPU缓存架构 不同的CPU厂商的架构也有些不同,在这里只介绍流行的缓存架构 缓存一致性可以分为三个点: 在进程每个写入运算时都立刻采取措施保证资料一致性 每个独立的运算,假如它造成资料值的改变,所有进程都可以看到一致的改变结果 在每次运算之后,不同的进程可能会看到不同的值(这也就是没有一致性的行为
阅读全文
摘要:重要 (1) windbg命令分为标准命令(40个左右),元命令(一百多个)和扩展命令。 标准命令提供最基本的调试功能,不区分大小写。如:bp g dt dv k等 元命令提供标准命令没有提供的功能,也内建在调试引擎中,以.开头。如.sympath .reload等 扩展命令用于扩展某一方面的调试功
阅读全文
摘要:进程切换(上下文切换)1、暂停当前运行进程,从运行状态变成其他状态。 2、调度另一个进程从就绪状态变成运行状态。 进程切换的要求切换前,保存进程上下文 切换后,恢复进程上下文快速切换快速切换 进程生命周期的信息 寄存器(PC,SP,.….)CPU状态内存地址空间 上下文切换的图示 进程控制块PCB:
阅读全文
摘要:转载自:https://www.cnblogs.com/xuanyuan/p/14679727.html 计算机领域有一个经典的问题:从你在浏览器中输入URL并按下回车,到网页渲染出来,这中间发生了什么? 通过这个问题,可以考察候选人对计算机网络的理解程度,因此出现在数不清的面试场合。 毋庸置疑,这
阅读全文
摘要:四核八线程是指使用了超线程技术 , 把一个物理核心,模拟成 两个逻辑核心, 理论上要像八颗物理核心一样在同一时间执行八个线程,所以设备管理器和任务管理器中会显示出八个核心,但事实上并不是真正的八个核心,四核八线程就是真四核,虚拟八核;四核八线程在有些情况下比如任务量不大能让CPU利用率提高很多从而使
阅读全文
摘要:OverView 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁)、SpinLocked(自旋锁)、易变构造(volatile关键字、volatile类、Thread.VolatitleRead|Thread.VolatitleWrite)、MemoryBar
阅读全文
摘要:概述: Incremental Linking翻译成中文就是“增量链接”,是一个链接的参数选项,作用就是为了提高链接速度的。什么意思呢?不选用增量链接时,每次修改或新增代码后进行链接时会重新洗牌,把原来的.exe删了,重新链接成一个新的.exe,这样对于大型项目来说链接会比较慢。而选用增量链接时,在
阅读全文
摘要:mscn:在 Visual Studio 调试器(C#)中指定符号 (.pdb) 和源文件 PDB全称Program Database,程序数据库 ( .pdb) 文件(也称为符号文件)将项目源代码中的标识符和语句映射到已编译应用中的相应标识符和说明。 这些映射文件将调试器链接到源代码,以进行调试。
阅读全文
摘要:锁提供了线程安全三要素中的 有序性。二、SpinWait是同步锁的核心,而Thread是SpinWait的核心。 Spinwait结构 完成代码:SpinWait.cs (dot.net) SpinWait结构的核心代码 internal const int YieldThreshold = 10;
阅读全文