Linux信号详解(转)

Posted by & filed under Uncategorized.

一 信号的种类 可靠信号与不可靠信号, 实时信号与非实时信号 可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号 不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于 SIGRTMIN的都是非可靠信号. 非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信 号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值 位于 [SIGRTMIN, SIGRTMAX] 区间的都是可靠信号. 关于可靠信号, 还可以参考WIKI的一段话: Text代码 The real-time signals, ranging from SIGRTMIN to SIGRTMAX, are a set of signals that can be used Read more […]

二叉树java实现

Posted by & filed under Uncategorized.

实现二叉树的增加、查找、删除、遍历   实现   结点类 [java] view plaincopy public class Node{ int key; int data; Node lchild=null; Node rchild=null; public Node(int key,int data) {     this.key=key;     this.data=data; } } 二叉树类: [java] view plaincopy public class BinaryTree {      Node root=null;      public void add(int key,int data)      {          Node node=new Node(key,data);          if (root==null)              root=node;          else          {              Node current=root;              Node pre=null;              while (true)              {                  if (key<current.key)                  {                      pre=current;                      current=current.lchild;                      if (current==null)                      {                          pre.lchild=node;                          break;                      }                  }                  else                  {   pre=current;                  current=current.rchild;                  if (current==null)                      {                      pre.rchild=node;                      break;                      }                  }              }          }      }      public Node findNode(int key)      {          Node current=root;          while (current!=null)          {              if (current.key==key)                  return current;              else if (key<current.key)                  current=current.lchild;              else current=current.rchild;          }          return null;      }      public int findElement(int key)      {          Node current=root;          while (current!=null)          {              if (current.key==key)                  return current.data;              else if (key<current.key)                  current=current.lchild;              else current=current.rchild;          }          return 0;      }      public boolean delete (int key)      {          Node current=root;          boolean isleftchild=false;          Node parent=root;          Node currentdouble=null;          while (current!=null)          {              if (root.key==key)              {                  root=null;                  return true;              }              if (current.key==key)              {                  //当前结点没有孩子,直接删除                  if (current.lchild==null && current.rchild==null)                  {                      if (isleftchild=true)                          parent.lchild=null;                      else parent.rchild=null;                      return true;                  }                 //当前结点没有左孩子,有右孩子                  if (current.lchild==null && current.rchild!=null)                  {                      if (isleftchild=true)                          parent.lchild=current.rchild;                      else parent.rchild=current.lchild;                      return true;                  }                     //当前结点没有右孩子,有左孩子                  if (current.lchild!=null && current.rchild==null)                  {                      if (isleftchild=true)                          parent.lchild=current.lchild;                      else parent.rchild=current.lchild;                      return true;                  }                  //右孩子,左孩子都有情况,将左孩子结点替换当前结点,当前结点的右孩子作为替换操作后子树中最右的一个结点                  if (current.lchild!=null && current.rchild!=null)                  {                      if (isleftchild=true)                          parent.lchild=current.lchild;                      else parent.rchild=current.lchild;                      currentdouble=current.lchild;                      Node rparent=null;                      while (currentdouble!=null)                      {                          rparent=currentdouble;                          currentdouble=currentdouble.rchild;                      }                      rparent.rchild=current.rchild;                     return true;                  }              }              else if (key<current.key)              {   parent=current;                  current=current.lchild;                  isleftchild=true;              }              else {                  parent=current;                  current=current.rchild;                  isleftchild=false;              }          }          return false;      }      //先序遍历      public void preorder(Node node)      {          if (node!=null)          {              System.out.println(node.data);              preorder(node.lchild);              preorder(node.rchild);          }      }      //中序遍历      public void midorder(Node node)      {          if (node!=null)          {              midorder(node.lchild);              System.out.println(node.data);              midorder(node.rchild);          }      }      //后序遍历      public void lastorder(Node node)      {          if (node!=null)          {              lastorder(node.lchild);              lastorder(node.rchild);              System.out.println(node.data);          }      } } 测试类 [java] view Read more […]

java排序算法

Posted by & filed under Uncategorized.

排序的算法有分别有: 1、插入排序 (直接插入排序、希尔排序) 2、交换排序(冒泡排序、快速排序) 3、选择排序(直接选择排序、堆排序) 4、归并排序 5、分配排序(箱排序、基数排序) 直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 直接插入排序Java版本的代码实现: public class MainTest { public static void main(String[] args) Read more […]

Java系统调优:内存管理与垃圾回收

Posted by & filed under Uncategorized.

1、Java虚拟机运行时的数据区 2、常用的内存区域调节参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制 -Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 -Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。 在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。 -XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。 -Xss: Read more […]

java类反射机制

Posted by & filed under Uncategorized.

项目中用了类反射机制,解释如下: java的类反射机制是一种常用的方法,主要是让JVM动态的加载已有的类对象。   [java] view plaincopy Class aClass = Class.forName(xxx.xx.xx); Object anInstance = aClass.newInstance(); forName中是已有的类名,返回一个类,然后再建立这个类的对象。     [java] view plaincopy Class Driver{ protected static Driver current; public static Driver getDriver(){ return current; } } Class MyDriver extends Driver{ static{ Driver.current=new MyDriver(); } MyDriver(){} } <pre name=”code” class=”java”>Class YourDriver extends Driver{ static{ Driver.current=new YourDriver(); } <pre name=”code” class=”java”><pre name=”code” class=”java”>YourDriver(){} }</pre></pre></pre>用时:Class.forName(“MyDriver”);Driver d=Driver.getDriver(); 这个实例中forName中的类名可以选择MyDriver或者YourDriver两个存在的,然后再建立对象   典型的例子是jdbc连接数据库,数据库会有很多,如Mysql,SQL Read more […]

zenoss的安装

Posted by & filed under Uncategorized.

最近花了很长的时间在安装zenoss这个软件,下面就说说安装的过程。 1.安装环境: 系统:ubuntuserver12.04 内存:2G 硬盘:20G 注意:这里我是在虚拟机里面安装的,内存方面用1G是不够的,硬盘最少10G(安装完成之后,用了快10G),如果内存和硬盘的容量不够,在安装过程中会出现很多奇怪的问题,最后归根就是它们的问题。 1.apt-get update && apt-get dist-upgrade -y && apt-get autoremove -y 首先是更新源,在安装的时候,需要下载很多东西,更新源之后速度有明显提升,一个好的源还是很必要的.在不特别说明的情况下,都是用root用户执行命令,这里的-y就省去了apt-get问你是否要安装的选择 2.apt-get Read more […]

(转)深度探索C语言函数可变长参数

Posted by & filed under Uncategorized.

  一、基础部分 1.1 什么是可变长参数 可变长参数:顾名思义,就是函数的参数长度(数量)是可变的。比如 C 语言的 printf 系列的(格式化输入输出等)函数,都是参数可变的。下面是 printf 函数的声明: int printf ( const char * format, … ); 可变参数函数声明方式都是类似的。 1.2 如何实现 C语言可变参数通过三个宏(va_start、va_end、va_arg)和一个类型(va_list)实现的, void va_start ( va_list ap, paramN ); 参数: ap: 可变参数列表地址 paramN: 确定的参数 功能:初始化可变参数列表(把函数在 paramN 之后的参数地址放到 ap 中)。 void va_end ( va_list ap ); 功能:关闭初始化列表(将 ap 置空)。 type Read more […]

(转) 别再让C++头文件中出现“using namespace xxx;”

Posted by & filed under Uncategorized.

  在这里,我毫不回避地说了这句话: 引用 我再也不想在任何头文件中看到“using namespace xxx;”了 作为一个开发者/团队领导者,我经常会去招聘新的项目成员,有时候也帮助其他组的人来面试应聘者。作为应聘流程之一,我经常要求应聘者写一些代码,因此我检查过相当多的代码。在最近提交的C++代码中,我注意到一个趋势,在任何头文件中,我总是能看到以下代码: C++代码       using namespace std; 如果我用我们的代码检查系统(在实践中我十分推荐这个系统)来检验代码,以上那行代码经常会跟着一句评论“Timo不会这样写的”。他们说得很对,我确实不会这么写。 那么,为什么我说服了很多C++教材(也许并不是什么好事),让他们认为使用上面那段代码是非常坏的方式? 让我们先来看看上面那段代码做了什么。总的来说,它把命名空间“std”以内的所有内容(或者其他由作者用using调用命名空间)无一例外的引入了目前的命名空间中。请注意我说的“所有内容”,并不是一两个你想用的类\类型\模板。在一段代码的开头引入命名空间的原因则是加强程序模块化,和减少命名冲突。大体上,它允许你可以写类似下面的那段代码,并且保证编译器可以选择正确的实现: C++代码

现在,假定我们正在尝试减少代码输入,并且在以上代码中使用using声明(或者更糟糕的,两个命名空间都声明了),按照如下代码来实现: C++代码

  如果这段代码的作者很幸运的话,编译器会选择vector的正确实现,或者至少在最初的阶段会这么做。但是过了一段时间,你会碰到一些很奇怪的编译器错误。幸运的话,你能找到这些错误的原因——我曾经遇到过类似问题,我花费了好几天才能找到这类问题的原因。该死,它们会浪费你很多的时间,仅仅因为你为了想少打5个字符的代码。 并且,如果你把using声明用在了头文件中,你会让这类问题更加恶化,因为命名冲突问题早晚都会在一个调用关系非常非常远的模块中神不知鬼不觉的出现,而你可能需要查三层调用才可以找到原因所在,一个头文件包含了另一个直接使用using声明的头文件可以导致命名空间被立刻污染掉,任何一个使用命名空间的文件如果使用了std命名空间的内容,都会导致这类问题。 那么,为什么你能在很多教科书中看到它们使用using Read more […]

(转)C++处理异常 try,catch,throw

Posted by & filed under Uncategorized.

  异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制。 也许我们已经使用过异常,但是你会是一种习惯吗,不要老是想着当我打开一个文件的时候才用异常判断一下,我知道对你来说你喜欢用return value或者是print error message来做,你想过这样做会导致Memory Leak,系统退出,代码重复/难读,垃圾一堆…..吗?现在的软件已经是n*365*24小时的运行了,软件的健壮已经是一个很要考虑的时候了。 自序: 对写程序来说异常真的是很重要,一个稳健的代码不是靠返回Error Message/return Value来解决的,可是往往我们从C走过来,习惯了这样的方式。 仅以本文献给今天将要来临的流星雨把,还好我能在今天白天把这写完,否则会是第4个通宵了;同时感谢Jeffrey大师,没有他的SEH理论这篇文章只能完成一半,而且所有SEH列子的构想都来自他的指导;另外要感谢Scott Read more […]

(转)c++有时比Python慢

Posted by & filed under Uncategorized.

  部门最近在搞JVM上的动态语言,比如Groovy。在享受了动态语言的种种灵活之后,性能自然而然被拿出来PK。 然后玩Python的同事就旧事重提,从网上找来一段Python代码,很多Python的人都知道了,很多C++的人也知道了,它跑得很快。 为了让文章好看一点,我来编一个故事,说,有个软件公司,正要招刚从大学毕业的C++程序员和Python程序,面试题是同一道: 有一个15万行的文档,其中很多行的内容相同的,请写一段代码,读入这文件,尽可能快地将不重复的行内容输出到新文件,注意次序不要改变”,比如,有5行内容: B1 B2 A2 B2 B1 要求新文件内容为: B1 B2 A2   小P新学习Pythont不久,他写出代码如下:

这是一段中规中矩的Pythont程序,符合Python的风格:看不出是新手还是老手写的。:) OK,在我的机器上,我准备了一个15万文字,但不重复行只有4万行的文件,上面的代码运行时间是281 Read more […]