Linux 下的文件锁

本文内容为 Linux 系统通用,各个语言实现可能稍有不同,但原理相同。

当多个进程或多个程序都想要修同一个文件的时候,如果不加控制,多进程或多程序将可能导致文件更新的丢失。

例如进程1和进程2都要写入数据到a.txt中,进程1获取到了文件句柄,进程2也获取到了文件句柄,然后进程1写入一段数据,进程2写入一段数据,进程1关闭文件句柄,会将数据flush到文件中,进程2也关闭文件句柄,也将flush到文件中,于是进程1的数据被进程2保存的数据覆盖了。

所以,多进程修改同一文件的时候,需要协调每个进程:

  • 保证文件在同一时间只能被一个进程修改,只有进程1修改完成之后,进程2才能获得修改权
  • 进程1获得了修改权,就不允许进程2去读取这个文件的数据,因为进程2可能读取出来的数据是进程1修改前的过期数据

这种协调方式可以通过文件锁来实现。

文件锁分类

文件锁分两种,

  • 独占锁(写锁)
  • 共享锁(读锁)

当进程想要修改文件的时候,申请独占锁(写锁),当进程想要读取文件数据的时候,申请共享锁(读锁)。

独占锁和独占锁、独占锁和共享锁都是互斥的。

只要进程1持有了独占锁,进程2想要申请独占锁或共享锁都将失败(阻塞),也就保证了这一时刻只有进程1能修改文件,只有当进程1释放了独占锁,进程2才能继续申请到独占锁或共享锁。

但是共享锁和共享锁是可以共存的,这代表的是两个进程都只是要去读取数据,并不互相冲突。

文件锁:flock 和 lockf

Linux上的文件锁类型主要有两种:flock和lockf。后者是fcntl系统调用的一个封装。它们之间有些区别:

  • flock来自BSD,而fcntl或lockf来自POSIX,所以lockf或fcntl实现的锁也称为POSIX锁
  • flock只能对整个文件加锁,而fcntl或lockf可以对文件中的部分加锁,即粒度更细的记录锁
  • flock的锁是劝告锁,lockf或fcntl可以实现强制锁。所谓劝告锁,是指只有多进程双方都遵纪守法地使用flock锁才有意义,某进程使用flock,但另一进程不使用flock,则flock锁对另一进程完全无限制
  • flock锁是附加在(关联在)文件描述符上的(见下文更深入的描述),而lockf是关联在文件实体上的。本文后面将详细分析flock锁在文件描述符上的现象

参考文献

Perl //= 和 ||= 的区别 | 附实验

结论

  • $var//=2:等价于 defined($var)||2,即 未定义 时才赋值为 2 ,否则不变( 即使是 空字符串
  • $var||=2 :除非定义且为 true 才不会赋值,否则赋值(比如 空字符串 时)为2。

//=

Step-1 空串

$var='';
$var//=2;
print "'$var'\n";
# perl atest4.pl 
''

Step-2 0

$var=0;
$var//=2;
print "'$var'\n";
# perl atest4.pl 
'0'

Step-3 1

$var=1;
$var//=2;
print "'$var'\n";
# perl atest4.pl 
'1'

Step-4 undef

$var=undef;
$var//=2;
print "'$var'\n";
# perl atest4.pl 
'2'

||=

Step-1 空串

$var='';
$var||=2;
print $var;
# perl atest4.pl 
2

Step-2 0

$var=0;
$var||=2;
print $var;
# perl atest4.pl 
2

Step-3 1

$var=1;
$var||=2;
print $var;
# perl atest4.pl 
1

Step-4 undef

$var=undef;
$var||=2;
print $var;
# perl atest4.pl 
2

Perl 常用内置函数 -r -e 等

-r: File is readable by effective uid/gid.
-w: File is writable by effective uid/gid.
-x: File is executable by effective uid/gid.
-o: File is owned by effective uid.

-R: File is readable by real uid/gid.
-W: File is writable by real uid/gid.
-X: File is executable by real uid/gid.
-O: File is owned by real uid.

-e: File exists.
-z: File has zero size (is empty).
-s: File has nonzero size (returns size in bytes).

-f: File is a plain file.
-d: File is a directory.
-l: File is a symbolic link.
-p: File is a named pipe (FIFO), or Filehandle is a pipe.
-S: File is a socket.
-b: File is a block special file.
-c: File is a character special file.
-t: Filehandle is opened to a tty.

-u: File has setuid bit set.
-g: File has setgid bit set.
-k: File has sticky bit set.

-T: File is an ASCII text file (heuristic guess).
-B: File is a "binary" file (opposite of -T).

-M: Script start time minus file modification time, in days.
-A: Same for access time.
-C: Same for inode change time (Unix, may differ for other platforms)

参考文献

2021 下半年博客「经营」报告

