Linux 基础 | 青训营笔记
Linux/Unix 是我到现在用过最多的开发环境了,不同于Win,Unix 带有终端的功能也让我用起来更加方便快捷,现在就跟着这篇笔记,来介绍下他的优点吧!
学习 Linux 的价值:
- 可以加深对操作系统概念和实现的理解,夯实基础知识
01 计算机硬件
计算机由五大基本单元组成
- 控制器
- 运算器 (和控制器共同组成 CPU)
- 存储器单元
- 输入单元
- 输出单元
相互之间如何配合的:
基本单元的原型流程:
从输入设备输入指令,经过控制器、运算器、存储器之间的处理,最终输出结果到输出设备展示给用户。
02 Computer OS
操作系统(Operating System)
管理和控制计算机系统中的硬件和软件资源,用于在用户与系统硬件之间传递信息。
操作系统启动流程
分为两种:BIOS legacy 和 UEFI
两种模式是一段固化在主板上的程序,计算机启动时候时会默认运行这段程序,然后通过其去运行主板引导项。
-
BIOS:BIOS => 自检 => Bootloader => OS
-
UEFI:UEFI => Bootloader => OS
UEFI 优化了自检 (应该是把自检内容已经写到一个文件,直接读取) 还有UEFI 搭配的 GPT 可以支持超过2.2T 的磁盘。
03 Linux 系统概览
Linux 版本
-
内核版本 (kernel)
-
发行版本(Distro)
Linux Kernel + usually Softwares(DE、WM、TE) = Linux Distro (Debian、Ubuntu、Arch)
查看 Linux 内核版本
# Methods 1
uname -a
# Methods 2
cat /proc/version
查看 linux 系统版本
cat /etc/os-release
Linux 应用领域
-
IT 服务器
-
嵌入式和智能设备
-
个人办公桌面
-
学术研究与软件研发
04 Linux 系统结构
Linux 基本组成
Linux 系统一般有 4 个主要部分:
-
内核
-
shell
-
文件系统
-
应用程序
Linux 体系结构
Linux kernel Comic
04 LInux 系统结构(System structures)
进程管理:
-
进程是正在执行的一个程序或命令(动态概念)
-
进程有自己的地址空间,占用一定的系统资源(CPU、Memory)
-
一个CPU 核同一时间只能运行一个进程
-
进程由它的进程ID (PID) 和它父进程的进程ID (PPID) 唯一识别
当 Linux 启动一个进程,是 fork 父进程来拉起一个子进程,以父进程为模版,创建一个新的进程,将子进程自己的系统资源和内容映射到新创建的进程当中,而不是通过接口来创建新进程。
当 Linux 启动时,会拉起一个 pid 0的创始进程。pid 0 启动时,会拉起 pid1 和pid2 。pid 1进程是所有用户进程的父进程,pid 2 是所有内核进程的父进程。后续默认情况下,Linux启动一个用户进程都是以 pid 1 为模版创建的。
Linux 的进程结构是一个树形结构,这种结构也为管理进程提供了很大的便利,不管是内核对进程的管理,还是用户对进程的管理。
查看进程信息:
# 查看启动的 niginx 进程
ps -ef | grep nginx
# 查看某个进程
top -p <pid>
# 关闭指定的进程
kill <pid>
top ## btop bpytop
进程调度
CPU将其运行时间做切分,例如100ms, 执行一个进程,当运行完成或者时间到期,就会切换到下一个进程。
进程创建完成后,就会进入就绪状态,等待被调度。当 CPU 发起调度,拉起进程进行执行后,进程处于运行状态。当本次调度结束,进程又回到就绪的状态。
进程运行时,碰到某些特殊事件执行,例如执行一次IO时,IO执行的过程中,会需要出一个等待的状态,就会又回到个进程就绪的状态。等待本次IO完成后,再去等待CPU又去把这个进程调起来。
Create => 就绪 => 执行 =>(执行完) 就绪 =>
进程关闭 => 进程僵死 并向父进程发送进程关闭的消息,然后释放该进程占有的计算机资源,等待父进程执行关闭命令 => 父进程执行关闭命令后,子进程才真正被关闭
阶段对应的进程状态:
-
R:可执行状态,(进程就绪 可执行的状态)
-
S:可中断的睡眠状态(NGINX 没有在处理用户请求时的状态,也可以理解为开启一个服务 用户端没有提出任何请求时的状态 )
-
D:不可中断的睡眠状态 (该进程在等待某一次IO的完成
-
T:暂停状态或跟踪状态(被跟踪或者停止,往往是被调试Debug工具引起
-
Z:退出状态,成为僵尸进程
-
X:退出状态,进程即将被销毁
进程调度原则
-
一个 CPU 核同一时间只能运行一个进程
-
每个进程有近乎相等的执行时间
-
对于逻辑CPU 而言 进程调度使用轮询的方式执行,当轮询完成则回到第一个进程反复(管理进程时,会把进程都放入队列,所有进程都进行完成了,开始下一个队列。避免低优先级的进程被饿死)
-
进程执行消耗时间和进程量成正比
进程的系统调用
Linux 系统结构分为两块,内核空间和用户空间。 当应用程序处于用户空间运行称为用户态,处于内核空间运行称为内核态。
Nginx 举例,当Nginx 开始运行时,默认处于用户态(用户空间)。当有个请求发送到Nginx时,需要读取一些页面文件,返回给用户,需要读取一些页面,就会发生(调用?)一次 IO请求。这次IO请求可以称为一次系统调用。当发生一次系统调用时,有一个IO读取的任务,任务就会切换到内核态来执行。 可以理解应用程序切换到了内核态,有权限和底层硬件进行交互,读取相应文件。 读取完会把结果返回给用户态的应用程序,然后应用程序会重新从内核态切换到用户态,把结果返回给调用的用户,把结果呈现给他。
总结:用户进程(程序)会频繁在用户态和内核态之前进行切换,来保证用户能读取一些硬件的资源或者调用一些内核态的资源。
文件系统
Linux 中一切皆文件。负责把用户的文件存到磁盘硬件中。都是通过文件的方式。
(目录也是文件)还有网络的 socket (连接字段)也是文件。
不同文件有不同类型。 ext2/3/4:普通文件类型,nfs:网络文件类型,proc、sysfs:内存里的虚拟文件类型。只存在内存当中,不是真正的文件系统。但 Linux 中 都是统一作为文件处理。
所有东西都是统一的,read去读,write去写,chmod去修改权限。
文件目录
-
/bin: Binary,这个目录存放着常用命令 -
/boot: 存放着启动 Linux 时使用的一些核心文件(引导),包括一些连接文件以及镜像文件。 -
/dev: Device,存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。 -
/etc: Etcetera,用来存放所有的系统管理所需要的配置文件和子目录。
-/home: User main Directory.目录名一般以账号名命名
-
/lib: Library,存放着系统最基本的动态连接共享库,类似于 Win 的DLL,几乎所有的应用程序都要用到这些共享库。 -
/mnt: 系统提供该目录是为了让用户临时挂载别的文件系统,可以将光驱 或外置硬盘挂载在 /mnt/ 上,就可以在该目录查看光驱、硬盘上的内容了。 -
/opt: Optional,是给主机额外安装软件所放的目录,例如你安装一个MySQL数据库就可以放在此处,默认为空。 -
/proc: Process,/proc 是虚拟文件系统VFS,存储的是当前内核运行状态的一系列特殊文件,/proc 是一个虚拟的目录,是系统内存的映射,我们可以直接通过访问这个目录来获取系统信息。 -
/root:系统管理员 or name super user 的主目录 -
/sbin: Super User Binaries,存放着管理员使用的系统管理程序。 -
/usr: unix shared resources ,是一个非常重要的目录,用户许多应用程序和文件都放在此处,类似 Win 的 program files
虚拟文件系统
通过VFS打通不同类型,做中间层的抽象,达到能读写文件。
中间层抹平文件差异。
查看文件系统类型
# dt 报告文件系统磁盘空间利用率
df -T
# mount 挂着文件系统,不带任何参数运行,会打印包含文件系统在内的磁盘分区信息
mount
文件基本操作
ls
mkdir <dir>
mv <dir> <new-dir>
rm -r <dir>
touch file.txt
cp file.txt file_bak.txt
文件读取流程
当接收到用户请求时,去找请求对应的文件,将文件内容读取出来,返回给用户。
首先进程去用户缓冲区寻找,去看以前是否命中过,有数据缓存。如果有的话,会直接从用户缓冲区读文件,然后返回。
如果没有命中,就要发起一次系统调用,就是会发起一次系统IO。IO系统调用发起时,进程就会从用户态进入到内核态后,内核进程会从内核缓冲区去读取以前是否有命中过对应的内容,是否有缓存。
有的话也会直接从内核缓冲区通过CPU将这些数据 Copy到用户缓冲区,然后给用户进程使用。如果没有命中,内核进程需要通过 DMA(直接存取访问)向磁盘发起文件读取请求,DMA会把磁盘中的文件,相关的数据Copy 到内核缓冲区。
然后当内存缓冲区有数据时, 就会向CPU 发送指令,CPU 就会将数据从内核缓冲区 Copy 到用户缓冲区,进程最后就会读取到用户缓冲区内的内容。
写入的部分,通过CPU拷贝到一个 Socket 缓冲区,最终通过 DMA 用网卡发回给用户。
DMA:可以直接和磁盘进行交互,获取磁盘数据,将磁盘数据写到内核缓冲区。
缓冲区的作用:为了减少对系统的调用次数,集中调用,提高系统性能。
用户权限:
用户账户:
-
普通用户账户:在系统中进行普通作业
-
超级用户账户
组账户:
-
标准组:可以容纳多个用户
-
私有组: 只有用户自己
查看用户信息
# 查看当前登录用户信息
w
# 查看当前用户所属的组
groups
# 查看用户的 uid 信息
id xxxx
文件权限:
文件权限关于用户有三个概念:
-
所有者: 文件的所有者
-
所在组:文件的所有者所在的组
-
其他人:除文件所有者及所在组外的其他人
每个用户对于文件都有不同的权限,包括 读(R)、写(W)、执行(X)
用户权限操作:
cd / && mkdir <dir> && ls -ld <dir>
sudo useradd <user>
sudo passwd <pwd>
su <user>
cd <dir>
touch index.js #创建文件,提示无权限,需要给 <user>用户 <dir>文件夹的权限
sudo chown -R <user>:<user> ./<dir> # <dir> 文件夹权限给 <user>
su <user>
cd <dir>
touch index.js # Create files success.
5 Software Package
Software package manage
-
底层工具:用来处理安装和删除软件包等任务,DPKG、RPM
-
上层工具:用于数据的搜索任务和依赖解析任务,APT、PACMAN
配置 Mirrors
推荐使用清华源,教程比较详细明了。
Setting in /etc/apt/sources.list
deb mirrors