`
anzhsoft
  • 浏览: 23497 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论
文章列表
前几篇文章,我们讨论了如何使用mutex保护数据及使用使用condition variable在多线程中进行同步。然而,使用mutex将会导致一下问题: 等待互斥锁会消耗宝贵的时间 — 有时候是很多时间。这种延迟会损害系统的scalability。尤其是在现在可用的core越多越多的情况下。 低优先级的线程可以获得互斥锁,因此阻碍需要同一互斥锁的高优先级线程。这个问题称为优先级倒置(priority inversion )。 可能因为分配的时间片结束,持有互斥锁的线程被取消调度。这对于等待同一互斥锁的其他线程有不利影响,因为等待时间现在会更长。这个问题称为锁护送(lock convoying ...
请阅读上篇文章《并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题》。当然不阅读亦不影响本篇文章的阅读。 Boost的互斥量,条件变量做了很好的封装,因此比“原生的”POSIX mutex,condition variables好用。然后我们会通过分析boost相关源码看一下boost linux是如何对pthread_mutex_t和pthread_cond_t进行的封装。 首先看一下condition_variable_any的具体实现,代码路径:/boost/thread/pthread/condition_variable.hpp class conditi ...
boost的mutex,condition_variable非常好用。但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装。因此通过对原生态的POSIX 的mutex,cond的生成者,消费者的实现,我们可以再次体会boost带给我们的便利。 1. 什么是互斥量 互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所以在该互斥锁上的阻塞线程都会变成可进行状态 ...
作为工作几年的老程序猿,肯定会遇到coredump,log severity设置的比较高,导致可用的log无法分析问题所在。 更悲剧的是,这个问题不好复现!所以现在你手头唯一的线索就是这个程序的尸体:coredump。你不得不通过它,来寻找问题根源。 通过上几篇文章,我们知道了函数参数是如何传递的,和函数调用时栈是如何变化的;当然了还有AT&T的汇编基础,这些,已经可以使我们具备了一定的调试基础。其实,很多调试还是需要经验+感觉的。当然说这句话可能会被打。但是你不得不承认,随着调试的增多,你的很多推断在解决问题时显得很重要,因此,我们需要不断积累经验,来面对各种case。 导致 ...
前一段时间再次拜读《Inside the C++ Object Model》 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transformation Semantics (程序转换语义学) The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为) The Semantics of Constructors: The Default Constructor (默认构造函数什么时候会被创建出来) The Semantics of Data: Data语义学 深入探索C++对象模型 这些文章都 ...
本文是《Inside the C++ Object Model》第三章的读书笔记。主要讨论C++ data member的内存布局。这里的data member 包含了class有虚函数时的vptr和vtable的布局情况。 1. 开头几个小问题 1. 首先回答一个问题: 一个空类,sizeof是多少?答案 ...
上一篇文章《Linux Debugging:使用反汇编理解C++程序函数调用栈》没想到能得到那么多人的喜爱,因为那篇文章是以32位的C++普通函数(非类成员函数)为例子写的,因此只是一个特殊的例子。本文将函数调用时的参数传递方法进行一下总结。总结将为C++普通函数、类成员函数;32位和64位进行总结。 建议还是读一下Linux Debugging:使用反汇编理解C++程序函数调用栈,这样本文的结论将非常容易理解,将非常好的为CoreDump分析开一个好头。而且,它也是32位C++ 普通函数的调用的比较好的例子,毕竟从汇编的角度,将参数如何传递的进行了比较好的说明。 1. 32位程序普通函 ...
没想到《Linux Debugging:使用反汇编理解C++程序函数调用栈》发表了收到了大家的欢迎。但是有网友留言说不熟悉汇编,因此本书列了汇编的基础语法。这些对于我们平时的调试应该是够用了。 1 AT&T与Intel汇编语法对比 本科时候大家学的基本上都是Intel的8086汇编语言,微软采用的就是这种格式的汇编。GCC采用的是AT&T的汇编格式, 也叫GAS格式(Gnu ASembler GNU汇编器)。 1、寄存器命名不同 AT&T Intel 说明 %eax eax Intel的不带百分号 2、操作数顺序不同 AT& ...
拿到CoreDump后,如果看到的地址都是????,那么基本上可以确定,程序的栈被破坏掉了。GDB也是使用函数的调用栈去还原“事故现场”的。因此理解函数调用栈,是使用GDB进行现场调试或者事后调试的基础,如果不理解调用 ...
1. Awards 1.1 Jun. 12, 2012, Accurev Migration 1.2 Oct. 16, 2012, Deliver Inyo RTM to Rockies 1.3 Jul. 17, 2013, Kittyhawk Health and Alerts Issue triage and Bug fix 1.4 Aug. 2013, Rockies RTM 1.5 Dec. 16, 2013, Kittyhawk approaching B-line 1.6 Feb. 9, 2014. Fast Transition of File ...
1. 背景 企业存储是企业信息系统管理很重要的组成部分。企业存储包含了大量的数据,供大量人使用。对于航空系统和金融系统来说,信息存储就更加重要了。 作为企业信息存储,扩展性是非常重要的,因为现在企业对于空间的使用越来越多。 那么一个企业可能会采用其他存储厂商的产品,原来信息如何保留? 使用数据迁移功能(migration),可以将数据转移到其他系统上。但是企业数据数以P级,还是占企业IT支出很大的一部分的。因此除非是热点数据,否则大部分的数据肯定还是保留在原有系统上。那么,如何保证这些原有系统可以正常使用呢?或者说,存储产品如何管理其他存储厂商的产品? 答案就是存储产品支持异构虚 ...
笔者在研究生阶段做了2年的QT开发,那时候QT在嵌入式的图形开发中非常火,当时Nokia在智能机的份额还是第一。想当年,Nokia从Trolltech的手中收购了QT,当时大家还在例会上讨论QT终于不会夭折了(后来了解到,这点担心其实是杞 ...
这里说的大文件指大小超过4G的文件。 在32位环境下,linux默认打开、读、写超过4G的文件会返回错误。定义如下宏可以突破这个限制,对read/write和fread/fwrite同时有效。 注意它必须定义在所有头文件之前。 #ifndef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #endif 或者在编译时添加如下参数: -D_FILE_OFFSET_BITS=64-D_LARGEFILE_SOURCE 或者使用函数fopen64,但是该函数我的测试机上没有找到相关的说明,所以在我这里不可用。 _FILE_OFFS ...
一、什么是共享内存区 共享内存区是最快的可用IPC形式。它允许多个不相关的进程去访问同一部分逻辑内存。如果需要在两个运行中的进程之间传输数据,共享内存将是一种效率极高的解决方案。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传输就不再涉及内核。这样就可以减少系统调用时间,提高程序效率。 共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址空间中。其他进程可以把同一段共享内存段“连接到”它们自己的地址空间里去。所有进程都可以访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所做的改动会立刻被有访问同一段共享内存的其他进程看到。 要注意的是共享 ...
比尔盖茨评价本文作者: 雷·库兹韦尔是我所知道的预测人工智能未来最权威的人。他的这本耐人寻味的书预测未来信息技术得到空前发展,将促使人类超越自身的生物极限——以我们无法想象的方式超越我们的生命。 中文版已经由机械工业出版社出版, amazon 购买衔接 这是本人研究生阶段参与翻译的。贴上译者序,让你了解本书,以及成为本书的fans: 当人们看到太多相同的时候,也许我们很无知; 当人们看到太多不同的时候,也许我们视野不够大; 当人们同时看到不同和相同的时候,也许这恰是我们的智慧原点。 物质是静止的能量,能量是运动的物质,生命是连接物质与能量的桥梁;智慧是生命的形态,智能是智慧的简 ...
Global site tag (gtag.js) - Google Analytics