6.824Lecture2-RPC&Threads
Background
Why Threads?
- I/O concurrency
- multi core parallelism
- convenience for, like routine
Threads Changes
- race conditions
- avoid share memory
- use locks: 并行变串行
- coordinations
- channels or condition variables
- dead lock
Go Methods
Channel
- 用来在并发中同步变量
- pipeline with datatype, need be created, like: ch = make(chan int)
- receivers & sender.默认情况下,发送和接收操作在另一端准备好之前都会阻塞。这使得 Go 程可以在没有显式的锁或竞态变量的情况下进行同步
- sender: 通过close关闭信道表示没有要发送的值. 向一个已经关闭的信道发送数据会引发程序panic
- receiver: v, ok := <-ch, ok=false when channel is empty and is closed
sync.Mutex
- 互斥锁,代码段前后调用Lock() & Unlock()实现某段代码的互斥执行,用defer保证互斥锁一定被解锁。
- defer func():func会在包含defer语句的函数返回时再执行
sync.Cond
- Wait()/Broadcast()/Singal()
RPC
remote procedure call
- goal: rpc ≈ pc
- pros: stub完成数据转换和解析、打开/关闭连接等细节
workflow
- 客户端调用 client stub,并将调用参数 push 到栈(stack)中,这个调用是在本地的
- client stub 将这些参数包装,并通过系统调用发送到服务端机器。打包的过程叫 marshalling(常见方式:XML、JSON、二进制编码)。
- 客户端操作系统将消息传给传输层,传输层发送信息至服务端;
- 服务端的传输层将消息传递给 server stub
- server stub 解析信息。该过程叫 unmarshalling。
- server stub 调用程序,并通过类似的方式返回给客户端。
- 客户端拿到数据解析后,将执行结果返回给调用者。
RPC Semantics under failures
server不知道client的具体情况,导致failure时难以处理
- at-least-once: client不断重试直到ack成功。适用于幂等操作
- 幂等操作:幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同
- at-most-once: 最常见的,只执行0/1次。通过过滤重复项来实现。
- exactly-once: hard
go rpc: at-most-once, 由client手动决定是否重试