(转)POSIX线程库条件变量的使用——Pthreads线程库实例笔记4

Posted by & filed under Uncategorized.

条件变量(Condition Variables) 条件变量是什么? 条件变量为我们提供了另一种线程间同步的方法,然而,互斥量是通过控制线程访问数据来实现同步,条件变量允许线程同步是基于实际数据的值。 如果没有条件变量,程序员需要让线程不断地轮询,以检查是否满足条件。由于线程处在一个不间断的忙碌状态,所以这是相当耗资源的。条件变量就是这么一个不需要轮询就可以解决这个问题的方法。 条件变量总是跟互斥锁(mutex lock)一起使用。 下面是使用条件变量的比较典型的过程: 主线程 声明并初始化需要同步的全局数据或变量(例如”count“) 声明并初始化一个条件变量对象 声明并初始化一个与条件变量关联的互斥量 创建线程A和B并开始运行 线程A 线程运转至某一个条件被触发(例如,”count“必须达到某个值) 锁定相关联的互斥量并检查全局变量的值 调用pthread_con_wait()阻塞线程等待线程B的信号。请注意,调用pthread_con_wait()以自动的原子方式(atomically)解锁相关联的互斥量,以便于可以被线程B使用。 当收到信号时,唤醒线程。互斥量被以自动的原子方式被锁定。 明确的解锁互斥量。 继续 Thread Read more […]

(转)《Linux命令行与shell脚本编程大全》 第十五章 学习笔记

