《CLR Via C#》读书笔记:27.计算限制的异步操作
一、CLR 线程池基础
一般来说如果计算机的 CPU 利用率没有 100% ,那么说明很多进程的部分线程没有运行。可能在等待 文件/网络/数据库等设备读取或者写入数据,又可能是等待按键、鼠标移动等事件。
执行 I/O 限制的操作时,操作系统通过设备驱动程序通知硬件干活,而 CPU 处于一种空闲状态。而在现代应用程序当中,使用线程池来执行计算限制的操作,而不是手动创建线程。
每个 CLR 都有自己独立的线程池,并且由各自 CLR 控制的所有 AppDomain 所共享。
线程池本身维护了一个请求队列,当程序需要执行一个异步操作的时候,会将一个记录项追加到队列之中,然后由线程池将该记录项分派给线程池线程,如果没有线程则创建一个新的线程。线程任务处理完整之后,将该线程放入线程池中等待以后进行复用。
线程池本身是启发式的,结合程序负载,他会自己根据当前线程池内线程的状态销毁/新增线程。
《CLR Via C#》读书笔记:26.线程基础
一、线程开销
操作系统创建线程是有代价的,其主要开销在下面列举出来了。
内存开销
-
线程内核对象
拥有线程描述属性与线程上下文,线程上下文占用的内存空间为 x86 架构 占用 700 字节、x64 架构 1240 字节 、ARM 架构 350 字节。
-
线程环境块(TEB)
TEB 消耗一个内存页,占用 4KB内存。
-
用户模式栈。
用户模式栈存储传递给方法的局部变量与实参,并且还存储有一个地址用于当前方法返回的时候,线程应该从哪个地方继续执行。默认 Windows 分配保留 1MB 内存。
《CLR Via C#》读书笔记:24.运行时序列化
一、什么是运行时序列化
序列化的作用就是将对象图(特定时间点的对象连接图)转换为字节流,这样这些对象图就可以在文件系统/网络进行传输。
二、序列化/反序列化快速入门
一般来说我们通过 FCL 提供的 BinaryFormatter
对象就可以将一个对象序列化为字节流进行存储,或者通过该 Formatter 将一个字节流反序列化为一个对象。
Abp 源码分析:十六、后台工作与后台工作者
0. 简介
在某些时候我们可能会需要执行后台任务,或者是执行一些周期性的任务。比如说可能每隔 1 个小时要清除某个临时文件夹内的数据,可能用户会要针对某一个用户群来群发一组短信。前面这些就是典型的应用场景,在 Abp 框架里面为我们准备了后台作业和后台工作者来帮助我们解决这个问题。
后台作业与后台工作者的区别是,前者主要用于某些耗时较长的任务,而不想阻塞用户的时候所使用。后者主要用于周期性的执行某些任务,从 “工作者” 的名字可以看出来,就是一个个工人,而且他们每个工人都拥有单独的后台线程。