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

服装设计网页制作素材wordpress 网站排名优化

服装设计网页制作素材,wordpress 网站排名优化,作文网大全,系统优化因素​专栏内容#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页#xff1a;我的主页 座右铭#xff1a;天行健#xff0c;君子以自强不息#xff1b;地势坤#xff0c;君子以厚德载物. 概述 在postgresql 中#xff0c;有大量的并发同步#xff0… ​专栏内容 postgresql内核源码分析 手写数据库toadb 并发编程 个人主页我的主页 座右铭天行健君子以自强不息地势坤君子以厚德载物. 概述 在postgresql 中有大量的并发同步所以避免不了使用很多保护锁。 同时为了提升并发的性能针对不同场景下的加锁需求设计了: spinlock 自旋锁lightweight lock(LWLocks) 轻量级锁regular lock(a/k/a heavyweight locks) 普通锁SIReadLock predicate locks 谓词锁 本文主要针对这四种锁进行分享起抛砖引玉的作用。 spinlock 是一种持有时间非常短的锁。它是通过test and set 原子操作来实现。 通过一定时间内的检测如果没有持有就获得这个时间大概是1min超时就会导致ERR错误。 所以此类锁都是一些状态保护很快就释放中间没有IO大的内存操作。 它的实现依赖于操作系统的原子操作实现所以通过宏定义共公接口底层根据不同操作系统实现不同。 也可以说是一种无锁化的实现需要原子操作TAS和内存同步。 操作函数 #define SpinLockInit(lock) S_INIT_LOCK(lock)#define SpinLockAcquire(lock) S_LOCK(lock)#define SpinLockRelease(lock) S_UNLOCK(lock)#define SpinLockFree(lock) S_LOCK_FREE(lock)底层操作函数有这四个是通过宏定义给出对于不同操作系统下定义了具体的原子操作。 在支持TAS 原语的操作系统上用TAS来实现如加锁的函数如下 int s_lock(volatile slock_t *lock, const char *file, int line, const char *func) {SpinDelayStatus delayStatus;init_spin_delay(delayStatus, file, line, func);while (TAS_SPIN(lock)){perform_spin_delay(delayStatus);}finish_spin_delay(delayStatus);return delayStatus.delays; }#define TAS_SPIN(lock) (*(lock) ? 1 : TAS(lock))static __inline__ int tas(volatile slock_t *lock) {slock_t _res 1;__asm__ __volatile__( lock \n xchgb %0,%1 \n : q(_res), m(*lock) : /* no inputs */ : memory, cc);return (int) _res; } 可以看到核心代码是通过汇编实现TAS操作大致流程是这样 检测lock是否为0 ,如果不为0说明还没有解锁继续等直到超时如果已经解锁就走入汇编代码锁定总线通过xchgb 原子交换lock和_res1 两个值进行内存同步加锁成功此时TAS_PIN返回0等待结束 而slock_t 是什么类型呢? 如果在支持TAS指令的操作系统下是如下定义 typedef unsigned char slock_t;是一个字节这样可以很快的检测和原子交换赋值 注意事项 通过上面的原理介绍可以看到它等待的时间非常短这就是说在锁持有时不能占用太久时间。 因此在持有spinlock时只是一些状态的获取和赋值就要立即释放否则就会有大量超时。 在锁持有此间避免磁盘网络函数调用等其它额外操作。 轻量级锁 lightweight lock 介绍 轻量级锁将加锁过程分成了两个阶段第一阶段通过原子操作来检测如果可以加锁就加锁成功如果不能加锁进入第二阶段将自己加入等待队列并阻塞在信号量上 主要用于共享内存和数据块的操作保护 它因为分了两个阶段所以较一般的系统级锁性能更高效一些。 它提供了如下特点 能够快速检测锁状态并且获取到锁每个后台进程只能有一个排队中的轻量级锁在持有锁期间信号会被阻塞在错误时会释放锁 数据结构 typedef struct LWLock {uint16 tranche; /* tranche ID */pg_atomic_uint32 state; /* state of exclusive/nonexclusive lockers */proclist_head waiters; /* list of waiting PGPROCs */ #ifdef LOCK_DEBUGpg_atomic_uint32 nwaiters; /* number of waiters */struct PGPROC *owner; /* last exclusive owner of the lock */ #endif } LWLock;extern bool LWLockAcquire(LWLock *lock, LWLockMode mode); extern bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode); extern bool LWLockAcquireOrWait(LWLock *lock, LWLockMode mode); extern void LWLockRelease(LWLock *lock);初始化 加锁 判断是否已经持有锁数量超过上限阻塞信号中断第一阶段 尝试加锁加上时直接返回锁否则将自己放入等待队列再次尝试加锁第二阶段 如果仍没有获取到锁时在当前backend对应的 MyProc中的信号量上进行等待 直到被唤醒如果proc-lwWaiting LW_WS_NOT_WAITING时继续等待 当获取到锁时将锁加入自己持有锁的数组中记录 解锁 从本等数据中获取当前锁的加锁模式 从锁中解除 如果有等待者将它们从等待队列中移除然后唤醒它们等待者们将再次竞争 等待锁释放 bool LWLockAcquireOrWait(LWLock *lock, LWLockMode mode);介绍 这个接口有点意思即可以获取锁也用来等待别人释放锁; 当前锁如果没有被占用则占有锁后函数返回 如果当前锁被占用则等待锁等别人释放锁后就直接返回而不持有锁。 用途 这个函数主要用来在写WAL时获取锁因为同时只能有一个进程写WAL 如果当前没有人写WAL则持有锁后执行WAL写入。 如果当前已经有人持有锁在写WAL那么自己的WAL也会被写入因为WAL是顺序写入后写时需要把前面的内容都要写入。 条件变量 static bool LWLockConflictsWithVar(LWLock *lock,uint64 *valptr, uint64 oldval, uint64 *newval,bool *result) bool LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval); void LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 val);基于轻量级锁又实现了一组类似于条件变量的接口 LWLockWaitForVar检测变量是否变化如果没人持有锁那就直接返回如果有锁则等待直到锁释放后返回新值 LWLockUpdateVar是改变变量的值并通知等待者唤醒等待者 锁排队 lightweiht lock可能会长时间等待因此每个backend只能有一个正在等待的轻量级锁所以每个backend都会有一个信号量 struct PGPROC {// other members ... PGSemaphore sem; /* ONE semaphore to sleep on */// other members ... };信号量定义在PROC结构上当进入信号量等待时同时也会把自己的MyProc添加到 lock-waiters 列表成员中。 在锁持有者释放锁时会删除队列中的所有成员同时唤醒等待者的信号量 在介绍了排队和释放后就会发现它存在两个问题 等锁的饿死问题惊群问题 当然lwlock 队列的唤醒也是顺序唤醒同时加锁分为两阶段这就在一定程度上避免了上述问题。 另外lwlock加锁是非常频可能在很短时间有加锁/释放所以需要更简洁直接的加锁方式。 结尾 非常感谢大家的支持在浏览的同时别忘了留下您宝贵的评论如果觉得值得鼓励请点赞收藏我会更加努力 作者邮箱studysenllang.onaliyun.com 如有错误或者疏漏欢迎指出互相学习。 注未经同意不得转载
http://www.yutouwan.com/news/283074/

