Linux 基础 | 青训营笔记

131 阅读10分钟

Linux 基础 | 青训营笔记

Linux/Unix 是我到现在用过最多的开发环境了,不同于Win,Unix 带有终端的功能也让我用起来更加方便快捷,现在就跟着这篇笔记,来介绍下他的优点吧!

学习 Linux 的价值:

  • 可以加深对操作系统概念和实现的理解,夯实基础知识

01 计算机硬件

计算机由五大基本单元组成

  • 控制器
  • 运算器 (和控制器共同组成 CPU)
  • 存储器单元
  • 输入单元
  • 输出单元

相互之间如何配合的:
基本单元的原型流程:

Hardware-prototype.png

从输入设备输入指令,经过控制器、运算器、存储器之间的处理,最终输出结果到输出设备展示给用户。

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

  • 文件系统

  • 应用程序

F-3-2.png

Linux 体系结构

F-3-3.png

Linux kernel Comic

LInux-kernel-comic.png

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 为模版创建的。

F-3-4.png

Linux 的进程结构是一个树形结构,这种结构也为管理进程提供了很大的便利,不管是内核对进程的管理,还是用户对进程的管理

查看进程信息:

# 查看启动的 niginx 进程
ps -ef | grep nginx

# 查看某个进程
top -p <pid>


# 关闭指定的进程
kill <pid>

top ## btop bpytop 

进程调度

CPU将其运行时间做切分,例如100ms, 执行一个进程,当运行完成或者时间到期,就会切换到下一个进程。

F-3-5.png 进程创建完成后,就会进入就绪状态,等待被调度。当 CPU 发起调度,拉起进程进行执行后,进程处于运行状态。当本次调度结束,进程又回到就绪的状态。

进程运行时,碰到某些特殊事件执行,例如执行一次IO时,IO执行的过程中,会需要出一个等待的状态,就会又回到个进程就绪的状态。等待本次IO完成后,再去等待CPU又去把这个进程调起来。

Create => 就绪 => 执行 =>(执行完) 就绪 =>

进程关闭 => 进程僵死 并向父进程发送进程关闭的消息,然后释放该进程占有的计算机资源,等待父进程执行关闭命令 => 父进程执行关闭命令后,子进程才真正被关闭

阶段对应的进程状态:

  • R:可执行状态,(进程就绪 可执行的状态)

  • S:可中断的睡眠状态(NGINX 没有在处理用户请求时的状态,也可以理解为开启一个服务 用户端没有提出任何请求时的状态 )

  • D:不可中断的睡眠状态 (该进程在等待某一次IO的完成

  • T:暂停状态或跟踪状态(被跟踪或者停止,往往是被调试Debug工具引起

  • Z:退出状态,成为僵尸进程

  • X:退出状态,进程即将被销毁

进程调度原则

  • 一个 CPU 核同一时间只能运行一个进程

  • 每个进程有近乎相等的执行时间

  • 对于逻辑CPU 而言 进程调度使用轮询的方式执行,当轮询完成则回到第一个进程反复(管理进程时,会把进程都放入队列,所有进程都进行完成了,开始下一个队列。避免低优先级的进程被饿死)

  • 进程执行消耗时间和进程量成正比

进程的系统调用

Linux 系统结构分为两块,内核空间和用户空间。 当应用程序处于用户空间运行称为用户态,处于内核空间运行称为内核态。

F-3-6.png

Nginx 举例,当Nginx 开始运行时,默认处于用户态(用户空间)。当有个请求发送到Nginx时,需要读取一些页面文件,返回给用户,需要读取一些页面,就会发生(调用?)一次 IO请求。这次IO请求可以称为一次系统调用。当发生一次系统调用时,有一个IO读取的任务,任务就会切换到内核态来执行。 可以理解应用程序切换到了内核态,有权限和底层硬件进行交互,读取相应文件。 读取完会把结果返回给用户态的应用程序,然后应用程序会重新从内核态切换到用户态,把结果返回给调用的用户,把结果呈现给他。

总结:用户进程(程序)会频繁在用户态和内核态之前进行切换,来保证用户能读取一些硬件的资源或者调用一些内核态的资源。

文件系统

F-3-7.png Linux 中一切皆文件。负责把用户的文件存到磁盘硬件中。都是通过文件的方式。

(目录也是文件)还有网络的 socket (连接字段)也是文件。

不同文件有不同类型。 ext2/3/4:普通文件类型,nfs:网络文件类型,proc、sysfs:内存里的虚拟文件类型。只存在内存当中,不是真正的文件系统。但 Linux 中 都是统一作为文件处理。

所有东西都是统一的,read去读,write去写,chmod去修改权限。

文件目录

F-3-8.png

  • /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

虚拟文件系统

F-3-9.png

通过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

文件读取流程

F-3-10.png 当接收到用户请求时,去找请求对应的文件,将文件内容读取出来,返回给用户。
首先进程去用户缓冲区寻找,去看以前是否命中过,有数据缓存。如果有的话,会直接从用户缓冲区读文件,然后返回。 如果没有命中,就要发起一次系统调用,就是会发起一次系统IO。IO系统调用发起时,进程就会从用户态进入到内核态后,内核进程会从内核缓冲区去读取以前是否有命中过对应的内容,是否有缓存。
有的话也会直接从内核缓冲区通过CPU将这些数据 Copy到用户缓冲区,然后给用户进程使用。如果没有命中,内核进程需要通过 DMA(直接存取访问)向磁盘发起文件读取请求,DMA会把磁盘中的文件,相关的数据Copy 到内核缓冲区。 然后当内存缓冲区有数据时, 就会向CPU 发送指令,CPU 就会将数据从内核缓冲区 Copy 到用户缓冲区,进程最后就会读取到用户缓冲区内的内容。

写入的部分,通过CPU拷贝到一个 Socket 缓冲区,最终通过 DMA 用网卡发回给用户。

DMA:可以直接和磁盘进行交互,获取磁盘数据,将磁盘数据写到内核缓冲区。

缓冲区的作用:为了减少对系统的调用次数,集中调用,提高系统性能。

用户权限:

用户账户:

  • 普通用户账户:在系统中进行普通作业

  • 超级用户账户

组账户:

  • 标准组:可以容纳多个用户

  • 私有组: 只有用户自己

查看用户信息

# 查看当前登录用户信息
w

# 查看当前用户所属的组
groups


# 查看用户的 uid 信息
id xxxx

文件权限:

文件权限关于用户有三个概念:

  • 所有者: 文件的所有者

  • 所在组:文件的所有者所在的组

  • 其他人:除文件所有者及所在组外的其他人

每个用户对于文件都有不同的权限,包括 读(R)、写(W)、执行(X)

F-3-11.png

用户权限操作:

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

Linux RoadMap

Linux Roadmap.png