当前位置: 首页 > wzjs >正文

国外网站排行aspnet网站开发pdf

国外网站排行,aspnet网站开发pdf,手机网站表单页面制作,不能安装wordpress高性能内存队列 缓存一致性伪共享高性能内存队列Disruptor构造器参数使用流程 缓存一致性 在CPU多核缓存架构中,每个处理器都有一个单独的缓存,共享数据可能有多个副本:一个副本在主内存中,一个副本在请求它的每个处理器的本地缓…

高性能内存队列

  • 缓存一致性
  • 伪共享
  • 高性能内存队列Disruptor
    • 构造器参数
    • 使用流程

缓存一致性

在CPU多核缓存架构中,每个处理器都有一个单独的缓存,共享数据可能有多个副本:一个副本在主内存中,一个副本在请求它的每个处理器的本地缓存中。当数据的一个副本发生更改时,其他副本必须反映该更改。也就是说,CPU多核缓存架构要保证缓存一致性。

两种方式:

  1. 总线锁定
  2. 缓存一致性协议:缓存一致性协议是一种用于确保处理器缓存中的数据和主存中的数据一致的机制。缓存一致性协议会通过处理器之间的通信,确保在一个处理器修改了某个数据后,其他处理器缓存中的该数据会被更新或者失效,从而保证在多个处理器同时对同一个数据进行操作时,它们所看到的数据始终是一致的。
  3. 缓存一致性协议有多种实现,大概分为两类:写失效(当处理器写入一个共享缓存块时,其他缓存中的所有共享副本都会通过总线窥探失效)和写更新(当处理器写入一个共享缓存块时,其他缓存的所有共享副本都会通过总线窥探更新)。

伪共享

如果多个核上的线程在操作同一个缓存行(linux下缓存行有64个字节)中的不同变量数据,那么就会出现频繁的缓存失效,即使在代码层面看这两个线程操作的数据之间完全没有关系。这种不合理的资源竞争情况就是伪共享(FalseSharing)。

linux下查看缓存行大小:cat /proc/cpuinfo
避免伪共享方案:

  1. 缓存行填充
public class FalseSharing {public static void main(String[] args) throws InterruptedException {Pointer pointer = new Pointer();long start = System.currentTimeMillis();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {for(int i = 0; i < 100000000; i++) {pointer.x++;}}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {for(int i = 0; i < 100000000; i++) {pointer.y++;}}});t1.start();t2.start();t1.join();t2.join();System.out.println(System.currentTimeMillis()-start);}static class Pointer {volatile long x;//缓存填充long p1,p2,p3,p4,p5,p6,p7,p8;volatile long y;}
}
  1. 使用@sun.misc.Contended注解(java8)注意需要配置jvm参数:-XX:-RestrictContended
public class FalseSharing {public static void main(String[] args) throws InterruptedException {Pointer pointer = new Pointer();long start = System.currentTimeMillis();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {for(int i = 0; i < 100000000; i++) {pointer.x++;}}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {for(int i = 0; i < 100000000; i++) {pointer.y++;}}});t1.start();t2.start();t1.join();t2.join();System.out.println(System.currentTimeMillis()-start);}static class Pointer {@Contendedvolatile long x;//缓存填充//long p1,p2,p3,p4,p5,p6,p7,p8;volatile long y;}
}
  1. 用线程的本地内存,比如ThreadLocal

高性能内存队列Disruptor

juc下的队列大部分采用有界队列,有界队列通常采用数组实现。但是采用数组实现又会引发另外一个问题false sharing(伪共享)。Disruptor实现了队列的功能并且是一个有界队列,可以用于生产者-消费者模型。利用缓存行填充解决了伪共享的问题。

    <dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version></dependency>

构造器参数

EventFactory:创建事件(任务)的工厂类。ringBufferSize:容器的长度。
ThreadFactory:用于创建执行任务的线程。
ProductType:生产者类型:单生产者、多生产者。
WaitStrategy:等待策略。

使用流程

  1. 构建消息载体(事件)
  2. 构建生产者
  3. 构建消费者
  4. 生产消息,消费消息的测试
@Data
public class OrderEvent {private long value;private String name;
}
public class OrderEventFactory implements EventFactory<OrderEvent> {@Overridepublic OrderEvent newInstance() {return new OrderEvent();}
}
public class OrderEventProducer {//存储事件的环形队列private RingBuffer<OrderEvent> ringBuffer;public OrderEventProducer(RingBuffer<OrderEvent> ringBuffer) {this.ringBuffer = ringBuffer;}public void onData(long value, String name) {//获取队列的下一个槽long next = ringBuffer.next();//获取消息OrderEvent orderEvent = ringBuffer.get(next);//写入数据orderEvent.setValue(value);orderEvent.setName(name);System.out.println(String.format("生产着发送数据:value=%d name=%s", value, name));ringBuffer.publish(next);}
}
public class OrderEventHandler implements EventHandler<OrderEvent> {@Overridepublic void onEvent(OrderEvent orderEvent, long l, boolean b) throws Exception {System.out.println(String.format("消费者拿到数据:value=%d name=%s", orderEvent.getValue(), orderEvent.getName()));}
}

单生产者单消费者模式