相关文章:

  • 郑州网站推广公司排名苏州电商系统开发
  • 邢台wap网站建设报价重庆建设岗位培训网站
  • 基金会网站建设登录wordpress数据库
  • 做竞品分析去哪个网站互联网有多少网站
  • 怎做连接网站重庆知名设计公司有哪些
  • 大网站开发语言石家庄网站建设公司哪家好
  • 做宠物网站心得网站开发入股合作分配比例
  • php网站开发文本格式设置在网站设计公司上班好吗
  • 网站开发保密合同wordpress 中文文件名
  • 西安网站建设报价方案中国计算机网络公司排名
  • 网站关键字选择标准网站建设风险怎样规避
  • 微商网站模板上海公司排名前十
  • 长沙网建站中国建设银行网站对公账户首页
  • 东莞中赢网站建设公司怎么样建设门户网站需要多少钱
  • 5000多一年的网站建站怎么做物流网站代理
  • dw做网站实例旅游网站的建设开题报告
  • 阜平网站建设电商网站建设意义
  • 茌平做网站推广做网站要买服务器吗
  • 了解网站建设的流程30岁学编程太晚了
  • 如何建设网站哪个济南兴田德润简介免费域名证书申请
  • 做网站前端用什么语言全景网站模版
  • 个人业务网站教程wordpress小图标大全
  • 网站关键词突然没有排名了ppt设计主题
  • 泰安专业网站开发公司h5自适应网站建设是什么意思
  • 网站如何强制修改主页 源码广州智能科技有限公司
  • 学校网站建设意义网站建设如何定价
  • iis网站服务器安全隐患分析网站开发注册个体工商
  • 江西专业网站建设定制细分网站
  • 网站改标题不改版 kwordpress图片主题 瀑布流经典
  • 网站策划素材做网站如何获得阿里巴巴投资