0%

这是Lewis Baker讲解协程的第四篇。这是原作者时隔2年后的文章,第一部分从简单例子中介绍并回顾之前的例子,从例子中引出无限递归会导致的栈溢出问题,然后第二部分介绍对称转移协程的设计以及是如何解决这个问题的。
本篇进一步从例子中来讲述实现协程的方式。

原文:https://lewissbaker.github.io/2020/05/11/understanding_symmetric_transfer

协程提案提供了很方便的方式来按照同步的方式写异步代码。你只需要在合适的点带上co_await,然后编译器就会处理好协程的挂起、保存挂起点前后的状态,以及当操作完成时恢复协程。

然而,协程提案中,特别是早期的版本,有很大的局限性,在不仔细处理时会很容易导致栈溢出。并且为了避免栈溢出,你不得不引入额外的同步开销来安全的保障你的task<T>类型。

幸运的是,在2018年协程的设计对这做了修补,增加了一项对称转移(symmetric transfer)的能力,允许你挂起一个协程然后恢复另外一个协程而不需要任何额外的栈空间。该项能力消除协程提案中的关键限制,使得实现异步协程类型可以更简单且更高效,而不用牺牲为了防止栈溢出所需的安全保证。

本篇中我会尝试解释栈溢出问题,以及“对称转移”能力是如何解决该问题的。

Read more »

这是Lewis Baker讲解协程的第二篇,主要介绍

  • awaite,awaiter相关概念
  • awaite细节机制,包括c++
  • 实现awaite对象的例子

原文:https://lewissbaker.github.io/2017/11/17/understanding-operator-co-await

在上一篇中,我描述了函数和协程的高层区别,但是没有深入C++协程提案中描述的语法和语义细节。

该协程提案中给C++添加的关键点是挂起一个协程的能力,并允许稍后被恢复。提案中提供的机制是新的操作co_await

理解co_await是如何工作的,有助于弄清楚协程的行为,以及是如何挂起以及恢复的。本篇中会解释co_await操作的机制,并介绍相关的AwaitableAwaiter类型概念。

Read more »

最近在研习C++协程的一些用法,翻到folly::coro作者 Lewis Baker 的几篇文章,都是基于C++20协程,讲解比较详细,翻译如下。
第一篇主要介绍了一下内容,并有配图说明了协程调用的过程:

在这个系列中,我会覆盖C++协程基础原理,以及如何应用到更高层次的抽象,例如在cppcoro库中所提供的。
(注1:Lewis Baker同时也是流行库cppcoro的作者;注2:C++20的协程只是提供了协程源语,要真正用起来,还需要很多封装,例如调度器)

本篇会描述函数与协程之间的区别,以及介绍所支持操作的原理。本篇目标是给读者引入C++协程的基础概念。

Read more »

Fuse 是一个可以在用户态实现文件系统功能的框架,包括内核模块和用户态库。
基于Fuse开发文件系统主要是实现fuse吐出的一系列文件系统操作函数,对外有两套API,high level和low level。
Low level是基于内部的句柄号来访问的, High level是在low level上实现的,基于Path来访问的API。
本文主要分析high level如何处理path的过程。

Read more »

背景

Ceph RGW压测大并发时,由于底层性能不足,会造成服务端请求超时。如果在中间有ngxin做负载均衡时,压测工具Cosbench会显示有请求失败,而直连rgw则不会显示失败,为了分析这个问题,研究了下rgw请求超时过程中发生了什么。

而关于Cosbench请求是否失败的问题,其实比较简单,由于中间有nginx时,nginx在判断server超时时,会给客户端返回50x错误,直连rgw时,请求超时返回的是客户端错误,而cosbench对客户端错误只是打印了一行warn日志,不会报错,所以导致两种测试方式结果有差异,本质上都是服务端来不及处理客户端请求了。

Read more »

本篇是介绍ceph multisite第二篇,从多zone同步的 桶创建 看元数据的同步过程。zonegroup下多zone元数据是强同步,所有从zone的元数据修改会重定向到主zone,主zone的元数据修改会通知给所有从zone。而数据部分是多zone可以同时写入,所有zone之间会相互同步,实现最终数据一致。

Read more »

工作一年,基本一直在做rgw,本篇作为续写博客第一篇,从最近看的multisite写起,争取在架构和代码上给rgw写一个系列。

ceph从J版开始,重构了multisite方案,改变了原来配置复杂,同步难于管理的问题。新版简化了配置,zone之间通过内部的协程框架同步。本篇先简单介绍同步流程。

Read more »

工作一年了,感觉对技术方向有点迷失,可能还是自己坚持不够,就重新拾掇起博客。

首先把用hexo改造了下博客。hexo会生成静态页面,加载速度会更快,部署和使用方式上也比原生的简单很多。
切换过程,直接搜索hexo的部署教程,并不麻烦。

遇到的问题:

1.安装hexo的问题

1
2
{ [Error: Cannot find module './build/Release/DTraceProviderBindings'] 
参考:[https://github.com/hexojs/hexo/issues/1055](https://github.com/hexojs/hexo/issues/1055)

2.hexo的目录结构

sources
|- _posts 对应原来的 _posts,文章目录
|- images 对应原来的 images,图片目录

3.文章时间

在没有指定时间时,会根据文件的创建时间决定。
可以在文章头指定date,格式 YYYY-MM-DD hh:mm:ss

4.语法高亮

之前用的kramdown,语法高亮格式时 { % highlight c % },这边不识别,用python脚本转换了下

其他还有些文章链接地址保持的问题和锚点格式的问题。

转换脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python
import sys

name = sys.argv[1]
date = name[:10]

with open(name) as fi:
lines = fi.readlines()
fw = open(name, 'w')

for i,line in enumerate(lines):
if 'endhighlight' in line:
line = '```\n'
elif 'highlight' in line:
try:
lang = line.split()[3]
line = '```'
if lang != '%}':
line += ' ' + lang
line += '\n'
except:
print 'not highlight'
print line
elif '{#' in line:
line = line.replace('{', '](')
line = line.replace('}', ')')
for i,c in enumerate(line):
if c != '#':
break
if c == ' ':
i += 1
line = line[:i] + '[' + line[i:]
elif 'site.imageurl' in line:
line = line.replace('{{site.imageurl}}', '/images')

fw.write(line)
if i == 1:
date = 'date: ' + date + '\n'
fw.write(date)
fw.close()