2016年3月1日
摘要: 最近在看google那篇经典的MapReduce论文,中文版可以参考孟岩推荐的 mapreduce 中文版 中文翻译 论文中提到,MapReduce的编程模型就是: 计算利用一个输入key/value对集,来产生一个输出key/value对集.MapReduce库的用户用两个函数表达这个计算:map和reduce. 用户自定义的map函数,接受一个输入对,然后产生一个中间key/v... 阅读全文
posted @ 2016-03-01 21:13 inevermore 阅读(4111) 评论(0) 推荐(0) 编辑
  2015年12月31日
摘要: async意味着异步执行代码,看如下示例: #include #include #include #include #include #include using namespace std; int do_something(char c) { std::default_random_engine dre(c); std::uniform_int_dist... 阅读全文
posted @ 2015-12-31 21:11 inevermore 阅读(2405) 评论(0) 推荐(0) 编辑
  2015年7月4日
摘要: 首先看下面的代码:```python# coding: utf-8class Test(object): passprint Test.__class__ # typeprint Test.__base__ # objectt = Test()print t.__class__ ... 阅读全文
posted @ 2015-07-04 00:37 inevermore 阅读(370) 评论(0) 推荐(0) 编辑
  2015年4月19日
摘要: ###exec本节我们分析exec系统调用的执行过程。 exec一般和fork调用,常规用法是fork出一个子进程,然后在子进程中执行exec,替换为新的代码。###do_exec跟上次的fork类似,这里我们查看do_exec函数。```cint do_execve(struct filenam... 阅读全文
posted @ 2015-04-19 12:46 inevermore 阅读(1736) 评论(0) 推荐(0) 编辑
  2015年4月12日
摘要: ###进程创建Linux中创建进程一共有三个函数: 1. fork,创建子进程 2. vfork,与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行。 3. clone,主要用于创建线程这里值得注意的是,Linux中得线程是通过模拟进程实现的,较新的内核使用的线程库一般都是NPTL。... 阅读全文
posted @ 2015-04-12 21:34 inevermore 阅读(1130) 评论(0) 推荐(0) 编辑
  2015年4月5日
摘要: #分析system_call中断处理过程上周我们使用gcc内嵌汇编调用系统调用,这次我们具体分析下过程。###将getpid嵌入menuos代码从github下载,步骤如下: 1. 增加一个函数,getpid 2. 在main中添加MenuConfig("getpid","Show Pid", G... 阅读全文
posted @ 2015-04-05 22:26 inevermore 阅读(456) 评论(0) 推荐(0) 编辑
摘要: #muduo库的简单使用muduo是一个基于事件驱动的非阻塞网络库,采用C++和Boost库编写。 它的使用方法很简单,参考这篇文章:[TCP网络编程本质论](http://blog.csdn.net/Solstice/article/details/6171831#t0)里面有这么几句: 我认为... 阅读全文
posted @ 2015-04-05 00:28 inevermore 阅读(5122) 评论(5) 推荐(0) 编辑
  2015年4月4日
摘要: 我们先用C语言写一个交换两个数的代码:```Cvoid swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}int main(void){ int x = 12; int y = 34; swap(&a... 阅读全文
posted @ 2015-04-04 23:02 inevermore 阅读(1625) 评论(0) 推荐(0) 编辑
  2015年3月28日
摘要: 本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call。 系统调用其实就是操作系统提供的服务。我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量打印在屏幕上,就必须调用printf,而printf这个函数内部就使用了write这个系统调用。... 阅读全文
posted @ 2015-03-28 16:29 inevermore 阅读(828) 评论(0) 推荐(0) 编辑
  2015年3月22日
摘要: 环境搭建环境的搭建参考课件,主要就是编译内核源码和生成镜像start_kernel从start_kernel开始,才真正进入了Linux内核的启动过程。我们可以把start_kernel看做平时用C编程时的main函数。在平时应用程序编程中,main函数并不是一开始就启动的,而是先使用汇编和C准备一... 阅读全文
posted @ 2015-03-22 17:04 inevermore 阅读(935) 评论(0) 推荐(0) 编辑
  2015年3月18日
摘要: 之前在公司的一个模块,需要从另一处url取得数据,我使用了Python的一个很著名的lib,叫做requests。但是这样做极大的降低了程序的性能,因为tornado是单线程的,它使用了所谓的reactor模式,底层使用epoll监听每个tcp连接,上层再经过封装,接受HTTP请求。所以,tornad实际上是单线程的。 在实际的场景中,经常采用nginx反向代理的模式,然后服务器开启多个torn... 阅读全文
posted @ 2015-03-18 21:17 inevermore 阅读(952) 评论(0) 推荐(1) 编辑
  2015年3月14日
摘要: ###1.环境的搭建:这个可以参考孟宁老师的github:[mykernel](https://github.com/mengning/mykernel),这里不再进行赘述。主要是就是下载Linux3.9的代码,然后安装孟宁老师编写的patch,最后进行编译。###2.代码的解读课上的代码全部保存在... 阅读全文
posted @ 2015-03-14 18:19 inevermore 阅读(1763) 评论(2) 推荐(0) 编辑
  2015年3月8日
摘要: ###署名信息 郭春阳 原创作品转载请注明出处 :《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ###C源码这里为了防止重复,修改了部分源码```Cint g(int x){ return x + 99;}in... 阅读全文
posted @ 2015-03-08 00:04 inevermore 阅读(337) 评论(0) 推荐(0) 编辑
  2015年2月9日
摘要: 最近在公司做了微信支付的接入,这里总结下开发的一些经验 注意,我使用的是微信开放平台的支付,与手机app相关,而与公众账号无关。 微信支付的主要操作流程 1.用户浏览app,选定商品然后下单。 2.服务器处理订单逻辑,开始正式发起支付流程 3.首先,后台服务器向weixin服务器发起请求,获取一个token。 4.后台服务器拿到token,使用和其他参数加密,再... 阅读全文
posted @ 2015-02-09 23:19 inevermore 阅读(1853) 评论(0) 推荐(1) 编辑
摘要: 加法在多线程下是否可靠? 我们先看下面的实例: #include #include #include #include #include #include using namespace std; int g_count = 0; int main(int argc, const char *argv[]) { vector> ths; for ... 阅读全文
posted @ 2015-02-09 21:41 inevermore 阅读(1062) 评论(0) 推荐(0) 编辑
摘要: 这里记录一下。 之前在mac下使用brew install mysql安装,但是安装完成后发现密码不好修改,上网搜了下发现mac下使用命令行安装mysql确实存在很多问题,这一点确实远不如Ubuntu方便。 网上建议的是去mysql官网下载,这里采用官方版本。 1.去mysql官网下载 http://dev.mysql.com/downloads/mysql/ 在这个页面下载,然后安... 阅读全文
posted @ 2015-02-09 21:30 inevermore 阅读(1506) 评论(0) 推荐(0) 编辑
  2015年1月14日
摘要: 上节提出了range和xrange的效率问题,这节我们来探究其中的原因 yield的使用 我们看下面的程序: #coding: utf-8 def test(): print 4 print 2 print 5 if __name__ == '__main__': test() 这段代码的运行结果当然是没有任何疑问的。 但是如果... 阅读全文
posted @ 2015-01-14 22:03 inevermore 阅读(565) 评论(4) 推荐(0) 编辑
  2015年1月12日
摘要: 之前我们在一个用于统计函数调用消耗时间的装饰器中写了一个装饰器,用于统计函数调用时间。代码如下: from time import time from time import sleep def count_time(): def tmp(func): def wrapped(*args, **kargs): begin_time = ti... 阅读全文
posted @ 2015-01-12 21:34 inevermore 阅读(972) 评论(0) 推荐(0) 编辑
  2015年1月11日
摘要: 使用xrange 当我们获取某个数量的循环时,我们惯用的手法是for循环和range函数,例如: for i in range(10): print i 这里range(10)生成了一个长度为10的列表,内容为从0到9,所以这里的for循环实际上是在遍历其中的元素。 如果循环次数过大的时候,range要生成一个巨大的列表,这将导致程序的性能降低。 解决方案是采用xr... 阅读全文
posted @ 2015-01-11 19:04 inevermore 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 对于一个列表,a = [1, 2, 3, 4],我们最常见的遍历方式就是: a = [1, 2, 3, 4] for item in a: print item 这里我们研究一种新的方式,就是迭代器。 在C++的STL中大量使用了迭代器,迭代器的作用当然就是遍历容器中的元素,而且他的好处就在于分离了容器的实现和遍历操作,不管我们使用什么类型的容器,使用迭代器的操作几乎是如出一... 阅读全文
posted @ 2015-01-11 17:42 inevermore 阅读(643) 评论(0) 推荐(0) 编辑