- 博客(56)
- 收藏
- 关注
转载 蚁群算法
蚁群算法自话蚁群算法这算是填3年前的一个坑吧,已经懒癌晚期了,想必也还是要挣扎下,那今天先从蚁群算法这个坑说起,如果你是要寻找怎么优化蚁群算法,可以直接跳过本文,如果你还不了解什么是蚁群算法,或许本文能够提起你的兴趣。如果你同样对遗传算法和粒子群算法感兴趣,请查看3年前我对于这两个算法见解的文章。自话粒子群算法(超简单实例)自话遗传算法(带实例)简单蚁群算法模拟实验:DemoGithub这个模拟实
2018-01-19 11:27:40
857
转载 Linux的用户和组的管理
Linux的用户和用户组管理Linux是个多用户多任务的分时操作系统,所有一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也能帮助用户组织文件,并为用户提供安全性保护。每个用户账号都拥有一个惟一的用户名和用户口令。用户在登录时键入正确的用户名和口令后,才能进
2017-12-25 10:25:47
4445
转载 深入理解GRASP
GRASP,全称为General Responsibility Assignment Software Pattern,即通用职责分配软件模式,它由《UML和模式应用》(Applying UML and Patterns)一书作者Craig Larman提出。与其将它们称之为设计模式,不如称之为设计原则,因为它是站在面向对象设计的角度,告诉我们怎样设计问题空间中的类与分配它们的行为职责,以
2017-11-01 20:23:42
2381
转载 UT、IT、ST、UAT
软件开发中的完成测试环境所包括的环节包括:UT、IT、ST、UATUT = Unit Test 单元测试IT = System Integration Test 集成测试ST = System Test 系统测试UAT = User Acceptance Test 用户接受测试(俗称:验收测试)UT(单元测试,Unit Test): 单元测试任务包括: 1、模块接口测试; 2、模块局部数据结构测试
2017-07-10 10:55:55
4192
原创 初识标准库类型vector
vector 是同一种类型的对象的集合,类似于数组,每个对象都有一个对应的整数索引值。它和 string 对象一样,系统将负责管理与存储元素相关的内存。我们把 vector称为容器,是因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。 使用 vector 之前,必须包含相应的头文件 #include using std::vector;ve
2017-03-13 11:01:14
413
转载 进程的创建
进程的创建也就有两种方式:一是由操作系统创建,二是由父进程创建。在系统启动时,操作系统会创建一些进程,他们承担着管理和分配系统资源的任务,这些进程通常被称为系统进程。系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构。整个Linux系统的所有进程也是一个树形结构。树根是系统自动构造的,即在内核态下执行的0号进程,他是所有进程的祖先。由0号进程创
2016-10-07 10:08:11
2444
转载 linux内存管理之slab机制
一、内核内存分配在linux内核中伙伴系统用来管理物理内存,其分配的单位是页,但是向用户程序一样,内核也需要动态分配内存,而伙伴系统分配的粒度又太大。由于内核无法借助标准的C库,因而需要别的手段来实现内核中动态内存的分配管理,linux采用的是slab分配器。slab分配器不仅可以提供动态内存的管理功能,而且可以作为经常分配并释放的内存的缓存。通过slab缓存,内核能够储备一些对象,供后续使用
2016-10-06 10:17:05
6921
转载 linux物理内存管理技术
linux使用伙伴系统来管理物理内存页。一、伙伴系统原理1. 伙伴关系定义:由一个母实体分成的两个各方面属性一致的两个子实体,这两个子实体就处于伙伴关系。在操作系统分配内存的过程中,一个内存块常常被分成两个大小相等的内存块,这两个大小相等的内存块就处于伙伴关系。它满足 3 个条件 : 两个块具有相同大小记为 2^K 它们的物理地址是连续的 从同一个大块中拆分出来
2016-10-06 10:14:45
1696
转载 linux段页式内存管理技术
一、概述1.虚拟地址空间内存是通过指针寻址的,因而CPU的字长决定了CPU所能管理的地址空间的大小,该地址空间就被称为虚拟地址空间,因此32位CPU的虚拟地址空间大小为4G,这和实际的物理内存数量无关。Linux内核将虚拟地址空间分成了两部分:一部分是用户进程可用的,这部分地址是地址空间的低地址部分,从0到TASK_SIZE,称为用户空间一部分是由内核保留使用的,这部分地址
2016-10-06 10:12:10
3917
原创 快速区分集线器、交换机、路由器、网桥、网关
集线器(HUB) 集线器就是将网线集中到一起的机器,也就是多台主机和设备的连接器。集线器的基本功能是信息分发,它把一个端口接收的所有信号向所有端口分发出去。一些集线器在分发之前将弱信号重新生成,一些集线器整理信号的时序以提供所有端口间的同步数据通信。集线器在OSI/RM中的物理层。 集线器的工作原理很简单,比如有一个具备8个端口的集线器,共连接了8台电脑。集线器处于网络的“中心”,
2016-08-25 11:34:14
1001
转载 nandflash启动 和 norflash启动
S3C2440的启动时读取的第一条指令是在 0x00 上,分为成 nand flash 和 nor flash 上启动。 nand flash:适合大容量数据存储,类似硬盘; nor flash:适合小容量的程序或数据存储,类似小硬盘; sdram:主要用于程序执行时的程序存储、执行或计算,类似内存。 Nor
2016-08-25 10:36:46
479
转载 C++ 模板详解
1. 模板的概念 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。//函数1.int max(int x,int y);{ return(x>y)?x:y ;}//函数2.flo
2016-08-22 11:44:51
610
转载 虚拟内存与物理内存的区别
第一层理解 1.每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构 2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,
2016-08-22 10:00:50
3522
原创 new/delete 与 malloc/free 的区别
在 C++ 中,申请动态内存与释放动态内存,用 new / delete 与 malloc / free 都可以,而且它们的存储方式都相同,new / malloc 动态申请的内存都位于堆中,无法被操作系统自动回收,需要对应的 delete / free 来释放空间,同时对于一般的数据类型,如 int、char型,它们的效果都是一样的。 malloc / free 是 C /
2016-08-22 09:53:06
373
原创 浅谈缓冲区溢出问题
缓冲区:程序运行时机器内存中的一块连续块,保存了给定类型的数据,随着动态分配变量出现问题。 缓冲区溢出:当缓冲区内填充数据位数超过了缓冲区自身的容量限制时,发生溢出的数据会覆盖在合法数据(数据、下一指令的指针、函数返回地址等)上的情况。最好的情况是程序不允许输入超过缓冲区长度的字符并检查数据长度,由于大多数程序都会假设数据长度总是与所分配的储存空间相当,进而存在缓冲区溢出隐患
2016-08-18 22:49:02
1600
原创 浅谈内存泄漏与内存溢出的区别?
内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用,出现内存溢出; 内存泄露:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 内存泄露会最终会导致内存溢出! 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却
2016-08-18 21:50:31
452
原创 前置运算符与后置运算符的区别
前置运算符:先取变量的地址,运算它的内容,然后把值放到寄存器中。后置运算符:先取变量的地址,把它的值装入寄存器中,在运算它内存中的内容。简而言之:前置是先算后用,后置是先用后算;#includeint main(){ int a,b,c,d; a = 10; b = a++; c = ++a; d = 10 * a++;
2016-08-15 10:44:40
6645
原创 详解 C/C++中 extern 关键字
1 定义: extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。问题1 : extern + 变量 在一个源文件里定义了一个数组:char a[5]; 在另外一个文件里用下列语句进行了声明:extern char *a;请问,这样可以吗? 答案与分析: 1
2016-08-15 10:18:22
895
原创 进程间通信机制有哪些?
进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 2.信号(signal): 信号量是一个计数器,可以用来控制多
2016-08-14 20:09:05
11196
转载 Sizeof与Strlen的区别与联系
一、sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所
2016-08-14 14:33:39
339
原创 快速解析 递归与分治思想
分治思想: 斐波那契数列的迭代实现:(兔子繁殖问题) #include int main(){ int i; int a[40]; a[0] = 0; a[1] = 1; for(i = 2; i 40; i++) { a[i] = a[i - 1] + a[i - 2]; printf("%d",
2016-08-14 12:36:06
999
原创 快速解析 栈和队列
栈: 定义: 后进先出的线性表,只能在表尾进行删除和插入操作 ——表尾:栈顶(top), 表头:栈底(bottom) 栈的顺序存储结构: typedef struct{ ElemType *base; ElemType *top; int stackSize;}s
2016-08-14 12:32:22
863
原创 详述线性表(单链表,双链表,静态链表和循环链表)
线性表:由零个或多个数据元素组成的有限序列。 关键点:有限序列第一个元素有且仅有一个前驱结点,最后一个与元素有且仅有一个后继结点,中间元素有一个前驱结点和一个后继结点线性表可以有零个数据元素,称作空表线性表分为顺序存储结构和链式存储结构顺序存储结构: 用一段地址连续的存储空间依次存储线性表中的数据结构 物理关系上:
2016-08-14 12:29:36
3578
原创 快速解析数据结构
数据结构:程序设计 = 数据结构 + 算法;数据结构分为:逻辑结构 和 物理结构逻辑结构:数据对象中元素间的对应关系物理结构:数据在计算机中的存储形式逻辑结构:集合结构:同属于同一集合,并没有其他关系线性结构:数据元素之间一对一的关系树形结构:数据元素之间一对多的关系图形结构:数据元素之间多对多的关系物理结构:顺序结构:把
2016-08-14 11:53:18
496
转载 Shell常用命令整理大全
1、 ls: 类似于dos下的dir命令ls最常用的参数有三个: -a -l -F。ls –aLinux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示一般文件名外,连隐藏文件也会显示出来。ls –l该参数显示更详细的文件信息。ls –F使用这个参数表示在文件的后面多添加表示文件类型的符号,例如 * 表示可执行,/ 表示目
2016-08-14 11:44:08
431
转载 linux 进程内存解析
之前我所了解的linux下进程的地址空间的布局的知识,是从APUE第2版的P430得来的,之后上网查了一些资料,大概弄了明白。一个linux进程分为几个部分(从一个进程的地址空间的低地址向高地址增长):1.text段,就是存放代码,可读可执行不可写,也称为正文段,代码段。2.data段,存放已初始化的全局变量和已初始化的static变量(不管是局部static变量还是全局static变量)
2016-08-14 11:27:32
288
原创 快速区分 malloc calloc realloc
malloc: malloc() 在内存的动态存储区中分配一块长度为size字节的连续区域。参数size为需要的内存空间的长度,返回该区域的地址 用法:char *pt = (char *)malloc(sizeof(char *));relloc: calloc()与 malloc() 相似,参数sizeofE
2016-08-14 10:05:14
286
原创 快速搞懂 ”ld“ ——链接器
链接器的功能:将一个可执行程序所需的目标文件和库最终整合在一起。 一个程序包含三个段:.text 、.data 和 .bss 段。 而各目标文件和库都包含这三段,所以,ld 链接器的功能就是将各个目标文件和库的三段合并在一起。 当然,链接器所完成的链接工作并非只是简单地将各个目标文件和库的三段内存堆砌在一起,而是还要完成 “重定位” 的工作。
2016-07-22 13:33:05
11458
5
原创 字节序与边界对齐
字节序: 32位处理器每次处理 4 个字节。 当数据类型大于1个字节时,其在内存中的顺序存在两种模式: (1)小端:低字节放在低地址 (2)大端:低字节放在高地址边界对齐: 边界对齐是处理器为了提高处理性能而对存取数据的起始地址所提出的一种要求。
2016-07-22 13:30:22
924
原创 快速编写“专家级”makefile(4.打造更专业的编译环境——改善编译效率)
对于大型项目,提高项目的编译速度有着非常重要的意义。 从 Makefile 中看,一个可以改善编译效率的地方与其中的隐式规则有关 隐式规则即:make 自带的编译规则,如生成 .o 文件的规则 %.o : %.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $^ 而我们在前面
2016-07-22 13:28:06
354
原创 快速编写“专家级”makefile(4.打造更专业的编译环境——管理对库的依赖关系)
对于前面的 Makefile , 当我们改动了 foo.c 文件时,会导致 libfoo.a 库的重新编译,但并没有使得 huge.exe 重新编译。原因是:我们只是指定了 huge.exe 生成时所需的库,并没有让 huge.exe 依赖于这些库文件,所以库文件的改动并不能使得 huge.exe 被重新编译 解决:前面提出, LINK_LIBS 已经指明了 huge.exe 生
2016-07-22 13:27:11
521
原创 快速编写“专家级”makefile(4.打造更专业的编译环境——增强可使用性)
从前面看来,为了编译 huge 项目需要进入不同的目录运行 make ,我们可以简化它: huge / build / Makefile.PHONY : all cleanROOT = $(realpath ..)DIRS = $(ROOT)/code/foo/src\ $(ROOT)/code/bar/src\ $(ROOT)/code/huge/srcRM =
2016-07-22 13:26:23
845
原创 快速编写“专家级”makefile(4.打造更专业的编译环境——实现库链接)
根据前面所运行结果,main.o 被正确地生成了,但在链接时因为找不到 foo() 函数的实现而出现错误。由于 foo() 函数的实现是放在 libfoo.a 库中的,而 Makefile 中并没有告诉编译器在生成 huge.exe 时需要与 libfoo.a 库链接在一起 huge / build / make.rule.PHONY : all cleanNKDIR
2016-07-22 13:25:30
424
原创 快速编写“专家级”makefile(4.打造更专业的编译环境——支持头文件目录的指定)
现将项目文件放入各目录中:huge / code / foo / inc / foo.h#ifndef __FOO_H#define __FOO_Hvoid foo();#endifhuge / code / foo / inc / foo.c#include #include "foo.h"void foo(){ printf("This is foo
2016-07-22 13:24:32
482
原创 快速编写“专家级”makefile(4.打造更专业的编译环境——增进复用性)
可以将共用部分放入一个独立的文件中——这就是 build 目录下的 make.rule 文件的作用 那么,在 foo 模块的 Makefile 中,哪些是不能共用的呢?变量 EXE 和 LIB 的定义对于每一个软件模块是不同的DIR_EXES 变量和 DIR_LIBS 变量由于运用了相对路径,所以也是每个模块特有的。但是可以采用绝对路径的方式解决这个问题。比如,可以定
2016-07-22 13:22:57
547
原创 快速编写“专家级”makefile(4.打造更专业的编译环境)
前面的 simple 和 complicated 项目都是采用了单一的目录结构,但大型的项目往往用多个目录来存放不同的模块。下面我们通过 huge 项目来模拟一个更加专业的编译环境。 下图说明了 huge 项目将采用的目录结构 从图中:huge 最上层有两个目录: build 和 codebuild 目录用于存放个 Makefile 文件间的共享文件
2016-07-22 13:21:33
606
原创 快速编写“专家级”makefile(3.提高编译环境的实用性)
首先创建一个 complicated 项目:complicated / foo.h#ifndef __FOO_H#define __FOO_Hvoid foo();#endifcomplicated / foo.c#include #include "foo.h"void foo(){ printf("This is foo ()!\n");}
2016-07-21 18:00:30
966
原创 快速编写“专家级”makefile(2.创建基本编译环境-使用功能”函数“)
1.abspath 功能:将 _names 中的各路径名转换成绝对路径 形式:$(abspath _names) 返回值:返回转换结果实例:.PHONY: allROOT:= $(abspath/usr/.../lib)all:@echo $(ROOT) 运行结果$make/
2016-07-21 17:59:04
943
原创 快速编写“专家级”makefile(2.创建基本编译环境)
一、运用规则:先来创建 simple 项目的两个源程序:foo.c#include void foo(){ printf("This is foo ()!\n");}main.c#include extern void foo();int main(){ foo(); return 0;} 对于项目,在编写 Makefil
2016-07-21 17:57:59
854
原创 快速编写“专家级”makefile(1.从最简单的Makefile中了解规则)
三个概念: 目标(target):指要干什么依赖关系(dependency):指目标所依赖的其他目标命令(command):指告诉 make 如何生成目标 规则的语法: targets:prerequisite command .... 第一个
2016-07-21 17:56:15
816
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人