操作系统 | 重归混沌的BLOG

listen函数中的backlog字段

今天在公司无意间又拿redis-benchmark测了一下silly的IO并发性并与redis本身比较了一下。 发现在2000个client同时并发的情况下,性能只是Redis的30%的左右。 直觉上这很不正常,虽然silly所有的数据经过lua层时都需要malloc和memcpy,但最多性能上差个10%~20%就已经很可观了,绝对不可能差70%这么多。 通过不断的调整client的个数,我发现性能并没有明显随着client的数量降低而降低,而是在client个数到达某个值时突然降低的。 比如我自己测的数据是在491个client时,silly的性能与r……

SIGPIPE信号

昨天夜里实现了按行来切为数据包的协议, 今天就迫不及待使用resdis-benchmark来测试一下silly的性能。 结果发现到100000个请求左右时就有一定机率程序会默默的退出, 使用gdb看了一下, 是因为向socket写入数据时触发了SIGPIPE信号。 google了一下发现,当向一个已经关闭的socket第二次写入数据时,就会触发SIGPIPE。 但是我把所有的_socket_close都加了打印也没有发现问题。 最后偶然间发现,如果一个socket被对方关闭, 那么第一次write函数不一定返回出错, 但是第二次write却一……

silly中socket犯的错误

silly的socket模块最初是使用epoll实现的, 后来为了在mac上开发就加入了kevent, 然后使用socket_poll.h来封装成了socket_poll。 但是由于对epoll和kevent的不了解,导致了在实现silly_socket.c文件中的_process函数时犯了一些很silly的错误。 直到昨天去实现异步发送时才突然发现epoll和kevent的不同之处。 linux下,在调用epoll_wait函数时将一个struct epoll_event结构体的数组作为参数传入,当epoll_wait函数返回且返回值大于0时, 则会将当前已经发生的事件和发生事件的文件描……

linux下调试内存问题

因为linux下没有QQ,刚好我的mac mini在闲置, 于是尝试着在OSX下开发silly。 令人奇怪的是在我的linux机器下运行好好的程序, 在osx下只要client对着silly发送几个数据包就会导致silly直接崩溃, 调试半夜未果。 今天早上在地铁上我都甚至开始怀疑osx下的malloc库默认不是线程安全的, 但是地铁上查了一路依然不能确定。 到了公司后, info程序员还没到,我就又寻思着我那个bug, 在centos下又测了一次,依然无果。 不死心看了一下’男人’对malloc怎么说, 无意间看到lin……

linux下动态库的版本号

据说linux下的动态库管理机制可以避免微软件DLL Hell的问题. 今天抽了点时间研究了一下, 发现其实本质上是利用别名(soname)技术来实现的. 在编译so文件时, 通过参数-soname将别名传入链接器ld(gcc可通过参数-Wl来将-soname参数传入链接器), 那么生成的动态库文件中Dynamic section中的SONAME将会被填入输入的别名. 如果没有-soname参数, 则Dynamic section中将不会有SONAME字段生成. 当使用命令gcc -g -Wall -o main -L. -lver时, 在进行链接时, 链接器ld会首先去当前目录查找libve……

linux下动态库

今天无意间发现在linux下share object(dynamic library)中的函数竟然可以不通过回调的方式直接访问主程序中的函数,瞬间颠覆以前对于动态库的观念. 如代码所示libhi.so中有一个函数hello, 主程序main中有一个函数hi_out, 那么在main中调用libhi.so中的hello时,hello会自动找到main程序中的hi_output函数地址, 然后进行调用. 在感叹linux下动态库强大的同时, 对于其实现机制也产生了好奇. 经过一番努力终于在程序员的自我修养中第7.6.2章找到答案. “动态链接器在完成基本自举……

POSIX线程中的条件变量与互斥量

在看到UNP第26章时发现对于linux下的线程模型还很不是非常了解. 翻到APUE的第11章, 发现POSIX线程中通用的两个线程交互与同步手段有互斥量和条件变量两种. 对于这两种同步手段我想了很久也没想到每种到底适用于哪些场景, 甚至于我觉得几乎mutex就够完成绝大部分线程同步功能了. 以前在写代码时都是自然而然的用出来了, 也从来没有认真总结过到底什么情况下使用Mutex, 什么下使用条件变量(类似Windows下的事件). 在google到这篇文章终于豁然开朗. 其实问题很简单, 也许换个描述方式……

UcosII 就绪表的理解

为了保证系统的实时性,在就绪表这一块,内核设计者设计了一种算法,这个算法在O(1)的时间里完成查找就绪表中最高优先级的任务(遍历就绪表来查找最高优先级的做法是不能保证实时性要求的)。关于就绪表,这里涉及到四个数据结构,分别是:OSRdyGrp、OSRdyTbl[]、OSMapTbl[]和OSUnMapTbl[]。前两者是全局变量(INT8U),OSRdyTbl[]数组的大小取决于OS_LOWEST_PRIO。后面两个数组是静态成员,其值见下面的表格和代码:   OSMapTbl[]的下标   OSMapTbl[](即位掩……

~/.fvwm/fvwm.stroke

#strokes #window list without drag Stroke 0 0 R N WindowList #button 3 guesture with Ctrl starts programs in any context #"r" like guestures starts rxvt #Stroke N5456 0 A C Exec exec xkill #Stroke N65456 0 A C Exec exec xkill #Stroke N7414789 0 A C Exec exec rxvt #Stroke N7414759 0 A C Exec exec rxvt #Stroke N74147589 0 A C Exec exec rxvt #Stroke N7414756 0 A C Exec exec rxvt #Stroke N74156 0 A C Exec exec rxvt #Stroke N74159 0 A C……

~/.fvwm/.fvwm2rc

ImagePath +:/usr/share/icons:/usr/share/pixmaps:/usr/share/icons/hicolor/48x48/apps:/usr/local/share/fvwm/icons:$HOME/.fvwm/icons EdgeResistance 250 100 EdgeScroll 100 100 EdgeThickness 10 ColormapFocus FollowsMouse ClickTime 750 DeskTopSize 2x2 #忽略数字锁定键 IgnoreModifiers L25 # default Styles: Style * BorderWidth 5, HandleWidth 5, DepressableBorder Style * Icon kcmkwm.png Style * MWMFunctions, MWMDecor, MWMButtons, HintOverride Style * De……