OpenStack Object Storage Essentials (1)

OpenStack Swift (1)

  • 第30页 Locating the Data
    所谓locating data其实就是分布式存储的基本问题--data placement。感觉可以在多花些篇幅介绍handoff机制、哈希环虚拟节点、虚拟节点和磁盘分配算法上。不过这本书是SwiftStack的人写的,其主要受众应该还是运维...

Docker开发实践 (1)

  • 第42页 3.4.2 镜像的分发
    用户名和密码通过哈希运算之后保存在auth字段 用户名和密码是通过base64保存,而不是哈希运算。base64就是明文,毫无安全性可言。 例如 eG14aWh1Ondob2FtaQ== 通过base64 decode出来就是 xmxihu:whoami。 你要说...

The Go Programming Language (27) 更多

  • 第323页 11.4 Benchmark Function
    这一节讲的benchmark都是micro benchmark。micro benchmark参考意义并不是很高,具体可以见我写的另一本书的一篇笔记:[https://book.douban.com/annotation/33251844/] (1回应)
  • 第313页 11.2.3 White-Box Testing
    这一节其实是讲如何做mock的。跟Java相比,Go的mock框架确实比较原始。Go常见的mock方法就是用用函数变量实现功能,在unit test中用fake函数代替函数变量。 这种方法不需要借助任何框架,但是如果要追求ut覆盖率...
  • 第277页 9.7 Concurrent Non-Blocking Cache
    非常好的演示了closed channel的妙用
  • 第265页 9.2 Mutual Exclusion: sync.Mutext
    Deposit tries to acquire the mutex lock a second time by cal ling mu.Lock(), but because mutex locks are not re-entrant—it’s not possible to lock a mutex that’s already locked—this leads to a d...
  • 第264页 9.2 Mutual Exclusion: sync.Mutext
    Where possible, use defer and let critical section s extend to the end of a function. 这就涉及到一个锁的粒度的问题,粒度大了,性能就下去了。标准库中不少锁都没有锁住整个函数
  • 第246页 8.7 Multiplexing with select
    select with default 用法:[https://gobyexample.com/non-blocking-channel-operations]
  • 第219页 8.1 Goroutines
    Other than by returning from main or exiting the program, there is no programmatic way for one goroutine to stop another, but as we will see later, there are ways to communicate with a goroutine to...
  • 第179页 7.3 Interface Satisfication
    Go 中 interface 跟 struct 是一种松耦合的关系,可以先有struct,再来用interface抽象操作
  • 第146页 5.8 Deferred Function Calls
    Deferred functions run after return statements have updated the function’s result variables. Because an anonymous function can access its enclosing function’s variables, including named results, ...
  • 第146页 5.8 Deferred Function Calls
    on entry 和 on exit 可以看做一种pattter了。例如衡量一个操作执行的时间
  • 第143页 5.7 Variadic Functions
    关于可变参数函数 1. 可变参数最少个数为0, 即不添加任何参数 2. 可变参数只能是最后一个参数 3. slice可以作为实参,但是array不行 package main import "fmt" func sum(vals ...int) int { total := 0 for _, ...
  • 第141页 5.6.1 Caveat: Capture Iteration Variables
    anonymous function和for循环的一个坑,不久前就踩过。使用情景是使用 [common pool]([https://github.com/jolestar/go-commons-pool]) 时,common pool接受函数来初始化,用for循环结果传递函数进去,结果是只有...
  • 第137页 5.6 Anonymous Functions
    anonymous function 也可以递归,只不过需要额外处理
  • 第107页 4.4.3 Struct Embedding and Anonymous Fields
    The answer has to do with methods. The shorthand notation used for selecting the fields of an embedded type woks for selecting its methods as well. In effect, the outer struct type gains not just t...
  • 第87页 4.2 Slices
    nil slice 的长度是0 package main import "fmt" func main() { var a []int fmt.Println(a == nil) // true fmt.Println(len(a)) // 0 b := make([]int, 0) fmt.Println(b == nil) // false fmt.Println(len(b))...
  • 第88页 4.2.1 The append Function
    slice并不是 copy on write 数据结构, append 一个slice会override underlying array的数据 package main import "fmt" func main() { a := [...]int{1, 2, 3, 4, 5, 6} b := a[:2] fmt.Println(a) // [1 2 3 4...
  • 第83页 4.1 Arrays
    Go 函数是pass by value的,传数组进去会先把数组复制一遍,返回数组也是copy一遍。 package main import "fmt" func inspectArray(nums [2]int) { nums[0] = 0xdeadbeef } func inspectSlice(nums []int) { nums...
  • 第83页 4.1 Arrays
    数组比较,跟Java差别忒大 package main import "fmt" func main() { a := [...]string{"hello", "world"} b := []string{"hello", "world"} c := [...]string{"hello", "world"} d := [...]string{"world", "hel...
  • 第82页 4.1 Arrays
    开眼界了,array和slice还可以这样初始化 package main import "fmt" func main() { syms := []string{2: "bar", 1: "foo"} fmt.Println(len(syms)) // 3 fmt.Println(syms) }
  • 第81页 4.1 Arrays
    array 类似于Java的array, slice类似于Java的ArrayList package main import "fmt" func main() { a := []string{"hello", "world"} // a slice b := [...]string{"HELLO", "WORLD"} // a array fmt.Printf("%T\...
  • 第78页 3.6.2 Untyped Constants
    The compiler represents these uncommitted constants with much greater numeric precision than values of basic types, and arithmetic on them is more precise than machine arithmetic; you may assume at...
  • 第57页 3.2 Floating-Point Numbers
    Inf 跟 NaN不一样,Inf可以比较 package main import ( "fmt" "math" ) func main() { var z float64 inf := 1 / z fmt.Println(inf == math.Inf(1)) // true }
  • 第52页 3.1 Integers
    The type rune is an synonym for int32 synonym 意味着 rune 跟 int32可以互用,例如 package main import "fmt" func echoRune(v rune) { fmt.Println(v) } func echoInt32(i int32) { fmt.Println(i) } func m...
  • 第44页 2.6.2 Package Initialization
    Any file may contain any number of functions whose declaration is just func init() {} init 函数可以有任意个,例如 package main import "fmt" var jeff string var bob string func init() { jeff = "Jeff...
  • 第32页 2.3.2 Pointers
    It perfectly safe for a function to return the address of a local variable 在Go中,return local pointer是很常见的,NewXXX 函数基本都是这一类型的,在C中这个是不允许的。关于这个话题,这篇blog有更详细...
  • 第30页 2.3 Variables
    if the expression is omitted, the initial value is the zero value for this type Golang的zero value是一个比较特别的概念。 在Java中,默认初始值只有primitive type会被设置为例如 0, false, 其它 non-pri...
  • 第9页 1.3 Finding Duplicate Lines
    It is not a problem if the map doesn't yet contain that key 不需要再写类似以下的代码了 if _, ok := counts["foobar"]; !ok { counts["foobar"] = 0 }

UNIX Internals (28) 更多

  • 第541页 16.8.3 Dynamic Loading and Unloading
    SVR4 应该算是第一个现代操作系统了吧,Virtual Memory, COW, VFS, 再加上这个动态加载,现在在Linux还在用这些技术
  • 第522页 16.4.2 Device Files
    The <major, minor> pair provides a simple and effective device name space for the kernel. At the user level, however, it is quite unusable: users do not wish to remember a pair of numbers for...
  • 第437页 14.1 Motivation
    In SunOS 4.0, Sun Microsystems introduced a memory management architecture called VM (for Virtual Memory). The previous versions of SunOS were based on the BSD memory management model, which had al...
  • 第466页 14.10 Analysis
    On one hand, it seems more complex, with a greater number of basic abstractions and data structures. On the other hand, the separation of responsibility within the different layers results in clean...
  • 第460页 14.8.1 Vnode Interface Changes
    The VM architecture relegates all file system specific details to the vnode layer, accessing files solely through the procedural interface of the vnode. To enable this, SVR4 adds three operations t...
  • 第439页 14.2 Memory-Mapped Files
    What happens when a process writes to a mapped page? A process may establish two types of mappings to files--shared and private. For a shared mapping, modifications are made to the mapped object it...
  • 第453页 14.7.2 anonymous page handling
    When a process first writes to a page that is mapped MAP_PRIVATE either to a file or to the anonymous object. This includes dirty pages of text, data, stack, and other explicitly created private ma...
  • 第288页 9.13 Summary
    实现一个UNIX文件系统,主要考虑这些问题 1. 设计 super block, inode 数据结构 2. 如何 分配/释放 inodes ? 3. 如何 分配/释放 free blocks ? 4. directory如何实现? 5. 如何实现 vop接口的各种操作 (1)...
  • 第1页 1 Introduction
    一张图看懂UNIX的发展史 清晰版下载: [https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Unix_history-simple.svg/2000px-Unix_history-simple.svg.png] 这么复杂的发展史可以看出为什么会有所谓的UN...
  • 第266页 9.2.3 The Superblock
    Free blocks list Free inodes list 跟 ext2 的bitmap有什么不同?
  • 第263页 9.2 The System V File System(s5fs)
    Following the superblock is the node list... 关于磁盘上的inode: 1. inode list 不是链表,而是一个数组 2. 每个inode大小为64 bytes。在Linux的Ext2上的,inode的大小是128 byte 3. inode list数组的大小在...
  • 第283页 The Translucent File System
    这个文件系统是一个UnionFS(docker一开始采用的技术),由SUN发明,主要用于程序员管理代码,可以在不通过复制代码就能保证每个人都拥有自己的版本,配合外部提供的工具可以使用某一个版本。 听起来是不是很熟悉...
  • 第257页 8.11.3 the OSF/1 Approach
    OSF/1 是 DEC的UNIX实现,基于Mach内核,这个系统后来演变成DEC的Digital UNIX, Tru64 UNIX, DEC还发布过另一个基于BSD的UNIX系统 —— Ultrix。 DEC真是一个伟大的公司,尽管不是UNIX的发明者,但是最初的UNIX...
  • 第256页 8.11.2 The 4.4BSD model
    Sometimes, after lookup completes, the kernel might decide not to proceed with the creation or deletion (perhaps because the caller does not have adequate permissions). In that case, it mustinvoke ...
  • 第257页 8.12 Summary
    尽管大多数OS都能遵循VFS的基本原则,但是实现上不同的OS还是有很大的差异。例如SVR4, BSD和OSF/1, 当然本书出版与1994年,不知现在Solaris, BSD和Linux是否统一了实现,还是依然有个字的实现?
  • 第226页 File Descriptors
    A process may pass a file descriptor to another unrelated process The interface for descriptor passing depends on the UNIX variant...4.3 BSD uses sendmsg and recvmsg calls to a socket connection. 1...
  • 第228页 8.2.6 File Locking
    4BSD provides the flock system call, which only supports advisory locking of open files, but allows both shared and exclusive locks Linux 同时支持 advisory 和 mandatory lock
  • 第227页 8.2.4 File I/O
    read, write 进行硬盘实际操作之前是否需要进行user space 内存到kernel space内存的拷贝?
  • 第225页 8.2.3 File Descriptors
    file descriptors, file descriptions 跟 inode的关系在 The linux programming interface ([http://book.douban.com/subject/4292217/]) 5.4 Relationship Between File Descriptors and Open Files 有详细说明
  • 第211页 7.10.2 Recursive Locks
    recursive locks 在java中叫 reentrant lock, Java的lock是recursive的,而Go则不是
  • 第195页 7.7.3 Blocking Locks
    所谓的blocking locks就是user space常见的那种lock,跟spin lock相对应的。本书是先讲spin lock,再讲blocking lock, 其实我们一般都是先接触blocking lock, 如果不深入kernel space,一般人也不会接触到spin lock
  • 第202页 7.6.1 Use of Spin Lock
    spin lock 主要是为了减少 context switch. 以前一直以为spin lock是 Linux特有的,原来也是操作系统的基本设计原理。 Rule NO. 1: threads never relinquish control of the CPU while holding a spin lock. 为...
  • 第201页 7.5.5 Convoys
    Semaphores V.S. Mutex ( [http://stackoverflow.com/questions/62814/difference-between-binary-semaphore-and-mutex?page=1&tab=votes#tab-top])
  • 第195页 7.4 Multiprocessor Synchronization Issues
    通过比较说明了单核的设计在多核系统上的问题,这种纵向比较的方式非常便于理解。一直觉得操作系统设计师一个演化的过程,既有纵向的演化,例如virtual memory的出现,journal 文件系统,log文件系统,也有横向的...
  • 第164页 6.3.5 Discussion
    POSIX IPC 是否面临security问题?
  • 第151页 6.2.2 Pipes
    关于Linux的pipe, 1. pipe的容量是65K(65536) 2.pipe是单向的(unidirectional) 3. 要双向通信怎么办?创建两个管道
  • 第153页 6.2.4 Process Tracing
    ptrace, debug 也是一种ipc
  • 第52页 concurrency and parallelism
    看来不同的书对concurrency 和 parallelism 有不同的理解
<前页 1 2 3 4 5 后页>