Posted by & filed under Uncategorized.

  处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能终止 17 STOP 无条件停止运行,但不终止 18 TSTP 停止或暂停,但继续在后台运行 19 CONT 在STOP或TSTP之后恢复执行 默认情况下,bash shell会忽略收到的任何SIGQUIT(3)和SIGTERM(5)信号。 如果bash shell收到了SIGHUP信号,它会退出。但是在退出之前,它会将SIGHUP信号传给shell启动的所有进程(比如shell脚本)。通过SIGINT可以中断shell。Linux内核会停止将CPU的处理时间分配给shell。此时,shell会将SIGINT信号传给shell启动的所有进程。 注意:shell会将这些信号传给shell脚本程序来处理,而shell脚本的默认行为是忽略这些信号。   产生信号 终止进程 CTRL+C会生成SIGINT信号 暂停进程 CTRL+Z会生成SIGSTP信号 $ gedit a ^Z [1]+  Stopped                 gedit a   这里看到有一个作业产生,状态为stopped 关于作业讲解可参看(#1) 可以用ps查看已停止的作业,然后用kill将其终止。 捕捉信号 trap commands Read more […]

(转)多核下绑定硬件/进程到不同CPU

Posted by & filed under Uncategorized.

  转自http://flash520.blog.163.com/blog/static/344144752010729104235462/ 硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。现在的服务器上动不动就是多 CPU 多核、多网卡、多硬盘,如果能让网卡中断独占1个 CPU (core)、磁盘 IO 中断独占1个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。我前天收到一位网友的邮件提到了 SMP IRQ Affinity,引发了今天的话题。以下操作在 SUN FIre X2100 M2 服务器+ 64位版本 CentOS 5.5 + Linux 2.6.18-194.3.1.el5 上执行。 什么是中断 中文教材上对 “中断” 的定义太生硬了,简单的说就是,每个硬件设备(如:硬盘、网卡等)都需要和 Read more […]

(转)关于bug分析与异常处理的一些思考

Posted by & filed under Uncategorized.

  前言:工作三年了,工作内容主要是嵌入式软件开发和维护,用的语言是C,毕业后先在一家工业自动化控制公司工作两年半,目前在一家医疗仪器公司担任嵌入式软件开发工作。软件开发中,难免不产生bug;产品交付客户使用后,难免不产生问题,那么关于bug分析和异常处理则是软件开发和维护中无法躲避的工作内容。工作至今,我一直在思考关于bug分析和异常处理,有没有一些原则性、规律性的东西可循,以减少bug,提高bug分析的效率,对于一些异常,基于什么原则进行处理,才能达到客户的要求。这些问题每个行业、每个职位上的人都会有不同的想法,但是大家的目的是一样的,即提高产品的稳定性、可靠性、可用性和易用性。我暂且说说,自己的一些想法吧,不一定正确,但是算是自己想法的一种梳理吧,其实自己希望通过这种梳理增强自己关于这些问题的认识,促进自己的进一步思考。 备注:因为只是自己的一些想法,就暂且不考虑行文了,呵呵 原则一:自己写的软件中肯定存在bug 这一原则适用于软件开发和编码阶段,她让自己保持一颗谦虚谨慎的心,那么自己在设计和编码阶段就会考虑可能出现的问题,对于可能出现的问题,采取防御式编码。譬如: 在嵌入式软件中,不使用动态分配内存,这样就杜绝了内存泄露的问题,虽然这样做浪费了内存资源,但是相比后续分析内存泄露的问题带来的资源消耗和产生的严重产品问题,浪费的这点内存还是很划算的; 不要相信自己是个没有“笔误”的家伙,因此,在书写if判断的时候,自己总是会按照if(42 Read more […]

(转)UDT协议-基于UDP的可靠数据传输协议

Posted by & filed under Uncategorized.

  1.   介绍 随着网络带宽时延产品(BDP)的增加,通常的TCP协议开始变的低效。这是因为它的AIMD(additive increase multiplicative decrease)算法彻底减少了TCP拥塞窗口,但不能快速的恢复可用带宽。理论上的流量分析表明TCP在BDP增加到很高的时候比较容易受包损失攻击。 另外,继承自TCP拥塞控制的不公平的RTT也成为在分布式数据密集程序中的严重问题。拥有不同RTT的并发TCP流将不公平地分享带宽。尽管在小的BDP网络中使用通常的TCP实现来相对平等的共享带宽,但在拥有大量BDP的网络中,通常的基于TCP的程序就必须承受严重的不公平的问题。这个RTT基于的算法严重的限制了其在广域网分布式计算的效率,例如:internet上的网格计算。 一直到今天,对标准的TCP的提高一直都不能在高BDP环境中效率和公平性方面达到满意的程度(特别是基于RTT的问题)。例如:TCP的修改,RFC1423(高性能扩展),RFC2018(SACK)、RFC2582(New Read more […]

log4j日志输出性能优化-缓存、异步(转)

Posted by & filed under Uncategorized.

  1、log4j已成为大型系统必不可少的一部分,log4j可以很方便的帮助我们在程序的任何位置输出所要打印的信息,便于我们对系统在调试阶段和正式运行阶段对问题分析和定位。由于日志级别的不同,对系统的性能影响也是有很大的差距,日志级别越高,性能越高。 2、log4j主要分为error,warn,info,debug四个级别,也是使用最多的四种,日志级别从左至右依次减小。 3、log4j对系统性能的影响程度主要体现在以下几方面: a、日志输出的目的地,输出到控制台的速度比输出到文件系统的速度要慢。 b、日志输出格式不一样对性能也会有影响,如简单输出布局(SimpleLayout)比格式化输出布局(PatternLayout)输出速度要快。可以根据需要尽量采用简单输出布局格式输出日志信息。 c、日志级别越低输出的日志内容就越多,对系统系能影响很大。 d、日志输出方式的不同,对系统系能也是有一定影响的,采用异步输出方式比同步输出方式性能要高。 e、每次接收到日志输出事件就打印一条日志内容比当日志内容达到一定大小时打印系能要低。 4、针对以上几点对系能的影响中的第4,5点,对日志配置文件做如下配置: a、设置日志缓存,以及缓存大小 Java代码

以上配置说明,当日志内容达到8k时,才会将日志输出到日志输出目的地。 b、设置日志输出为异步方式 Java代码

同步情况:各线程直接获得输出流进行输出(线程间不需要同步)。 异步情况:1.各线程将日志写到缓存,继续执行下面的任务(这里是异步的) 2.日志线程发现需要记日志时独占缓存(与此同时各线程等待,此时各线程是被阻塞住的),从缓存中取出日志信息,获得输出流进行输出,将缓存解锁(各线程收到提醒,可以接着写日志了) 众所周知,磁盘IO操作、网络IO操作、JDBC操作等都是非常耗时的,日志输出的主要性能瓶颈也就是在写文件、写网络、写JDBC的时候。日志是肯定要记的,而要采用异步方式记,也就只有将这些耗时操作从主线程当中分离出去才真正的实现性能提升,也只有在线程间同步开销小于耗时操作时使用异步方式才真正有效 Read more […]

程序性能分析(转)

Posted by & filed under Uncategorized.

个人推荐这篇文章,可能看过之后在程序设计过程中会考虑到更多的东西去提高程序性能。 这篇文章主要是想谈谈在以CPU为中心的计算体系结构中影响程序性能的主要因素和性能的分析方法以及多线程对程序性能的影响,读这篇文章首先要具备一定的体系结构和操作系统基础,特别是进程调度,建议看《Operation System Concept》(中文《操作系统概论》)。 先定义一下程序的性能,就是在单位时间内能执行的任务数或者执行某个任务需要的时间。显然,在更短的时间内执行更多的任务性能就越高。 CPU和IO操作 言归正传,先看一个经典的入门的C程序Hello World! int main(int argc, char * args[]) { int m = 0; for (int i = 0;i < 10;i ++) { m = m+i; }  printf(“Hello Read more […]

C/C++返回内部静态成员的陷阱(转)

Posted by & filed under Uncategorized.

背景 在我们用C/C++开发的过程中,总是有一个问题会给我们带来苦恼。这个问题就是函数内和函数外代码需要通过一块内存来交互(比如,函数返回字符串),这个问题困扰和很多开发人员。如果你的内存是在函数内栈上分配的,那么这个内存会随着函数的返回而被弹栈释放,所以,你一定要返回一块函数外部还有效的内存。 这是一个让无数人困扰的问题。如果你一不小心,你就很有可能在这个上面犯错误。当然目前有很多解决方法,如果你熟悉一些标准库的话,你可以看到许多各式各样的解决方法。大体来说有下面几种: 1)在函数内部通过malloc或new在堆上分配内存,然后把这块内存返回(因为在堆上分配的内存是全局可见的)。这样带来的问题就是潜在的内存问题。因为,如果返回出去的内存不释放,那么就是memory Read more […]

线程资源

Posted by & filed under Uncategorized.

  在linux环境下进行多线程开发出现线程创建失败,错误码 errno为12,错误信息为 Cannot allocate memory。 错误代码:

错误原因:程序处在不停的线程创建中,在线程创建的for循环处便出现上述错误,而始终运行不到pthread_join处释放资源。由于占用资源内存不断增加,最终导致系统没有可用资源分配给新创建的线程。 将上述代码线程函数改为下面代码即可

经查阅资料得到linux线程有两种状态:joinable状态和unjoinable状态,默认为 joinable状态。 如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用资源。只有当你调用了pthread_join之后这些资源才会被释放。 若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。unjoinable属性可以在pthread_create时指定 ,或在线程创建后在线程中使用代码pthread_detach(pthread_self())设置pthread_detach属性将状态改为unjoinable状态确保资源的释放。 在查看线程创建失败的过程中还涉及到了线程栈,线程在初始化时,系统会为其分配线程栈,用于局部变量、函数调用时的参数等。 在Linux平台可以使用如下函数操作POSIX线程栈空间: int Read more […]

[转]linux文件缓冲区

Posted by & filed under Uncategorized.

  一:缓冲区机制 根据应用程序对文件的访问方式,即是否存在缓冲区,对文件的访问可以分为带缓冲区的操作和非缓冲区的文件操作: 缓冲区文件操作:高级文件系统,将在用户空间中自动为正在使用的文件开辟内存缓冲区。 非缓冲区文件系统:低级文件系统,如果需要,只能由用户在自己的程序中为每个文件设定缓冲区。 如果采用非缓冲的文件访问方式,每次对该文件进行一次读写操作时,都需要使用读写文件系统掉用来处理该操作,因此,如果用户需要访问某个磁盘文件,则每访问一次都要执行一次系统调用,执行一次系统调用将涉及到CPU状态的切换,即从用户空间切换到内核空间,实现上下文的切换,这将损耗一定的CPU时间,频繁的磁盘访问对程序的执行效率造成很大的影响。 ANSI标准C库函数建立在底层系统调用之上,即C函数库文件访问函数的实现中使用了低级文件I/O系统调用,ANSI标准C库中的文件处理函数为了减少使用系统调用的次数,提高效率,根据应用的不同,采用缓冲区机制,这样,在对磁盘文件进行读操作时,可以一次从文件中读出大量的数据到缓冲区中,以后对这部风的访问就不需要在使用系统调用了,即只需要少量的CPU状态切换。在对文件进行写操作时,可以先将内容存在缓冲区,待文件写满后,或者确实需要更新时在调用系统调用将文件一次写入到磁盘中。 二:缓冲区类型 标准I/O Read more […]