Linux操作系统基础原理

计算机系统

在这里插入图片描述

1.计算机体系层次

计算机自身是由众多电子元器件构成,硬件本身提供给用户的接口十分底层复杂,使用很不方便。在硬件之上的操作系统将硬件接口抽象封装为比较直观,用户容易调用的接口;用户开发应用程序,通过指令代码调用这些接口完成任务。
狭义的操作系统主要指系统内核,内核有以下作用:进程管理、文件系统、网络管理、内存管理、驱动程序、安全功能。内核可以将用户无法操作的底层硬件接口进行抽象并封装为用户可以操作的接口,称为系统调用(system call),当用户需要操作硬件时需要向内核发起系统调用完成相应操作。
shell解释器是运行在操作系统上的一个特殊的应用程序,它提供了人机交互接口,用户通过shell向操作系统发出各种命令,而shell解释器又可以将用户输入的命令翻译成操作系统能够理解的指令交给CPU执行,并将执行结果显示给用户。
最高层是运行在系统上的各种应用程序,由程序员使用各种编程语言开发,例如C、Java、JavaScript、PHP、C++等。应用程序体现了用户的真实目的,才能完成用户想做的事情。
总之从整个计算机系统看,越高级就越抽象,越接近用户的最终目的;越底层就越具体,越接近硬件的真实面目

2.计算机硬件

计算机5大基本部件:运算器、控制器(运算器和控制器都在CPU内部)、存储器、输入设备、输出设备,设备之间通过总线进行连接。
计算机总线按照其功能主要分为3种:
数据总线:传输指令和数据信息

  1. 是CPU与内存或其他器件之间的数据传送的通道。
  2. 数据总线的宽度决定了CPU和外界的数据传送速度。
  3. 每条传输线一次只能传输1位二进制数据。eg: 8根数据线一次可传送一个8位二进制数据(即一个字节)。
  4. 数据总线是数据线数量之和。

地址总线:传输地址信息,一般是存放数据的内存地址

  1. CPU是通过地址总线来指定存储单元的。
  2. 地址总线决定了cpu所能访问的最大内存空间的大小。eg: 10根地址线能访问的最大的内存为1024位二进制数据(1024个内存单元)(1B)
  3. 地址总线是地址线数量之和。

控制总线:传输控制信号和时钟信号

  1. CPU通过控制总线对外部器件进行控制。
  2. 控制总线的宽度决定了CPU对外部器件的控制能力。
  3. 控制总线是控制线数量之和。

在这里插入图片描述

通常讲32位或64位机,是指其地址总线位数是32位或64位。32位地址总线,其最大内存寻址空间位2^32,1024✖1024✖1024✖4=4GB。计算机主板上并不是全都有这3种总线,CPU通过控制器可以控制当前总线是什么功能。
在这里插入图片描述
各部件性能:CPU(寄存器)>一级缓存>二级缓存>三级缓存>内存>SSD硬盘>机械硬盘,一般每一颗核心都有自己的一级,二级缓存,各核心共享三级缓存。衡量一个CPU性能,不光看工作频率,缓存也是非常重要的指标。两颗相同频率,一级,二级缓存不同的CPU在造价上是有天壤之别。

2.1. CPU

CPU的执行指令大致分为3步骤:从内存中取指令、解码指令、执行指令,与之对应在CPU上分为3个单元:取指单元、解码单元、执行单元。为了实现高性能,这些单元都不止一个。
CPU内部有保存关键变量和临时数据的存储器,称为寄存器。寄存器性能很高,和CPU工作频率相当,在CPU内部总线上完成数据操作。

2.1.1 CPU与多线程

早期CPU性能提升主要靠提升工作频率或时钟周期,即在一秒内能完成的操作次数,但如今制造工艺出现瓶颈,无法在工作频率上继续突破,所以为了提升CPU的性能,出现了多核心技术,在一颗CPU上植入多颗核心,实现并行执行多个进程。
多核CPU上,如果只有一两个进程很繁忙,其他进程空闲,而一个进程只能调度在一颗核心上运行,这时对于CPU来说使用效率不高,如何实现一个进程如何工作在多个核心?从串行执行变为并行执行,将程序中互不相干的指令划分出来,形成多个不同执行流,每一个执行流就是一个线程,每个线程调度到不同的CPU核心上执行,从而实现了单进程到多线程的性能提升。多线程技术是实现并发编程的重要基础。

2.1.2 CPU缓存

CPU的寄存器的空间很小,而且主要用来存放程序执行中产生的临时数据,所以CPU不得不借助内存来存放程序指令,但是内存的运行速度低于CPU,造成二者之间运行不协调,CPU需要为内存等待多个时钟周期,造成了CPU性能浪费,这种情况下在CPU和内存之间加入中间层来解决。理论依据是程序的局部性原理:1、空间局部性,指一个指令或数据被访问到,它附近的数据也可能会被访问;2、时间局部性,指一个指令或数据被访问执行之后,可能会被再次访问到。正是局部性原理的存在,导致了CPU可以使用缓存来存放这些数据,所以在CPU上出现了一级、二级、三级缓存,这大大提高了程序的执行速度。内存是以时间换空间,增加了存储能力,但消耗了CPU时钟;而缓存是以空间换时间,通过增加存储来换取程序更快的执行时间。

2.1.3 NUMA结构

