计算机基础概念
计算器或者计算机简单说作用:接受用户输入指令与数据,经由中央处理器的数学与逻辑单元运算处理后, 以产生或储存成有用的信息
CPU:两个重要单元:算数逻辑单元与控制单元
算数逻辑单元主要负责程序运算与逻辑判断,控制单元则主要在协调各周边组件与各单元间的工作
那么,cpu需要的数据就是从 主存储器 发来的
对于CPU的指令集,也分为精简指令集和复杂指令集
精简:ARM
复杂:x86
区别:复杂指令集在微指令集的每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂, 每条指令的长度并不相同。因为指令执行较为复杂所以每条指令花费的时间较长, 但每条个别指令可以处理的工作较为丰富。
0/1 这个二进制的的单位我们称为 bit。
1 Byte = 8 bits
ram rom:ROM断电后信息不丢失 RAM断电信息丢失 rom以前是只可读 现在随着时代的发展,已经有部分可以更改,不过像手机的系统不可更改。
Linux
在 Linux 系统中,每个装置都被当成一个文件来对待
比如:硬盘 就 认为文件名是 /dev/sd[a-d]
在 Linux 这个系统当中,几乎所有的硬件装置文件都在/dev 这个目录内。
目录树:
所谓的『挂载』就是利用一个目录当成进入点,将磁盘分区槽的数据放置在该目录下; 也就是说,
进入该目录就可以读取该分区槽的意思
~:自己家目录
Linux区分大小写
基础指令:
显示日期与时间的指令: date
显示日历的指令: cal
简单好用的计算器: bc
[Tab]功能:『命令补全』与『文件补齐』
[Tab] 接在一串指令的第一个字的后面,则为『命令补全』;
[Tab] 接在一串指令的第二个字以后时,则为『文件补齐』!
若安装 bash-completion 软件,则在某些指令后面使用 [tab] 按键时,可以进行『选项/参数的补齐』功能!
[Ctrl]-c 按键: 中断目前程序
[Ctrl]-d 按键:『键盘输入结束(End Of File, EOF 或 End Of Input)』的意思! 另外,他也可以用来取代 exit 的输入呢!例如你想要直接离开文字接口,可以直接按下[Ctrl]-d 就能够直接离开了(相当于输入 exit 啊!)
[shift]+{[PageUP]|[Page Down]}按键 : [Shift]+[Page Up] 来往前翻页,也能够使用 [Shift]+[Page Down] 来往后翻页!
在线求助命令:man 和 info
man指令:
大致分为以下几类:
其后面的1:
在任何时候输入『/word』,来主动搜寻关键词
info:info page 则是将文件数据拆成一个一个的段落,每个段落用自己的页面来撰写, 并且在各个页面中还有类似网页的『超链接』来跳到各不同的页面中,每个独立的页面也被称为一个节点(node)。
简单的文本编辑器:nano
惯用的关机指令: shutdown
数据同步写入磁盘: sync 因此在 Linux 系统中,为了加快数据的读取速度,所以在默认的情况中, 某些已经加载内存中的数据将不会直接被写回硬盘,而是先暂存在内存当中,万一你的系统因为某些特殊情况造成不正常关机 (例如停电或者是不小心踢到 power)时,数据不会更新 就需要 sync 这个指令来进行数据的写入动作啦
重新启动,关机: reboot, halt, poweroff
Linux文件系统:
Linux 最优秀的地方之一就在于他的多人多任务环境。而为了让各个使用者具有较保密的文件数据,因此文件的权限管理
就变的很重要了。 Linux 一般将文件可存取的身份分为三个类别,分别是 owner/group/others,且三种身份各有
read/write/execute 等权限。
群组的意义:
改变文件属性和权限:
window和Linux的可执行文件的差别。
文件和目录权限区别:
建立目录可用 mkdir(make directory),建立空文件可用 touch()来处理。
文件种类:
Linux的文件扩展名没有实际作用,能不能执行只跟权限有关。
与此同时,能不能执行成功要看文件的内容。
虽然如此,不过我们仍然希望可以藉由扩展名来了解该文件是什么东西,所以, 通常我们还是会以适当的扩展名来表示该文件是什么种类的。
Linux目录配置:
Linux目录配置
环境变量:就是说不用绝对路径 系统会在环境变量中帮你寻找
使用 -l 及 -s 都会建立所谓的连结档(link file),但是这两种连结档却有不一样的情况。
那个 -l 就是所谓的实体链接(hard link),至于 -s 则是符号链接(symbolic link),
符号链接=快捷方式
硬链接:产生同一个指针 指向原来区域。
文件内容查阅:
more:
less:比起more可以往前翻页。
每个文件有三个时间,默认显示的是最近修改的时间。
umask 就是指定 『目前用户在建立文件或目录时候的权限默认值』
看后三个值 第一个值是特殊值
设定 umask: umask + 值(002)
隐藏属性:
脚本搜索:which
文件档名搜索:type
find:直接搜索磁盘 浪费时间
whereis :只在某些特定目录中寻找。
locate:利用数据库来搜索文件名字。locate 寻找的数据是由『已建立的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,
所以不用直接在去硬盘当中存取数据
Linux文件特性:
文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到inode 中,至于实际数据则放置到 data block 区块中。另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
这种叫做索引式文件系统,将占据的块在inode中标记出来,如下。
FAT格式,闪存,并没有inode存在,block中存放下一个block,如下。如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!
碎片整理:需要碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起,这样数据的读取会比较容易啊!
因此,FAT 的文件系统需要经常的碎片整理一下。
由于 Ext2 是索引式文件系统,基本上不太需要常常进行碎片整理的。
Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。
文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗磁盘唯一的 MBR, 这样也才能够制作出多重引导的环境啊。
data block:资料区块
在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及4K 三种而已。
inode table:inode表格
用直接、间接、双间接来存小文件和大文件。
superblock:超级区块。
比如读取一个/etc/passwd 过程。
1. / 的 inode:
透过挂载点的信息找到 inode 号码为 128 的根目录 inode,且 inode 规范的权限让我们可以读取该 block
的内容(有 r 与 x) ;
2. / 的 block:
经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (33595521);
3. etc/ 的 inode:
读取 33595521 号 inode 得知 dmtsai 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
4. etc/ 的 block:
经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码 (36628004);
5. passwd 的 inode:
读取 36628004 号 inode 得知 dmtsai 具有 r 的权限,因此可以读取 passwd 的 block 内容;
6. passwd 的 block:
最后将该 block 内容的数据读出来。
对于新建一个文件也要用到block bitmap 及 inode bitmap 的帮忙了
1. 先确定用户对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
2. 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
3. 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block
指向数据;
4. 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。
数据不一致性:因为不知名原因导致系统中断(例如突然的停电啊、 系统核心发生错误啊~等等的怪事发生时),所以写入的数据仅有 inode table 及 data block 而已, 最后一个同步更新中介数据的步骤并没有做完,此时就会发生 metadata 的内容与实际数据存放区产生不一致
日志式文件系统:
1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
2. 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;
3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。
ext4/ext3可以实现。
挂载点:每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才
能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』。 关于挂载的一些特性我们在第
二章稍微提过, 重点是:挂载点一定是目录,该目录为进入该文件系统的入口。 因此并不是你有任
何文件系统都能使用,必须要『挂载』到目录树的某个目录后,才能够使用该文件系统的。
df:列出文件系统的整体磁盘使用量;
du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
Linux连接档: ln
Hard Link (实体链接, 硬式连结或实际连结) ::hard link 只是在某个目录下新增一笔档名链接到某 inode 号码的关连记录而已。
压缩:正常是0101 的bit来进行存取, 有可能将为0的扔出来腾出空间,或者有100个1的时候,记录成100个1 而不是111111...11
有扩展名是因为压缩指令不同,
gzip:
注意:
bzip2:要比gzip更好
xz:优化更多 但是时间长。
tar:打包命令 可以压缩也可以打包
解压的时候 -jxv -f /root/etc.tar.bz2 在本目录解压
-jxv -f /root/etc.tar.bz2 -C /tmp 在/tmp下解压
常见备份:
vim:简单来说 是一个程序编辑器。
v分为三种模式:一般指令模式 编辑模式 指令列命令模式
编辑模式与指令列模式之间不可互相切换
u是撤销 ctrl +r 重做
切换到指令列模式的操作:
『:set nu』然后你会在画面中看到左侧出现数字即为行号。
vi中途 ctlr+z 退出的话会产生一个x.swp作为一个暂存档
vim的区块复制
多文件进行编辑
BASH:Bourne Again SHell (简称bash)
反斜杠 (\) :指令太长,回车不执行继续 指令
使用了单引号的时候,那么 $name 将失去原有的变量内容,仅为一般字符的显示型态而已!这里必需要特别小心在意!
从键盘读取变量
history的使用:
指令顺序:
login shell 默认会读取这两个配置文件。
常用bash:
bash的通配符:
默认的标准输出都是输出到屏幕上的。
>重定向会覆盖原来的内容
>> 会追加
将正确的和错误的都写入一个文件
用;来表示连续指令下达:
管道: |
只会处理标准输出 不会处理标准错误
管道命令必须能够接受前一个的输出 作为输入
cut 将需要的切出来
grep 有想要的就拿出来(高亮)
排序sort
uniqu 将重复的只显示一个
wc:输出有多少字?多少行?多少字符
tee:双重导向 文件和屏幕
tr: tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换!
col:可以用来简单的处理将[tab] 按键取代成为空格键!
join:主要是在处理『两个文件当中,有"相同数据" 的那一行,才将他加在一起』的意思。.
paste:将两行贴在一起,且中间以[tab] 键隔开
expand:将 [tab] 按键转成空格键
split:将一个大文件,依据文件大小或行数来分区,就可以将大文件分区成为小文件了
xargs:这个玩意儿就是在产生某个指令的参数的意思
关于减号- 的用途:
正规表示法:正规表示法就是处理字符串的方法,他是以行为单位来进行字符串的处理行为, 正规表示法透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程序!
『通配符(wildcard) 代表的是bash 操作接口的一个功能』,但正规表示法则是一种字符串处理的表示方式!
grep 提取信息:
dmesg命令用于显示开机信息。
kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里。
『grep 在数据中查寻一个字符串时,是以"整行" 为单位来进行数据的撷取的!』也就是说,假如一个文件内有10 行,其中有两行具有你所搜寻的字符串,则将那两行显示在屏幕上,其他的就丢弃了!
sed 通过管道修改文件内容或者 直接修改文件内容。
格式化打印: printf
awk:好用的数据处理工具
文件比对工具 diff
Shell scripts:程序脚本
这个程序是使用纯文本文件,将一些shell 的语法与指令(含外部指令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。
shell script 就像是早期DOS 年代的批处理文件(.bat) ,最简单的功能就是将许多指令汇整写在一起, 让使用者很轻易的就能够 one touch 的方法去处理复杂的动作
shell scripts的执行:
cript 的执行方式差异:
利用直接执行的方式来执行script :其实 script 是在子程序的bash 内执行的 『当子程序完成后,
在子程序内的各项变量或动作将会结束而不会传回到父程序中』
利用source 来执行脚本:在父程序中执行
test:利用test 指令的测试功能 看文件是否存在等
12章 暂时跳过
操作系统只认识 UID GID
UID :user id
GID:group id
/etc/passwd 文件结构 每一行代表一个账号。
用:分隔开 有七个东西。
账号名称 密码 UID GID 用户信息 家目录 shell
/etc/shadow 用:分隔开 有9个东西。
账号名 密码(加密过的) 最近改动的日期...
/etc/group GID对应
su 身份切换命令
su 和su-的区别
sudo
进程:
Linux下 触发任何一个事件都是进程,都有一个进程ID PID
不同的用户执行一个事件会根据自己的权限不同而 进程的权限不同
ppid 父进程pid
ps -l 查看进程
服务:常驻系统中的进程
执行指令时候可以在后面加个& 吧当前的任务放到背景,从而继续操作bash
将『目前』的工作丢到背景中『暂停』:[ctrl]-z
观察目前的背景工作状态: jobs
让工作在背景下的状态变成运作中: bg
管理背景当中的工作: kill
一个是只能查阅自己 bash 进程的『 ps -l 』
一个则是可以查阅所有系统运作的进程『 ps aux 』
因为该进程应该已经执行完毕,或者是因故应该要终止了, 但是该进程的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在内存当中。 如果你发现在某个进程的 CMD 后面还接上<defunct> 时,就代表该进程是僵尸进程啦
top:动态观察进程的变化
如果要找进程之间的相关性:pstree
free :观察内存使用情况
uname:查阅系统与核心相关信息
uptime:观察系统启动时间与工作负载
netstat :追踪网络或插槽文件
dmesg :分析核心产生的讯息
vmstat :侦测系统资源变化
编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。
1.预处理
gcc -E test.c -o test.i 或 gcc -E test.c
命令是-E 生成 *.i文件
2.编译为汇编代码(Compilation)
gcc -S test.i -o test.s
对 *.i文件 进行命令是 -s 生成.s
3.汇编(Assembly)
gcc -c test.s -o test.o
对 *.s文件 进行 -c 生成 *.o文件
4.连接(Linking)
gcc test.o -o test
对 *.o文件进行 生成可执行二进制制文件
-o 后面是要输出的名
如果直接gcc -o 是进行全部的操作(预处理、编译、汇编、连接)
gcc test.c -o test
如果 gcc 不加参数会生成a.out可执行文件
gcc:
gcc
当一个文件会调用其他文件的时候,就是多个互相链接的时候,如果用gcc -o 会输入多个文件
这个时候可以在目录下目录下建立一个名为 makefile 的文件
包含其gcc -o xxxx
最后make指令就好了。
作用:
简化编译时所需要下达的指令
若在编译完成之后,修改了某个原始码文件,则 make 仅会针对被修改了的文件进行编译,其他的 object file不会被更动;
最后可以依照相依性来更新 (update) 执行档