2013年2月22日
摘要: #include <stdio.h>void heapify(int* intp, unsigned idx, unsigned nr){ unsigned j = idx; while (1) { unsigned i = idx * 2 + 1; if (nr > i && intp[i] > intp[j]) { j = i; } ++i; if (nr > i && intp[i] > intp[j]) { j = i; } ... 阅读全文
posted @ 2013-02-22 15:43 zylthinking 阅读(187) 评论(0) 推荐(0) 编辑
  2013年2月18日
摘要: 算法导论题目: 设 A[0...N] 数组, 若 i < j 且 A[i] > A[j] 则称 (i, j) 为一个逆序对, 给出一个算法, 在最坏 O(nlgn) 的运行时间, 得到任意数组的逆序对个数。#include <stdio.h>#include <stdlib.h>#include <string.h>int merge(int* intp, int a, int b, int c){ int n = c - a; int* p = (int *) malloc(sizeof(int) * n); if (p == NULL) { 阅读全文
posted @ 2013-02-18 16:25 zylthinking 阅读(191) 评论(0) 推荐(0) 编辑
  2013年2月8日
摘要: 转载 ARM流水线 2011-10-09 16:17:09 转载 ARM流水线 转载 ARM流水线 标签:休闲 职场 流水线 流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。ARM7处理器核使用了典型三级流水线的冯·诺伊曼结 阅读全文
posted @ 2013-02-08 00:30 zylthinking 阅读(726) 评论(0) 推荐(0) 编辑
  2013年2月6日
摘要: 上一次分析了 classic rcu 在 2.6.28.3 中的实现, 根据它的原理, 在用户空间实现了一份, 性能应该不如内核 rcu, 但整体来讲, 应该比基于锁总线而实现的读写锁要效率高一些。#ifndef rcu_h#define rcu_h#include "list_head.h"struct rcu { int lck; int zombie; struct list_head sync, async, nxtlist, entry; unsigned int nr; int* tlsp; int* intp; int* refp; ... 阅读全文
posted @ 2013-02-06 13:09 zylthinking 阅读(672) 评论(0) 推荐(0) 编辑
  2013年2月5日
摘要: 看的是 2.6.18.3 版本的 rcu 代码, 这个版本其实还没有区分什么 tiny rcu, preempt rcu, 这些都出现在以后的版本, 之所以选择这个, 完全是因为刚开始看 rcu 时搜索到的网文引用的代码是这个版本的, 而且也算是早期的实现, 代码比较少, 容易看清脉络。 rcu 的原理大概就相当于一个读写锁, 不同的是实现方式: rcu 要求被读的数据被一个指针指向, 读者先读这个指针, 而后读指针指向的数据; 写者也先读这个指针及其数据, 不同的是它而后分配出一块新内存, 做一次拷贝, 而后修改在这个拷贝上进行, 等修改完毕, 将指针指向这块新内存;而后将旧内存释放掉。.. 阅读全文
posted @ 2013-02-05 17:27 zylthinking 阅读(983) 评论(0) 推荐(0) 编辑
  2013年1月31日
摘要: 本来想翻译一篇国外的文章, 因为不得不说他比我会写多了, 但貌似高质量的文章背后是将一个问题尽量拖长, 像是写小说似的, 很多东西似乎和想要说的无关, 只是为了流畅易懂来的。 全部翻译下来, 太累了, 干脆摘抄部分关键段落, 剩下的自己写。 而且我也有我自己的理解, 英文全文链接在此:http://blog.chinaunix.net/uid-7190305-id-3014030.html。An interrupt source, fed into an 8259A, is known as an IRQ – Interrupt Request. An 8259A has 8IRQ inp.. 阅读全文
posted @ 2013-01-31 11:21 zylthinking 阅读(606) 评论(0) 推荐(0) 编辑
  2013年1月30日
摘要: 1. The interrupt flag (IF) of the 80x86 is reset eitherdirectly (e.g., by a "cli" instruction) or because aninterrupt handler is entered. In the latter case thecorresponding in-service (IS) bit of the 8259A is set(effectively blocking interrupts of lower priority).2. The 8259A receives an 阅读全文
posted @ 2013-01-30 15:23 zylthinking 阅读(851) 评论(0) 推荐(0) 编辑
  2013年1月16日
摘要: 681/* 682 * Get the lock to a page atomically. 683 */ 684struct page * __find_lock_page (struct address_space *mapping, 685 unsigned long offset, struct page **hash) 686{ 687 struct page *page; 688 689 /* 690 * We scan the hash list read-only. Ad... 阅读全文
posted @ 2013-01-16 16:03 zylthinking 阅读(1876) 评论(0) 推荐(0) 编辑
  2013年1月10日
摘要: do_mmap 函数自己本身并不真做 mmap, 它基本上只是检查参数, 准备必要的数据结构; 但这也不是没有可说的, 事实上, glibc 函数 mmap 的需要注意的点, 再这个函数里面还真有几个。先看 mmap 原型void* mmap(void* addr, sie_t length, int prot, int flags, int fd, offset_t offset)参数含义可以 man, 不多说, 单看几个prot | flags偏门组合:1. PROT_READ | MAP_SHARED这意思是, 我只读, 但别人的写得给我看到;那么这个和 PROT_READ | MAP_ 阅读全文
posted @ 2013-01-10 13:11 zylthinking 阅读(1460) 评论(0) 推荐(0) 编辑
  2013年1月7日
摘要: struct inode 里面有 15 个成员最为重要, 分成4类:1. 链表类,i_hash 将 inode 链接入 inode hashtable, 外部可以通过 super_block 指针与 ino 来找到这个 inodei_dentry 为 inode 的 dentry 链表表头, 从而一个 inode 可以在文件树中有多个硬链接i_list 将 inode 链接入 inode_used 链表2. 属性类i_ino, inode numberi_mode, 文件 RWX 属性及文件类型, 比如是否是文件夹, 普通文件, 或者设备文件等i_dev, inode 所在设备的设备号, 从 阅读全文
posted @ 2013-01-07 00:08 zylthinking 阅读(1415) 评论(1) 推荐(1) 编辑