CPU所有核心共享三级缓存,多个CPU又共享内存;一旦出现共享,必然会引起资源争用问题。用户在解决资源争用问题的同时,产生了额外的花销,所以集成多CPU,向上扩展必然会到达一个临界点,超过这个临界点,性能反而会有所下降。
为了解决资源共享的争用问题,在多颗CPU上引入了NUMA结构(Non Uniform Memory Access,非一致性内存访问),每一个CPU都有自己的专用内存空间,这样就大大减少了争用出现的机率。但与此同时,会带来另一个问题,为了充分利用多CPU的性能,内核会对每个CPU上工作的进程进行负载均衡,当进程在被调度在第一颗CPU上运行,下一次有可能会被调度到另外一颗CPU上,但是NUMA结构下的每个CPU使用自己的内存空间,所以第二个CPU找不到这个进程运行的中间数据,需要从第一个CPU的专用内存中去复制一份,这个过程会消耗CPU的性能。所以,在NUMA结构上对进程进行CPU绑定是性能优化的一个重要方法。

2.1.4 NUMA结构

CPU只能操作寄存器的数据,如果寄存器中没有,需要从缓存,或者内存甚至IO设备上获取。数据修改后,写入到内存才认为是修改完成。为了保证尽快写到内存,通常有2中策略:通写(write through)和回写(write back)
通写,将数据依次从一级、二级、三级缓存,最终写到内存。整个过程由CPU控制,CPU不能做别的事情。
回写,数据写入一级缓存,便告诉CPU写入完成,CPU可以去做别的事情。

通写数据可靠性高,回写性能高。按需选择,没有绝对的统一法则。
事实上,硬盘存储也遵循通写与回写策略。硬盘回写,是由内核控制将内存中的数据移动到硬盘缓存,便认为写入完成;后续由硬盘控制器将缓存中的数据移动到硬盘自身。硬盘通写,内核控制将数据写入到硬盘缓存,再写到硬盘,才认为写入完成。

2.1.5 用户态与内核态

用户开发的应用程序都是工作在操作系统之上的,不属于操作系统内部。系统内核之上的空间称为用户空间(用户态),内核自身称为内核空间(内核态)。不论用户程序还是内核指令,执行时加载到CPU然后运行。CPU在生产过程中,研制人员开发了CPU能够执行的众多指令,这些CPU支持的所有指令的集合称为CPU的指令集。CPU的指令主要分为4个层次,即环0、环1、环2、环3,每个环对应了不同层次的指令。以Intel的X86指令架构CPU为例,主要使用环0和环3两个层次,环3上是用户可以执行的指令,相当于用户空间;环0上为特权指令,相当于内核空间用户不能直接操作。例如操作硬件,这是个特权操作,用户不可以执行,必须向内核申请,即发起系统调用,由内核执行,完成后将结果返回给用户程序。对于计算机的所有特权操作都必须由内核承担,内核最重要的一个功能就是管理硬件资源
程序员编写的代码其实就是一条条指令构成,程序代码在执行过程中,如果这条指令用户自身有权限去执行,则可以直接执行。如果需要执行特权指令,只能由内核执行,用户没有权限执行;此时要向内核发起系统调用,内核执行系统调用的代码,完成后将执行结果返回给执行的程序,然后再继续执行后面的指令。内核在运行系统调用代码时,程序是处在等待状态。执行系统调用时,程序工作在内核空间(内核态);运行用户可以执行的指令时,程序工作在用户空间(用户态)。
应用程序在工作过程中,就是不断在用户态和内核态之间做模式切换,需要执行特权命令就发起系统调用,陷入内核态,当内核执行系统调用完毕后再返回用户态。所以内核或者系统调用并不直接发挥生产力,它更多是在底层提供支撑,帮助用户完成其特定功能,只有用户自己的程序才具有生产力,才能真正实现用户自己的目标。 一个有效率的程序,它不应该浪费太多时间在系统调用。一般CPU应该至少有70%的时间在执行用户代码(即工作在用户态),不多于30%的时间用来执行系统调用(工作在内核态)。

2.1.6 保护现场与恢复现场

CPU是通过给不同的程序分配时间片(time slice)来完成多任务运行,给每一个程序分配独立的时间片。在执行过程中,很产生很多中间状态数据,例如执行到第几条指令,接下来CPU该去取第几条指令,这些数据存放在CPU的指令指针寄存器中。如果此时发生了进程切换,寄存器的数据就会被新的进程所覆盖,等到下次再执行相同程序时又得从头再来,这是所不能接受的。所以一旦程序在一个时间片内没有办法执行完毕,CPU需要把程序执行的中间状态的数据保存起来,例如当前运行到哪个指令,在内存中取数据取到哪个地址,这称为保存现场。保存完成后,在下一个时间片执行另一个进程。当重新恢复执行当前进程时,需要把保存的中间数据装载到CPU中,称为恢复现场。保存和恢复现场需要执行内核代码完成(即工作在内核空间,所以也会消耗CPU时间),CPU中断一个进程的执行转而去执行另一个进程又称为上下文切换context switch。保存现场的数据存放在内存中,内核为每一个进程创建一个结构体的数据结构进行存放,称为任务结构体task struct,这里面存放了进程的各种信息,例如PID号、进程状态、父子进程关系、优先级、虚拟内存、程序计数器、CPU使用时间等等,当然也包含进程执行的中间状态数据。

发布了11 篇原创文章 · 获赞 3 · 访问量 6200

猜你喜欢

转载自blog.csdn.net/newbei5862/article/details/105162619