距离发布《2021 上半年博客「经营」报告》已经半年过去了,这半年里,我发布了 Notion BoJo模版及其配套的财务看板「BJ-PFD」,发布了随机壁纸生成器「Get Random Wallpaper」,新作了个人主页「煎茶」,自此我的博客「Frytea’s Blog」专门分享一些碎片化的信息,主页用来汇集个人信息并分享成体系的内容。

这样一来,下半年的网站访问量相较上半年有一个简单的提升,在这里简单“汇报”一下。

发现百度统计统计到来自百度的流量多,Google 统计到来自 Google 的流量多,为了解决该问题我自己使用 umami 搭建了访问统计服务,但目前才统计了3个月,这次还是先看百度统计吧。

数据概述

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-2.35.06c9acb01fa2da7373.png

从百度统计的结果来看,近半年主要网站 PV 10W 次,UV 7W 个,来自 5W 个IP,相比去年有一个小小的提升,心里还是很开心。

其中 11月访问量最高,单月访问量 3W+,大概是因为那个月在 V2EX 发布了一篇「找寻独立原创博客的价值」的帖子。截至目前这篇帖子获得了 5060 次点击 ∙ 44 人收藏 ∙ 3 人感谢。

来源统计

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.10.15045551465ce491a6.png

再来看一下来源统计。百度统计的结果显示,访客最多的是直接访问,其次是来源百度搜索,之后是必应和谷歌,在后面就是来自论坛和其他流量。

搜索词方面,比较多的是这些来自百度的搜索词:

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.18.41f7954644672e4673.png

访问统计

访问统计方面,这些页面被访问的次数最多:

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.27.374776c271b94a0473.png

访客统计

访客统计方面,先看看全球的访客分布:

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.29.02934d38cb95a44a93.png

来自中国的访问最多,其次是美国。再看看国内的访客分布:

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.30.211e42bb9be478a0fe.png

国内访客中,来自北京的最多,其次是上海和广东。

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.31.46110a9d8db0e86c4f.png

客户端类型方面,PC端还是比移动端多一些。

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.34.04fc04190d6f127d45.png

访客属性方面,大概如图所示。

总结

互联网时代的流量就是金钱,而作为网站站长则希望自己网站的内容可以真正的为网友提供帮助,在未来我会努力输出整理有价值的内容,希望持续输出价值。

什么是 WEB3 以及其发展概要

要问何为 Web3,就先从什么味 Web2 和 Web1 来说起吧。

最近在网上看到 Web3 的概念很火热,比肩区块链、元宇宙,其实貌似一整个未来,特意整理一下认为比较好的材料分享出来。

WEB 的进化

https://imagehost-cdn.frytea.com/images/2021/12/31/image83ab2e1e696f8c3e.png

截止目前,互联网技术大致进行过2次重要的革新,每个时代,都有其显著地时代特征。

WEB1 – 信息投喂

虽然我很不喜欢这个词,但貌似事实如此。

早在上世纪 90 年代互联网刚刚开始普及的时候,用户与网络的互动处于非常早期的阶段,即用户只能被动地浏览文本、图片以及简单的视频内容,网站提供什么,用户查看什么。几乎没有互动可言。

上世纪 90 年代中后期,在谷歌、百度发展之前的一段时间,互联网曾经由 AltaVista 和 Netscape 主宰。当时,互联网的存在只是为了宣传他们的实体公司。这些网站是「只读网站」,意味着你只能搜索和阅读信息。

https://imagehost-cdn.frytea.com/images/2021/12/31/image83876cc0f4e5dc0a.png

而那个时代的电子商务网站实际上跟现在超市发的促销手册一样,只是给你展示内容,你无法在网站上下单。

这就是 Web1.0,缓慢的 Web 1.0,完全受控制的 Web 1.0

WEB2 – 网上互动

当前我们所处的这个时代,大致可理解为 WEB2.0

这一代互联网被称为「Web2.0」或「读写」网络。现在,用户不仅仅是单纯的访问者,他们还可以创建自己的内容,并将其上传到网站上。以著名的视频博主「办公室小野」为例,她仅用了 2 年的时间就从一个默默无闻的视频作者变成了月收入数千万的视频大 V。

https://imagehost-cdn.frytea.com/images/2021/12/31/imagec1f47771a6aaaafa.png

有影响的网红只需要发一个视频就可以让一个餐馆排满长队,也可以用一句话让一家网店差评如潮。互联网人对于互联网的影响力与日俱增,以往网站给用户投喂信息的时代已经过去。

Web2.0 的主要目标是,使互联网更加民主,并尽可能地方便用户访问。

WEB3 – 未来互联网

至于什么是 WEB3 还很难有一个准确的定义,但可以总结这么几个关键词:

  • 统一身份认证
  • 数据确权与授权
  • 隐私保护与抗审查
  • 去中心化运行

