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

航达建设集团有限公司网站网站备案制度

航达建设集团有限公司网站,网站备案制度,宣传类的网站,各位大神给个网址1.CPU缓存架构详解 1.1 CPU高速缓存概念 CPU缓存即高速缓冲存储器#xff0c;是位于CPU与主内存间的一种容量较小但速度很高的存储器。CPU高速缓存可以分为一级缓存#xff0c;二级缓存#xff0c;部分高端CPU还具有三级缓存#xff0c;每一级缓存中所储存的全部数据都是…1.CPU缓存架构详解 1.1 CPU高速缓存概念 CPU缓存即高速缓冲存储器是位于CPU与主内存间的一种容量较小但速度很高的存储器。CPU高速缓存可以分为一级缓存二级缓存部分高端CPU还具有三级缓存每一级缓存中所储存的全部数据都是下一级缓存的一部分这三种缓存的技术难度和制造成本是相对递减的所以其容量也是相对递增的。 由于CPU的速度远高于主内存CPU直接从内存中存取数据要等待一定时间周期Cache中保存着CPU刚用过或循环使用的一部分数据当CPU再次使用该部分数据时可从Cache中直接调用,减少CPU的等待时间提高了系统的效率。 在CPU访问存储设备时无论是存取数据抑或存取指令都趋于聚集在一片连续的区域中这就是局部性原理。 时间局部性Temporal Locality如果一个信息项正在被访问那么在近期它很可能还会被再次访问。 比如循环、递归、方法的反复调用等。 空间局部性Spatial Locality如果一个存储器的位置被引用那么将来他附近的位置也会被引用。 比如顺序执行的代码、连续创建的两个对象、数组等。 1.2 CPU多核缓存架构 现代CPU为了提升执行效率减少CPU与内存的交互一般在CPU上集成了多级缓存架构常见的为三级缓存结构。如下图 CPU寄存器是位于CPU内部的存储器数据的读写速度非常快比缓存和主存更快。CPU会把常用的数据放到寄存器中进行处理而不是直接从主存中读取这样可以加速数据的访问和处理。但是寄存器的容量非常有限一般只有几十个或者几百个字节因此只能存储少量的数据 当CPU读取一个地址中的数据时会先在 L1 Cache 中查找。如果数据在 L1 Cache 中找到CPU 会直接从 L1 Cache 中读取数据。如果没有找到则会将这个请求发送给 L2 Cache然后在 L2 Cache 中查找如果 L2 Cache 中也没有找到则会继续将请求发送到 L3 Cache 中。如果在 L3 Cache 中还是没有找到数据则最后会从主内存中读取数据并将其存储到 CPU 的缓存中。 当CPU写入一个地址中的数据时同样会先将数据写入 L1 Cache 中然后再根据缓存一致性协议将数据写入 L2 Cache、L3 Cache 以及主内存中。具体写入过程与缓存一致性协议相关有可能只写入 L1 Cache 中也有可能需要将数据写入 L2 Cache、L3 Cache 以及主内存中。写入过程中也可能会使用缓存行失效、写回等技术来提高效率。 思考这种缓存架构在多线程访问的时候存在什么问题 CPU多核缓存架构缓存一致性问题分析 在CPU多核缓存架构中每个处理器都有一个单独的缓存共享数据可能有多个副本一个副本在主内存中一个副本在请求它的每个处理器的本地缓存中。当数据的一个副本发生更改时其他副本必须反映该更改。也就是说CPU多核缓存架构要保证缓存一致性。 1.3 CPU缓存架构缓存一致性的解决方案 《64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf》中有如下描述 The 32-bit IA-32 processors support locked atomic operations on locations in system memory. These operations are typically used to manage shared data structures (such as semaphores, segment descriptors, system segments, or page tables) in which two or more processors may try simultaneously to modify the same field or flag. The processor uses three interdependent mechanisms for carrying out locked atomic operations: • Guaranteed atomic operations • Bus locking, using the LOCK# signal and the LOCK instruction prefix • Cache coherency protocols that ensure that atomic operations can be carried out on cached data structures (cache lock); this mechanism is present in the Pentium 4, Intel Xeon, and P6 family processors 32位的IA-32处理器支持对系统内存中的位置进行锁定的原子操作。这些操作通常用于管理共享的数据结构(如信号量、段描述符、系统段或页表)在这些结构中两个或多个处理器可能同时试图修改相同的字段或标志。处理器使用三种相互依赖的机制来执行锁定的原子操作: 有保证的原子操作 处理器提供一些特殊的指令或者机制可以保证在多个处理器同时执行原子操作时它们不会相互干扰从而保证原子性。这些指令或者机制的实现通常需要硬件支持。例如x86架构中提供了一系列的原子操作指令如XADD、XCHG、CMPXCHG等可以保证在多个处理器同时执行这些指令时它们不会相互干扰从而保证原子性。总线锁定使用LOCK#信号和LOCK指令前缀 总线锁定是一种用于确保原子操作的机制通常会在LOCK指令前缀和一些特殊指令中使用。在执行LOCK指令前缀时处理器会将LOCK#信号拉低这个信号会通知其他处理器当前总线上的数据已经被锁定从而确保原子性。缓存一致性协议确保原子操作可以在缓存的数据结构上执行(缓存锁定);这种机制出现在Pentium 4、Intel Xeon和P6系列处理器中 缓存一致性协议是一种用于确保处理器缓存中的数据和主存中的数据一致的机制。缓存一致性协议会通过处理器之间的通信确保在一个处理器修改了某个数据后其他处理器缓存中的该数据会被更新或者失效从而保证在多个处理器同时对同一个数据进行操作时它们所看到的数据始终是一致的。 缓存锁定则是在缓存一致性协议的基础上实现原子操作的机制它会利用缓存一致性协议来确保在多个处理器同时修改同一个缓存行中的数据时只有一个处理器能够获得锁定从而保证原子性。缓存锁定的实现也需要硬件的支持而且不同的处理器架构可能会有不同的实现方式。 缓存一致性协议不能使用的特殊情况 当操作的数据不能被缓存在处理器内部或操作的数据跨多个缓存行时则处理器会调用总线锁定。 不能被缓存在处理器内部的数据通常指的是不可缓存的设备内存如显存、网络接口卡的缓存等这些设备内存一般不受缓存一致性协议的管辖处理器无法将其缓存到自己的缓存行中。有些处理器不支持缓存锁定。早期的Pentium系列处理器并不支持缓存锁定机制。在这些处理器上只能使用总线锁定来实现原子操作。 但现代的处理器通常都支持缓存锁定机制因此应该尽量使用缓存锁定来实现原子操作以获得更好的性能。 1.4 缓存一致性协议实现原理 总线窥探 总线窥探(Bus snooping)是缓存中的一致性控制器(snoopy cache)监视或窥探总线事务的一种方案其目标是在分布式共享内存系统中维护缓存一致性。包含一致性控制器(snooper)的缓存称为snoopy缓存。该方案由Ravishankar和Goodman于1983年提出。 在计算机中数据通过总线在处理器和内存之间传递。每次处理器和内存之间的数据传递都是通过一系列步骤来完成的这一系列步骤称之为总线事务Bus Transaction 工作原理 当特定数据被多个缓存共享时处理器修改了共享数据的值更改必须传播到所有其他具有该数据副本的缓存中。这种更改传播可以防止系统违反缓存一致性。数据变更的通知可以通过总线窥探来完成。所有的窥探者都在监视总线上的每一个事务。如果一个修改共享缓存块的事务出现在总线上所有的窥探者都会检查他们的缓存是否有共享块的相同副本。如果缓存中有共享块的副本则相应的窥探者执行一个动作以确保缓存一致性。这个动作可以是刷新缓存块或使缓存块失效。它还涉及到缓存块状态的改变这取决于缓存一致性协议cache coherence protocol。 窥探协议类型 根据管理写操作的本地副本的方式有两种窥探协议: 写失效Write-invalidate 当处理器写入一个共享缓存块时其他缓存中的所有共享副本都会通过总线窥探失效。这种方法确保处理器只能读写一个数据的一个副本。其他缓存中的所有其他副本都无效。这是最常用的窥探协议。MSI、MESI、MOSI、MOESI和MESIF协议属于该类型。 写更新Write-update 缓存一致性协议在多处理器系统中应用于高速缓存一致性。为了保持一致性人们设计了各种模型和协议如MSI、MESI(又名Illinois)、MOSI、MOESI、MERSI、MESIF、write-once、Synapse、Berkeley、Firefly和Dragon协议。 MESI协议 MESI协议是一个基于写失效的缓存一致性协议是支持回写write-back缓存的最常用协议。也称作伊利诺伊协议 (Illinois protocol因为是在伊利诺伊大学厄巴纳-香槟分校被发明的)。 缓存行有4种不同的状态: 已修改Modified (M) 缓存行是脏的dirty与主存的值不同。如果别的CPU内核要读主存这块数据该缓存行必须回写到主存状态变为共享(S).独占Exclusive (E) 缓存行只在当前缓存中但是干净的——缓存数据同于主存数据。当别的缓存读取它时状态变为共享当前写数据时变为已修改状态。共享Shared (S) 缓存行也存在于其它缓存中且是未修改的。缓存行可以在任意时刻抛弃。无效Invalid (I) 缓存行是无效的 MESI协议用于确保多个处理器之间共享的内存数据的一致性。当一个处理器需要访问某个内存数据时它首先会检查自己的缓存中是否有该数据的副本。如果缓存中没有该数据的副本则会发出一个缓存不命中miss请求从主内存中获取该数据的副本并将该数据的副本存储到自己的缓存中。 当一个处理器发出一个缓存不命中请求时如果该数据的副本已经存在于另一个处理器或核心的缓存中即处于共享状态则该处理器可以从另一个处理器的缓存中复制该数据的副本。这个过程称为缓存到缓存复制cache-to-cache transfer。 缓存到缓存复制可以减少对主内存的访问从而提高系统的性能。但是需要确保数据的一致性否则会出现数据错误或不一致的情况。因此在进行缓存到缓存复制时需要使用MESI协议中的其他状态转换来确保数据的一致性。例如如果两个缓存都处于修改状态那么必须先将其中一个缓存的数据写回到主内存然后才能进行缓存到缓存复制。 1.5 伪共享的问题 如果多个核上的线程在操作同一个缓存行中的不同变量数据那么就会出现频繁的缓存失效即使在代码层面看这两个线程操作的数据之间完全没有关系。这种不合理的资源竞争情况就是伪共享False Sharing。 ArrayBlockingQueue有三个成员变量 takeIndex需要被取走的元素下标putIndex可被元素插入的位置的下标count队列中元素的数量 这三个变量很容易放到一个缓存行中但是之间修改没有太多的关联。所以每次修改都会使之前缓存的数据失效从而不能完全达到共享的效果。 如上图所示当生产者线程put一个元素到ArrayBlockingQueue时putIndex会修改从而导致消费者线程的缓存中的缓存行无效需要从主存中重新读取。 linux下查看Cache Line大小 Cache Line大小是64Byte 或者执行 cat /proc/cpuinfo 命令 避免伪共享方案 方案1缓存行填充 class Pointer {volatile long x;//避免伪共享 缓存行填充long p1, p2, p3, p4, p5, p6, p7;volatile long y; }方案2使用 sun.misc.Contended 注解java8 注意需要配置jvm参数-XX:-RestrictContended public class FalseSharingTest {public static void main(String[] args) throws InterruptedException {testPointer(new Pointer());}private static void testPointer(Pointer pointer) throws InterruptedException {long start System.currentTimeMillis();Thread t1 new Thread(() - {for (int i 0; i 100000000; i) {pointer.x;}});Thread t2 new Thread(() - {for (int i 0; i 100000000; i) {pointer.y;}});t1.start();t2.start();t1.join();t2.join();System.out.println(pointer.x,pointer.y);System.out.println(System.currentTimeMillis() - start);} }class Pointer {// 避免伪共享 Contended jvm参数-XX:-RestrictContended jdk8支持//Contendedvolatile long x;//避免伪共享 缓存行填充//long p1, p2, p3, p4, p5, p6, p7;volatile long y; }方案3 使用线程的本地内存比如ThreadLocal 2.高性能内存队列Disruptor详解 2.1 juc包下阻塞队列的缺陷 1 juc下的队列大部分采用加ReentrantLock锁方式保证线程安全。在稳定性要求特别高的系统中为了防止生产者速度过快导致内存溢出只能选择有界队列。 2加锁的方式通常会严重影响性能。线程会因为竞争不到锁而被挂起等待其他线程释放锁而唤醒这个过程存在很大的开销而且存在死锁的隐患。 3 有界队列通常采用数组实现。但是采用数组实现又会引发另外一个问题false sharing(伪共享)。 2.2 Disruptor介绍 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列研发的初衷是解决内存队列的延迟问题在性能测试中发现竟然与I/O操作处于同样的数量级。基于Disruptor开发的系统单线程能支撑每秒600万订单2010年在QCon演讲后获得了业界关注。2011年企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。 目前包括Apache Storm、Camel、Log4j2在内的很多知名项目都应用了Disruptor以获取高性能。 Githubhttps://github.com/LMAX-Exchange/disruptor Disruptor实现了队列的功能并且是一个有界队列可以用于生产者-消费者模型。 2.3 Disruptor的高性能设计方案 Disruptor通过以下设计来解决队列速度慢的问题 环形数组结构 为了避免垃圾回收采用数组而非链表。同时数组对处理器的缓存机制更加友好空间局部性原理。元素位置定位 数组长度2^n通过位运算加快定位的速度。下标采取递增的形式。不用担心index溢出的问题。index是long类型即使100万QPS的处理速度也需要30万年才能用完。无锁设计 每个生产者或者消费者线程会通过先申请可以操作的元素在数组中的位置申请到之后直接在该位置写入或者读取数据。整个过程通过原子变量CAS保证操作的线程安全。利用缓存行填充解决了伪共享的问题实现了基于事件驱动的生产者消费者模型观察者模式 消费者时刻关注着队列里有没有消息一旦有新消息产生消费者线程就会立刻把它消费 RingBuffer数据结构 使用RingBuffer来作为队列的数据结构RingBuffer就是一个可自定义大小的环形数组。除数组外还有一个序列号(sequence)用以指向下一个可用的元素供生产者与消费者使用。原理图如下所示 Disruptor要求设置数组长度为2的n次幂。在知道索引(index)下标的情况下存与取数组上的元素时间复杂度只有O(1)而这个index我们可以通过序列号与数组的长度取模来计算得出indexsequence % entries.length。也可以用位运算来计算效率更高此时array.length必须是2的幂次方indexsequece(entries.length-1)当所有位置都放满了再放下一个时就会把0号位置覆盖掉 思考覆盖数据是否会导致数据丢失呢 等待策略 名称措施适用场景BlockingWaitStrategy加锁CPU资源紧缺吞吐量和延迟并不重要的场景BusySpinWaitStrategy自旋通过不断重试减少切换线程导致的系统调用而降低延迟。推荐在线程绑定到固定的CPU的场景下使用PhasedBackoffWaitStrategy自旋 yield 自定义策略CPU资源紧缺吞吐量和延迟并不重要的场景SleepingWaitStrategy自旋 yield sleep性能和CPU资源之间有很好的折中。延迟不均匀TimeoutBlockingWaitStrategy加锁有超时限制CPU资源紧缺吞吐量和延迟并不重要的场景YieldingWaitStrategy自旋 yield 自旋性能和CPU资源之间有很好的折中。延迟比较均匀 Disruptor在日志框架中的应用 Log4j 2相对于Log4j 1最大的优势在于多线程并发场景下性能更优。该特性源自于Log4j 2的异步模式采用了Disruptor来处理。 在Log4j 2的配置文件中可以配置WaitStrategy默认是Timeout策略。 loggers all async采用的是Disruptor而Async Appender采用的是ArrayBlockingQueue队列。 由图可见单线程情况下loggers all async与Async Appender吞吐量相差不大但是在64个线程的时候loggers all async的吞吐量比Async Appender增加了12倍是Sync模式的68倍。 2.4 Disruptor实战 引入依赖 !-- disruptor -- dependencygroupIdcom.lmax/groupIdartifactIddisruptor/artifactIdversion3.3.4/version /dependencyDisruptor构造器 public Disruptor(final EventFactoryT eventFactory,final int ringBufferSize,final ThreadFactory threadFactory,final ProducerType producerType,final WaitStrategy waitStrategy)EventFactory创建事件任务的工厂类。ringBufferSize容器的长度。ThreadFactory 用于创建执行任务的线程。ProductType生产者类型单生产者、多生产者。WaitStrategy等待策略。 使用流程 1构建消息载体事件 2 构建生产者 3构建消费者 4 生产消息消费消息的测试 单生产者单消费者模式 1创建Event(消息载体/事件)和EventFactory事件工厂 创建 OrderEvent 类这个类将会被放入环形队列中作为消息内容。创建OrderEventFactory类用于创建OrderEvent事件 Data public class OrderEvent {private long value;private String name; }public class OrderEventFactory implements EventFactoryOrderEvent {Overridepublic OrderEvent newInstance() {return new OrderEvent();} }2 创建消息事件生产者 创建 OrderEventProducer 类它将作为生产者使用 public class OrderEventProducer {//事件队列private RingBufferOrderEvent ringBuffer;public OrderEventProducer(RingBufferOrderEvent ringBuffer) {this.ringBuffer ringBuffer;}public void onData(long value,String name) {// 获取事件队列 的下一个槽long sequence ringBuffer.next();try {//获取消息事件OrderEvent orderEvent ringBuffer.get(sequence);// 写入消息数据orderEvent.setValue(value);orderEvent.setName(name);} catch (Exception e) {// TODO 异常处理e.printStackTrace();} finally {System.out.println(生产者发送数据value:value,name:name);//发布事件ringBuffer.publish(sequence);}} }3创建消费者 创建 OrderEventHandler 类并实现 EventHandler 作为消费者。 public class OrderEventHandler implements EventHandlerOrderEvent {Overridepublic void onEvent(OrderEvent event, long sequence, boolean endOfBatch) throws Exception {// TODO 消费逻辑System.out.println(消费者获取数据value: event.getValue(),name:event.getName());} }4 测试 public class DisruptorDemo {public static void main(String[] args) throws Exception {//创建disruptorDisruptorOrderEvent disruptor new Disruptor(new OrderEventFactory(),1024 * 1024,Executors.defaultThreadFactory(),ProducerType.SINGLE, //单生产者new YieldingWaitStrategy() //等待策略);//设置消费者用于处理RingBuffer的事件disruptor.handleEventsWith(new OrderEventHandler());disruptor.start();//创建ringbuffer容器RingBufferOrderEvent ringBuffer disruptor.getRingBuffer();//创建生产者OrderEventProducer eventProducer new OrderEventProducer(ringBuffer);//发送消息for(int i0;i100;i){eventProducer.onData(i,Foxi);}disruptor.shutdown();} }单生产者多消费者模式 如果消费者是多个只需要在调用 handleEventsWith 方法时将多个消费者传递进去。 //设置多消费者,消息会被重复消费 disruptor.handleEventsWith(new OrderEventHandler(), new OrderEventHandler());上面传入的两个消费者会重复消费每一条消息如果想实现一条消息在有多个消费者的情况下只会被一个消费者消费那么需要调用 handleEventsWithWorkerPool 方法。 //设置多消费者,消费者要实现WorkHandler接口一条消息只会被一个消费者消费 disruptor.handleEventsWithWorkerPool(new OrderEventHandler(), new OrderEventHandler());注意消费者要实现WorkHandler接口 public class OrderEventHandler implements EventHandlerOrderEvent, WorkHandlerOrderEvent {Overridepublic void onEvent(OrderEvent event, long sequence, boolean endOfBatch) throws Exception {// TODO 消费逻辑System.out.println(消费者 Thread.currentThread().getName()获取数据value: event.getValue(),name:event.getName());}Overridepublic void onEvent(OrderEvent event) throws Exception {// TODO 消费逻辑System.out.println(消费者 Thread.currentThread().getName()获取数据value: event.getValue(),name:event.getName());} }多生产者多消费者模式 在实际开发中多个生产者发送消息多个消费者处理消息才是常态。 public class DisruptorDemo2 {public static void main(String[] args) throws Exception {//创建disruptorDisruptorOrderEvent disruptor new Disruptor(new OrderEventFactory(),1024 * 1024,Executors.defaultThreadFactory(),ProducerType.MULTI, //多生产者new YieldingWaitStrategy() //等待策略);//设置消费者用于处理RingBuffer的事件//disruptor.handleEventsWith(new OrderEventHandler());//设置多消费者,消息会被重复消费//disruptor.handleEventsWith(new OrderEventHandler(),new OrderEventHandler());//设置多消费者,消费者要实现WorkHandler接口一条消息只会被一个消费者消费disruptor.handleEventsWithWorkerPool(new OrderEventHandler(), new OrderEventHandler());//启动disruptordisruptor.start();//创建ringbuffer容器RingBufferOrderEvent ringBuffer disruptor.getRingBuffer();new Thread(()-{//创建生产者OrderEventProducer eventProducer new OrderEventProducer(ringBuffer);// 发送消息for(int i0;i100;i){eventProducer.onData(i,Foxi);}},producer1).start();new Thread(()-{//创建生产者OrderEventProducer eventProducer new OrderEventProducer(ringBuffer);// 发送消息for(int i0;i100;i){eventProducer.onData(i,monkeyi);}},producer2).start();//disruptor.shutdown();} }
文章转载自:
http://www.morning.mgfnt.cn.gov.cn.mgfnt.cn
http://www.morning.yqlrq.cn.gov.cn.yqlrq.cn
http://www.morning.fldrg.cn.gov.cn.fldrg.cn
http://www.morning.jxjrm.cn.gov.cn.jxjrm.cn
http://www.morning.cpwmj.cn.gov.cn.cpwmj.cn
http://www.morning.hxxyp.cn.gov.cn.hxxyp.cn
http://www.morning.playmi.cn.gov.cn.playmi.cn
http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn
http://www.morning.cytr.cn.gov.cn.cytr.cn
http://www.morning.tlbhq.cn.gov.cn.tlbhq.cn
http://www.morning.fnpyk.cn.gov.cn.fnpyk.cn
http://www.morning.krwzy.cn.gov.cn.krwzy.cn
http://www.morning.zfxrx.cn.gov.cn.zfxrx.cn
http://www.morning.prlgn.cn.gov.cn.prlgn.cn
http://www.morning.geledi.com.gov.cn.geledi.com
http://www.morning.qggxt.cn.gov.cn.qggxt.cn
http://www.morning.langlaitech.cn.gov.cn.langlaitech.cn
http://www.morning.syqtt.cn.gov.cn.syqtt.cn
http://www.morning.bgrsr.cn.gov.cn.bgrsr.cn
http://www.morning.bpmnl.cn.gov.cn.bpmnl.cn
http://www.morning.yrycb.cn.gov.cn.yrycb.cn
http://www.morning.krswn.cn.gov.cn.krswn.cn
http://www.morning.pmdzd.cn.gov.cn.pmdzd.cn
http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn
http://www.morning.trrhj.cn.gov.cn.trrhj.cn
http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn
http://www.morning.lizpw.com.gov.cn.lizpw.com
http://www.morning.eshixi.com.gov.cn.eshixi.com
http://www.morning.jhrqn.cn.gov.cn.jhrqn.cn
http://www.morning.cffwm.cn.gov.cn.cffwm.cn
http://www.morning.mwkwg.cn.gov.cn.mwkwg.cn
http://www.morning.chzqy.cn.gov.cn.chzqy.cn
http://www.morning.iterlog.com.gov.cn.iterlog.com
http://www.morning.fldk.cn.gov.cn.fldk.cn
http://www.morning.dtmjn.cn.gov.cn.dtmjn.cn
http://www.morning.lkbdy.cn.gov.cn.lkbdy.cn
http://www.morning.rqqkc.cn.gov.cn.rqqkc.cn
http://www.morning.sfwd.cn.gov.cn.sfwd.cn
http://www.morning.yqjjn.cn.gov.cn.yqjjn.cn
http://www.morning.mbhdl.cn.gov.cn.mbhdl.cn
http://www.morning.lbqt.cn.gov.cn.lbqt.cn
http://www.morning.tnwwl.cn.gov.cn.tnwwl.cn
http://www.morning.yxdrf.cn.gov.cn.yxdrf.cn
http://www.morning.yybcx.cn.gov.cn.yybcx.cn
http://www.morning.c-ae.cn.gov.cn.c-ae.cn
http://www.morning.xzjsb.cn.gov.cn.xzjsb.cn
http://www.morning.mzbyl.cn.gov.cn.mzbyl.cn
http://www.morning.wjndl.cn.gov.cn.wjndl.cn
http://www.morning.yfzld.cn.gov.cn.yfzld.cn
http://www.morning.txlnd.cn.gov.cn.txlnd.cn
http://www.morning.mlckd.cn.gov.cn.mlckd.cn
http://www.morning.gryzk.cn.gov.cn.gryzk.cn
http://www.morning.njftk.cn.gov.cn.njftk.cn
http://www.morning.nkpml.cn.gov.cn.nkpml.cn
http://www.morning.cwqpl.cn.gov.cn.cwqpl.cn
http://www.morning.brwnd.cn.gov.cn.brwnd.cn
http://www.morning.tlfzp.cn.gov.cn.tlfzp.cn
http://www.morning.bwzzt.cn.gov.cn.bwzzt.cn
http://www.morning.ddfp.cn.gov.cn.ddfp.cn
http://www.morning.dxgt.cn.gov.cn.dxgt.cn
http://www.morning.gqmhq.cn.gov.cn.gqmhq.cn
http://www.morning.dnzyx.cn.gov.cn.dnzyx.cn
http://www.morning.qrnbs.cn.gov.cn.qrnbs.cn
http://www.morning.tdqhs.cn.gov.cn.tdqhs.cn
http://www.morning.kttbx.cn.gov.cn.kttbx.cn
http://www.morning.plnry.cn.gov.cn.plnry.cn
http://www.morning.bbmx.cn.gov.cn.bbmx.cn
http://www.morning.lxjxl.cn.gov.cn.lxjxl.cn
http://www.morning.srxhd.cn.gov.cn.srxhd.cn
http://www.morning.gjzwj.cn.gov.cn.gjzwj.cn
http://www.morning.fbrshjf.com.gov.cn.fbrshjf.com
http://www.morning.drkk.cn.gov.cn.drkk.cn
http://www.morning.qjngk.cn.gov.cn.qjngk.cn
http://www.morning.sknbb.cn.gov.cn.sknbb.cn
http://www.morning.bttph.cn.gov.cn.bttph.cn
http://www.morning.xbhpm.cn.gov.cn.xbhpm.cn
http://www.morning.bnlch.cn.gov.cn.bnlch.cn
http://www.morning.qfgxk.cn.gov.cn.qfgxk.cn
http://www.morning.mfbcs.cn.gov.cn.mfbcs.cn
http://www.morning.mnygn.cn.gov.cn.mnygn.cn
http://www.tj-hxxt.cn/news/245709.html

