Linux基础 | 青训营笔记

100 阅读13分钟

计算机硬件

一:运算器

运算器是计算机的核心部件,承担着数据的算术或逻辑运算。算术运算包括加、减、乘、除等,逻辑运算包括与、或、非等,这些运算通常由计算机的运算器部件进行完成。

二:控制器

控制器是整个计算机的大脑,控制着各个部件的协调运行,比如有条不紊的从存储器中取出程序指令,然后译码,根据得到的译码指令,驱动运算器工作,或根据运算器得到的计算结果和状态做出相应的控制等。

三:存储器

计算机处理的数据,通常来自存储器,这里存储的不仅有程序代码或程序指令序列,还存放着程序需要的数据信息。存储器是数据存储的设备,计算机运行后,控制器会调用存储器中的代码进行执行,从而完成各种任务。

四:输入设备

输入设备是必不可少的设备,程序或数据要想进入计算机内部,必须要有输入设备,常用的输入设备为键盘和鼠标。不仅如此,输入设备也是人机交互的必要设备,键盘和鼠标是常规的输入设备,还有其他输入设备,比如手写板,触摸屏,扫描仪等也是输入设备。

五:输出设备

计算机运行后的结果,通常要通过打印机或显示器进行输出,这样才能被人们看到计算机结果。计算机是打印设备,要借助打印机和打印纸进行显示,而显示器则直接通过点阵的像素进行结果的显示。打印机和显示器虽然原理不同,但都是计算机的输出设备。

计算机操作系统

功能:

image.png

特征:

image.png

运行机制:

image.png

系统调用:

image.png

开机流程

1.传统的BIOS启动过程

开机——BIOS初始化——BIOS自检——引导操作系统——进入系统

2.UEFI启动过程

开机——UEFI初始化——引导操作系统——进入系统(省了自检这一步,开机速度稍微快)

Linux系统结构

Linux由4部分组成:内核,shell,文件系统(内核空间),应用程序(用户空间)。   image.png

1. 内存管理

对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

2 .进程管理

进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。

进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。

通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。

image.png

image.png

文件系统

Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux 将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。Linux 操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux 土生土长的文件系统。但 Linux 也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其它操作系统交换数据。由于 Linux 支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统. image.png

image.png

image.png

虚拟文件系统

虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。

  文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要时就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

*** 因此,用户和进程不需要知道文件所在的文件系统类型,而只需要像使用 Ext2 文件系统中的文件一样使用它们。***

image.png

4. 设备驱动程序

设备驱动程序是 Linux 内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程序,而不是 IDE 驱动程序。

5.网络接口(NET)

提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。Linux 的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。 网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。

Linux shell

shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。 目前主要有下列版本的shell。

1.Bourne Shell:是贝尔实验室开发的。  

2.BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell。

3.Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。    

4.C Shell:是SUN公司Shell的BSD版本。

Linux支持的常见文件系统

Linux 系统能够支持的文件系统非常多,除 Linux 默认文件系统 Ext2、Ext3 和 Ext4 之外,还能支持 fat16、fat32、NTFS(需要重新编译内核)等 Windows 文件系统。也就是说,Linux 可以通过挂载的方式使用 Windows 文件系统中的数据。Linux 所能够支持的文件系统在 "/usr/src/kemels/当前系统版本/fs" 目录中(需要在安装时选择),该目录中的每个子目录都是一个可以识别的文件系统。我们介绍较为常见的 Linux 支持的文件系统,如图所示。

image.png image.png

用户态和内核态

应用程序是无法直接访问硬件资源的,需要通过通过内核SCI 层提供的接口来访问硬件资源。

Linux系统将自身划分为两部分,一部分为核心软件,即是kernel,也称作内核空间,另一部分为普通应用程序,这部分称为用户空间。

区分用户空间和内核空间的目的是为确保系统安全。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。因为如果应用程序和内核在同一个保护级别,那么应用程序就有可能有意或者不小心进入了内核空间,破坏了内核空间的代码和数据,系统崩溃就不足为奇。所以CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3, 内核空间级别为“RING0”, 用户空间级别为“RING3”。

linux的内核是一个有机的整体。每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。

当应用程序进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(RING0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(RING3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。

内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, 如上所提到的intel cpu提供Ring0-Ring3四种级别的运行模式,Ring0级别最高,Ring3最低。Linux使用了Ring3级别运行用户态,Ring0作为 内核态,没有使用Ring1和Ring2。

从用户空间到内核空间有两种触发手段:

1.系统调用: 用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。

2.中断:
硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。例如网卡发送一个数据包或硬盘驱动器提供一次 IO 请求等。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。 image.png

虚拟机命令

1

image.png

image.png 查询自己linux虚拟机的版本为5.19.0-38-generic #39-22.04.1-Ubuntu

2

image.png

3

Kill指令可以杀死刚才访问的nginx进程 按1,则可以展示出服务器有多少CPU,及每个CPU的使用情况!

image.png

观察%Cpu0和%Cpu1,说明有两个cpu在运作。

显示不同模式下所占cpu时间百分比,

us/user: 运行(未调整优先级的) 用户进程的CPU时间

sy/system: 运行内核进程的CPU时间

ni/niced:运行已调整优先级的用户进程的CPU时间

wa/IO wait: 用于等待IO完成的CPU时间

hi:处理硬件中断的CPU时间

si: 处理软件中断的CPU时间

st:这个虚拟机被hypervisor偷去的CPU时间

一般而言,服务器的合理负载是CPU核数*2。也就是说对于8核的CPU,负载在16以内表明机器运行很稳定流畅。如果负载超过16了,就说明服务器的运行有一定的压力了。

4

按shift + M,则将进程按照内存使用率从大到小排序

image.png

5

按shift+P,则将进程按照CPU使用率从大到小排序,很容易能够定位出哪些服务占用了较高的CPU和内存。

image.png

6

查看系统最近1,5,15分钟的平均负载

查看系统中有多少个zombile(僵尸进程)

查看系统的内存的利用率

image.png

7

按q退出。 仅仅有top命令是不够的,因为它仅能展示CPU和内存的使用情况,对于负载升高的另一重要原因——IO没有清晰明确的展示。linux提供了iostat命令,可以了解io的开销。

8

查看文件系统类型 image.png

9

基操

image.png

用户权限

1.查看当前登录用户信息 2.查看当前组 3.查看用户uid信息 image.png

关于文件权限

image.png image.png

Linux系统软件包管理器

image.png 底层工具:自己买锅,底料,原料并做菜 上层工具:雇一个厨师买原料并做菜

image.png

目前自己用过的Ubuntu,apt,apt-get,dpkg,.deb

一些软件安装命令

image.png

总结:以上笔记有课堂内容,自己理解,以及一些博主的博客理解。本次课程主要是建立了对前端linux系统的构成以及一些linux操作基础知识的概念和理解