摘要: 刚才的标签对齐那片文章提到的关于调整两行之间的长度差的问题。0-1背包问题解决这个问题就很简单了:用其中的一些尽量去放满一半的总容量就好了。比较麻烦的一个问题是如何记录能达到最优情况的时候两行里面分别是什么?这个问题其实也是挺简单的,具体看下面的代码吧。#include <stdio.h>#include <math.h>#include <stdlib.h>#include <memory.h>#define MAX_NUM 40#define MAX_LEN 40#define MAX_CAP 2000int len[MAX_NUM];voi 阅读全文
posted @ 2011-09-22 22:06 GG大婶 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 在一些手机网站上面会有很多很多运营加上去的标签。有的时候把这些标签对其是一件比较繁琐的事情,下面的代码可以基本实现标签的对齐。其中MAX_LEN为屏幕宽度:#include <stdio.h>#include <stdlib.h>#include <memory.h>#include <math.h>#define MAX_LEN 40#define MAX_NUM 100struct str{ int len;//字符串长度 int next;//拉链表};str strs[MAX_NUM];int row[MAX_NUM], size[MAX 阅读全文
posted @ 2011-09-22 20:56 GG大婶 阅读(320) 评论(1) 推荐(0) 编辑
摘要: 普通文件的读写操作,样例如下:#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#include <sys/stat.h>int main(){ char buf[10]; int n, fd; struct stat file_stat; stat("test", &file_stat); printf("文件设备编号:%d\n", (int)file_stat.st_dev); prin 阅读全文
posted @ 2011-09-22 15:40 GG大婶 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 很久没有写东西了,这几天看了下以前看过的东西,然后下午看了下内核中PST的实现。因为在网上很少,也找不到什么权威的分析,所以这里的分析也不能保证是完全正确的。先看相关的结构体:下面是PST的根:struct prio_tree_root { struct prio_tree_node *prio_tree_node; unsigned short index_bits; unsigned short raw;};嵌入到vm_area_struct中的结构:struct raw_prio_tree_nod... 阅读全文
posted @ 2011-09-21 19:58 GG大婶 阅读(1491) 评论(0) 推荐(0) 编辑
摘要: shell程序中的操作默认都是字符串操作,在要运行数学运算符的时候可能得到意想不到的答案:var=1var=$var+1echo $varoutput:1+1从这个例子中可以看出shell字符串连接的操作,需要注意的是空格。在shell中可以使用let来指示下面是算术表达式:var=1let "var+=1"echo $varoutput:2这其中的let可以用(())代替,就像很多的循环中用法一样:var=1((var++))echo $varoutput:2还有一种写法:var=1var=$[$var+1]echo $varoutput:2使用expr,需要注意的是其中 阅读全文
posted @ 2011-09-13 16:42 GG大婶 阅读(501) 评论(0) 推荐(0) 编辑
摘要: 很久之前看过一个题目,当时没在意,昨天早上突然想起来,记录一下。题目的大概意思是:两男两女,各有不同性病,现只有两个安全套,要求每个男的都和每个女的发生性关系,且不互相传染病。问如何使用安全套?至于这个是不是哈佛的题目就不管了,现在也没想到更好的描述方法。就这个题目本身来说是很简单的,下面是解法(N代表男生,V代表女生):N1--T1+T2--V1(两个TT和在一起用);N1--T1--V2;N2--T2--V1;N2--T2+T1--V1(两个TT和在一起用)。 通过上面的过程就可以完成了,但是这是两个的情况,如果有N队男女的时候需要多少个?如果给了2N个TT,这个问题就很简单了,因为每.. 阅读全文
posted @ 2011-09-08 15:15 GG大婶 阅读(507) 评论(3) 推荐(0) 编辑
摘要: 在刚开始看的时候感觉缺页异常(这可是异常啊,搞Java的人表示对着个比较敏感)肯定是一些进程在搞鬼,看完才发现原来是内核在搞鬼,它是故意的!!!1、请求调页 请求调页是一种动态分配内存的策略,把页面的分配推迟到不能再迟的时候(不能再迟的时候就是进程要访问的时候)。为什么要这样呢?RAM一般情况下都是很宝贵的资源,而且进程在一段的运行时间段中一般不会访问到所有的地址空间,到时发现page不在就引发一个缺页异常。这样的话就以一个异常处理周期长度的时间换来更多的RAM去做更重要的事情。1.0、如何引起请求调页 在发生访问一个线性地址的时候发生了错误进入do_page_faule函数,在判断出【发生在 阅读全文
posted @ 2011-08-22 21:48 GG大婶 阅读(2280) 评论(0) 推荐(0) 编辑
摘要: 在进入正题之前先看看vmalloc是怎么申请内存的(虽然在前面的文章中已经说过了)。管理vmalloc分配空间用到的数据结构是vm_struct。首先用slab分配一个vm_struct实例,然后从vm_struct链表中找到一个合适的位置准备插入这个实例。这个实例只是用来管理这块内存的,那下面就开始申请这些内存,也就是一页一页地从buddy system中分配单页来填充一个page数组(这就是vmalloc分配得到的内存)。那怎么访问这些分配的内存呢?下面就逐层地建立pgd、pmd、pte结构中的值。释放vmalloc申请的空间的过程就是逆过来的。 下面进入正题! 在逐层建立pgd、pmd. 阅读全文
posted @ 2011-08-19 15:05 GG大婶 阅读(1848) 评论(1) 推荐(0) 编辑
摘要: 在实际需要某个虚拟内存区的数据之前,虚拟和物理内存之间的关联是不会建立的,我们就默认程序不着急用,先去处理认为重要的事情。如果要访问一个页面这而它却不在物理内存中,处理器自动引发一个缺页异常,内核必须处理此异常。这时需要考虑的几个问题是:1、出错地址有什么特点?2、出错的地址有相对应的现有映射吗?3、要怎样获取该区域的数据? 看过代码(还有网上关于这块的流程图)之后感觉实在太复杂了。处理缺页异常的函数是void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)下面就沿着这个函数开始看内核是怎么处理的. 阅读全文
posted @ 2011-08-18 18:09 GG大婶 阅读(2227) 评论(2) 推荐(0) 编辑
摘要: 管理用户虚拟地址空间的方法比内核地址空间复杂一些:每个应用程序都有自己的地址空间,与所有其他应用程序分开;地址空间巨大,只有很少的段可用于各个用户空间进程,这些段之间有一定的距离,内核需要有效的管理这些分配的段;内核无法信任用户程序,必须做检查;地址空间只有极少的一部分和物理页帧直接关联,不经常使用的部分只有在必要时与页帧关联。进程由不同长度的段组成用于不同的目的:当前运行代码的二进制代码段、程序使用的动态库的代码、全局变量和动态产生的数据的堆、用于保存局部变量和实现函数调用的栈、环境变量和命令行参数、文件内容。系统中的每个进程都用一个mm_struct结构来保存内存管理信息:struct m 阅读全文
posted @ 2011-08-15 22:23 GG大婶 阅读(2095) 评论(2) 推荐(1) 编辑