最近更新

Android gRPC protobuf的compile&generate问题 2015-03-13

Android上使用gRPC时,proto的compile和generate不能用java的方法,要用javanano的,而在文档中并没有给出具体的 command line

我找了很久终于发现了一种方法

先用

protoc --proto_path="IMPORT_PATH" --javanano_out=ignore_services=true:"DST_DIR" "path/to/file.proto"    

生成 file.java 这是proto的类文件

再用(这里假设你在grpc-java的根目录下)

protoc --plugin=protoc-gen-java_rpc=compiler/build/binaries/java_pluginExecutable/java_plugin --java_rpc_out=nano=true:"$OUTPUT_FILE" --proto_path="$DIR_OF_PROTO_FILE" "$PROTO_FILE"

生成xxxGrpc.java 这是用于Client的interfaces

也可以将这两个合起来使用(““中为自己规定)

HITOSExperiment7-proc文件系统的实现 2014-11-30

实验内容

在Linux 0.11上实现procfs(proc文件系统)内的psinfo结点。当读取此结点的内容时,可得到系统当前所有进程的状态信息。例如,用cat命令显示/proc/psinfo的内容,可得到:


# cat /proc/psinfo
pid    state    father  counter start_time
0   1   -1  0   0
1   1   0   28  1
4   1   1   1   73
3   1   1   27  63
6   0   4   12  817
# cat /proc/hdinfo
total_blocks:62000;
free_blocks:39037;
used_blocks:22963;
total_inodes:20666;
…
#cat /prco/inodeinfo
inr:1;zone[0]:659
inr:2;zone[0]:xxxx
…
procfs及其结点要在内核启动时自动创建。相关功能实现在fs/proc.c文件内。

HITOSExperiment5-地址映射与共享 2014-11-16

实验内容

  1. 用Bochs调试工具跟踪Linux 0.11的地址翻译(地址映射)过程,了解IA-32和Linux 0.11的内存管理机制;
  2. 在Ubuntu上编写多进程的生产者—消费者程序,用共享内存做缓冲区;
  3. 在信号量实验的基础上,为Linux 0.11增加共享内存功能,并将生产者—消费者程序移植到Linux 0.11。

这次实验用到了实验4的代码,然后再加上两个系统调用

shmget的参数key和size就够了,不需要shmflag

shmat的参数shmid就可以

因为shm.c是在mm里写的,所以要改mm/makefile,改法和kernel里的一样

shmget的关键是get_free_page

shmat的关键是put_page,用从shmget中得到的物理地址和线性地址建立映射,具体请看虚拟内存的相关内容,

正常来说我们还需要写shmdt来释放共享内存 ,进程结束时,系统会自动检测进程中映射的共享内存并释放该映射,并将mam_map[]减一。 因为实验没要求,所以这里我们要改下mm/memory.c,把释放内存时的panic注释掉.

HITOSExperiment4-信号量的实现和应用 2014-11-09

实验内容

  1. 在Ubuntu下编写程序,用信号量解决生产者——消费者问题;
  2. 在0.11中实现信号量,用生产者—消费者程序检验之。

  这个实验其实没啥好说的,说简单一点不简单,说难其实也就那么回事,(内核代码一遍过,也是让我惊呆了)

  就说说几个需要注意的地方吧,剩下的看指导书和代码就行了

  1. 这个实验用到了实验二的东西,所以做之前建议复习下实验二

  2. 写pc.c时,如果对缓冲区使用到in,out指针(自定义)的话,要注意out指针是由所有的消费者共享的,因为子进程继承父进程的全局变量是通过复制,所以子进程修改后的只对自己这一支有效,所以我们要想办法让所有进程共享相同的out指针,怎么做呢?我是通过把它写到缓冲区的第10个单元,每次消费者操作时先把它读出来,然后结束时把改变的out再写回去.

  3. 内核代码最关键的是sem_t的结构怎么实现,下面是我的实现

    
    /**

    • in unistd.h
    • sem struct */

