type
status
date
slug
summary
tags
category
icon
password
Property
函数(function)是可以重复使用的代码片段,有利于代码的复用。它与别名(alias)的区别是,别名只适合封装简单的单个命令,函数则可以封装复杂的多行命令。
函数总是在当前 Shell 执行,这是跟脚本的一个重大区别,Bash 会新建一个子 Shell 执行脚本。如果函数与脚本同名,函数会优先执行。但是,函数的优先级不如别名,即如果函数与别名同名,那么别名优先执行。
Bash 函数定义的语法有两种:
fn
是自定义的函数名,函数代码就写在大括号之中。一个简单函数的例子
调用时,就直接写函数名,参数跟在函数名后面。
type
status
date
slug
summary
tags
category
icon
password
Property
FHS 是 File System Hierarchy Standard(文件系统层次化标准)的缩写,多数Linux 版本采用这种文件组织形式,类似于 Windows 操作系统中 c 盘的文件目录,FHS 采用树形结构组织文件。FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。
根据 FHS(Filesystem Hierarchy Standard) 的官方文件指出, 他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下,重点在于规范每个特定的目录下应该要放置什么样的数据。
FHS 标准根据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四种交互作用形态:
- 可分享的:可以分享给其他系统挂载使用的目录
- 不可分享的:与自身机器直接相关的设备文件等,不能分享给其他主机
- 不变的:数据不常变动的文件
- 可变动的:经常改变的数据,如登录文件、新闻组等。
事实上,FHS针对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义:
type
status
date
slug
summary
tags
category
icon
password
Property
目录
用户身份与能力
设计Linux系统的初衷之一就是为了满足多个用户同时工作的需求,因此Linux系统必须具备很好的安全性。
在安装Linux系统时,特别要求设置root管理员密码,这个root管理员就是存在于所有类UNIX系统中的超级用户。它拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户、启动/关闭服务进程、开启/禁用硬件设备等。虽然以root管理员的身份工作时不会受到系统的限制,但一旦使用这个高能的root管理员权限执行了错误的命令可能会直接毁掉整个系统。
Linux系统的管理员之所以是root,并不是因为它的名字叫root,而是因为该用户的身份号码即UID(User IDentification)的数值为0。在Linux系统中,UID就相当于我们的身份证号码一样具有唯一性,因此可通过用户的UID值来判断用户身份。
- 管理员UID为0:系统的管理员用户
type
status
date
slug
summary
tags
category
icon
password
Property
物理设备的命名规则
Linux
系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的udev
设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev
设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev
目录下的设备文件。Linux
系统中常见的硬件设备的文件名称:硬件设备 | 文件名称 |
IDE设备 | /dev/hd[a-d] |
SCSI/SATA/U盘 | /dev/sd[a-z] |
virtio设备 | /dev/vd[a-z] |
软驱 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
光驱 | /dev/cdrom |
鼠标 | /dev/mouse |
type
status
date
slug
summary
tags
category
icon
password
Property
算法复杂度(Algorithm complexity):在问题的输入规模为的条件下,程序的时间使用情况和空间使用情况。
算法所追求的就是 所需运行时间更少(时间复杂度更低)、占用内存空间更小(空间复杂度更低)。所以进行「算法分析」,就是从运行时间情况、空间使用情况两方面对算法进行分析。
要比较两个算法的优劣通常有两种方法:
- 事后统计:将两个算法各编写一个可执行程序,交给计算机执行,记录下各自的运行时间和占用存储空间的实际大小,从中挑选出最好的算法
- 预先估算:在算法设计出来之后,根据算法中包含的步骤,估算出算法的运行时间和占用空间。比较两个算法的估算值,从中挑选出最好的算法
大多数情况下,会选择第 2 种方式。因为第 1 种方式的工作量实在太大,得不偿失。另外,即便是同一个算法,用不同的语言实现,在不同的计算机上运行,所需要的运行时间都不尽相同。所以我们一般采用预先估算的方法来衡量算法的好坏。
采用预先估算的方式下,编译语言、计算机运行速度都不是我们所考虑的对象。只关心随着问题规模扩大时,时间开销、空间开销的增长情况。
type
status
date
slug
summary
tags
category
icon
password
Property
vector
是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector
是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector
是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。vector
的扩充机制
按照容器现在容量的一倍进行增长。
vector
容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。迭代器
_First
指向使用空间的头部,_Las
t指向使用空间大小(size)的尾部,_End
指向使用空间容量(capacity)的尾部type
status
date
slug
summary
tags
category
icon
password
Property
目录
链表
链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删除数据十分方便,但寻找与读取数据的表现欠佳。
- 链表因其链状的结构,能方便地删除、插入数据,操作次数是。但也因为这样,寻找、读取数据的效率不如数组高,在随机访问数据中的操作次数是。
- 数组可以方便地寻找并读取数据,在随机访问中操作次数是。但删除、插入的操作次数是次。
优点:存储空间不必事先分配,在需要存储空间的时候可以临时申请,不会造成空间浪费;一些操作的时间效率远比数组高(插入、移动、删除等)
缺点:不仅数据元素本身的数据信息要占用存储空间,指针也需要占用存储空间,链表结构比数组结构的空间开销大。