`
Aoogoo
  • 浏览: 20787 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Postgresql源码中spinlock的基础:TAS

阅读更多
PostgreSQL中使用spinlock来对资源进行加锁。TAS lock是最简单的spinlock。当然spinlock可以用信号量来实现。但是据PostgreSQL的早期报告显示,内核提供的信号量将大大降低性能。所以学习TAS lock对我们提高软件性能是大有帮助的。
TAS就是Test And Set。它要做的就是跟一个变量进行Test。如果条件满足对其Set另外一个值,如果条件不满足,就继续等待。但是所有这些都是原子操作。
void spin_lock(lock)
{
  while(test_and_set(lock,true))
   ;
}

void spin_unlock(lock)
{
  atomic_set(lock,false);
}

Windows提供了一个API:InterlockedCompareExchange。PostgreSQL的Windows版本就是利用它来实现TAS的。
下面的Demo就是看看这个API是怎么用的。
#include <windows.h>
#include <iostream>

using namespace std;

void main()
{
	LONG source = 1;

	cout<<"before: "<<source<<endl;

	for(;;)
	{
		if(1==InterlockedCompareExchange(&source,2,1))
		{
			break;
		}
	}

	cout<<"after: "<<source<<endl;
}

PostgreSQL是如何定义TAS的呢?
typedef LONG slock_t;
#define TAS(lock) (InterlockedCompareExchange(lock, 1, 0))
分享到:
评论
7 楼 mathgl 2010-04-23  
spinlock 会导致一种 liveness hazard的现象。。都在频繁等待其他线程......
6 楼 七猫 2010-04-21  
对我们大部分人来说,无需要考虑像CRITICALSECTION的性能问题。
5 楼 七猫 2010-04-21  
这个东东看过好多种实现,如果预计锁的时间比较长,感觉还是不用这处方法。
好像有的地方会在interlock之间加些像pause之类的汇编指令。
4 楼 ray_linn 2010-04-21  
This function generates a full memory barrier (or fence) to ensure that memory operations are completed in order.
3 楼 wandou 2010-04-21  
spinlock不会增加cpu时间吗?不会有比spinlock性能更低的写法了吧?
2 楼 Aoogoo 2010-02-10  
1.是否能用信号量实现spinlock,我还不确定。但是用内核对象会增加CPU时间,其中一个重要的原因是Cache失配率会陡增。
2.InterlockedCompareExchange()带有全局的内存栅障,所以不用volatile。PostgresSQL也麽可有用volatile。
1 楼 mikeandmore 2010-02-10  
1 spinlock和信号量本身就是两个东西。spinlock就是纯userspace的lock。信号量是内核的,不能用信号量实现spinlock
2 InterlockedCompareExchange有barrier么?你那个source是不是还要volatile?

相关推荐

    PostgreSQL修炼之道:从小工到专家

     《PostgreSQL修炼之道:从小工到专家》的主要内容和特色: 全面且实践性强:本书从SQL基础、安装配置、数据类型、数据库的逻辑结构等基础知识一直讲到PostgreSQL的架构、技术内幕、特色功能、Standby、数据库优化...

    postgresql-42.3.1-API文档-中文版.zip

    Maven坐标:org.postgresql:postgresql:42.3.1; 标签:postgresql、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    windows下编译postgresql源码编译环境搭建

    windows下编译postgresql源码编译环境搭建

    Postgresql源码解读.docx

    4500页的源码解读 光是SELECT语句相关实现,就阐述了300多页 看完了你就是postgreSQL达人了 章节明细,需要精读那个功能点就仔细看

    PostgreSQL源码

    PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。 POSTGRES 领先的许多概念只是在非常迟的时候才出现在商业数据库中。  PostgreSQL 是最初的...

    PostgreSQL WAL日志解析工具: wal2json

    工具软件,基于 https://blog.csdn.net/Kafka_yx/article/details/103132469 生成的dll

    postgreSQL源码

    PostgreSQL from github

    postgresql-http-server:PostgreSQL HTTP API服务器

    PostgreSQL HTTP API服务器注意:该项目处于无限期搁置状态,并已由取代尝试在上实施类似建议的内容正在安装注意:需要node.js # npm install postgresql-http-server用法# postgresql-... --port ...

    postgresql_maestro(ver:15.4.0.2),postgresql数据库管理工具

    postgresql数据库管理工具,PostgreSQL Maestro是首屈一指的PostgreSQL管理工具,数据库管理,控制和开发。该应用程序还为您提供了一套强大的工具,编辑和执行SQL脚本,构建数字数据的可视化图表,撰写OLAP多维数据...

    Linux环境PostgreSQL源码编译安装1

    Linux环境PostgreSQL源码编译安装Linux环境PostgreSQL源码编译安装Linux环境PostgreSQL源码编译安装PostgreSQL版

    通过源码安装PostgreSQL

    通过源码安装PostgreSQL

    postgresql-42.2.2-API文档-中文版.zip

    Maven坐标:org.postgresql:postgresql:42.2.2; 标签:postgresql、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    PostgreSQL教程(十):性能提升技巧

     PostgreSQL中生成的查询规划是由1到n个规划节点构成的规划树,其中最底层的节点为表扫描节点,用于从数据表中返回检索出的数据行。然而,不同的扫描节点类型代表着不同的表访问模式,如:顺序扫描、索引扫描,以及...

    PostgreSQL 14.1 中文手册

    PostgreSQL 14.1 手册 PostgreSQL 全球开发组 翻译:彭煜玮1,PostgreSQL中文社区2文档翻译组

    postgresql源码包编译安装.docx

    postgresql源码包编译安装

    postgresql-42.2.2-API文档-中英对照版.zip

    Maven坐标:org.postgresql:postgresql:42.2.2; 标签:postgresql、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    Linux-postgresql源码所有版本地址

    Linux 安装postgresql 源码ftp 地址,所有不同版本,官方下载地址

    PostgreSQL:Up.and.Running

    开源数据库PostgreSQL,动物园出的教材,值得推荐,值得品味,

    PG源码解析系列之查询引擎源码技术探析

    PG源码解析系列之查询引擎源码技术探析,postgresql基础,postgresql源码,postgresql查询优化,postgresql查询引擎,postgresql源码解析

Global site tag (gtag.js) - Google Analytics