相关文章:

  • 东莞网站建设 家具有哪些网站做的符合企业风格
  • 地税城市维护建设税网站是什么中国工商注册网官网网址
  • 网站建设策划方案如何写用ps制作网页步骤
  • 临沂自助建站软件江苏又一地检测出阳性
  • 那个网站百度收录快装修设计软件排名
  • 网站代码查看泰安市景区建设网站
  • php网站开发全程实例南昌电子商务网站建设
  • 集宁网站建设SEO优化广州网站推广服务商
  • 浙江联科网站建设室内设计专业招聘信息
  • 广东省住房城乡建设厅官方网站厦门免费建立企业网站
  • 做不好的网站违法吗百度掘金入口官网
  • 计算机系部网站开发背景网页模版设计
  • 东营市做网站的公司建设银行网上银行网站可以开通网银
  • 重庆科技建设信息网站做企业网站和邮箱
  • 铁岭市网站建设婚庆公司多少钱
  • 自己做网站代理产品鞍山软件制作平台
  • 会计信息网站建设的意思能自己做网站吗
  • 合肥网站建设司图廊坊专业网站网站
  • 应用网站开发温州小程序制作
  • 什么是网站降权处理百度资讯指数
  • 怡康医药网站建设方案html网站开发实验报告
  • 西安网站设计制广州十大网站开发公司
  • 佛山外贸网站建设报价h5培训
  • 深圳罗湖网站建设公司宁波seo公司网站推广
  • 网站建设 中标wordpress 去优酷广告
  • dw建立网站之后怎么做如何使用云服务建设网站
  • 徐州专业网站seowordpress所有文章新窗口打开
  • 旅游网站设计说明百度站长平台app
  • 北京网站制做的公司只有域名如何做网站
  • 专业网站建设套餐济南网站建设行知科技