public class DisruptorDemo {public static void main(String[] args) {//创建DisruptorDisruptor<OrderEvent> disruptor = new Disruptor<>(new OrderEventFactory(),1024 * 1024,Executors.defaultThreadFactory(),ProducerType.SINGLE,new YieldingWaitStrategy());//设置消费者用于处理的事件disruptor.handleEventsWith(new OrderEventHandler());disruptor.start();//创建队列容器RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer();//创建生产者OrderEventProducer producer = new OrderEventProducer(ringBuffer);for(int i = 0; i < 100; i++) {producer.onData(i, "test"+i);}disruptor.shutdown();}
}

单生产者多消费者模式

public class DisruptorDemo {public static void main(String[] args) {//创建DisruptorDisruptor<OrderEvent> disruptor = new Disruptor<>(new OrderEventFactory(),1024 * 1024,Executors.defaultThreadFactory(),ProducerType.SINGLE,new YieldingWaitStrategy());//设置消费者用于处理的事件//disruptor.handleEventsWith(new OrderEventHandler());//多消费者,重复消费//disruptor.handleEventsWith(new OrderEventHandler(), new OrderEventHandler());//设置多消费者,消费者要实现WorkHandler接口,一条消息只会被一个消费者消费disruptor.handleEventsWithWorkerPool(new OrderEventHandler(), new OrderEventHandler());disruptor.start();//创建队列容器RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer();//创建生产者OrderEventProducer producer = new OrderEventProducer(ringBuffer);for(int i = 0; i < 100; i++) {producer.onData(i, "test"+i);}disruptor.shutdown();}
}

多生产者多消费者模式

public class DisruptorDemo {public static void main(String[] args) throws InterruptedException {//创建DisruptorDisruptor<OrderEvent> disruptor = new Disruptor<>(new OrderEventFactory(),1024 * 1024,Executors.defaultThreadFactory(),ProducerType.MULTI,new YieldingWaitStrategy());//设置消费者用于处理的事件//disruptor.handleEventsWith(new OrderEventHandler());//多消费者,重复消费//disruptor.handleEventsWith(new OrderEventHandler(), new OrderEventHandler());//设置多消费者,消费者要实现WorkHandler接口,一条消息只会被一个消费者消费disruptor.handleEventsWithWorkerPool(new OrderEventHandler(), new OrderEventHandler());disruptor.start();//创建队列容器RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer();//创建生产者Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {OrderEventProducer producer = new OrderEventProducer(ringBuffer);for(int i = 0; i < 100; i++) {producer.onData(i, "test"+i);}}});//创建生产者Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {OrderEventProducer producer = new OrderEventProducer(ringBuffer);for(int i = 0; i < 100; i++) {producer.onData(i, "aaaa"+i);}}});t1.start();t2.start();t1.join();t2.join();disruptor.shutdown();}
}

文章转载自:

http://Yp7jBCbq.rnpnn.cn
http://oheuiJGF.rnpnn.cn
http://F6UEWbng.rnpnn.cn
http://Z7aGdE5I.rnpnn.cn
http://xtm2mZMJ.rnpnn.cn
http://vvQ7Y1dG.rnpnn.cn
http://2cFUKF7H.rnpnn.cn
http://6JvHSax4.rnpnn.cn
http://NZWf1BJx.rnpnn.cn
http://MiKlj29i.rnpnn.cn
http://22utX5Z4.rnpnn.cn
http://r5taydBq.rnpnn.cn
http://xWrHAyFm.rnpnn.cn
http://fDfr3Lva.rnpnn.cn
http://7AJP4urL.rnpnn.cn
http://2pGrHokH.rnpnn.cn
http://WCxn1fe9.rnpnn.cn
http://LXjegR1m.rnpnn.cn
http://nqhNtrpA.rnpnn.cn
http://OHj3GR60.rnpnn.cn
http://wSbXsPj6.rnpnn.cn
http://i6mtqmvm.rnpnn.cn
http://csHqxc4L.rnpnn.cn
http://IfyFN6sM.rnpnn.cn
http://MN31MhIV.rnpnn.cn
http://uQC2eWZe.rnpnn.cn
http://xABSbce2.rnpnn.cn
http://VQC3CuoB.rnpnn.cn
http://BexLk4X2.rnpnn.cn
http://an3fystQ.rnpnn.cn
http://www.dtcms.com/wzjs/616200.html

相关文章:

  • 建造师免费自学网站重庆网站建设首选承越
  • 布吉网站的建设智慧旅游景区网站建设
  • 聊城制作手机网站wordpress编辑器知乎
  • 江苏质监站网站做资料公司起名生成器
  • linux系统网站建设快递网站建设
  • 电影网站建设成本微企点做的网站怎么去底下的
  • 湘潭自助建站系统可以做公司宣传的网站有哪些
  • 一手房发帖网站怎样做北京免备案网站建设
  • 网站制作.网站建设制作软件叫啥
  • 目前流行的网站开发技术网站建设需求背景
  • 建一个网站的手机电脑锦州网站建设工作
  • 网站被黑是什么原因点样做网站
  • 上海网站建设公司价格做视频网站软件有哪些
  • 青海公路工程建设总公司网站江阴网站建设工作室
  • 网站怎么做用密码中国林业工程建设网站
  • 新网域名网站网页样式库
  • 大丰建站工业软件开发技术专业
  • 网站页面那个图怎么做网站开发png图标素材
  • 临沂市建设局网站改版杭州物联网前十名公司
  • 哪些网站用黑体做的怎么注册网络平台
  • wordpress建视频网站做是么网站
  • 石家庄公司网站设计网络营销的发展概述
  • 寺庙网站建设合肥网站建设zgkr
  • 建设网站网站设计搜盘 资源网
  • 个人能做网站吗无法访问iis网站
  • 网站建设微商城多少钱深圳做微信网站制作
  • 济南营销型网站建设工作室学习网站开发教程
  • 网站举报多久有结果重庆开县网站建设公司
  • 做网站加入视频无法播放网站建设氺首选金手指12
  • 毕业设计2网站建设什么是c2c模式