关于 pthread cond 的注意事项

最近在使用 pthread condition variable 的时候出现了问题,经过排查发现是 pthread_cond_signal() 放在了 pthread_mutex_unlock() 之后调用导致的。本来不是个什么复杂的问题,但是由于自己一直以来的忽略,觉得有必要记录一下。

先来看下很多文章中都用到的关于 pthread_cond_ 系列函数的例子:

/* ----- producer ----- */

pthread_mutex_lock(&mutex);               /* 1 */
queue.push(item);                         /* 2 */
pthread_cond_signal(&cond);               /* 3 */
pthread_mutex_unlock(&mutex);             /* 4 */

/* ----- consumer ----- */

pthread_mutex_lock(&mutex);               /* 

阅读全文…

使用 freebsd 搭建家用 nas

最近拍摄的照片和视频有点多,手机存不下,准备搞个家用 nas 来存,经过一番对比之后准备上 freebsd,这里记录下一些重要配置。

freebsd 安装和设置

本文使用的是 13-RELEASE。要注意的地方主要是分区的时候选手动,分区表格式选“GPT”,文件系统格式填“freebsd-zfs”,系统会单独分一个 512KB 的 /boot,剩下的全分给 /

更新系统(例如更新到 13.2):

freebsd-update upgrade -r 13.2-RELEASE
freebsd-update install

更新完系统后可以执行

pkg upgrade

来更新其它软件包。

如果更新后执行 pkg 报错,可以使用以下命令来修复:

pkg-static install -f pkg
pkg upgrade -f

修改 /boot/loader.conf 启用 aio:…

阅读全文…

gdb 笔记

一些零散的 gdb 备忘都记录在这里。

gdb 前端

gdb 自带了一个 tui 的前端,使用 -tui 选项即可启动。tui 界面比较简单,上半部分是代码,下半部分是 gdb 命令窗口,而且代码也没有高亮。另外还有使用 vim 操作方式的 cgdb,以及有一个用 python 写的 web 前端 gdbgui。当然在 emacs 中也集成了一个叫 gud 的 debugger mode(参考资料 1)。

gdb 自定义命令

建立 ~/.gdbinit 文件,里面写上要定义的命令,gdb 启动的时候会读取这个文件里的命令,这样在调试过程中就可以使用这些自定义命令了。定义命令的方式为:

define mycmd
...

阅读全文…

《Time, Clocks, and the Ordering of Events in a Distributed System》中文版

分布式系统中的时间,时钟,以及事件顺序

原文:Time, Clocks, and the Ordering of Events in a Distributed System
作者:Leslie Lamport
发表日期:1978 年 07 月
译者:ou@https://ouonline.net/

摘要

本文研究了“分布式系统中一个事件在另一个事件之前发生”这个概念,并用它来定义事件的偏序关系。给出了用于同步逻辑时钟系统的分布式算法,该算法可以用来确定事件的全序关系。用解决同步问题的方法来说明全序的使用。这个算法被专门用来同步物理时钟,并得出时钟同步的最大偏离范围。

引言

时间的概念是我们思维的基础。它源自一个更基础的概念,即事件发生的顺序。如果某事发生在我们的时钟读数为 3:15 之后并且在其读数变为 3:16 之前,我们就说 3:15 发生了某事。事件的时间顺序概念充斥着我们对系统的思考。例如,在航空公司的预定系统中,我们指定如果在航班满员之前提出预定请求,那么应该允许该请求。然而,我们会看到,在考虑分布式系统中的事件时,必须仔细重新检查这个概念。

一个分布式系统由空间上分离的不同进程的集合组成,这些进程通过交换消息来互相通信。一个互相连接的计算机的网络,例如 ARPA,就是一个分布式系统。单个计算机也可以被看作是一个分布式系统,其中的中央控制单元,存储单元和输入输出通道都是独立的进程。如果消息传输延迟与单个进程中事件发生的间隔相比不能忽略,则这个系统就是分布式的。

我们将主要关注空间上分离的计算机系统。但是,我们的许多结论将会更通用。特别地,单台计算机上的多进程系统会遇到与分布式系统类似的问题,因为某些事件的发生顺序不可预测。

在分布式系统中,有时候无法决定两个事件中的哪一个先发生。因此,“先发生”关系只是系统中事件的偏序关系。我们发现这个问题经常出现,是因为人们没有完全意识到这个事实以及它的含义。

在本文中,我们讨论了由“先发生”关系定义的偏序,并给出了一种分布式算法,用于将偏序扩展为所有事件的一致全序。这个算法可以为实现分布式系统提供有用的机制。我们通过一个解决同步问题的简单方法来说明它的用法。如果由这个算法得到的顺序和用户感知的顺序不同,则可能会发生意外的异常行为。通过引入真实的物理时钟可以避免这种情况。我们介绍了一种用来同步这些时钟的简单的方法,并推导出它们漂移的不同步程度的上限。

偏序

如果事件 a 发生的时间早于事件 b,大部分人可能会说 …

阅读全文…

《Reconfiguring a State Machine》中文版

重新配置状态机

原文:Reconfiguring a State Machine
作者:Leslie Lamport, Dahlia Malkhi, Lidong Zhou
发表日期:2010 年 01 月 29 日
译者:ou@https://ouonline.net/

摘要

重新配置意味着更改分布式系统中的执行任务的进程。我们介绍几种方法(包括一些新方法),用来重新配置一个使用状态机方式来实现的系统。本文将讨论这些方法与之前的重新配置算法之间的关系——特别是在组通信中的视图变更。

目录

  • 1 引言
  • 2 状态机
    • 2.1 准备工作
    • 2.2 垃圾回收
    • 2.3 重新配置的简单方法
    • 2.4 正确性
  • 3 重新配置的复杂方法
    • 3.1 停止状态机
      • 3.1.1 “停止标记”法

阅读全文…

《Paxos Made Simple》中文版

深入浅出 PAXOS

原文:Paxos Made Simple
作者:Leslie Lamport
发表日期:2001 年 11 月 01 日
译者:ou@https://ouonline.net/

摘要

Paxos 算法,如果用简明的语言来描述,其实很简单。

目录

  • 1 引言
  • 2 共识算法
    • 2.1 问题描述
    • 2.2 选定一个值
    • 2.3 获得被选定的值
    • 2.4 推进
    • 2.5 实现
  • 3 实现一个状态机
  • 参考文献

1 引言

Paxos 是一个用来实现具有容错特性的分布式系统的算法。很多人认为 …

阅读全文…

emacs GUI 使用 fcitx

前段时间用 emacs GUI 的时候发现不能输入中文,搜了下发现有挺多人遇到问题,参考资料 [1] 里面有解释说是 emacs 的一个遗留问题,只要把 LC_CTYPE 设置成 zh_CN.UTF-8 就行。但是我试了下发现没效果,继续搜索之后发现还有个可能是字体的问题(见参考资料[2,3]),装完字体就好了。这里把需要的配置都总结下备忘,因为字体的问题一点都没有报错,完全不知道从何查起。

这里的环境是 fcitx 4.2.9.7,emacs 26.3。

编辑 ~/.xprofile(或 ~/.bashrc),加入以下内容:

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

编辑 ~/.xprofile(或 ~/.bashrc),设置 LC_CTYPE

export LC_CTYPE=zh_CN.UTF-8

可能有关的一个配置(不确定)是,在 ~/.Xdefaults 加上

Emacs.useXIM:on

阅读全文…

使用 overlayfs+chroot 搭建临时环境

最近在写一个小工具,依赖的库比较多,但是这些依赖都不常用,不想为了开发而装在常用的机器上。想用以前用 chroot 搞的一个开发环境,可惜更新源验证总出问题,搜索了几个方案后还是没解决。我只是想搞个隔离的测试环境,不需要限制资源,docker 又庞大配置又麻烦(其实根本原因是我讨厌 golang),又不想重新配置一份环境,于是搜了下 docker 相关的底层技术,最后发现 overlayfs+chroot 就能完美解决我的需求,在这里记录一下,内核版本是 5.6。

overlayfs 介绍

顾名思义,overlayfs 就是把多个目录组合在一起形成一个新的文件系统,在 2014 年被合并进 kernel v3.18。先来看下使用时的命令行参数:

mount -t overlay overlay -o lowerdir=<lowerdir1>:<lowerdir2>:<...>,upperdir=<upperdir>,workdir=<workdir> <mountpoint>

大概介绍下这里的三个参数:

  • lowerdir:只读目录,多个目录用 ":" 分隔。
  • upperdir:可读可写目录。如果 upperdirlowerdir 中有同名的文件,会优先展示 upperdir 中的文件(换言之就是 lowerdir 中的文件被屏蔽了)。

阅读全文…

博客迁移到 vps

几周前在 linode 上买了个最低配的 vps(不要问我为什么买,我也不知道,反正就是买了),流量翻墙也用不完,于是想着把博客迁过来,还能省点钱。

nginx 和 php

这里

另外还需要在 /etc/nginx/sites-enabled/default 中的 server{} 部分加上

index index.html index.php;

安装数据库

自从 MySQL 被 Oracle 收购后,开源界为了避免版权问题,fork 了一个分支 MariaDB:

apt-get install mariadb-server

为了能让 php 访问数据库,还需要安装对应的插件:

apt-get install php-mysql

备份原博客

从 cpanel 打开文件管理器,将 public_html …

阅读全文…

nginx 支持 php

记录一下 nginx 和 php 的配置过程。运行环境是 Debian 10 stable。

安装:

apt-get install nginx php-fpm

然后编辑 nginx 的配置文件 /etc/nginx/sites-available/default,去掉以下几行的注释:

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
}

这个配置是告诉 nginx,如果请求中有 .php 结尾的文件,就把它交给 php-fpm 来处理。

改完保存后重启 nginx 和 php-fpm:

/etc/init.d/nginx restart
/etc/init.d/php7.3-fpm 

阅读全文…