GMP模型的设计思想
前言通过上一期的文章,我们知道了Go调度器的由来及作用:Go调度器用于合理分配goroutine(go的协程)到内核级线程中运行,实现高并发
概念GMP模型是指Go调度器的内部模型结构,GMP三个字母是三个不同单词的简写:
G: Goroutine, Go 语言中的协程。每个 G 代表一个要执行的协程,包含了该协程的栈空间、执行状态等信息。调度器通过管理和调度 G 来实现并发执行。
M:Machine,操作系统(内核级)线程(OS thread)。M 是调度器和协程的中间层,负责将协程(G)绑定到线程(M)上执行。Go 调度器会根据系统的负载情况动态创建和销毁 M,以适应并发需求。每个 M 拥有自己的调用栈和一些状态信息,包括指令指针、堆栈指针等。 Go调度器最多可以创建 10000 个M。
P: Processor,逻辑处理器。P 是调度器的实际执行者,负责执行 G。一个 P 在某个时刻只能执行一个 G,但可以执行多个 G。P 执行 G 的过程中,G 会占用 P 的上下文(上下文切换),直到执行完成或发生阻塞。一个 M 可以绑定到一个 P 上执行。
要注意的是:M是操作系统(内核 ...
调度器的由来和分析
前言我在看刘丹冰老师的视频教程Golang深入理解GPM模型时,发现《调度器的由来和分析》这章节有很多有同学在弹幕和评论区表示质疑和不解,所以我结合了一些操作系统的知识对这一章节进行的重构,创作了本文章。如果有出现纰漏,请及时指出。
用户态|内核态我们的操作系统有两种状态,用户态和内核态,我们可以简单把用户态和内核态理解为平民阶级和特权阶级。应用程序在用户态下执行时,只能访问受限的资源和执行受限的指令集。内核态下运行的代码则可以直接操作硬件设备、更改系统资源状态、执行特权指令等。这是为了保护系统,因为一些特权指令是很危险的,例如清空内存。如果我们不得不使用用户态下的特权指令时,可以通过系统调用切换状态。值得注意的是系统调用发生在用户态,对系统调用的相关处理需要在内核态下进行。
关于更多用户态和内核态的知识,大家可以自行查询相关资料,但是对于接下来课题的学习,大家只要记住一点就好了:用户态和内核态的切换是一种昂贵的操作,涉及到上下文切换、权限切换等开销。
进程|线程|协程进程、协程和线程是计算机中用于实现并发和并行的概念。它们表示了不同的执行单元和调度方式。
进程
进程是操作系统分 ...
Linux任务调度工具
前言本文是视频教程韩顺平 一周学会Linux部分章节的归纳总结,内容补充和错误纠正。
概述Linux中的任务调度是指在特定的时间或条件下执行预定的任务。crond和at都是Linux中用于任务调度的工具。crond可以周期性地执行任务,而at则可以在指定的时间点执行任务。它们都可以帮助用户在特定的时间或条件下自动执行预定的任务,提高工作效率。
crond简要介绍
crond是Linux系统中的一个守护进程,负责周期性地执行预定的任务。它根据预设的时间表(通常是crontab文件)来触发任务的执行。crontab文件包含了一系列的任务定义,每个任务定义包括了任务的执行时间、执行的命令或脚本等信息。crond会根据这些定义,按照设定的时间间隔周期性地执行任务。常见的时间间隔包括每分钟、每小时、每天、每周、每月等。
需要注意的是,at命令在某些系统上可能未预装(本人使用的Ubuntu 22.04未预装),可能需要通过包管理器安装。
基本语法
corntab [选项]:选项如下
选项
说明
-e
编辑corntab文件
-l
查询corntab定时任务调度
-r
递归删 ...
Linux权限管理
前言本文是视频教程韩顺平 一周学会Linux部分章节的归纳总结,内容补充和错误纠正。
概念组
Linux系统中的每个文件和目录都有一组权限,用于控制对它们的访问。这些权限分为三个类别:
所有者(Owner)
所属组(Group)
其他人(Others)
权限
每个类别都有读(Read)、写(Write)和执行(Execute)权限。权限可以使用符号表示法来表示,其中每个类别都有一个字母表示权限:
r(读权限):表示可以读取文件内容或查看目录中的文件列表。
w(写权限):表示可以修改文件内容,或在目录中创建、删除和重命名文件。
x(执行权限):对于文件,表示可以执行文件作为可执行程序;对于目录,表示可以进入目录。
注意:如上面所说,如果你对一个文件拥有w权限,你可以修改这个文件,但是你并不能删除这个文件。删除这个文件的前提是你拥有文件所在目录的w权限
在Linux中权限有两种表示方法:
符号表示法
权限符号表示法的格式为:[所有者权限][所属组权限][其他人权限]。
例如,rw-r--r--表示所有者具有读写权限,所属组和其他人只有读权限,数字表示法表示为644
数字表示法
权限 ...
基于均方根(RMS)和过零率的语音/音乐判别器
原文链接https://www.csd.uoc.gr/~tziritas/papers/07tmm01-panagiotakis-proof.pdf
摘要在过去的几年,我们对开发提取音视频媒体中信息的方法做出了很多重大努力,以便于在数据库中自动存储和检索这些信息。在这项工作中,我们处理音频的特征,这可能用于更大的音视频系统的一部分或者作为独立的系统,例如将音频记以数字信号形式存储在磁盘。我们的目标是先开发一个系统用于对单独的音频分段,然后将其分为两个主要分类之一:语音或者音乐。系统要求包括处理速度以及在实时环境中以尽量小延迟去执行操作。因为限制了两个类,需要提取的特征更少了,而且需要的计算都是直接计算。实验结果表明,在不牺牲性能的情况下,效率非常好。
分段基于平均信号幅度分布,而分类则利用与频率相关的附加特征。 分类算法可以与分段算法结合使用,在这种情况下,它可以验证或否定 音乐-语音或语音-音乐的转换,或者对于给定的音频片段独立地使用。基本特征是在20毫秒的时间间隔内计算的,从而可以将分段的边界精确到20毫秒的准确度。最小的分段长度为一秒。分割和分类算法在一个大型数据集上进行了基准测 ...
Linux常用命令
前言本文是视频教程韩顺平 一周学会Linux部分章节的归纳总结,内容补充和错误纠正。
概述Linux命令是一组用于在Linux操作系统上执行特定任务的命令。这些命令可以在终端窗口中使用,也可以通过脚本自动化执行。Linux命令可以用于管理文件和目录、安装和卸载软件、配置网络、查看系统状态等多种任务。在Linux中,命令通常由一个或多个单词组成,可以带有选项和参数,用于指定命令的行为和操作对象。Linux命令是Linux操作系统中的核心组件之一,掌握Linux命令可以帮助用户更好地管理和使用Linux系统。
下面整理了一些Linux系统中常用的命令,让我们一起看看吧
帮助命令基本介绍
man [命令|配置文件]:获取该命令或配置文件的帮助信息,例如查看ls命令的帮助信息可以输入man ls
help [命令] :获取Shell内置命令的帮助信息,例如help cd查看cd命令信息
--help:一般所有的CLI程序都是命令和选项组成的,一般情况都有--help选项(有时候是-h),可以查看该命令及其选项将要说明
关机和重启基本介绍
shutdown -h now:立刻关机
shut ...
Linux的目录结构
前言本文是视频教程韩顺平 一周学会Linux部分章节的归纳总结,内容补充和错误纠正。
概述在Linux中,一切皆为文件。Linux系统会把硬件,网络,系统等各种东西映射成文件。
因此与Windows不同,Linux中的目录结构是有规范的,不同的目录承载着不同的功能。
具体的目录结构下表整理了Linux系统一些具体的目录结构,使用频率和说明
目录
使用频率
说明
/bin
【常用】如/usr/bin,/usr/local/bin
Binary的简写,存放着最常用的程序(命令)
/sbin
【常用】如/usr/sbin,/usr/local/sbin
Super User Binary的简写,存放系统管理员使用的系统管理程序(命令)
/home
【常用】如/home/UserName
在Linux中每一个普通用户都有一个自己的目录,一般以自己的用户名命名
/root
【常用】
系统管理员的目录,也称为超级权限者的用户目录
/lib
【不常用】
系统开机所需最基本的动态链接共享库,其作用类似于Windows里的DDL文件。几乎所有的应用程序都需要用到这些共享库 ...
Vi与Vim快速入门
前言本文是视频教程韩顺平 一周学会Linux部分章节的归纳总结,内容补充和错误纠正。
简介Vi是Linux系统内置的文本编辑器
Vim可以看做Vi的升级版本,具有程序编辑功能,可以主动设置以字体的颜色辨别语法正确性,方便程序设计。拥有代码补全,编译错误跳转等方便编程的等丰富功能。
模式三种模式Vi和Vim有三种常用模式
正常模式
当我们用vim或者vi打开一个文档时,默认进入的模式。在这个模式下,我们可以用方向键移动光标,可用【删除字符】或者【删除整行】来处理档案内容,也可以用【复制】,【粘贴】来处理文件数据
插入模式
按下i,I,o,O,a,A,r,R任何一个键可以进入插入模式,一般来说按i就可以了
命令行模式
正常模式下输入:可以进入命令行模式。使用相关命令,可以完成【读取】,【存盘】,【替换】,【离开】,【显示行号】等操作。
模式切换
在终端下,我们可以使用vi xxx 或vim xxx进入相应编辑器的正常模式浏览文件
在正常模式下,我们可以输入i或上面提到的任何一个字母进入插入模式进行文本编辑
在插入模式下,我们可以按esc键退出插入模式
在正常模式下,我们可以输入:或者/进入 ...
MySQL数据库锁机制
前言这是一篇关于MySQL数据库索引的文章。该文章是黑马程序员—MySQL数据库入门到精通视频的归纳总结和补充,同时也引用了公共仓库 - 智云知识和Java Guide的部分内容,仅用于个人技术归档和技术分享。
概述锁机制,是处理并发场景下保持数据一致性的使用的机制。我们要清楚一点,锁机制一般都是对于并发事务而言的,下面说到阻塞,一般是多事务操纵数据库时发生的
在MySQL数据库中,按照功能性来分,又可以分为:共享锁和排他锁
按照锁的粒度分类可以分为:全局锁,表级锁,行级锁
共享锁和排他锁不论是表级锁还是行级锁,都存在共享锁(Share Lock,S 锁)和排他锁(Exclusive Lock,X 锁)这两类:
共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容)。
排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁(锁不兼容)。
排他锁与任何的锁都不兼容,共享锁仅和共享锁兼容。(读读兼容,读写冲突,写写冲突)
S 锁
X ...
MySQL数据库InnoDB引擎
前言这是一篇关于MySQL数据库索引的文章。该文章是黑马程序员—MySQL数据库入门到精通视频的归纳总结和补充,同时也引用了公共仓库 - 智云知识和Java Guide的部分内容,仅用于个人技术归档和技术分享。
逻辑存储结构
表空间Tablespace(ibd文件):一个MySQL数据库实例可以有多个表空间,用于存储记录,索引等数据
段Segment:分为数据段(Leaf Node segment)、索引段(Non-leaf node segment、回滚段(Rollback segment),InnoDB是索引组织表,数据段是B+树的叶子节点。段用于管理多个Extent(区)
区Extent:表空间单元结构,每个区大小为1M。默认情况下,InnoDB的存储引擎页大小为16K,即一个区一共有64个连续的页
页Page:InnoDB引擎磁盘管理的最小单元,每个页默认为16K。为了保持页的连续性,InnoDB引擎每次从磁盘申请4-5个区。
行Row:InnoDB引擎数据是按照行存放的。
DB_TRX_ID:每次对于记录进行改动时,都会把对应的事务ID赋值给DB_TRX_ID隐藏列
DB ...
