您现在的位置:首页 --> 查看专题: 锁
最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会造成严重的影响,没有处理经验的用户往往无从下手。下面将从整个数据库设计,开发,运维阶段介绍如何避免锁问题的发生,提供一些最佳实践供RDS的用户参考。
在实际的软件程序中,由于代码量较大,函数之间的调用关系较为复杂,因此对于某些全局变量的操作要格外小心。在程序中,一般采用互斥量加锁的方式来保证对全局变量的操作的唯一性。
本文详细介绍了Linux下互斥量加锁与解锁操作的C代码实现,为相关的软件开发工作的开展提供了有益的参考。
数据的安全越来越重要,不是说你的生产库安全,你的数据就一定安全了,rman备份也是泄露数据的一个重要地方,如果别人拿到了你的备份集,一样等同入侵了你的生产库。为了rman备份的安全,最简单方式就是使用set encryption方式在rman备份过程中设置密码,需要版本为10.2及其以后企业版版,另外如果需要备份到带库只能使用oracle自己的osb(Oracle Secure Backup),注意rman只有backupset可以加密,copy无法进行加密。
C/C++语言的并发程序(Concurrent Programming)设计,一直是一个比较困难的话题。很多朋友都会尝试使用多线程编程,但是却很难保证自己所写的多线程程序的正确性。多线程程序,如果涉及到对共享资源的并发读写,就会产生资源争用(Data Race)。解决资源争用,最直接的想法是引入锁,对并发读写的数据进行保护(更高级的则包括无锁编程—— Lock Free Programming)。但是,锁又有很多种类,例如:自旋锁(Spinlock)、互斥锁(Mutex)、读写锁(Read-Write-Lock)等等。这么多的锁,每种锁有什么特点?对应哪些不同的使用场景?使用过程中需要注意哪些事项?各自分别有哪些不足之处?都是困扰程序员的一个个问题。
近期在项目中用到了无锁队列 (lock free queue)这个东西,在项目中后台需要收集数据,待收集完整后需要落地,如果收集和落地都由一个进程来做,效果不好。无锁队列是蛮实用的一种数据结构。譬如,当一些后台的任务,写数据库,文件等,会出现较长时间的阻塞,可以交由后台进程去处理。这时候就涉及 IPC 方面的知识。当然,完全可以使用 fifo,mq 之类的系统预置的调用,但频繁的系统调用是吃不消的。
HashMap主要有插入、删除、查找以及ReHash四种基本操作。一个典型的HashMap实现,会用到一个数组,数组的每项元素为一个节点的链表。对于此链表,我们可以利用文中提到的操作方法,执行插入、删除以及查找操作,但对于ReHash操作则比较困难。
有同学在问 MySQL中 QueryCache(QC)的锁是 “全局锁”还是 “表锁”。这里简要说明一下。 1、 QC基本概念 这个是实现在MySQL层(非引擎层)的一个内存结构,基本规则是将满足一定条件的查询结果缓存在内存中,若同样的查询再执行第二次,而且缓存没有失效,则可以直接返回查询结果,无需到引擎获取数据。
这是一个同事问我的问题。我并非专家,只是有基本的原理理解。首先排除上层的各种花里胡哨的锁的机制,基本的锁应该有如下的几种实现方式。 1.OS提供的内核对象方式提供的异步锁实现这种方式下,锁的实现是内核对象,对外提供API,之所以说是异步是因为试图加锁的进程如果无法获取这个锁,内核的操作方式是将进程加入这个锁的等待队列之中。当该锁被释放之后,OS对于等待队列中的进程进行唤醒。 2.对于单CPU的IntMask方式的同步的锁实现之所以说是同步是因为这种方式关中断,停止CPU的任务调度,这样我们可以保证互斥操作。 3.对于多CPU的处理器,多个CPU之间的Spin Lock 每个CPU只能关自己的中断,因此这个时候关中断无法保证全局互斥,需要找到一个全局的统一互斥点。我们依赖的是总线,各个CPU通过锁总线来进行竞争(据说Intel多核CPU提供了避免锁总线的机器指令)。
在并行程序中,锁的使用会主要会引发两类难题:一类是诸如死锁、活锁等引起的多线程Bug;另一类是由锁竞争引起的性能瓶颈。本文将介绍并行编程中因为锁引发的这两类难题及其解决方案。
spinlock又称自旋锁,线程通过busy-wait-loop的方式来获取锁,任何时刻时刻只有一个线程能够获得锁,其他线程忙等待直到获得锁。spinlock在多处理器多线程环境的场景中有很广泛的使用,一般要求使用spinlock的临界区尽量简短,这样获取的锁可以尽快释放,以满足其他忙等的线程。Spinlock和mutex不同,spinlock不会导致线程的状态切换(用户态->内核态),但是spinlock使用不当(如临界区执...
目前在 Linux 中线程和进程和最大分别,可能就是有共享变量就个东西了。其它的地方使用起来感觉不大,只是线程更加高效,占用更加少,但是也更加容易出问题。下面就看看 Perl 中的锁和相关的问题。
1. MySQL中并发和隔离控制机制 Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition Language)提供隔离操作。一种特别的meta-data元数据类型,叫Name Lock。(SQL层) 表级table-level数据锁(SQL层) 存储引擎特有机制 ― row locks行锁,page locks页锁,table locks表级,版本控制(在引擎中实现) 全局读锁 ― FLUSH TABLES WITH READ LOCK(SQL层) (...)阅读全文MySQL锁管理(并发...
php中很多函数在win32的情况下使用经常出现兼容性的问题,其中flock就是其中一个。函数: flock(file,lock,block) 参数描述 file 必需。规定要锁定或释放的已打开的文件。 lock 必需。规定要使用...
[ 共15篇文章 ][ 第1页/共1页 ][ 1 ]
近3天十大热文
- [55] 如何拿下简短的域名
- [54] IOS安全–浅谈关于IOS加固的几种方法
- [53] Oracle MTS模式下 进程地址与会话信
- [53] Go Reflect 性能
- [51] android 开发入门
- [49] 图书馆的世界纪录
- [49] 读书笔记-壹百度:百度十年千倍的29条法则
- [46] 【社会化设计】自我(self)部分――欢迎区
- [38] 程序员技术练级攻略
- [31] 视觉调整-设计师 vs. 逻辑
赞助商广告