摘要: 上学时学得《数据库系统概念》,一致似懂非懂,停留在定义和证明层面。最近在做项目,认真的了解了下数据库的范式问题,只有潜意识懂得了其原理和应用场合才能较快设计出合理的表。首先,明确概念如下:主码 也就是主键候选码 若关系中的某一属性组的值能唯一的标识一个元组,而其任何真子集都不能再标识,则... 阅读全文
posted @ 2014-08-30 20:50 aitao 阅读(4197) 评论(0) 推荐(0) 编辑
摘要: 空指针和传参问题1) 段错误。形参改为二级指针即可void GetMemory( char *p ){ p = (char *) malloc( 100 );}void Test( void ){char *str = NULL;GetMemory( str );strcpy( str, "hel... 阅读全文
posted @ 2014-07-11 12:21 aitao 阅读(724) 评论(0) 推荐(0) 编辑
摘要: 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:1、检查要访问的虚拟地址是否合法2、查找/分配一个物理页3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)4、建立映射关系(虚拟地址到物理地址)重新执行发生缺页中断的那条指令如果第3步,需要读取磁盘,那么这次缺页中断就是majfl... 阅读全文
posted @ 2014-07-02 18:13 aitao 阅读(19339) 评论(0) 推荐(4) 编辑
摘要: 使用的基本模板如下(参考APUE): signal代码序列如下, pthread_mutex_lock ... pthread_cond_signal pthread_mutex_unlock wait代码序列如下, while (1){ pthread_mutex_lock(&mutex); wh 阅读全文
posted @ 2014-07-02 14:00 aitao 阅读(1350) 评论(1) 推荐(0) 编辑
摘要: 基础知识 该命令的功能为逐行比较两个文本文件,列出其不同之处。它比comm命令完成更复杂的检查。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。 语法:diff [选项] file1 file2 说明:该命令告诉用户,为了使两个文件file1和file2... 阅读全文
posted @ 2014-06-20 14:32 aitao 阅读(517) 评论(1) 推荐(0) 编辑
摘要: 关于搞软体行业,到底要不要念大学,念硕士,念博士这件事,主观来说当然每个人都有他独特的经验可以分享。但是,仔细分析起来,这些不同经验,其实也没有衝突。我的看法是先搞清楚技术知识的类型与本质,接下来是想清楚自己到底想要过什麽样的人生,达成什麽样的目标。 这两个问题想清楚后,就会知道自己... 阅读全文
posted @ 2014-06-06 13:51 aitao 阅读(523) 评论(0) 推荐(0) 编辑
摘要: 1.unicode、gbk、gb2312、utf-8的关系http://www.pythonclub.org/python-basic/encode-detail这篇文章写的比较好,utf-8是unicode的一种实现方式,unicode、gbk、gb2312是编码字符集;2.python中的中文编... 阅读全文
posted @ 2014-06-05 14:55 aitao 阅读(51356) 评论(1) 推荐(1) 编辑
摘要: 本文主要为了记载用,详细解释请自己根据提示亲自画图操作下,切忌眼高手低。一、装满背包装满背包,要求最红认定最大val值的前提是——此刻背包刚好装满,仅从实现上看,和“可不满”背包的区别只是初始化方法不同。以0-1背包为例,V=10,N=3,c[]={3,4,5}, w={4,5,6}1)背包不一定装... 阅读全文
posted @ 2014-05-21 17:49 aitao 阅读(808) 评论(0) 推荐(0) 编辑
摘要: 说起共享内存,一般来说会让人想起下面一些方法:1、多线程。线程之间的内存都是共享的。更确切的说,属于同一进程的线程使用的是同一个地址空间,而不是在不同地址空间之间进行内存共享;2、父子进程间的内存共享。父进程以MAP_SHARED|MAP_ANONYMOUS选项mmap一块匿名内存,fork之后,其... 阅读全文
posted @ 2014-04-28 00:20 aitao 阅读(11373) 评论(0) 推荐(0) 编辑
摘要: 本文以32位机器为准,串讲一些内存管理的知识点。1. 虚拟地址、物理地址、逻辑地址、线性地址 虚拟地址又叫线性地址。linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻辑地址专指下文说的线性偏移前的地址)是一个概念。物理地址自不必提。内核的虚拟地址和物理地址,大部分只差... 阅读全文
posted @ 2014-04-28 00:16 aitao 阅读(61863) 评论(5) 推荐(19) 编辑
摘要: #include#include#include#includeint main(){char * str=(char *)malloc(20);char * p="0.0.0.1";struct sockaddr_in servaddr;bzero(&servaddr,sizeof(servadd... 阅读全文
posted @ 2014-04-23 17:20 aitao 阅读(2967) 评论(0) 推荐(1) 编辑
摘要: 首先从OS设计原理上阐明三种线程:内核线程、轻量级进程、用户线程内核线程内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Thread... 阅读全文
posted @ 2014-03-24 09:45 aitao 阅读(19305) 评论(2) 推荐(7) 编辑
摘要: memcached是一个开源的高性能分布式内存对象缓存系统。其实思想还是比较简单的,实现包括server端(memcached开源项目一般只单指server端)和client端两部分:server端本质是一个in-memory key-value store,通过在内存中维护一个大的hashmap用来存储小块的任意数据,对外通过统一的简单接口(memcached protocol)来提供操作。client端是一个library,负责处理memcached protocol的网络通信细节,与memcached server通信,针对各种语言的不同实现分装了易用的API实现了与不同语言平台的集成。 阅读全文
posted @ 2014-03-16 14:52 aitao 阅读(956) 评论(0) 推荐(0) 编辑
摘要: 这种问题比较锻炼思维,同时考察c和c++的掌握程度。如果你遇到过类似问题,此题意义自不必说。如果用c实现c++,主要解决如何实现封装,继承和多态三大问题,本文分两块说。1、封装// Example class A contains regular and // static member variables and methods.class A{private: int m_x; static int g_y; int m_z; // Should be invoked when the object ends void InformEnd();public: A(int ... 阅读全文
posted @ 2014-03-15 21:56 aitao 阅读(844) 评论(0) 推荐(0) 编辑
摘要: 刚入职场,很多事情忙不过来的时候就会感叹记忆力减退,但是似乎每天又都在学习新东西,那么记忆力到底是减退还是未减退? 这里分享一种乐观的观点:记忆力没减退,但是我们提取记忆的能力或者方法需要改进。打个比方,我们每天接触的信息反射给大脑,就好比存储在了硬盘,我们觉得记忆力减退,不是硬盘容量或者已存数据有损了,而是连接硬盘的线路断了,或者由于信息量太大,我们回忆起来很慢——好比硬盘IO带宽很低。是不是很新鲜? 下面分享9个经过本人加工整理的观点,他们来自加州大学洛杉矶分校记忆专家罗伯特.艾.布约克的有关著作。你一定会对论证观点时所涉及的事例感觉面熟! 1. 记忆不会衰退每个人都体验过想不起... 阅读全文
posted @ 2014-02-15 19:55 aitao 阅读(626) 评论(0) 推荐(0) 编辑
摘要: 首先,以java为例,说下gc的有向图回收机制1 引言 Java的一个重要优点就是通过垃圾收集器GC (Garbage Collection)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java 不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC 或JVM的问题。其实,这种想法是不正确的,因为Java 也存在内存泄漏,但它的表现与C++不同。如果正在开发的Java 代码要全天24 小时在服务器上运行,则内存漏洞在此处的影响就比在配置实用程序中的影响要大得多,即使最小的漏洞也会导致JVM耗尽全部可用内存。另外,在很多嵌入式系统中,内存的总量非常有 阅读全文
posted @ 2014-01-25 20:34 aitao 阅读(488) 评论(0) 推荐(0) 编辑
摘要: #include #include #include int main(void){ int i; for(i=0; i<2; i++){ fork(); printf("-"); } return 0;}输出结果不是6个减号,而是8个,如果你见过此题,当不足为奇。因为,子进程复制了父进程缓冲区——而由于printf没带\n,导致把一个咱的缓冲器给了后代,直到(子)进程结束时才把缓冲区所有内容一起打出来。为了简化问题,先修改printf语句为:printf("ppid=%d, pid=%d, i=%d \n", getppid(), getpid( 阅读全文
posted @ 2014-01-22 00:26 aitao 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 字符名数字名组合键ctrl+备注SIGTERM15kill的默认值,可以杀死后台进程SIGKILL9不可忽略,必杀技SIGTSTP20Z前台组全暂停(只是组合键方式吧),也可以暂停后台单个进程,可以捕捉或忽略SIGSTOP19同上,但不可捕捉或忽略SIGINT2C杀死前台进程组所有进程(kill方式貌似不可以),后台只能杀一个SIGQUIT3\类似INT,会在当前目录下生成core文件,可以杀死前台组所有进程SIGHUP1也可以发给后台进程全组 阅读全文
posted @ 2013-10-28 21:57 aitao 阅读(494) 评论(0) 推荐(0) 编辑
摘要: 强烈声明:关于对数字的比较以及判断是否为空 最好在外层添加""引起来,这样可以避免空与其他字符比较时报错的问题。1. 变量通过" "引号引起来 #!/bin/sh para1= if [ ! -n "$para1" ]; then echo "IS NULL" else echo "NOT NULL" fi2. 直接通过变量判断 #!/bin/sh para1= if [ ! $para1 ]; then echo "... 阅读全文
posted @ 2013-08-23 19:54 aitao 阅读(5576) 评论(0) 推荐(0) 编辑
摘要: 首先,大致说下U盾的工作流程。 你的数字证书有一对,一份在U盾里的私钥,一份在银行的公钥(其实两份银行都有)。U盾的原理很类似于双向认证的TLS(SSL)或者其它用到RSA的双向证书验证手段,以下步骤可能和U盾实际执行的有所区别,但本质相同: --银行先给你一个"冲击",它包含了随机数,以及该随机数HASH,它们都由公钥加密,这样就可以保证只有你能解密这个"冲击" --你计算该随机数的HASH,并和用私钥解出的HASH,两者相同后,便可确认银行的身份 --接下来,以一个只有你和银行知道的算法,利这个随机数和一些其它信息,生成"响应"和 阅读全文
posted @ 2013-01-27 15:37 aitao 阅读(12446) 评论(1) 推荐(0) 编辑