首页
精选文章事件驱动查看全文程序的范式可以分为同步模型和异步模型。同步模型一般是指请求<->响应模式,调用方同步请求下游,并且阻塞等待结果。同步模型一般用于短耗时,低并发的场景,因为同步模型一般需要一个线程/协程等待结果的返回,所以在高并发场景下线程等资源会成为系统瓶颈。 在耗时较长的情况下,线程需要等待的时间较长,可以用轮询的方式定期去下游查询结果,避免一个线程长期用于等待结果。 但是如果在高并发场景下,需要轮询大量的数据,对服务器能力的压力较大。这个时候就需要引入异步的编程模型。 异步模型 异步编程可以下列几种模型: 消息驱动,消息驱动是目前微服务架构下常用的异步模型,消息驱动分为生产者,队列,消费者,生产者发送消息到队列,通过推或者拉的方式消费者可以异步的消费这些消息。 事件驱动,事件和消息的区别,只是事件做了一些结构化的封装。例如一般情况下事件会根据业务场景的不同而区分为不同的事件,每个事件的关注者也只会消费特定类型的事件。 流模式,流是一组有序的无界事件或数据,一般和消息/事件区别是通信方式,消息/事件一般都是离散的,通过推或者轮询拉的方式获取数据,流模式一般通过固定的长链接链路推送大量数据。 以上三种模式并没有严格的界限,比如消息驱动架构下,可以将不同类型的消息发送到不同的队列,其实也可以算是结构化的事件。而把不同的事件放在一起,形成事件总线也类似消息。同时消息和事件也可以通过长链接的方式推动给下游进行消费。 事件驱动不仅仅可以用于业务研发中异步化我们都业务逻辑,在基础组件中也承担重要的作用。 Reactor Reactor是网络编程领域著名的并发模型,将网络编程转换为一个个需要处理的事件,例如OnAccept,OnWrite…ZGC【Java】查看全文ZGC是自JDK11中开始推出的一款垃圾回收器,ZGC的主要特点是支持大内存(大达16TB),低延迟(低至10ms)。ZGC的堆内存和G1类似,也是基于 Region 来分布,但是 ZGC 抛弃了分代的概念,不再区分新生代和老年代。而且 ZGC 的 Region 支持动态创建和销毁,ZGC 中的 Region 大小分为三种类型 : 小对象区(Small Region),默认2MB,用于放置小于 256 KB 的对象。 中等对象区(Medium Region),主要用于放置大小在 256 KB 和 4 MB 之间的对象,默认大小是32M。 对于大于32M的对象,会被放入Large Region,Large Region每个Region只会放值一个对象,为了对齐,所以Region的大小必须是2MB的倍数,Large Region的最小内存是4MB。 ZGC使用多重映射和染色指针实现垃圾回收。 ZGC不再区分新生代和老年代,垃圾回收的过程中分为标记阶段和转移阶段。 标记算法 标记过程可以分为初始标记,并发标记和重新标记。 初始标记阶段是STW(Stop The World,暂停所有业务线程)的,因为初始标记阶段是将和GC root直接关联的对象进行标记,所以该阶段需要一个静态的快照,也就是需要STW。 初始标记完成之后,标记工作就可以和业务线程同时进行了。 并行标记的一般采用三色标记的方式进行标记,三色标记是指在标记过程中将对象分为白色,黑色,灰色三种。 三色标记的过程如下: 初始阶段所有的对象都是白色。 初始标记完成之后将GC Roots直接关联的对象置为灰色。 遍历灰色对象的所有引用,当所有引用被标记完成之后…选择排序查看全文选择排序中的选择是指在循环过程中每一轮找到最大值,然后把值直接放置在其最终位置的排序方式。所以选择排序可以认为是冒泡排序的优化过程,都是每一轮找到剩余元素的最大值,但是选择排序在每一轮获取最大值的过程,不会两两交换数据,而是使用一个临时变量存储这个最大值,循环结束之后再将做一次交换,将最大值和位置上当前的值就行交换。 选择排序的流程整体也是分为两轮循环。 因为选择排序每一次循环都可以确认一个最大值的位置,所以n个数字的数据集需要n-1轮才能确认所有数的位置。所以外循环循环n-1次。 每一轮内循环就是寻找数据集中最大值的过程,确认最大值之后将其和其位置上的当前值进行交换,一轮内循环确认一个最大值的位置之后,下一轮内循环只需要将数据集中该位置之前的数据重复该内循环的过程。 例如输入{4,6,8,3,9, 5}将其从小到大排序。 输入的数据集一共是6个数字,所以循环5次可以完成选择排序的过程。 第一轮找出数据集的最大值,可以使用哨兵先将最大值置为第一个数字4,然后向后循环,发现比最大值大的数字就将最大值改写为该值,第一轮循环的时候,最大值是9,该值应该放在数据集最后的位置,所以将9和5交换。 因为9的位置已经确认,所以还剩余5个数字待排序,重复第一轮的循环过程,找出剩余数据的最大值8,将其和目前的第5位的数字5进行交换。 依此类推,将6、5、4、3依次放置在正确的位置。 选择排序的过程是两轮循环,每一轮循环的数据量级是数据规模,所以其时间复杂度是 。 选择排序过程中使用一个变量存储的当前的最大值,数据交换的过程也可能需要一个临时变量,空间复杂度是 。 因为选择排序过程中本轮最大值和其位置上的当前值交换,所以数据本来的顺序可能会打乱… |
热门分类开源Golang消息队列JavaJavascriptLinuxMysqlNLPPHP事务内存管理分布式理论分类存储常用存储开源软件操作系统画图网络编程数据库算法虚拟化前端存储理论常用算法微服务数据结构算法应用计算机原理中间件共识算法分布式分治动态规划容器并发排序架构组件绘图工具网络协议编程语言理论算法思想树缓存架构C++字符串算法工程思想搜索
算法题库精选内容 |