首页天道酬勤同步队列,队列的存储结构

同步队列,队列的存储结构

张世龙 05-04 17:57 30次浏览

称为NUMA和SMPS MP (系统多处理器),即多处理器结构,服务器中的多个CPU对称工作,每个CPU访问存储器地址所需的时间相同。 主要特征是共享,包括共享CPU、存储器、I/O等。 SMP的优点是可以确保内存一致性。 缺点是这些共享资源很可能成为性能瓶颈。 随着CPU数量的增加,每个CPU都会访问同一内存资源,这可能会导致内存访问冲突,从而导致CPU资源的浪费。 常用的电脑就属于这一类。 非统一存储器访问(numa )不一致的存储访问将CPU划分为CPU模块,每个CPU模块由多个CPU组成,并具有独立的本地存储器、I/O插槽等模块之间可以通过互连模块相互访问,本地内存访问速度远远快于远程内存(系统中其他节点的内存)。NUMA的优点是可以很好地解决原始SMP系统的扩展问题缺点是,由于对远程存储器的访问延迟远远超过本地存储器,所以随着CPU的数量的增加,系统的性能不会线性地增加。

CLH算法实现CLH队列中的节点QNode包含锁定字段。 如果此字段为true,则表示线程需要获得锁定,且不会解除锁定;如果为false,则表示线程已解除锁定。 节点之间用看不见的链表连接。 之所以称为不可见的链表,是因为这些节点之间没有明显的next指针,myPred指向的节点变化会影响myNode的行为。 CLHLock还有一个末端指针,它始终指向队列中的最后一个节点。 CLHLock的类图如下所示。 如果线程需要获取锁定,则会创建新的QNode。 如果其中的locked设置为true,则表示需要获取锁定。 然后,线程对tail域调用getAndSet方法使其位于队列末尾,获取对上一个节点的引用myPred,该线程将成为上一个节点的locked字段。如果线程需要解锁,则该线程将锁定当前节点如下图所示,线程a需要获取锁定。 myNode域为true,tail指向线程a的节点,线程b也添加在线程a之后,tail指向线程b的节点。 接着,线程a和b在其myPred域上旋转,并且当其myPred节点的locked字段变为false时,可以获得锁定扫描行。 很明显,线程a的myPred locked域为false,此时线程a获得了锁定。 整个CLH的代码如下所示。 其中,使用ThreadLocal类,将QNode绑定到每个线程,同时使用AtomicReference。 对尾指针的更改是通过调用它的getAndSet ) )操作实现的,以确保对象引用以原子方式更新。 publicclassclhlockimplementsllock { atomicreferenceqnodetail; ThreadLocalQNode myPred; ThreadLocalQNode myNode; publicclhlock ((tail=newatomicreferenceqnode ) ) false ); //创建的默认团队状态节点。 默认为解锁状态(locked为false ) myNode=new ThreadLocalQNode () {protected QNode initialValue ) {return new QNode ) ); }; myPred=new ThreadLocalQNode () {protected QNode initialValue ) {return null; }; }@Overridepublic void lock () {QNode qnode=myNode.get ); //当前线程是节点qnode qnode.locked=boolean.true.boolean value (; //当前线程需要获取锁定qnodepred=tail.getandset(qnode ); //获取预运行节点QNode pred,并将当前线程的节点设置为队列末端mypred.set(pred )。 //当前线程的前向节点qnodepredwhile(pred.locked ) /前向节点pred解锁) pred.locked为false ) }@Overridepublic void unlock ) //mynode.set(mypred.get ),用于设置当前线程的解锁状态; myNode.remove (; 将myNode解除绑定到当前线程,然后创建另一个QNode (即使当前线程需要再次获取锁定)。 myPred.remove (; }私有身份证明{ final intid; 电压布尔锁定; finalstringname=thread.current thread ().getName ) ) '-QNode '; 私有财务统计信息中心=newatomicintegeridcount (0; QNode () this.id=id count.getandincrement ); }布尔锁定(qnode ) {this ); this.locked=locked; }@Overridepublic String toString () return'qnode ) id:'id )、locked:' locked )、name:' name '}; }}从代码中可以看出,lock方法具有while循环。 这是一个等待的过程,其中在等待之前指向节点的锁定域为false,并等待自旋。 unlock方法很简单,只需将自己的锁定域设置为false即可。

CLH的优点和缺点CLH队列锁定的优点是空间复杂度低。 (如果有n个线程,l个锁,并且每个线程只获取一个锁,则所需的存储空间为o(ln ),n个线程具有n个myNode,l个锁具有l个tail ) )。 CLH的一个变体被应用于JAVA并发框架。 唯一的缺点是在NUMA系统结构中性能较差。 在该系统结构中,每个线程都有自己的存储器,并且当前进节点的存储器位置较远时,自旋判断前进节点的锁定域将导致性能极大地降低,但在SMP系统结构中该方法非常有效。 解决NUMA系统结构的一种思路是MCS队列锁。

从http://blog.csdn.net/Aesop _ wubo/article/details/7533186转发

clh队列是什么意思,cloud