05 2013 档案
摘要:林 昊翔(linhaoxiang@hotmail.com), Linux 内核爱好者秦 君(qinjun@cn.ibm.com), 软件工程师, IBM简介:排队自旋锁(FIFO Ticket Spinlock)是 Linux 内核 2.6.25 版本中引入的一种新型自旋锁,它解决了传统自旋锁由于无序竞争导致的“公平性”问题。本文详细介绍了排队自旋锁的设计原理和具体实现,并与 Windows 操作系统采用的类似技术进行比较。最后讨论可能的扩展排队自旋锁的一些想法。发布日期:2008 年 6 月 05 日级别:中级访问情况 :11802 次浏览评论:0(查看|添加评论- 登录)平均分 (20个评
阅读全文
摘要:(2012-7-02 08:07:59)标签:linux内核,多线程分类:系统底层1.缘起随着SMP(Symmetrical Multi-Processing)架构的流行和epoll类系统调用对非阻塞fd监视的支持,高性能服务器端的开发已经能够实现CPU计算和IO的分离。为了充分发挥CPU的计算能力,服务器端的设计必须要尽量减少线程切换。引起线程切换最重要的原因之一就是对mutex和semaphor等锁的使用。本文从计算机体系架构、操作系统的支持和mutex的实现彻底分析Linux用户空间mutex的实现,分析的源码版本是glib-2.3.4和kernel-2.6.8。2.体系结构和指令的支.
阅读全文
摘要:2012-04-25 21:45:32分类:LINUX转载自:http://blog.csdn.net/wbd880419/article/details/6675271sem就是一个睡眠锁.如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。信号量一般在用进程上下文中.它是为了防止多进程同时访问一个共享资源(临界区).spin_lock叫自旋锁.就是当试图请求一个已经被持有的自旋锁.这个任务就会一直进行 忙循环——旋转——等待,直到锁
阅读全文
摘要:杨燚(yang.yi@bmrtech.com), 计算机科学硕士简介:本文详细地介绍了 Linux 2.6 内核中新的锁机制 RCU(Read-Copy Update) 的实现机制,使用要求与典型应用。发布日期:2005 年 7 月 01 日级别:初级访问情况 :30765 次浏览评论:3(查看|添加评论- 登录)平均分 (69个评分)为本文评分一、 引言众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用。但是随着计算机硬件的快速发展,获得这种锁的
阅读全文
摘要:2012-04-25 21:23:41分类:LINUX转载自:http://blog.21ic.com/user1/2543/archives/2006/13468.htmlLinux内核中的同步机制:原子操作、信号量、读写信号量和自旋锁的API,使用要求以及一些典型示例 一、引言 在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问。尤其是在多处理器系统上,更需要一些同步机制来同步不同处理器上的执行单元对共享的数据的访问。 在主流的Linux内核中包含了几乎所有现代的操作系统具有的同步机制,这些同步机...
阅读全文
摘要:M. Tim Jones, 顾问工程师, Emulex简介:在学习 Linux® 的过程中,您也许接触过并发(concurrency)、临界段(critical section)和锁定,但是如何在内核中使用这些概念呢?本文讨论了 2.6 版内核中可用的锁定机制,包括原子运算符(atomic operator)、自旋锁(spinlock)、读/写锁(reader/writer lock)和内核信号量(kernel semaphore)。 本文还探讨了每种机制最适合应用到哪些地方,以构建安全高效的内核代码。发布日期:2007 年 11 月 19 日级别:中级访问情况 :19172 次浏览
阅读全文
摘要:Linux 多线程应用中如何编写安全的信号处理函数周 婷(zhouting@cn.ibm.com), 软件工程师, IBM 中国软件开发技术实验室刘 坚(liujsh@cn.ibm.com), 软件工程师, EMC唐 桂峰(tangguif@cn.ibm.com), 资深软件工程师, IBM简介:关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略。本文首先介绍如何编写安全的异步信号处理函数;然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同步的方式处理。发布日期:2009 年 6 月 18 日级别:中级访问情况 :17222 次浏览评论:0
阅读全文
摘要:Epoll在LT和ET模式下的读写方式发布时间:July 10, 2012分类:Linux《VPS下CentOS装机记录》《MooC的一些设计思路》在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: Resource temporarily unavailable总结:这个错误表示资源暂时不够,能read时,读缓冲区没有数据,或者write时,写缓冲区满
阅读全文
摘要:本文介绍malloc和free函数的内容。 在C中,对内存的管理是相当重要。下面开始介绍这两个函数: 一、malloc()和free()的基本概念以及基本用法:1、函数原型及说明:void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。关于分配失败的原因,应该有多种,比如说空间不足就是一种。void free(void *FirstByte):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。2、函数的用法:其实这两个函数用起来...
阅读全文
摘要:分类:Linux/Shell2013-03-15 23:411284人阅读评论(0)收藏举报lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。例如:传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表,对系统监测和排
阅读全文
摘要:分类:Linux2008-09-06 15:04533人阅读评论(0)收藏举报linuxlinux内核化工nullthread工具当使用top等工具查看系统运行情况的时候,会知道当前(准确地说是过去的几秒钟内)处理器的利用率有多少。用户态占了多少,核心态占了多少,idle占了多少。我们通常把idle就视为系统空闲,但是这个"空闲"到底代表什么意思?接下来我们探讨一下。1. idle是什么 简单的说idle是一个进程,其pid号为0。其前身是系统创建的第一个进程,也是唯一一个没有通过fork()产生的进程。在smp系统中,每个处理器单元有独立的一个运行队列,而每个运行队列上又
阅读全文
摘要:分类:Linux2008-09-06 14:521026人阅读评论(0)收藏举报linux数据结构编译器solarisdb2null前几次我们分析了Linux系统中用户进程的4G虚存大致分为了几个部分,介绍了3G用户空间中数据段,代码段等静态区域的虚存管理,重点分析了栈的使用。这次我们来分析一下虚存使用中另一个重要部分--堆。前面的介绍中,我们知道编译器,操作系统担负着大量栈分配管理的工作。不论是静态分配的栈空间还是用户动态分配的栈空间,在函数返回的时候就自动释放了。堆的使用比之栈而言更为灵活,允许程序员动态的分配并释放,但也意味着,堆的使用需要程序员更为小心。4.5 堆的内存管理在学习&qu
阅读全文
摘要:分类:Linux2008-09-06 14:51745人阅读评论(0)收藏举报linux汇编编译器linux内核数据结构c上次我们分析了用户进程在虚存中的大致分布,这次我们就来分析一下,用户进程的4G虚存是怎么管理的,其对应的物理内存又是怎么维护的。4. 用户进程的内存管理机制4.1 虚拟内存和物理内存前几次我们分析了什么是物理内存,什么是虚拟内存,也反复强调了虚存不同于物理内存。虽然用户程序看到的是虚拟内存,但真正运行的时候还是必须运行在物理内存上的,这就涉及到一个虚拟内存分配和物理内存分配之间关系的问题。后面我们会详细展开了讲,但这里要先让大家明确一个概念,就是物理内存的延迟分配。因为物理
阅读全文
摘要:分类:Linux2008-09-06 14:50711人阅读评论(0)收藏举报linuxlinux内核windowsgcc编译器bbs上次我们讲到了硬件平台和操作系统对物理内存的管理机制,经过这两层处理,应用程序中只要好好利用自己独占的4G虚拟内存就行了。这次我们来讨论一下这应用程序是如何分配这4G内存的,当然这都离不开编译器,操作系统的帮助。PS: 在这之前,再强调一下,这里所说的虚拟内存是逻辑概念。和Windows平台上设置的那个虚拟内存不一样,那个相当于交换分区。3. 用户进程的虚存布局首先Linux把每个用户进程可访问的4G虚存空间分成两个大的部分。其中0x0~0xBFFFFFFF的3
阅读全文
摘要:分类:Linux2008-09-06 14:48864人阅读评论(1)收藏举报linuxdescriptor平台程序开发tablerandom前几次我们分析了程序是如何在Linux上被加载运行的。这次我们尽量简洁的分析一下在Linux中,程序是如何使用内存,而系统又是怎样管理内存的。内存访问和管理是一个跨越应用程序,操作系统,硬件平台的一个复杂的过程。虽然过程很复杂,我们还是尝试着去理解一下。1. IA-32架构中的内存管理机制我们从硬件开始吧,内存归根结底是硬件,内存(Random Access Memory)在加电的情况下,在地址总线上放上要读取/写入的地址,然后就可以在控制信号的帮助下,
阅读全文
摘要:分类:Linux2008-09-06 14:26443人阅读评论(0)收藏举报linuxshell编译器gccstruct平台 main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口。那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么?这次我们来探讨一下这个问题。1. main()函数的形式先来说说main函数的定义,较早开始写C程序的肯定都用过这样的定义void main(){},其实翻翻C/C++标准,从来没有定义过void main()。在C标准中main的定义只有两种: int main(vo
阅读全文
摘要:分类:Linux2008-09-06 14:21527人阅读评论(0)收藏举报linuxstructsignalsecurityjobsthread进程终止过程:进程终止的系统调用sys_exit()通过函数do_exit()实现。do_exit()调用static inline void __exit_mm(struct task_struct * tsk){struct mm_struct * mm = tsk->mm;mm_release();}释放一部分资源。然后调用static void exit_notify(void){/* Let father know we died*
阅读全文
摘要:分类:Linux2008-09-06 14:13469人阅读评论(0)收藏举报linuxshellpaththreadsearchstruct上次讲了如何从源文件得到可执行文件。这次聊聊可执行文件是如何在shell中被"执行"的。本文中尽可能少用一些源码,免得太过于无聊,主要讲清这个过程,感兴趣的可以去查看相应的源码了解更多的信息。1.父进程的行为: 复制,等待执行应用程序的方式有很多,从shell中执行是一种常见的情况。交互式shell是一个进程(所有的进程都由pid号为1的init进程fork得到,关于这个话题涉及到Linux启动和初始化,以及idle进程等,有空再说)
阅读全文
摘要:Linux中文手册Linux官方手册中文翻译定期与Linux官方手册同步翻译欢迎所有同仁参与翻译:易美翻译开头字母A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z标题摘要a64la64l, l64a - 在 long (长整形)与 base-64 之间进行相互转换abort强行终止一个进程,以一个非常粗野的方式来完成这个工作。abortabort - 异常终止进程absabs, labs, llabs, imaxabs - 计算一个整数的绝对值acceptaccept - 通过套接口接受一个连接accessaccess - 对一个文件检测当
阅读全文
摘要:Tutorials|Exercises|Abstracts|LCWorkshops|Comments|Search|Privacy & Legal NoticePOSIX Threads ProgrammingAuthor: Blaise Barney, Lawrence Livermore National LaboratoryUCRL-MI-133316Table of ContentsAbstractPthreads OverviewWhat is a Thread?What are Pthreads?Why Pthreads?Designing Threaded Program
阅读全文
摘要:目录:1. Linux系统调用原理2. 系统调用的实现3. Linux系统调用分类及列表4.系统调用、用户编程接口(API)、系统命令和内核函数的关系5. Linux系统调用实例1.系统调用原理系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结
阅读全文
摘要:分类:Linux2008-09-06 14:391305人阅读评论(0)收藏举报linuxsemaphorenulljointhread多线程上回说到Glibc中(NPTL)的线程同步方式如Mutex,Semaphore等都使用了futex作为其基础。那么实际使用是什么样子,又会碰到什么问题呢?先来看一个使用semaphore同步的例子。sem_t sem_a;void *task1();int main(void){int ret=0;pthread_t thrd1;sem_init(&sem_a,0,1);ret=pthread_create(&thrd1,NULL,tas
阅读全文
摘要:分类:Linux2008-09-06 14:351383人阅读评论(0)收藏举报linuxsemaphorepthreadsvariables多线程system在linux中进行多线程开发,同步是不可回避的一个问题。在POSIX标准中定义了三种线程同步机制: Mutexes(互斥量), Condition Variables(条件变量)和POSIX Semaphores(信号量)。NPTL基本上实现了POSIX,而glibc又使用NPTL作为自己的线程库。因此glibc中包含了这三种同步机制的实现(当然还包括其他的同步机制,如APUE里提到的读写锁)。Glibc中常用的线程同步方式举例:Sem
阅读全文
摘要:分类:Linux2008-09-06 14:341546人阅读评论(0)收藏举报linuxsocketsstruct平台unixsystem引子在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序",那futex是什么?和glibc又有什么关系呢?1. 什么是FutexFutex是Fast Userspace muTexes的缩写,由Hubertus Franke, Matthew Kirkwood, Ingo Molnar and Rusty Rus
阅读全文
摘要:援引CU上一篇帖子的内容:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的”也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务 并不一定是锁定某一资源,还可以是进行一些计算
阅读全文
摘要:之前一直没有怎么关注过这个问题,前些日子在面试一家公司的时候,面试官提到了pthread_cond_wait/pthread_cond_signal的实现,当时答的不是很好,回来就查了nptl的代码。前天,水木上又有人问到了信号量和互斥锁的问题,我想还是对它们的区别与实现总结一下。首先了解一些信号量和线程互斥锁的语义上的区别:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
阅读全文
摘要:Linux 线程锁,条件变量 信号量的区别分类:Linux程序开发2011-03-25 19:55612人阅读评论(0)收藏举报linuxsignalsemaphorebufferthreadreturning一) 线程锁1) 只能用于"锁"住临界代码区域2) 一个线程加的锁必须由该线程解锁.锁几乎是我们学习同步时最开始接触到的一个策略,也是最简单, 最直白的策略.二) 条件变量,与锁不同, 条件变量用于等待某个条件被触发1) 大体使用的伪码:// 线程一代码pthread_mutex_lock(&mutex);// 设置条件为truepthread_cond_si
阅读全文
摘要:作者:CppExplore 网址:http://www.cppblog.com/CppExplore/为了后面写的《网络模型(二)》,多写一篇关于线程的。线程使用涉及的主要数据结构以及应用框架可以参考http://www.cppblog.com/CppExplore/archive/2008/01/15/41175.html。本文的主要目的是给出linux下实用的线程消息队列实现。一、linux上线程相关的操作有下面几种:(1)pthread_t类型的创建、属性创建设置等。这类具体可以:man pthread_creat; man pthread_attr_init;man pthread_d
阅读全文
摘要:分类:linux应用程序2008-04-08 09:434896人阅读评论(2)收藏举报semaphorestructnulljobs工作initialization进行多线程编程,最头疼的就是那些共享的数据。因为你无法知道哪个线程会在哪个时候对它进行操作,你也无法得知那个线程会先运行,哪个线程会后运行。下面介绍一些技术,通过他们,你会合理安排你的线程之间对资源的竞争。l互斥量Mutexl信号灯Semophorel条件变量Conditions先说一下互斥量。什么时候会用上互斥量了?比如你现在有一全局链表,你有几个工作线程。每一个线程从该链表中取出头节点,然后对该头节点进行处理。比如现在线程1正
阅读全文
摘要:April 5, 2013workjob-hunting,google,amazon,facebook0 Comments一年多前,出于显而易见的原因,下定决心肉身FQ。经过一番考虑,放弃了读书这条途径,决定直接找工作,通过H1B签证出去。于是去年八月份从百度辞职,开始着手准备。当时觉得今年拿到H1B的成功率大致能有个六七成,加上周围朋友们的不断鼓励,可以说还是相当自信的。然而,时至今日,在历经Google、Amazon、Facebook三家公司之后,这第一次尝试却可耻地失败了……战绩概览:Google:仓促应战,HR电面一轮,技术电面一轮,北京onsite两轮,惨败;Amazon:技术电面两
阅读全文
摘要:pthread_cond_wait()用法分析多线程编程中,发现同步和互斥的手段中,条件变量见到的是最少的。后来查找资料发现:使用信号量完全可以模拟条件变量,而且通常更加具有优势。可以用信号量模拟锁和条件变量:1) 锁,在同一个线程内同时对某个信号量先调用sem_wait再调用sem_post, 两个函数调用其中的区域就是所要保护的临界区代码了,这个时候其实信号量是作为二值计数器来使用的.不过在此之前要初始化该信号量计数为1,见下面例子中的代码.2) 条件变量,在某个线程中调用sem_wait, 而在另一个线程中调用sem_post.不过, 信号量除了可以作为二值计数器用于模拟线程锁和条件变量
阅读全文
摘要:分类:linux2009-06-19 09:3337142人阅读评论(24)收藏举报多线程linuxsemaphoresystemlinux内核signal很想写点关于多进程和多线程的东西,我确实很爱他们。但是每每想动手写点关于他们的东西,却总是求全心理作祟,始终动不了手。今天终于下了决心,写点东西,以后可以再修修补补也无妨。一.为何需要多进程(或者多线程),为何需要并发?这个问题或许本身都不是个问题。但是对于没有接触过多进程编程的朋友来说,他们确实无法感受到并发的魅力以及必要性。我想,只要你不是整天都写那种int main()到底的代码的人,那么或多或少你会遇到代码响应不够用的情况,也应该有
阅读全文
摘要:分类:C语言2009-04-30 23:2684346人阅读评论(145)收藏举报数据结构编译器windowsbyte存储扩展一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一
阅读全文
摘要:引子:1.在Linux系统中,进程状态除了我们所熟知的TASK_RUNNING,TASK_INTERRUPTIBLE,TASK_STOPPED等,还有一个TASK_TRACED。这表明这个进程处于什么状态?2.strace可以方便的帮助我们记录进程所执行的系统调用,它是如何跟踪到进程执行的?3.gdb是我们调试程序的利器,可以设置断点,单步跟踪程序。它的实现原理又是什么?所有这一切的背后都隐藏着Linux所提供的一个强大的系统调用ptrace().1.ptrace系统调用ptrace系统调从名字上看是用于进程跟踪的,它提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的
阅读全文
摘要:Posted on2007-08-30 14:05OldHawk阅读(31460) 评论(8)编辑收藏信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。一、信号的基本概念本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件。基本概念对于理解和使用信号,对于理解信号机制都特别重要。下面就来看看什么是信号。1、基本概念软
阅读全文
摘要:c语言中*P=NULL的作用书上说NULL对暂时不用的指针变量赋初值如 int *p=NULL但书上又说企图用*p=5给p所指向的存储单元赋值,则系统将给用户一个错误信息为什么呢?赋初值之后想用到这个指针变量了 想赋5 哪里不可行了?我这里没弄懂答:p是个指针,指针是指向一个地址的,地址里面存放的才是值,int *p=NULL,意思是虽然给*p本身分配了一个空间但是p本身没有指向一个确定的地址。可能是栈上的一个地址,也可能是静态数据区,还可能是系统核心数据区 。更不要说地址里面的值了,如果你程序里想让P指向一个值,先得让他指向一个地址,比如说 int *p=&a 意思是给P分配了一个整
阅读全文
摘要:一。new/delete 与 malloc/free 的区别1。new自动计算需要分配的空间,而malloc需要手工计算字节数2。new是类型安全的,而malloc不是,比如:int*p=newfloat[2];//编译时指出错误int*p=malloc(2*sizeof(float));//编译时无法指出错误------以上两点只是改进,但以下两点malloc就无能为力了newoperator由两步构成,分别是operatornew和construct3。operatornew对应于malloc,但operatornew可以重载,可以自定义内存分配策略,甚至不做内存分配,甚至分配到非内存设备
阅读全文
摘要:linux用户态和内核态切换理解Linux使用了Ring3级别运行用户态,Ring0作为内核态,没有使用Ring1和Ring2。Ring3状态不能访问Ring0的地址空间,包括代码和数据。Linux进程的4GB地址空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作
阅读全文
摘要:dccmx 于 2012年 五月 5日 发表 | 最后修改于 2012年 五月 8日写网络程序躲不过协议,协议其实就是定义了消息的格式,以及消息是如何交换的。协议可简单可复杂,复杂精密如TCP协议,简单奔放如HTTP的协议。这里将我所接触到的协议稍微总结一下,最后抛出一个个人设计的简单通用的文本协议。设计一个协议不是一件很容易的事情,尤其是当对设计的要求包含很好的描述性和可扩展性的时候。如果再将效率考虑在内,则更是件耗脑力的活。在继续讨论下去之前,先看看现有的一些协议吧。这里主要讨论的是应用层的协议,应用层的协议大多是请求响应模式(除了zeromq这个变态的家伙,后面再说),所以这里侧重讨论消
阅读全文
摘要:dccmx 于 2012年 十二月 10日 发表 | 最后修改于 2012年 十二月 10日http://blog.dccmx.com/2012/12/build-perfect-monitoring-system/对于任何一个互联网公司来说,监控系统都是不可或缺的。监控系统的完善程度,直接影响到系统的稳定程度,性能等各个方面。关于监控系统的搭建,网上已经有了很多方案,在规划公司的监控体系的时候,我也参考了很多解决方案。比较常见的有:nagios,cacti,icinga,zabbix,ganglia,还有收费的监控服务有如newrelic等。考察了一圈下来,发现各有所长,又各有重叠。n...
阅读全文
摘要:那些“cache”和“buffer”(一)dccmx 于 2011年 六月 13日 发表 | 最后修改于 2012年 三月 16日江湖人称:cache is king。还有个与之类似的是buffer。这里就谈谈buffer和cache。那么他们到底是用来干什么的呢?其实他们就是在两个相对独立的系统之间的一个中间层,用来避免这两个系统之间不必要的交互和不不必要的或者重复的同步。同步,你懂的,不同数量级系统之间的同步,你也懂的。比如内存和磁盘之间,比如应用和数据库之间。buffer针对写,cache针对读。这篇文章先来看看Linux里面系统的那些cache和buffer(至于硬件里面的一些cach
阅读全文
摘要:参数说明:-c 统计每一系统调用的所执行的时间,次数和出错的次数等.-d 输出strace关于标准错误的调试信息.-f 跟踪由fork调用所产生的子进程.-o filename,则所有进程的跟踪结果输出到相应的filename-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.-h 输出简要的帮助信息.-i 输出系统调用的入口指针.-q 禁止输出关于脱离的消息.-r 打印出相对时间关于,,每一个系统调用.-t 在输出中的每一行前加上时间信息.-tt 在输出中的每一行前加上时间信息,微秒级.-ttt 微秒级输出,以秒了表示时间.-T 显示每一调用所耗的时间.-v 输出所有的系统调用.一些
阅读全文
摘要:上一篇文章,我介绍了KMP 算法。 但是,它并不是效率最高的算法,实际采用并不多。各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore 算法。 Boyer-Moore 算法不仅效率高,而且构思巧妙,容易理解。1977 年,德克萨斯大学的 Robert S. Boyer 教授和 J Strother Moore 教授发明了这种算法。 下面,我根据 Moore 教授自己的例子来解释这种算法。 1. 假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE"。 2. 首先,"
阅读全文
摘要:本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。注意:本文基于Python2.4完成;如果看到不明白的词汇请记得百度谷歌或维基,whatever。尊重作者的劳动,转载请注明作者及原文地址 >.<html1. 正则表达式基础1.1. 简单介绍正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表
阅读全文
摘要:本文介绍了Python对于线程的支持,包括“学会”多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例。注意:本文基于Python2.4完成,;如果看到不明白的词汇请记得百度谷歌或维基,whatever。尊重作者的劳动,转载请注明作者及原文地址 >.<1. 线程基础1.1. 线程状态线程有5种状态,状态转换的过程如下图所示:1.2. 线程同步(锁)多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时,可能存在数据不同步的问题。考虑这样一种情况:一个列表里所有元素都是0,线程"set"从后向前把所有元素改成1,
阅读全文
摘要:字符串匹配的KMP算法Posted: 01 May 2013 03:46 AM PDT字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一
阅读全文
摘要:闭包这个概念在很多语言中都有涉及,本文主要谈谈python中的闭包。Python中使用闭包主要是在进行函数式开发时使用。一,定义python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).这个定义是相对直白的,好理解的,不像其他定义那样学究味道十足(那些学究味道重的解释,在对一个名词的解释过程中又充满了一堆让人抓狂的其他陌生名词,不适合初学者)。下面举一个简单的例子来说明。[python]view plaincopy>>>defaddx(x):>>>d
阅读全文