1. 用户线程和内核线程
用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
内核线程(kernel-level treads)指需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销。其优点是:较好的并行能力,一个进程内的线程阻塞不会影响该进程内的其他线程;缺点则是线程管理的开销过大,缺乏灵活性。int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
2. 函数模板和类模板
模板(template)是一个将数据类型参化的工具,它提供了一种将代码与数据类相脱离的机制,即代码不受具体的数据类型的影响。
函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化重载函数的设计。
类模板只能显示调用。
3. 泛型编程
泛型编程就是以独立于任何特定类型的方式编写代码,而模板是泛型编程的基础。
4. 工厂模式
简单工厂模式(静态工厂方法)、工厂方法模式、抽象工厂模式 。
通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割。
5. 递归和回溯
递归,递推和回归,不断调用自身函数。代码简洁易明,耗内存。
回溯,利用递归实现深度优先搜索的一种算法思想。
6. 单例模式
一种常用的软件设计模式,其核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
7. 搜索算法
深度优先(depth-first search, DFS):通过栈实现。递归,回溯。
广度优先(breadth-first search, BFS):通过队列实现。迭代。
8. 同步和异步
所谓同步执行模式,是指语句在同步执行模式下,将始终保持对程序流的控制,直至 程序结束。如查询操作,客户机上的应用程序在向服务器发出查询操作的指令后,将 一直等待服务器将查询结果返回客户机端,然后才继续进行下一步操作。
所谓异步执行模式,是指语句在异步执行模式下,各语句执行结束的顺序与语句执行开始的顺序并不一定相同。快,充分利用资源,但是编写和控制较为复杂。
同步是阻塞模式,异步是非阻塞模式。
9. 数据段,代码段,
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈(stack):栈又称堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
一个程序本质上都是由 bss段、data段、text段三个组成的。
+-------------+-----------
| .bss | (未初始化的全局变量)
+-------------+-- 数据段
| .data | (已初始化的全局变量)
+-------------+-----------
| .rodata |
|_____________| 代码段
| .text |
+-------------+-----------