摘要:
在很多的应用场景,需要根据任务去创建线程去异步处理问题,不过不停的创建线程和销毁线程本身是一个非常耗时和消耗系统资源的事情,所以通常这种情况使用线程池来实现,常用的场景比如web容器对于web请求的处理,就是使用的线程池。线程池有几个关键性的元素: (1) 工作者线程,比如我们称为worker... 阅读全文
摘要:
多处理器使用松散的内存模型可能会非常混乱,写操作可能会无序,读操作可能会返回不是我们想要的值,为了解决这些问题,我们需要使用内存栅栏(memory fences),或者说内存屏障(memory barrier)。 X86平台可能还算是使用松散内存模型的多处理器中还算比较好的了,它针对内存顺序有... 阅读全文
摘要:
在进行多线程编程的时候,需要对共享数据,或者说竞争数据进行上锁,通常我们都是使用操作系统提供的数据结构和接口,比如linux下的mutex结构。使用现成的锁结构能满足绝大多数的需求,不过针对一些特殊情况,可能需要自己实现锁,比如想检测程序中是否发生了死锁。 本文主要针对TAS这种锁的方式进行讨... 阅读全文
摘要:
在64位centos6上编译32位的汇编程序,如果程序中使用了C库,比如printf。因为是编译32位的目标程序,所以使用gcc编译的时候需要加上-m32选项,但是如果编译的话会报错,以print.s程序为例子 1 .code32 2 .section .data 3 output: 4 ... 阅读全文
摘要:
由于使用as和ld来编译链接汇编程序,在使用C库的时候比较麻烦,需要输入比较多的指令,所以使用gcc进行编译链接。由于书中内容是32位汇编程序,但是机器使用的是64位操作系统,自带的gcc也是64位的,导致编译生成的程序,一运行就会Segment Fault。经过查询之后,发现是调用printf... 阅读全文
摘要:
在服务器里面需要用到从一组数中随机M个不同的数出来的需要,这种需求实现出来本身不复杂,最简单的就是一直随机,每次随机出来的数字判断是否跟之前有重复,如果没有就加入返回队列中。这种简单的算法在数据源很大,需要随机的数很少的时候,效率还是可以的,而且实现非常简单。但是在数据源本身就很小,而且需要随机... 阅读全文
摘要:
国庆长假之后,上班,第一件事就是连接开发服务器进行开发,结果发现死活进不去系统。一开始以为是用户名和密码错误,后来发现怎么输入都是进不去系统,密码输入是肯定正确的。 google了一下,发现有人说是密码过期,有人说是登陆相关文件内容目录出错。不管哪种可能性,现在都需要进入‘单用户模式’然后进行... 阅读全文
摘要:
前几天程序新加一个功能之后,其中用到了boost的lexical_cast,发现在关闭命令行窗口的时候,程序报错,是程序退出清理时候报的错误。 一开始以为是程序新增的功能有问题,发现去除新功能之后,随便在一个函数中使用lexical_cast,程序在退出的时候都会报错。 所以怀疑是自己程序功... 阅读全文
摘要:
前几天做服务器压力测试,本地10个线程不停的去向服务器建立连接,然后请求数据,然后连接再关闭,程序每运行几万次之后就会发现客户端程序没办法connect服务器,connect超时。 一开始怀疑是自己服务器的处理有问题,导致socket数过多没办法创建新的连接,现将系统中用户可以打开的最大文件数... 阅读全文
摘要:
前一天使用pmap查看服务器中自己开发的游戏服务的内存使用情况,发现其中数据存储服务的内存占用率非常高,截图如下。 从截图中可以看出来,分配了大量的64MB左右的内存空间,因为对自己的服务比较了解,知道不可能是自己程序开辟的,而且进程才刚刚启动,也不可能是内存泄露。 所以第一时间想到的是... 阅读全文