2019年3月7日

摘要: 一、问题 在常规的函数调用中,通常是直接看到函数的定义并调用该函数,所以,函数调用传递的是值还是引用是根据函数声明来决定的。但是,在std::tr1中的bind函数本身是为了完成不同格式参数的适配,所以函数调用处看到的内容和真正的函数执行位置看到的内容并不相同。 简单的说,这里可以简单的模拟下bin 阅读全文
posted @ 2019-03-07 10:39 tsecer 阅读(372) 评论(0) 推荐(0)
摘要: 一、std::tr1::bind及std::tr1::function函数的意义 在第一次见到std库中bind函数的时候,有一种你们城里人真会玩的感觉,把模版用的出神入化。但是,更关键的是这么华丽的用法,是为了解决什么问题呢?这个问题本身可能比它们如何实现更加重要。其实科技的发展也是大抵如此,往往 阅读全文
posted @ 2019-03-07 10:39 tsecer 阅读(173) 评论(0) 推荐(0)
摘要: 一、常规情况 通常情况下,这个矩形都是和坐标系平行的一个矩形,例如典型的windows系统中,一个窗口总是和屏幕坐标平行的。在这种情况下,判断一个点是否在矩形之内就非常简单:只需要判断该点在x和y轴方向是否在矩形范围内即可。 简单代码如下,当然,如果在确定x1和x2关系的情况,实现可以更加简洁。 t 阅读全文
posted @ 2019-03-07 10:38 tsecer 阅读(3050) 评论(0) 推荐(0)
摘要: 一、变长模版参数(variadic template paramter) 1、语法说明 gcc源代码中对于该语法的解析是在gcc-4.8.2\gcc\cp\parser.c文件中完成,同样是"...",如何区分哪些是pack,哪些是expansion呢?从代码(的注释)上来看,只有在模版声明temp 阅读全文
posted @ 2019-03-07 10:37 tsecer 阅读(260) 评论(0) 推荐(0)
摘要: 一、碰撞检测中的broad phase中的常见算法 该算在 这篇文章 中有比较简单而准确的描述,由于这里描述的思路并不复杂,但是是所有物理引擎中碰撞检测的入门级功课,所以这里写代码加深下对于该简单算法的理解。同样为了避免链接失效,这个地方拷贝下关键内容: Let's see what this me 阅读全文
posted @ 2019-03-07 10:37 tsecer 阅读(1090) 评论(0) 推荐(0)
摘要: 一、问题 在使用stringstream对一个变量进行格式化的时候,发现格式化之后的字符串并不是一个可显示的字符,最后看了半天,发现问题在于这个变量定义的类型是char类型,导致格式化之后数值本身并没有变化。我记得这个问题甚至不是我第一次遇到,这个问题本身是一个很小的问题,但是既然几次遇到都没有什么 阅读全文
posted @ 2019-03-07 10:36 tsecer 阅读(280) 评论(0) 推荐(0)
摘要: 一、为什么考虑到这个问题 在看std::tr1的function实现时,看到一个问题。比方说在C++中可以通过指针获得一个变量的位置 tsecer@harry: cat function.cpp #include <tr1/functional> using namespace std::tr1; 阅读全文
posted @ 2019-03-07 10:35 tsecer 阅读(303) 评论(0) 推荐(0)
摘要: 一、converting constructor 不知道为什么,这个名次从来没有听说过,之前也没有关注过C++的这个特性。看了下《The C++ Programming Language》这本书最后的索引,也没有关于这个名词的索引,只是在"constructor"的"and type convers 阅读全文
posted @ 2019-03-07 10:35 tsecer 阅读(365) 评论(0) 推荐(0)
摘要: 一、无效请求的处理 通常来说,系统都是为了给“合法”请求提供服务,但是总有一些异常发生,也就是意料之外的事情。类似的,如果异常发生在一些知名的公司,这些事件可能就是“公关危机”。对于软件来说,通常这些异常情况也就是考验一个产品健壮性的机会,不同质量的软件对于这种异常的处理在很大程度上决定了软件的质量 阅读全文
posted @ 2019-03-07 10:33 tsecer 阅读(847) 评论(0) 推荐(0)
摘要: 一、表格 表格在整个Lua语言的数据结构中占有重要地位,正如Lua的作者所说: Tables are the main — in fact, the only — data-structuring mechanism in Lua.Table是Lua的主要(事实上,也是唯一的)数据结构。 数组变量的 阅读全文
posted @ 2019-03-07 10:32 tsecer 阅读(291) 评论(0) 推荐(0)
摘要: 一、闭包的由来 闭包这个概念对于没有接触过函数式编程的人来说还是比较陌生的,它基于把函数看作头等公民(first-class),至于怎么理解这个first-class,我想大致就是说把函数看作是像int、float这样的基本类型,而不是把它看作一个特殊的、定制的特殊实体。把函数当作基本类型之后,就可 阅读全文
posted @ 2019-03-07 10:32 tsecer 阅读(396) 评论(0) 推荐(0)
摘要: 一、问题 和C相比,Lua是一种限制比较松散的语言,这个在函数相关的处理中更加明显。函数可以有多个参数,函数返回值可以被赋值给变量列表(Lua manual中的varlist),函数可以return表达式列表(Lua manual中的explist),这些其实也不是很混乱,问题在于这些特性放在一起的 阅读全文
posted @ 2019-03-07 10:31 tsecer 阅读(5694) 评论(0) 推荐(0)
摘要: 一、快速删除记录 在事务型DB删除记录时,一个比较容易想到的优化是以通过设置一个标志位来表示这条记录已经被逻辑上删除(相对于物理删除)。这样实现的优点在于删除动作的指向会很快,特别是在事务提交中,如果只向磁盘flush一个bit的数据修改,可以缩短IO延迟,提高命令响应速度;并且有机会在回滚和再次插 阅读全文
posted @ 2019-03-07 10:30 tsecer 阅读(352) 评论(0) 推荐(0)
摘要: 一、问题和背景 对于apache生成的cgi服务来说,通常需要读取一些特有的配置,而这个配置通常使用的方法还是使用软链接。在使用软链接的场景中,由于二进制是在一个文件夹中,而配置文件和日志文件可能在一个软链接的文件夹,所以配置的时候禁不住要问下apache派生的cgi的当前工作路径在哪里,有没有一个 阅读全文
posted @ 2019-03-07 10:29 tsecer 阅读(285) 评论(0) 推荐(0)
摘要: 一、臆想的一个问题 一直比较好奇一个问题,或者说是一个恶作剧:假设说A、B两个主机互为网关,A需要发送一个数据,根据自己路由配置数据被发送给B主机;数据到达B主机之后,B主机检查自己的路由,发现网关是A主机,这样就会将这个数据(递减TTL之后)再次回传给A主机。这个过程是否会这样一直继续下去呢(当然 阅读全文
posted @ 2019-03-07 10:28 tsecer 阅读(1697) 评论(0) 推荐(1)
摘要: 一、B树基础 在B树的定义中,中间节点存储n个键值和n+1个指针,下面是一个乌托邦式的B树实例。在这个实例中可以看到,每个键值存储的都是其紧邻右侧指针指向子树的最小值。 但是比较特殊的是第一个键值的左边还有一个指针,这个指针也是n+1个指针中(+1)的由来。那么为什么要使用n+1个指针而不是直观上更 阅读全文
posted @ 2019-03-07 10:27 tsecer 阅读(752) 评论(0) 推荐(0)
摘要: 一、MySQL的join buffer 在MySQL对于join操作的处理过程中,join buffer是一个重要的概念,也是MySQL对于table join的一个重要的优化手段。虽然这个概念实现并不复杂,但是这个是实现MySQL join连接优化的一个重要方法,在"暴力"连接的时候可以极大提高j 阅读全文
posted @ 2019-03-07 10:27 tsecer 阅读(8868) 评论(6) 推荐(0)
摘要: 一、数据库中事务的隔离等级 这里首先要明确的是,这里的“隔离”都是在“事务”的基础上讨论的,通常的事务通过 start transaction开启,之后通过rollback或者commit来结束。由于大部分情况下对于mysql的操作都是单条语句的操作,我想大部分人在操作mysql的时候不是在操作测试 阅读全文
posted @ 2019-03-07 10:26 tsecer 阅读(235) 评论(0) 推荐(0)
摘要: 一、协程基础 按照执行单位从大到小的粒度区分,最早的执行单位就是进程(或者linux内核中所说的task)、之后为了资源共享,又有了线程的概念。线程在内核中成为基础的执行单位。线程这个概念对内核来说也是可见的,也就是说内核为了支持线程和进程的机制做过相关的处理,但是在linux下,这个处理的大部分工 阅读全文
posted @ 2019-03-07 10:25 tsecer 阅读(653) 评论(0) 推荐(1)
摘要: 一、锁的意义 在一个复杂一点的并发系统中,锁始终是一个绕不开的存在,大家通常接触到这个概念最多的是多任务操作系统,例如服务器比较常用的linux操作系统。在所有的操作系统教材中,都会对锁进行描述,生产者/消费者问题;哲学家就餐问题等都是典型的入门例子,所以锁最为常见的应用场景就是在操作系统中。但是, 阅读全文
posted @ 2019-03-07 10:24 tsecer 阅读(196) 评论(0) 推荐(0)
摘要: 一、时间比较的语法分析 在mysql中,通常时间是一个必不可少的类型,而这种类型的一个特殊地方就在于它的比较函数。其实,即使对于字符串的比较函数和对于int的比较也是完全不同的,但是这个差别并不想以datetime保存的时间这么具有视觉的震撼性和表现的这么明显。这里还有一个问题在于,当mysql的y 阅读全文
posted @ 2019-03-07 10:23 tsecer 阅读(2945) 评论(0) 推荐(0)
摘要: 一、shift生成 这个算法之前大致看过一下,在grep中再次遇到了该算法,大致想了下它的具体实现,发现shift数组的计算并没有像KMP中那样的迭代过程,之后就在网络上搜索了下这个算法的描述,主要是看shift的生成方法,具体思想描述有不少图片甚至视频展示,这里就不详细说明了。关于shift的生成 阅读全文
posted @ 2019-03-07 10:22 tsecer 阅读(254) 评论(0) 推荐(0)
摘要: 一、问题 在编可执行文件的时候,为了图方便,没有使用工程的Makefile,而是自己做了一些特殊的处理,选择性的编译了一部分代码,导致最后调试时发现一些文件访问singleton特定组件时错误,然后就想了下C++对于头文件中定义的static类成员中的static变量是如何实现及保证这个单件的唯一性 阅读全文
posted @ 2019-03-07 10:20 tsecer 阅读(116) 评论(0) 推荐(0)
摘要: 一、select s from f where w这是一个最为基础的sql语句,相当于C语言的printf("hello world\n");对于一个简单的应用来说,知道这个套路解决一般问题是没有难度的,在一些复杂的场景,例如涉及到subselect、join、union等各种各样的延伸问题时,如果 阅读全文
posted @ 2019-03-07 10:18 tsecer 阅读(1108) 评论(0) 推荐(0)
摘要: 一、多表操作这个问题并不是一个空穴来风的纯粹分析,应用的场景是假设一个数据库中相同的表格内容是按照每个月创建一个table,这样的好处在于随着日期的变化,我们可以通过一个简单的drop命令删除不再需要的数据,而且表的大小也不会太膨胀。这些好处的作用非常明显,但是也有一些不太方便的地方,假设我们想知道 阅读全文
posted @ 2019-03-07 10:17 tsecer 阅读(833) 评论(0) 推荐(0)
摘要: 一、除重在一些数据库查询中,我们希望一些记录是唯一的,比如希望查找某一项的最大值,由于table中可能有多条记录他们的值相同,都是最大值,例如一些有上限的属性,很容易出现多条record的属性值都达到上限的情况,此时我们可能只需要一条,验证它的确曾经达到过上限,此时比较好的办法就是使用group b 阅读全文
posted @ 2019-03-07 10:16 tsecer 阅读(832) 评论(0) 推荐(0)
摘要: 一、apache的worker模式下保活选项由于http的keepalive是控制apache行为的一个重要的特征,所以大致看了一下这个机制的实现及意义。通常来说,如果进行定性的分析,大家都可以随便信口开河,甚至望文生义也可以胡诌半天,但是这些结论对于真正的应用来说意义极小。就好像你说,我这个结论有 阅读全文
posted @ 2019-03-07 10:14 tsecer 阅读(429) 评论(0) 推荐(0)
摘要: 一、内存共享共享内存是linux下父子进程除了文件描述符之外的另一个更加具有亲缘性的共享机制了。和文件描述符共享不同,这种内存的共享它的共享性更强,因为内存的范围很大,共享的粒度可以精确到不同的数据结构。这个说法可能有些危言耸听,而且大家会觉得这个不是事实。老实说,它的确只是部分事实。在unix类系 阅读全文
posted @ 2019-03-07 10:13 tsecer 阅读(1201) 评论(0) 推荐(0)
摘要: 一、apache的实现对于apache的实现,默认配置的时候是不支持cgi模式的,这里的cgi模式就是cgid_mod的加载。如果没有加载该模块,当把该文件放入cgi_bin文件之后,从浏览器获得该文件的时候,httpd并不是执行该文件并将文件的输出返回,有意思的是,浏览器将会直接将请求的cgi文件 阅读全文
posted @ 2019-03-07 10:13 tsecer 阅读(903) 评论(1) 推荐(0)
摘要: 一、mysqld中对于SQL语句的分析客户端和服务器之间交互的时候,客户端发送的同样是字符串形式的查询和执行命令,返回的特定格式的数据库内容(?)。这个过程就需要在服务器端进行实时指令的翻译,生成特定的查询指令。在sqlite的实现中,sqlite定义了一个专用的虚拟机环境,和通常的真正的汇编指令相 阅读全文
posted @ 2019-03-07 10:12 tsecer 阅读(948) 评论(0) 推荐(0)
摘要: 一、源代码安装安装方式有两种,一种是二进制文件的安装,另一种是源代码级别安装。不同的二进制安装只是将同一份源代码在不同的机器上编译并且按照指定的运行格式进行尽量简单的配置,所以二进制安装的发行包命名中包含有操作系统的信息,源代码发行版本中中只有版本信息,不包含OS信息。在下载的5.5.28版本自带的 阅读全文
posted @ 2019-03-07 10:11 tsecer 阅读(546) 评论(0) 推荐(0)
摘要: 一、可配置型作为当前世界上部署最为广泛的Web服务器,apache具有很好的扩展性。这种扩展性和内核中的扩展性几乎有相同的作用和意义(核心的实现方法也是相同的,这两个实现应该是有相互借鉴的,只是不确定最早是谁提出的,或者两者都不是,而是从另外更早的unix版本中提出,不确定。),但是它的可配置性更好 阅读全文
posted @ 2019-03-07 10:10 tsecer 阅读(315) 评论(0) 推荐(0)
摘要: 一、问题描述本来是想测试一下svn的post-commit hook为什么能够实现对于后台任务的同步等待,所以就搭建了一个apache和svn的服务器程序,但是在调试的过程中一直出现文件系统打不开的问题,在apache的错误日志中也可以看到下面的提示内容, 1647 [Sun Oct 14 11:4 阅读全文
posted @ 2019-03-07 10:08 tsecer 阅读(1564) 评论(0) 推荐(0)
摘要: 一、问题描述希望在svn的post-commit中执行一个后台任务,但是发现该后台任务没有退出之前,svn提交始终不会返回。按照bash派生的后台任务的定义,就是在子进程派生之后,父进程不会把终端输入(终端的前台任务)派发给后台任务,也不会同步等该该子进程的返回。在父shell退出之后,内核会把退出 阅读全文
posted @ 2019-03-07 10:08 tsecer 阅读(291) 评论(0) 推荐(0)
摘要: 零、问题 git每天提交保存的是完整修改后的内容,那么多次修改同一个文件,多次提交可能会生成多个版本。如果checkout特定版本需要依赖历史版本的话,那么此时回溯的时候需要判断特定文件是不是最后一次提交的,并且只保留最后一次修改的版本。 一、测试一次完整的提交包含了什么 1、1 先创建一个空的gi 阅读全文
posted @ 2019-03-07 10:05 tsecer 阅读(491) 评论(0) 推荐(0)
摘要: 一、问题 在很多的C++容器使用,通常的遍历方法都是 for (auto iter = cont.begin(); iter != cont.end(); iter++) 或者使用更高级的C++语法 for (auto &iter : cont) 但是无论如何,在这种场景下,我们总是假设一个容器的e 阅读全文
posted @ 2019-03-07 10:04 tsecer 阅读(2171) 评论(0) 推荐(0)
摘要: 一、问题 执行一个windows文件启动失败,弹窗内容如下: ShaderCompileWorker.exe - 应用程序错误 应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。 确定 二、使用dependency walker看输出 从输出上可以看到有些DLL在系统中无法找 阅读全文
posted @ 2019-03-07 10:03 tsecer 阅读(1330) 评论(0) 推荐(0)
摘要: 一、保活的问题 之前一个同事问起一个问题:服务器通常不会主动检测客户端是否依然有效,在这种情况下,如果客户端异常退出后服务器依然维护着这条链路,随着时间的推移,过多的无效链接最终将会把服务器的资源消耗殆尽。举个例子:假设客户端是一个手机终端,用户可以抠出电池重启系统,这种情况下客户端的TCP协议栈没 阅读全文
posted @ 2019-03-07 10:02 tsecer 阅读(823) 评论(0) 推荐(0)
摘要: 一、当磁盘满了之后创建文件 在有些服务器进程中,可能需要在进程启动之后在文件中写入进程的pid,从而可以通过读取这个pid文件对进程进行reload、stop、start之类的控制操作。但是,在磁盘空间满了之后,虽然pid文件创建成功,但是进程id却无法写入,这个时候如果依赖文件存在,然后从中读取p 阅读全文
posted @ 2019-03-07 10:01 tsecer 阅读(472) 评论(0) 推荐(0)
摘要: 一、问题 对于mmap将内容映射到地址空间,从而让应用程序可以像操作内存一样来操作文件内容,这是操作系统为用户态程序提供的一个便利,它的确可以将繁琐的文件操作转换为码农喜闻乐见的内存操作,更重要的是它可以将文件内容的读写达到按需加载,只有在真正使用到文件内容的时候才会触发文件内容的读取,当然写回也是 阅读全文
posted @ 2019-03-07 10:00 tsecer 阅读(2802) 评论(0) 推荐(1)
摘要: 一、现象及问题 在两台同样环境上同样部署的进程,通过top工具查看两个进程的内存使用情况,可以看到的是,两个进程占用的虚拟地址空间大小相同,但是占用物理页面进程差别极大,可以认为不是一个数量级上的。通过free工具看到系统中可用内存比较少,但是buffers和caches的数量都非常大。按照常规理解 阅读全文
posted @ 2019-03-07 09:59 tsecer 阅读(1226) 评论(0) 推荐(0)
摘要: 一、问题 在c++的语法中,可以在函数声明中添加throw(),throw(type1, type2)之类的说明,前者声明该函数不被抛出任何异常,后者则是声明该函数只会抛出type1,type2类型的异常。当然这里并不是像孔乙己一样来说明回字的四种写法;更不是为这个语法摇旗呐喊,相反,各种论调都是不 阅读全文
posted @ 2019-03-07 09:58 tsecer 阅读(430) 评论(0) 推荐(0)
摘要: 零、原因 其实本来是在看TCP三次握手时客户端和服务器端socket对于epoll状态何时返回何种状态,不过后来引出了一个另有意思的问题:就是客户端和服务器双方对于三次握手的状态出现了不一致。我们知道,在三次握手中,客户端在发送最后一个ack之后进入ESTABLISHED状态,并没有要求服务器对于这 阅读全文
posted @ 2019-03-07 09:57 tsecer 阅读(909) 评论(0) 推荐(0)
摘要: 一、文件删除 通常在用户态我们删除一个文件都是通过rm命令来删除(删除文件夹的暂时就先不讨论了),这个删除操作并没有一个系统对应的rm系统调用,而是通过unlink系统调实现。在linux中,文件的删除不受文件是否正在被进程使用的限制,这一点和windows下的文件删除非常不同。这一点大家都知道,或 阅读全文
posted @ 2019-03-07 09:57 tsecer 阅读(835) 评论(0) 推荐(0)
摘要: 一、协议栈中的校验和 在IP协议及UDP/TCP协议中都是用了校验和字段,这个字段通常没有人会关注,就好像现在已经没有人知道当时的一个字节中保留的一个校验bit一样。我也是偶尔看我们常用的traceroute功能的时候间接看到了这个字段。traceroute的流程大致是这样的:从1不断的增加IP协议 阅读全文
posted @ 2019-03-07 09:55 tsecer 阅读(1883) 评论(0) 推荐(0)
摘要: 一、虚拟机磁盘扩容 最开始的时候创建的虚拟机的磁盘容量是20G,运行了一段时间之后,发现磁盘空间已经不够用,需要增加磁盘的容量。想到最简单的方法就是增加磁盘容量,把20G扩容到30G,这里的也有两种方法,一种是现有磁盘的容量,另一种是新加一个硬盘设备。当时使用的是第一种方法,也就是增加虚拟机现在使用 阅读全文
posted @ 2019-03-07 09:54 tsecer 阅读(558) 评论(0) 推荐(0)
摘要: 一、为什么想到这个问题 昨天在电脑上看视频的时候,发现字幕有些问题。具体的问题就是视频是分两个文件的,但是字幕是单个文件的,所以在看第二个文件的时候字幕就对不上了,而且相差很大,这个时候就需要手动对齐字幕,这个误差大概是50分钟,也就是3K秒左右,播放器貌似又不支持直接设置一个偏移量,所以我就只能通 阅读全文
posted @ 2019-03-07 09:54 tsecer 阅读(1926) 评论(0) 推荐(0)
摘要: 一、为什么会想到这个问题 主要是想测试下当接收方接收窗口满了之后,此时发送的检测包报文的格式。然后就想到了一个极端的问题:当tcp连接建立起来之后,假设说一方比较缺德(或者说程序有bug),对建立的socket数据不做任何读取操作,这样就让发送方非常尴尬了,因为发送方终究会感知到对方的接收窗口已经满 阅读全文
posted @ 2019-03-07 09:52 tsecer 阅读(1075) 评论(0) 推荐(0)
摘要: 一、接受方有效负载的判断 在rfc793中说明了对于判断接收到的报文是否有负载的判断在Page 24和Page 25之间,其中的原文说明为 A segment is judged to occupy a portion of valid receive sequence space if RCV.N 阅读全文
posted @ 2019-03-07 09:52 tsecer 阅读(1201) 评论(0) 推荐(0)
摘要: 一、收到报文对于网络地址的判断 对于刚收到的网络数据,经过了NF_IP_PRE_ROUTING过滤之后,开始到达了ip_rcv_finish函数,在该函数的开始做了一个看起来比较诡异的操作,就是判断了这个数据包中的路由dst是否已经设置过了,如果没有设置过则进行路由;这也就是反过来说,一些收到的报文 阅读全文
posted @ 2019-03-07 09:51 tsecer 阅读(460) 评论(0) 推荐(0)
摘要: 一、报文跨层传递 所有的网络协议栈都告诉我们:TCP/IP协议栈是分层的,低一层的协议无需也不能感觉到上层的协议,这个观念在我的脑海中根深蒂固,并且由衷的赞叹这种设计的思想,但是在经过一些简单的思考就会发现,这种分层并不是绝对的,正如这世间的一切。一个直观的问题是,一样米养百样人,同样的网卡上,可以 阅读全文
posted @ 2019-03-07 09:50 tsecer 阅读(2441) 评论(0) 推荐(0)
摘要: 基于2.6.32内核 一、现象 在x86_64的64位操作系统环境下,一个程序执行coredump,从coredump文件可以看到,导致coredump的问题是由于执行new操作时分配内存失败导致的。这个问题看起来让人有些莫名惊诧,用掉64bit下的所有虚拟地址空间,这是什么概念(这个惊诧可以用莱芜 阅读全文
posted @ 2019-03-07 09:49 tsecer 阅读(660) 评论(0) 推荐(0)
摘要: 一、问题的引入 在客户端希望通过http协议到服务器来拉取数据时,这种交互大多就是一次性的交互,客户端从httpsvr把数据拉取回来之后,服务器会主动关闭套接口。通常来说,如果是我们通过传统的PC端来连接,这个问题不是很大,因为这些客户端通常就是专门围着这个httpsvr来转的,就等着httpsvr 阅读全文
posted @ 2019-03-07 09:48 tsecer 阅读(1324) 评论(0) 推荐(0)
摘要: 一、实例代码 看了下面的例子,可能问题已经非常清晰了,但是这个例子就是为了让问题看起来清晰而故意这么写的,如果是在一个大型的项目中,特别是使用了大量的第三方库,这个问题并不是大家现在见到的这么显而易见的。下面是复现问题的demo: tsecer@harry: cat callpure.cpp #in 阅读全文
posted @ 2019-03-07 09:47 tsecer 阅读(4648) 评论(0) 推荐(1)
摘要: 一、用户态地址分配主要路径 用户态所有地址空间的申请主要经过mmap系统调用,也有一些是基于brk系统调用,对于mmap系统调用,它在某些条件下会执行申请空间合理性的判断,而brk则是一定进行合理性判断,下面是mmap相关的一些代码do_mmap_pgoff,它主要就是在于如果新分配的空间是私有可写 阅读全文
posted @ 2019-03-07 09:46 tsecer 阅读(1140) 评论(0) 推荐(0)
摘要: 一、静态局部变量初始化是否会很耗 之前曾经注意到过,gcc对静态变量的运行时初始化是考虑到多线程安全的,也就是说对于工程中大量使用的单间对象: CSingletone::Instance类型的代码,理论上说都是要经过mutex这种重量级的互斥检测,如此看来,这种单间对象对系统损耗应该是非常大的,因为 阅读全文
posted @ 2019-03-07 09:45 tsecer 阅读(880) 评论(0) 推荐(0)
摘要: 一、终端显示 大部分使用SecureCRT的用户可能都会经历这种情况,不小心cat了一个二进制文件,导致整个屏幕显示错乱,使用reset,stty -sane都没有办法恢复,只能重新打开一个终端。我之前就知道它是由于终端中SI控制字符导致的问题,但是更深入的原因没有进一步分析。后来我尝试使用另一种开 阅读全文
posted @ 2019-03-07 09:44 tsecer 阅读(1239) 评论(0) 推荐(1)
摘要: 一、gcc的模版匹配实现 1、主体函数 gcc的代码实现现在看起来依然晦涩,所以下面的分析只是大致的一个意会过程,没有精确详细的描述。以gcc4.1.0版本为例,模版特殊化的具体判断主要在gcc-4.1.0\gcc\cp\pt.c:most_specialized_class函数完成,从代码中可以看 阅读全文
posted @ 2019-03-07 09:43 tsecer 阅读(362) 评论(0) 推荐(0)
摘要: 一、强度削弱 之前在偶尔看gcc对于除以一个常数的表达式生成的汇编代码中,发现一条除法表达式生成的汇编指令非常多,这些指令中没有乘法操作,比较明显的特征就是进行了一个大整数的乘法,之后是移位啊、减法啊什么的操作,虽然不知道是什么意思,但是感觉很厉害的样子。 后台就觉得这应该是一个优化,搜索了一下,看 阅读全文
posted @ 2019-03-07 09:42 tsecer 阅读(1100) 评论(1) 推荐(0)
摘要: so运行的方法 在我之前的印象中,so文件是不能直接运行的,但是ld.so改变了我的这种偏见。执行一下动态链接库文件,执行结果为 tsecer@harry :/lib/ld-linux.so.2 Usage: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-P 阅读全文
posted @ 2019-03-07 09:41 tsecer 阅读(456) 评论(0) 推荐(0)
摘要: 一、udp的报文发送 udp在通常的应用中使用的比较少,可靠的协议通常使用TCP传输,对于的关注自然没有TCP多。尽管UDP具有不可靠的传输问题,和TCP相比,它有一个隐性的优点就是对于packet结构本身的完整性保持。严格意义上讲,这个属性并不是UDP协议单独完成的,而是由IP层完成,对于上层应用 阅读全文
posted @ 2019-03-07 09:41 tsecer 阅读(246) 评论(0) 推荐(0)
摘要: 一、当前进程current 在内核中,current绝对是一个出镜率非常高的变量,在几乎所有的系统调用中都会用到该变量。由于该变量被使用的频率比较高,所以它的实现要尽可能的快速高效。在最早的内核版本中,这个实现在内核的不同版本中一直在变化,从这个变量也可以引申出一些有意思的问题。 二、早期内核实现 阅读全文
posted @ 2019-03-07 09:39 tsecer 阅读(2212) 评论(0) 推荐(0)
摘要: 一、终端编辑 之前的终端都是为了便于人机交互而设计,交互性比较强。用户输入过程中,通常不是一蹴而就,也不可能没有笔误。所以终端通常是基于行为单位进行处理,在用户输入了回车之后才向用户态返回整个输入内容,也就是shell的一条命令。同样是为了便于用户编辑,在内核态支持简单的编辑命令,例如删除一个单词, 阅读全文
posted @ 2019-03-07 09:39 tsecer 阅读(1065) 评论(0) 推荐(0)
摘要: 一、gdb 硬件watch断点原理 1、直观的例子 硬件断点的watch功能是查找内存被改写的一个必备工具,和其它调试器断点功能一样,它可以快速的理解一个系统的特定方便而不用理解整个系统。对于某些关键变量,我们想知道有哪些地方使用或者初始化这些数据,只需要在该表达式打上数据断点,待命中时查看调用链即 阅读全文
posted @ 2019-03-07 09:38 tsecer 阅读(1725) 评论(0) 推荐(0)
摘要: 一、文件写入的原子性 管道在整个unix系统中有重要的基础设施意义,它使unix工具设计的“职能简单”原则得以实现的基础,不同的工具使用管道协调完成自己的功能,并把一个功能做好。一个想法的提出通常具有明确的场景和简洁的原理,后来需求的不断发展导致问题看起来极为复杂,就像我们现在社会的进化,可能原始社 阅读全文
posted @ 2019-03-07 09:37 tsecer 阅读(2470) 评论(0) 推荐(0)
摘要: 一、文件映射和匿名页面相比,文件映射算是比较幸福的一种映射方式了,它可以依靠每个文件都有的address_space结构来引伸出自己需要的信息,例如,所有映射了这个页面的page可以指向文件对应的inode的address_space结构。在vma侧,它们可以在address_space中建立一个自 阅读全文
posted @ 2019-03-07 09:36 tsecer 阅读(324) 评论(0) 推荐(0)
摘要: 一、基础数据结构及面临的问题页面结构struct page对于反向映射的实现使用了两个成员:一个是表示映射挂靠位置的内核级唯一结构。对于匿名映射来说,这个结构为一个全局的anon_vma结构;对于文件映射结构来说,这个指针指向的是一个表示地址空间的address_space结构,这个结构也就是我们通 阅读全文
posted @ 2019-03-07 09:35 tsecer 阅读(472) 评论(0) 推荐(0)
摘要: 一、现象so文件被不同的进程共享,映射入各个进程的地址空间中,这也是SO文件存在的重要原因。作为文件,它的只读部分可以供系统中任意多的进程使用,从而节省系统物理内存使用以及磁盘空间的使用。对于系统级的so文件,我们一般不会修改这些文件的内容,即使修改可能也是无意修改。但是对于一些自己编写的so文件, 阅读全文
posted @ 2019-03-07 09:34 tsecer 阅读(824) 评论(0) 推荐(0)
摘要: 一、直接修改内核代码段在386内核的kprobe实现过程中,其中有一个是对于代码段断点的安装,那个地方对于代码段的修改是轻松加惬意,就好象生活在新闻联播里一样,这让我们这些看惯了用户态进程各种保护的程序员来说还是比较震撼的,套用一句三俗的话来说:我和我的小伙伴们都惊呆了。386中对于kprobe调试 阅读全文
posted @ 2019-03-07 09:32 tsecer 阅读(572) 评论(0) 推荐(0)
摘要: 一、内核实现基础和之前的select相比,epoll是一个目标性更强的实现。在epoll等待的时候,它会把每个poll的唤醒函数注册为自己特有的函数,在该回调函数中,它将自己(被唤醒的fd)添加到readylist中,然后在poll到底是什么事件的时候只检测在readylist中的描述符即可,而不是 阅读全文
posted @ 2019-03-07 09:31 tsecer 阅读(367) 评论(0) 推荐(0)
摘要: 一、C库的printf函数簇这些函数其实大家最为熟悉,因为每个人都会写的hello world就是使用了printf这个C库函数。但是printf的实现并不见,如果有兴趣的同学可以看一下glibc中关于这个函数的哦实现,先不说各种格式化的处理以及文件的锁,其中的缓冲区管理及动态资源管理就有相当多的代 阅读全文
posted @ 2019-03-07 09:30 tsecer 阅读(480) 评论(0) 推荐(0)
摘要: 一、screen这个工具在其它地方有所耳闻,在实际工作中没有遇到过这种情况,准确的说是没有直接遇到这种情况。就像之前使用windows下的远程桌面一样,也是在无意中发现,之后在需要远程桌面的时候想到这种工具,才觉得工具非常好用。对于screen命令的使用也是如此,并没有刻意的去寻找一个特定的工具,虽 阅读全文
posted @ 2019-03-07 09:29 tsecer 阅读(531) 评论(0) 推荐(0)
摘要: 一、选项在内核中的使用搜索一下内核中对于SO_LINGER的使用,主要集中在socket的关闭、两个必不可少的set/get sockopt函数中,所以真正使用这个选项的地方并不多,所以分析起来可能并不复杂,也没什么影响,但是正如之前所说的,问题的严重性和重要性往往不是问题本身决定的,而是它可能引起 阅读全文
posted @ 2019-03-07 09:28 tsecer 阅读(1655) 评论(0) 推荐(0)
摘要: 一、序言这个异常处理可以说是C++语法中一个重要的组成部分,但是在使用中很少有人认真的研究过它的实现,甚至在工程中使用这个工具的人都很少,加上我之前对于C++的使用也是大概在windows下使用了两年,所以一些基本的问题我也不是很熟悉。但是对于windows下的结构化异常处理方法,在Matt pie 阅读全文
posted @ 2019-03-07 09:26 tsecer 阅读(2307) 评论(0) 推荐(0)
摘要: 一、异常终止在C++中,如果有一个异常没有被任何人捕捉,此时默认的处理是将进程终止掉,终止的时候使用的信号是sigabrt。好在内核对于这种信号的默认处理是会生成一个coredump文件,对于一些服务器来说,通过core文件可以知道当时的进程信息,如果附带了调试信息,那么调用的堆栈信息清晰可见。理想 阅读全文
posted @ 2019-03-07 09:25 tsecer 阅读(994) 评论(0) 推荐(0)
摘要: 一、端口重用这本是没什么意思的一个东西,只是别人那么随便一问,自己也是没啥事情,就看了一下,可能没什么实际意义。从名字上看,两者都是端口重用的表示,可能是和socket的发送接收缓冲区一个,一个是全局的,一个是实例私有的。但是看了一下代码,感觉好像不是这样。二、SO_REUSEADDR选项的使用in 阅读全文
posted @ 2019-03-07 09:24 tsecer 阅读(1046) 评论(0) 推荐(1)
摘要: 一、构造函数构造函数在C++中扮演着基础性的功能,再加上成员的初始化列表,问题就变的更加有意思的。通常也是机械性的写类和对应的构造函数,然后再对成员在初始化列表中对必要的成员进行初始化操作,例如对于一些整数类型赋值为非法初始值,以区分和识别一些未初始化的变量。但是在大部分情况下,我们并煤油灯对于一些 阅读全文
posted @ 2019-03-07 09:22 tsecer 阅读(669) 评论(0) 推荐(0)
摘要: 一、四次挥手三次握手是TCP协议中的一个经典问题,几乎所有的网络公司面试都会问到这个问题,以至于人们甚至忽略了更加有意义的挥手过程。无论从挥手的实现代码量还是在实际工程种可能引发的问题,挥手的过程都是比三次握手要更加的复杂。在TCP的状态转换过程中,大部分都是和连接关闭相关的操作,反过来看一下三次握 阅读全文
posted @ 2019-03-07 09:21 tsecer 阅读(383) 评论(0) 推荐(0)
摘要: 一、tcp关闭tcp的关闭在实际应用中的重要性可能会高于通常教科书中描述的三次握手。在三次握手发生时,此时的语义和动作都是确定的,server在侦听,而client去主动连接,此时连着的角色在连接开始之前就已经明确。对于TCP的断开来说,此时整个协议没有办法确定到底是谁来先断开,任何一方都可以在任何 阅读全文
posted @ 2019-03-07 09:20 tsecer 阅读(210) 评论(0) 推荐(0)
摘要: 一、gb2312现在我们大部分的中国程序员编译的程序可执行代码中包含的都是gb2312编码,这些编码通常体现在代码中的字符串里。编译器对于这些字符串的内容并不做特殊解释,因为gb2312中的常用英文字符是和ASCII码兼容的。根据编码的约定,通常的前32个字符是作为控制字符,也就是无法在屏幕上直接对 阅读全文
posted @ 2019-03-07 09:20 tsecer 阅读(176) 评论(0) 推荐(0)
摘要: 一、文件同步不同主机之间的文件同步是服务器开发过程中一个重要的基础操作,它是cp及scp的一个扩充版本,能够实现不同主机之间的文件复制,能够提供增量复制,能够提供安全性验证。rsync的代码实现数量并不多,核心的文件更少,和很多理论作者的操作一样,该文件使用C语言编写,代码的编写、变量的命令、文档的 阅读全文
posted @ 2019-03-07 09:19 tsecer 阅读(369) 评论(0) 推荐(0)
摘要: 一、TCP的异步发送在之前的日志中,已经看到tcp报文的发送时异步的,也就是应用层的send函数向一个TCP套接口发送数据,当send函数返回之后,send中的发送数据可能还没有到达网卡,更不要说到达对方并获得对方的ACK。这样做的好处是数据的准备和发送可以异步进行,和文件的缓冲一样,当write函 阅读全文
posted @ 2019-03-07 09:19 tsecer 阅读(338) 评论(0) 推荐(0)
摘要: 一、模板模板是C++中相对比较不太常见的结构,它实现了一些定义按照使用而动态由编译器实现的功能。或者说它部分实现了一些代码动态生成,将程序员的一些工作转移给了编译器来完成。并且它可以使用和内存的使用一样,只有在真正使用到(需要一种模板定义)的时候,此时才真正生成这种模板的一个实例。这一点和各种现代的 阅读全文
posted @ 2019-03-07 09:18 tsecer 阅读(476) 评论(0) 推荐(0)
摘要: 一、虚函数表每个包含有虚函数的类都会有一个所有对象共享的虚函数表,既然是所有实例共享,那么就涉及到可能出现“三个和尚没水喝”的情况。这个虚函数表既然是大家都要使用的,那么有谁来生成呢?最为保险但是低效的办法就是每个编译单元都生成一个,变量声明为weak,放入comdat节中,最后由连接器删除重复的冗 阅读全文
posted @ 2019-03-07 09:17 tsecer 阅读(1017) 评论(0) 推荐(0)
摘要: 一、unix socket这种套接口感觉在文件系统和套接口中都是一种异类,就好像蝙蝠是兽中的鸟、鸟中的兽一样。它的特点在于一个地址是否被占用是通过一个文件是否存在来确定。这其实是一个比较危险的操作,因为这个文件的存在是持久性创建的文件,会给底层的文件系统造成持久的影响。现在假设说一个程序非正常结束, 阅读全文
posted @ 2019-03-07 09:16 tsecer 阅读(530) 评论(0) 推荐(0)
摘要: 一、文件传输文件传输一直是互联互通以来的一个重要问题,为了这个问题,有各种的ftp实现,sz/rz模式,diff工具、以及scp等各种方法,它们各有各自的应用场景,也不能说一个就直接取代另一个。对于rsync来说,它应该算是一个比较特殊的方法,或者说在diff和scp之间有一个比较好的中和。通常来说 阅读全文
posted @ 2019-03-07 09:15 tsecer 阅读(426) 评论(0) 推荐(0)
摘要: 一、粘包问题TCP传输是一种基于流(stream)的传输方式,这个流是对应于udp的数据报格式的传输方式。在数据报传输格式中,每次传输的是一个单位,可以认为他是一个离散的信号,每次发送一个报单位。而流则是细水长流的流,它的数据可以持续的发送,接收和发送端都可以认为其中的字节流是没有天然的分隔点的,不 阅读全文
posted @ 2019-03-07 09:14 tsecer 阅读(370) 评论(0) 推荐(0)
摘要: 一、poll实现内核中VFS系统的poll机会是整个系统中异步等待的基础,无论是最为原始的poll,之后上流的select,以及最近的epoll,它们在内核中的实现都是基于每种文件提供一个poll接口功能来实现。但是对于内核态的poll来说,它并不是一个阻塞式的接口。它是最为接近poll英文原始意义 阅读全文
posted @ 2019-03-07 09:14 tsecer 阅读(594) 评论(0) 推荐(0)
摘要: 一、进程调试主要发生在一些调试环境中,文件的编译我们可以认为比较麻烦,或者说我们并不像真正的修改源代码,因为测试的代码修改之后还要改回来;麻烦不说,如果修改之后测试代码没有改回来,那么问题就更加严重了,所以我们尽量希望通过gdb工具来环保的修改程序的行为,这样我们就可能使用到下面的一些方法和指令。二 阅读全文
posted @ 2019-03-07 09:13 tsecer 阅读(2731) 评论(0) 推荐(0)
摘要: 一、丢包这个丢包不是网卡级别的丢包,在每个网卡中也会显示丢失的包的数据。这个一般是由于网卡在中断处理中需要通过skbuff来存储新来的包。此时是直接通过内存管理接口申请结构,此时这个地方并没有办法做限制,因为此时的中断处理程序并不理解上层的协议,更不用说进程或者是socket这些逻辑概念。所以当网卡 阅读全文
posted @ 2019-03-07 09:12 tsecer 阅读(1485) 评论(0) 推荐(0)
摘要: 一、语法语法是一个语言的基础,每个语言都会形式化的定义自己的语法规则,因为现在大部分时候还是“属性文法”,也就是基于语法的语义识别,所以严格的语法对于任何一门语言都是必须的,即使所谓的第四代编程语言SQL语言看起来非常高端,但是事实上它的语法也是有严格规定的,也可以通过语法文件(好像应该叫巴克斯-诺 阅读全文
posted @ 2019-03-07 09:11 tsecer 阅读(167) 评论(0) 推荐(0)
摘要: 一、unix套接字这种形式的套接字和通常的计算机间通讯不同,它是用来进行计算机内部进程间通讯的一种方式。大家比较经常接触到的进程间通讯方式可能是管道(无名和命名)、消息队列、共享内存等,可能对这个使用的比较少。那么我们可以想象一下这种通讯方式和前几种通讯方式相比,它的特殊之处在哪里?作为一个套接字, 阅读全文
posted @ 2019-03-07 09:10 tsecer 阅读(1280) 评论(0) 推荐(0)
摘要: 一、unix套接字这 种形式的套接字和通常的计算机间通讯不同,它是用来进行计算机内部进程间通讯的一种方式。大家比较经常接触到的进程间通讯方式可能是管道(无名和命名)、 消息队列、共享内存等,可能对这个使用的比较少。那么我们可以想象一下这种通讯方式和前几种通讯方式相比,它的特殊之处在哪里?作为一个套接 阅读全文
posted @ 2019-03-07 09:09 tsecer 阅读(1152) 评论(0) 推荐(0)
摘要: 一、bool值的范围根据C++语言中的说明,一个bool值可能的值只有两个,要么是0,要么是1。但是对于一个未初始化的bool值变量,它的取值范围却要丰富多彩的多,它的取值范围应该是可以为任意的一个单字节整数。测试的程序非常简单,大家随便打印一下一个未初始化的bool变量的值就应该可以看到各种各样的 阅读全文
posted @ 2019-03-07 09:08 tsecer 阅读(1738) 评论(0) 推荐(0)
摘要: 一、端口侦听我们知道,系统中的互联网端口地址是系统级唯一的,在默认情况下,IPV4和IPV6的同一个协议的套接口也不能再同一个端口侦听,而套接口编程的五元组就是<IP,port,peerip,peerport,inet proto>,其中没有进程区分,所以一个系统的套接口对于同一个网络地址来说是唯一 阅读全文
posted @ 2019-03-07 09:07 tsecer 阅读(592) 评论(0) 推荐(0)
摘要: 一、嵌入式系统中文件传输这个工具之前还的确是没有使用到过,可能的原因是因为之前一直使用桌面系统fedora core发行版本,开发主要使用busybox文件系统,而这两种版本中都没有自带sz/rz工具。它们的作用是通过串口来发送和接收文件,虽然说是串口,所有的支持串口协议的软件或者链路都可以,例如使 阅读全文
posted @ 2019-03-07 09:06 tsecer 阅读(1517) 评论(0) 推荐(0)
摘要: 一、linux下的防火墙基础iptables这个功能在之前的说法叫做ipchains,后来才修改为这个名字。名字本身通常会体现出很多的信息,这些信息可能根本不需要专业知识,只是因为这些术语本身不是我们的母语,加上翻译中信息的缺失和转义等问题,导致很多术语本身的意义并没有体现出来。拿我们最为熟悉的程序 阅读全文
posted @ 2019-03-07 09:05 tsecer 阅读(455) 评论(0) 推荐(0)
摘要: 一、memset一个对象这个是一个非常低级的错误,本身大家一看就看到这个代码是错误的,但是如果出现在面试题里,估计很多人会纠结一下,也可能会忽略这个问题。因为之前比较多的是用C语言,所以初始化一个结构的方法就是随手一个飘逸的memset一个结构。但是在C++中,这种方法可能会引起严重问题,特别的就是 阅读全文
posted @ 2019-03-07 09:05 tsecer 阅读(101) 评论(0) 推荐(0)
摘要: 一、多线程与析构函数这个是在C++编码中可能存在的一个问题,假设说一个线程执行了局部变量的构造函数之后,没有退出局部对象作用域之前,它主动退出线程(pthread_exit)或者被动退出线程(pthread_kill ed),那么这个局部变量的析构函数是否会执行?这个问题对于通常的程序来说影响并不大 阅读全文
posted @ 2019-03-07 09:04 tsecer 阅读(570) 评论(0) 推荐(0)
摘要: 一、map、全局符号及静态符号一般的大型工程都会在生成可执行文件的同时让链接器生成一个map文件,从而大致查看一下可执行文件中符号的内存布局以及从哪里引入可执行文件。这个通常对于小型工程是作用不大,因为代码就那么多,随便grep一下就知道符号定义位置了。但是对于一些大型工程或者涉及了比较多的第三方库 阅读全文
posted @ 2019-03-07 09:03 tsecer 阅读(3304) 评论(0) 推荐(0)

导航