2014年9月

在Linux中,使用make来维护程序模块关系和生成可执行成需的工具,它可以根据程序模块的修改强狂重新编译链接生成中间代码或最终的可执行程序,执行make命令,需要一个名为Makefile的文本文件,这个文件定义了整个项目的编译规则,包括模块间的依赖关系、文件的编译顺序、以及编译所使用的命令。通过make命令及Makefile文件,整个项目的源程序文件可以自动编译,极大的提高了软件开发效率。

make从Makefile文件获取模块间的依赖关系,判断哪些文件过时(文件生成后,源文件或头文件被修改了),然后使用Makefile中的编译命令进行编译。
例如:

main:main.o module1.o module2.o
    gcc main.o module1.o module2.o -o main
main:main.c head1.h head2.h common_head.h
    gcc -c main.c
module1.o:module1.c head1.h
    gcc -c module1.c
module2.o:module2.h head2.h
    gcc -c module2.h
#This is a makefile

- 阅读剩余部分 -

Linux程序开发过程中,最常用的调试器时gdb,gdb和其他调试器一样,可以在程序中设置断点、查看变量值、一步一步跟踪程序的执行过程。利用调试器的这些功能可以方便的找出程序中存在的非语法错误。

1、启动和退出gdb
gdb调试的对象是可执行文件,而不是程序的源代码。如果一个可执行文件可以被gdb调试,编译器gcc编译程序时需要加入-g选项,-g选项告诉gcc编译程序时加入调试信息。


gcc -g test.c -o test
gdb test     // 启动gdb
gdb -q test  // 取消显示版权信息
quit         // 推出gdb

2、显示和查找源程序
(1)显示
list:显示10行代码
list 5,10:显示5-10行代码
list test.c:5,10:显示源文件test.c 5-10代码,调试含多个源文件时使用
list list get_num:函数内代码
list test.c:get_num:源文件test.c内 5-10行代码

- 阅读剩余部分 -

在编写处理字符串的程序或网页时,经常会有查找某些复杂规则的字符串需要。正则表达式就是描述这些规则的工具。即,正则表达式是记录文本规则的代码

本文参考:正则表达式30分钟入门教程

1、入门
假设在一篇英文小说中查找‘hi’,可以使用正则表达式hi;它可以精确匹配这样的字符串:由两个字符组成,前一个是h,后一个是i。通常,处理正则表达式的工具会提供一个忽略大小写的选项,那么它可以匹配‘hi’、‘HI’、‘Hi’、‘hI’四种中的任一种。

但是许多单次内会包含‘hi’,用hi来查找,这里面的‘hi’也会被找出来,如果要精确的查找‘hi’这个单词的话,应该使用\bhi\b

b是正则表达式规定的一个特殊代码(元字符、metacharacter),代表着打次的开头和结尾,也就是单词的分界处。虽然通常英文单词由空格、标点符号或者换行符来分隔,但是\b并不匹配这些分隔符,它只匹配一个位置。

- 阅读剩余部分 -

1、fork/join并行执行模式
OpenMP是一个编译器指令和库函数的集合,主要是为共享存储计算机上的并行程序设计使用的。
标准并行模式(fork/join并行模式)执行代码的基本思想是,程序开始只有一个主线程,程序中的串行部分都由主线程执行,并行的部分通过派生其他线程来执行,如果串行部分没有执行结束,接下来的串行部分必须要等待子线程中并行部分执行完毕才能继续推进。
例如:

int main(int argc, char* argv[])
{
      clock_t t1 = clock();
      #pragma omp parallel for
      for ( int j = 0; j < 2; j++ ){
          test();
      }
      clock_t t2 = clock();
      printf("Total time = %d\n", t2‐t1);
   
      test();
      return 0;
}

在没有执行完for循环中的代码之前,后面的clock_t t2 = clock();不会执行,如果和调用线程创建函数相比,它相当于先创建线程,并等待线程执行完毕,所以这种模式中在主线程里面创建的线程并没有和主线程并行运行

- 阅读剩余部分 -

OpenMP(Open Multi-Processing)是一套支持跨平台共享内存方式的多线程并发的编程API,使用C,C++和Fortran语言,可以在大多数的处理器体系和操作系统中运行,包括Solaris, AIX, HP-UX, GNU/Linux, Mac OS X, 和Microsoft Windows。包括一套编译器指令、库和一些能够影响运行行为的环境变量。— —维基百科OpenMP

1、相比传统多线程编程,OpenMP(多核编程)具有以下优点:

  • CPU核数拓展性问题

多核编程需要考虑程序性能随CPU核心数的拓展性,当硬件升级到多核后,能够不修改程序让程序性能增长,这要求程序中的线程数要随CPU核数变化,不能创建定数线程,否则当CPU核数超过线程数,将无法发挥CPU性能,这正是OpenMP的优势。

  • 方便性问题

多核计算时,要求将计算分摊到各个CPU核上,所有的程序都需要并行执行,对计算的负载均衡有很高的要求。操作系统API创建线程时,需要线程入口函数,很难满足这个要求,除非将一个函数内的代码分拆成多个入口函数,这将大大增加程序员的工作量,使用OpenMP不需要入口函数,可以将同一函数内代码分解成多个线程执行,也可以将一个for循环分解成多个线程执行。

  • 可移植性问题

OpenMP是标准规范,所有支持它的编译器都是执行同一套标准,不存在可移植性问题。

- 阅读剩余部分 -