week7. 学习总结

用户头像
个人练习生niki
关注
发布于: 2020 年 07 月 19 日

top查询系统负载

当前正在系统中正在执行的进程+等待执行的进程。

理想情况CPU核数=正在执行的进程+等待执行的进程。

锁原语CAS(V,E,N),是一种操作系统原语,执行是连续的,不可被打断

V 要更新的变量

E 预期值

N 新值

如果V值等于E值,则将V值设为N,否则什么都不做

Java通过CAS原语在对象头中修改Mark Work 实现锁

偏向锁 不能竞争,竞争就升级。一段代码一直被一个线程访问,该线程自动获取锁

轻量级锁是非公平锁,有可能导致饥饿。当锁是偏向锁时,被另一个线程访问,就会升级为轻量级锁,其他线程通过自旋形式尝试获取锁,不会阻塞,提高性能。

重量级锁 是公平锁,轻量级锁自旋一定次数后悔进入阻塞,重量级锁会创建监视器队列,让线程进入等待,性能降低,一旦锁被释放,则队列头部将获得锁。

可重入锁 某个线程已经获得锁,可以再次获取锁而不会出现死锁



多CPU情况下CAS用总线锁或缓存一致性算法解决冲突

总线锁:处理器在内存总线上输出LOCK#信号时,其他处理器的请求将被阻塞,该处理器独占内存

缓存锁:从处理器写回内存时,修改内部内存地址,使用缓存一致性机制保障操作的原子性,是当某块CPU对缓存中的数据进行操作了之后,就通知其他CPU放弃储存在它们内部的缓存,或者从主内存中重新读取。



MESI协议[摘自 https://blog.csdn.net/qq_35642036/article/details/82801708]


MESI协议:是以缓存行(缓存的基本数据单位,在Intel的CPU上一般是64字节)的几个状态来命名的(全名是Modified、Exclusive、 Share or Invalid)。该协议要求在每个缓存行上维护两个状态位,使得每个数据单位可能处于M、E、S和I这四种状态之一,各种状态含义如下:

       M:被修改的。处于这一状态的数据,只在本CPU中有缓存数据,而其他CPU中没有。同时其状态相对于内存中的值来说,是已经被修改的,且没有更新到内存中。

        E:独占的。处于这一状态的数据,只有在本CPU中有缓存,且其数据没有修改,即与内存中一致。

        S:共享的。处于这一状态的数据在多个CPU中都有缓存,且与内存一致。

        I:无效的。本CPU中的这份缓存已经无效。



     一个处于M状态的缓存行,必须时刻监听所有试图读取该缓存行对应的主存地址的操作,如果监听到,则必须在此操作执行前把其缓存行中的数据写回CPU。

        一个处于S状态的缓存行,必须时刻监听使该缓存行无效或者独享该缓存行的请求,如果监听到,则必须把其缓存行状态设置为I。

        一个处于E状态的缓存行,必须时刻监听其他试图读取该缓存行对应的主存地址的操作,如果监听到,则必须把其缓存行状态设置为S。



       当CPU需要读取数据时,如果其缓存行的状态是I的,则需要从内存中读取,并把自己状态变成S,如果不是I,则可以直接读取缓存中的值,但在此之前,必须要等待其他CPU的监听结果,如其他CPU也有该数据的缓存且状态是M,则需要等待其把缓存更新到内存之后,再读取。



       当CPU需要写数据时,只有在其缓存行是M或者E的时候才能执行,否则需要发出特殊的RFO指令(Read Or Ownership,这是一种总线事务),通知其他CPU置缓存无效(I),这种情况下性能开销是相对较大的。在写入完成后,修改其缓存状态为M。

发布于: 2020 年 07 月 19 日 阅读数: 36
用户头像

做一个真诚、坦诚的行人,追求自由。 2018.07.30 加入

还未添加个人简介

评论

发布
暂无评论
week7.学习总结