HITOSExperiment3-进程运行轨迹的跟踪与统计 2014-10-23

实验内容

  进程从创建(Linux下调用fork())到结束的整个过程就是进程的生命期,进程在其生命期中的运行轨迹实际上就表现为进程状态的多次切换,如进程创建以后会成为就绪态;当该进程被调度以后会切换到运行态;在运行的过程中如果启动了一个文件读写操作,操作系统会将该进程切换到阻塞态(等待态)从而让出CPU;当文件读写完毕以后,操作系统会在将其切换成就绪态,等待进程调度算法来调度该进程执行……

本次实验包括如下内容:

  1. 基于模板“process.c”编写多进程的样本程序,实现如下功能: 所有子进程都并行运行,每个子进程的实际运行时间一般不超过30秒; 父进程向标准输出打印所有子进程的id,并在所有子进程都退出后才退出;

  2. 在Linux 0.11上实现进程运行轨迹的跟踪。基本任务是在内核中维护一个日志文件/var/process.log,把从操作系统启动到系统关机过程中所有进程的运行轨迹都记录在这一log文件中。

  3. 在修改过的0.11上运行样本程序,通过分析log文件,统计该程序建立的所有进程的等待时间、完成时间(周转时间)和运行时间,然后计算平均等待时间,平均完成时间和吞吐量。可以自己编写统计程序,也可以使用python脚本程序—— stat_log.py ——进行统计。

  4. 修改0.11进程调度的时间片,然后再运行同样的样本程序,统计同样的时间数据,和原有的情况对比,体会不同时间片带来的差异。

1

K近邻算法之局部敏感哈希 2014-10-08

问题背景

  KNN 算法,即 K 最近邻算法,是模式识别中一种最基本的用于分类与回归的非参方法。

  KNN 算法的核心思想是如果一个样本在特征空间中的 K 个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN 方法在类别决策时,只与极少量的相邻样本有关。由于 KNN 方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集 来说,KNN 方法较其他方法更为适合。

  KNN 问题最主要的难点在于,在输入数据规模较大(N 较大)的情况下,朴素的线性查找算法变得难以接受。为此,学界主要提出两种不同的改进思路:空间划分和哈希。

  这里我们重点了解下局部敏感哈希。

局部敏感哈希

  Indyk(1998) 最早提出了局部敏感哈希算法,为了解决所谓的“高维诅咒”给空间划分方法带来的优化难题。

  1.基本原理

  我们知道,通过建立 hash table 的方式我们能够得到 O(1)的查找时间性能,其中关键在于选取一个 hash function,将原始数据映射到相对应的桶内(bucket, hash bin),例如对数据求模:h = x mod w,w 通常为一个素数。在对数据集进行 hash 的过程中,会发生不同的数据被映射到了同一个桶中(即发生了冲突 collision),这一般通过再次哈希将数据映射到其他空桶内来解决。这是普通 hash 方法或者叫传统 hash 方法,其与 LSH 有些不同之处。

HITOSExperiment2-系统调用 2014-09-28

##实验内容##

此次实验的基本内容是:在Linux 0.11上添加两个系统调用,并编写两个简单的应用程序测试它们。

####iam()####

第一个系统调用是iam(),其原型为:

int iam(const char * name); 完成的功能是将字符串参数name的内容拷贝到内核中保存下来。要求name的长度不能超过23个字符。返回值是拷贝的字符数。如果name的字符个数超过了23,则返回“-1”,并置errno为EINVAL。

在kernal/who.c中实现此系统调用。

####whoami()####

第二个系统调用是whoami(),其原型为:

int whoami(char* name, unsigned int size); 它将内核中由iam()保存的名字拷贝到name指向的用户地址空间中,同时确保不会对name越界访存(name的大小由size说明)。返回值是拷贝的字符数。如果size小于需要的空间,则返回“-1”,并置errno为EINVAL。

HITOSExperiment1-操作系统的引导 2014-09-27

##实验内容##

