Golang并发控制 - 锁
数据争用什么是数据争用数据争用就是多个协程同时访问相同的内存空间,并且至少有一个写操作的情况。
数据争用是高并发程序种最难排查的问题,原因在于其结果是不明确的,而且出错可能是在特定的条件下。这导致很难复现相同的错误,在测试阶段也不一定能测试出问题。
数据争用检查检查工具race在使用race之前,需要在系统中安装gcc,并且需要配置go环境变量开启CGO
apt install gcc
export CGO_ENABLED=1
race可以使用在多个go指令中,当检测器在程序中找到数据争用时,将打印报告。该报告包含发生race冲突的协程栈,以及此时正在运行的协程栈:
go test -race mypkg
go run -race mysrc.go
go build -race mycmd
go install -race mypkg
比如以下代码检测数据争用
package main
var count = 0
func add() {
count++
}
func main() {
go add()
go add()
}
>> ...
Goroutine原理
1、进程、线程
一个进程就是就是一个正在执行程序的实例。为实现进程模型,操作系统维护着一张进程表,每个进程占用一个表项(PCB,进程控制块)该表项包含了进程的重要信息,包括程序计数器、堆栈指针、内存分配状况、所有打开文件的状态、账号和调度信息等。
进程模型基于两种独立的概念:资源分组处理与执行,可以理解为进程通过某种方法把相关资源集中在一起,进程内可以有多个执行的线程,而线程则是在CPU上被调度执行的实体。
线程中有一个程序计数器,记录着要执行哪一条指令。拥有寄存器,保存线程当前的工作变量。拥有一个堆栈,用来记录执行历史,其中每一帧保存了一个已调用的但是还没有从中返回的过程。
可以看出,一个进程内的多个线程可以同时操作一个打开的文件句柄,因为它们共享进程内的内存空间,而多个进程是做不到的。
总结一句话“进程是操作系统资源分配的基本单位,线程是操作系统调度的基本单位”
2、用户态、内核态2.1、内核空间实现线程内核中有一个记录系统中所有线程的线程表,当创建/终止一个线程时,需要进行一个系统调用,通过对线程表的更新完成线程的创建/终止操作。在系统级的调度过程中,有可能 ...
操作系统 - 文件系统
文件系统文件系统功能
分配磁盘空间
管理文件块(哪一块属于哪个文件)
管理空闲空间(哪一块是空闲的)
分配算法(策略)
管理文件集合
定位文件及其内容(定位)
通过名字找到文件的接口
分层文件系统
按不同方式组织文件(不同的文件系统)
提供安全特性
分层保护数据安全
可靠性/持久性
文件系统数据结构一个基本的文件系统应该包含哪些内容?
卷控制块(Unix:“superblock”)
每个文件系统一个
记录文件系统的详细信息
块、块大小、空闲块、计数/指针等
文件控制块(Unix:“inode”)
每个文件一个
记录文件的详细信息
权限、所有者、大小、位置等
目录节点(Linux:“dentry”)
每个目录项一个
将目录项数据结构及树形布局编码成树形数据结构
只需文件控制块、父节点、项目列表等
虚拟文件系统现在的存储介质多种多样,OS必须能够兼容不同的硬件,因此现代OS都采用分层结构通过分层,对下兼容不同的存储介质,对上提供统一的API。
文件系统的实现文件系统在磁盘上的布局(以MBR分区表为例)磁盘的0号扇区称为主引导记录 ...
ProxmoxVE安装黑群晖
为什么要装黑群
闲置的硬件利用起来,作为主力nas的冷备:一台闲置的ITX主机,处理器是i5-10500。8块闲置硬盘:3.5寸机械硬盘500G*2;2.5寸机械硬盘1T*2;2.5寸机械硬盘2T*2;2.5寸固态硬盘120G*2。
群晖有一个无可替代的功能SHR(Synology Hybrid RAID)群晖独有的磁盘阵列。能做到将不同容量的硬盘组磁盘阵列,而且不浪费空间,具体原理可以查看官方文档
安装篇PVE虚拟机其实群晖NAS对硬件要求很低。对于i5处理器,完全是性能过剩,所有选择装虚拟机,然后将sata控制器直通给虚拟机。虚拟机系统使用PVE,因为是基于Debian的发行版,用起来比较熟悉。然后免费开源,定制性较高。PVE如何安装、配置、以及开启硬件直通,不是本文重点,不多说。
虚拟机配置创建虚拟机主要注意以下几点:
1、网卡类型要选择Intel E1000,否则黑群晖不识别(听说Vmware vmxnet也行)
2、创建完之后把硬盘和光驱都删掉
3、硬盘选择直通SATA控制器。itx主板自带的sata控制器只有四个sata接口,还好有2个m.2,于是某宝搜一下,可以把m. ...
Golang快速入门
Tour地址:https://tour.go-zh.org/welcome/1
练习1:循环与函数(基础 - 流程控制语句)用牛顿法实现平方根函数。什么是牛顿法,题目中已给出:
z -= (z² − x ) / (2*z)
x为函数的变量,z的初始值为一个猜测值。z² − x 是 z² 到它所要到达的值(即 x)的距离, 除以的 2z 为 z² 的导数,我们通过 z² 的变化速度来改变 z 的调整量。 这种通用方法叫做牛顿法。 它对很多函数,特别是平方根而言非常有效。
计算机通常使用循环来计算 x 的平方根。从某个猜测的值 z 开始,我们可以根据 z² 与 x 的近似度来调整 z,产生一个更好的猜测:重复调整的过程,猜测的结果会越来越精确,得到的答案也会尽可能接近实际的平方根。
在提供的 func Sqrt 中实现它。无论输入是什么,对 z 的一个恰当的猜测为 1。 要开始,请重复计算 10 次并随之打印每次的 z 值。观察对于不同的值 x(1、2、3 …), 你得到的答案是如何逼近结果的,猜测提升的速度有多快。
提示:用类型转换或浮点数语法来声明并初始化一个浮 ...