在 WEB3.0 时代,身份认证有一个统一的平台,不再需要记录各个平台的账号密码,也不需要担心账号泄露;数据的确权与授权统一规范,不再是一家独大;个人隐私可以受到很好的保护,网站再也不能随意的跟踪用户行为;一切网络服务的运作,都是去中心化的。

至于具体改变了什么,未来将会是什么样子,可以想象。举个例子,某网盘再也不能随意的封禁用户数据,不可能因为新浪博客单方面的停止运营导致我们的博客内容无法访问,音乐资源不再局限于哪一家的版权,因为一切都是去中心化的。

当然改变越大,风险就越大,难度也越大。

怪不得最近总是看到有人说:不学习加密技术是自我毁灭

就像是有些人已经成了比特币首富,有些人连什么是比特币还不清楚。一些人已经在闷声发大财,有些人还在固有的道路上艰难前进。

变化

在将来,人们的使用习惯和生活方式可能会发生一些变化,比如现在常用 Chrome,未来可能使用 Brave。

https://imagehost-cdn.frytea.com/images/2021/12/31/image3dae6010ffd8d459.png

信息就是金钱,随着 Web 3.0的出现,新的平台将以一种不被垄断服务提供商扼杀的健康竞争水平出现。

这个概念是这样的: 目前,分散的应用程序、钱包、平台以及其他构成 Web 3.0的数字资产是分散的。访问这些接口需要单独的种子、登录和身份标识,这与现有的 Web 2.0非常相似。将通过一个种子将这些不同的平台连接在一起。因为这将作为一个加密的钥匙,可以与其拥有者联系起来,艾森蒂亚将提供身份证明,但不会透露任何非必要的个人身份。

总结

也许 WEB3 没有一个清晰地样子,只是不断的畅想未来的模型。如果一切明了,大概就是下一个时代的变革点了。因此抓住它,不要嫌弃它的简陋,要看到它就是未来。

参考文献

国内对象存储/CDN服务价格横评

话不多说,直接上表格。

价格表(国内HTTPS价格)

名称 存储免费额度(GB) 存储费用(元 / GB / 日) 流量免费额度 流量费用(元/GB) CDN流量费用
多吉云 10 0.003 20 0.11 0.11
七牛云 10 0.098-0.145 \ 0.29 0.28
腾讯云 \ 0.099-0.118 \ 0.5 0.21
阿里云 \ 0.12 \ 0.25-0.5 0.24
又拍云 \ 0.0043 \ 0.5 0.29
百度智能云 \ 0.119-0.15 \ 0.25-0.49 0.20

注:价格整理于2021年12月30日;存储指对象存储,流量指对象存储公网流出流量。

分析说明

由于本人使用过国内各种主流云厂商云存储、CDN服务,目前稳定存储2G左右,每日流量1G左右,使用过各家。知道最近发现多吉云也推出了自家云存储服务,虽然是阿里云、腾讯云包了一层,但费用便宜很多,应该是走量优惠比较大。

后来我就把自己网站的对象存储和CDN都迁移到多吉云了,目前使用起来感觉良好。

还记得上次过年期间,使用的七牛云存储出了点问题,提工单半天没解决,非说是我解析有问题。后来自愈了,对七牛云的印象就没有多好了,因此这次果断迁移到多吉云。

经过这次迁移,发现各家云存储费用差异还比较大,顺便整理,方便各位有需要的客官挑选。

参考文献

Ubuntu 安装 GitKraken 并汉化

GitKraken 是一款超好用的 git 可视化(gui)工具,但是官方不提供多语言支持,今天就以 Ubuntu 平台为例介绍一下安装方法。

安装及汉化

首先在 GitKraken 官网下载安装包:

如果是 debian 系操系统可下载其中的 deb 版本,之后安装即可。

至于汉化,使用 Github 上的 k-skye/gitkraken-chinese 这个仓库即可完成。

方法很简单,安装好之后,使用汉化语言包替换原有的语言包即可。

# 首先备份官方语言包
mv /usr/share/gitkraken/resources/app.asar.unpacked/strings.json /usr/share/gitkraken/resources/app.asar.unpacked/strings.json.bk
# 从github拉取资源并替换
wget https://github.com/k-skye/gitkraken-chinese/raw/master/strings_8.1.1.json -O /usr/share/gitkraken/resources/app.asar.unpacked/strings.json

# 如果在国内访问 github 有困难
# 可使用 fastgit 提供的 github 国内镜像拉取
wget https://hub.fastgit.org/k-skye/gitkraken-chinese/raw/master/strings_8.1.1.json -O /usr/share/gitkraken/resources/app.asar.unpacked/strings.json

之后重启 GitKraken 即可。

https://imagehost-cdn.frytea.com/images/2021/12/30/image031b80c4bef3b2af.png

参考文献