改写bootsect.s主要完成如下功能:

  1. bootsect.s能在屏幕上打印一段提示信息“XXX is booting…”,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等(可以上论坛上秀秀谁的OS名字最帅,也可以显示一个特色logo,以表示自己操作系统的与众不同。)

改写setup.s主要完成如下功能:

  1. bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s向屏幕输出一行”Now we are in SETUP”。
  2. setup.s能获取至少一个基本的硬件参数(如内存参数、显卡参数、硬盘参数等),将其存放在内存的特定地址,并输出到屏幕上。
  3. setup.s不再加载Linux内核,保持上述信息显示在屏幕上即可。

####第一个非常简单,而且在实验指导书里写的很清楚了####


    ! 首先读入光标位置
    mov ah,#0x03
xor bh,bh int 0x10

抵巇--鬼谷子第四篇 2013-11-28

  本篇不像其他各篇,从一些微观和具体操作入手,这篇作者是站在一个宏观的角度,来对问题进行阐述和应对方法。

  巇,就是裂缝,抵巇就是通过抵御来使其得以恢复秩序,一种办法是弥补,另一种就是破而后立。这在古代确实是惊天之语。

  “经起秋毫之末,挥之于太山之本。“千里之堤,溃于蚁穴就是这个道理。“自天地之合离终始,必有巇隙,不可不察也”,切记切记,“察之以捭阖”,我们既要放宽心态,又要注意小心谨慎。

阴符经全文 2013-11-24

  第一次看到《阴符经》是在《大秦帝国-国命纵横》,当时觉得读起来特别有感觉,所以就摘录了下来,早读的时候没事干就背了下来,其实当时只是隐隐约约明白一点,然后想彻底的了解,但是到图书馆找没有相关的书籍,而且当时是寄宿在学校,上网也不是很方便,久而久之也就忘了这回事,后来无一中在南怀瑾的《老子他说》中又看到了,就到网上搜了下,发现以前在《大秦帝国》上竟然引用的是全文!!(我一直以为是片段),顿时觉得这本书不可不读,就买了本《阴符经集释》,因为前一段时间比较忙,也没有怎么看,前几天中午的时候闲来没事,随手翻了翻,就被其吸引了。

  这里我就先默写一遍,以表对其的尊重。

  观天之道,执天之行,尽矣。天有五贼,见之者昌。五贼在心,施行于天,宇宙在乎手,万化生乎身。
  天性,人也;人心,机也。立天之道,以定人也。
  天发杀机,移星易宿;地发杀机,龙蛇起路;人发杀机,天地反覆;天人合发,万化定基。
  性有巧拙,可以伏藏。九窍之邪,在乎三要,可以动静。火生于木,祸发必克;奸生于国,时动必溃。知之修炼,谓之圣人。
  天生天杀,道之理也。天地,万物之盗;万物,人之盗。三盗既宜,三才既安。故曰:食其时,百骸理;动其机,万化安。人知其神之神,不知不神之所以神也。日月有数,大小有定,圣功生焉,神明出焉。其盗机也,天下莫能见,莫能知。君子得之固躬,小人得之轻命。
  瞽者善听,聋者善视。绝利一源,用师十倍;三反昼夜,用师万倍。心生于物,死于物,机在目。天之无恩而大恩生,雷厉风行,莫不蠢然。
  至乐性馀,至静则廉。天之至私,用之至公。禽之制在炁。死者生之根,生者死之根。恩生于害,害生于恩。愚人以天地文理圣,我义时物文理哲。
  人以愚虞圣,我以不愚虞圣。人以奇期圣,我以不奇期圣。故曰:沉水入火,自取灭亡。自然之道静,故天地万物生。天地之道浸,故阴阳胜。阴阳相推,而变化顺矣。
  是故圣人知自然之道不可违,因而制之。至静之道,律历所不能契。爰有奇器,是生万象,八卦甲子,神机鬼藏。阴阳相胜之术,昭昭乎进乎象矣。