操作系统原理

计算机硬件的五大核心组件

  • 控制器:计算机的指挥系统,负责控制所有硬件的运行
  • 运算器:负责数学运算和逻辑运算
  • 存储器:
    内存:比如内存条,基于电存取数据,断点数据全部丢失;用于临时保存数据,存取速度快;
    外存:用于永久保存数据,断电数据仍然存在;
    1.机械硬盘:存取数据慢,基于磁存取数据
    2.固态硬盘(SSD):依赖电子存取数据,相对机械硬盘速度较快
  • 输入设备:键盘、鼠标、麦克风等等
  • 输出设备:显示器、耳机、打印机等等

程序最先是存放于硬盘中的;
程序的运行需要先经历加载的过程:程序的代码/数据从硬盘读入内存;
然后cpu再从内存中读取指令来运行;

CPU

组成:控制器 + 运算器 + 寄存器 = cpu(中央处理器)
主要功能:寻址(从内存中装载指令)、解码(把指令解码成CPU运行的指令)、执行

  • 运算器 负责算术运算(+ - * / 基本运算和附加运算)和逻辑运算(包括 移位、逻辑测试或比较两个值等)。
  • 控制器 负责应对所有的信息情况,调度运算器把计算做好。
  • 寄存器 它们可用来暂存指令、数据和地址。既要对接控制器的命令,传达命令给运算器;还要帮运算器记录处理完或者将要处理的数据。

内存存储器

它用于暂时存放CPU中的运算数据,内存储器与硬盘等外部存储器交换的数据。

  • 主存储器(RAM):RAM作为主内存,临时存储计算机正在运行的数据和程序,它具有快速的读写速度和较大的容量,能够提高计算机的运行速度和多任务处理能力。
  • 只读存储器(ROM):而ROM作为只读存储器,包含了固定的数据,如启动程序、固件等。它在计算机启动时被读取和执行,为计算机提供必要的初始化和启动操作。

Linux系统会把内存分为两种区域:

  • buffer(缓冲区):存储一大波cpu处理好的数据放入硬盘
  • cache(缓存):把硬盘的数据在内存中缓存好,cpu取的时候可以直接从内存取

缓存机制

缓存(Cache)是一种将数据副本临时存储在可快速访问的存储内存中的技术。缓存将最近使用的数据存储在小内存中,以提高访问数据的速度。它充当 RAM 和 CPU 之间的缓冲区,从而提高处理器可用数据的速度。
引入缓存机制主要弥补CPU和内存之间速度的差异。
在CPU中缓存分为很多级别,一级缓存、二级缓存、三级缓存,级别越低,速度越接近CPU。CPU和一级缓存交互,一级缓存没有数据,需要从二级缓存置换数据到一级缓存,逐级置换。

NUMA的设计,提高了CPU访问内存和外设的速率,奈何CPU处理速率远远超过了内存的吞吐速率,就给CPU带来了不必要的开销。一般地,CPU从DDR中取指令,大概需要花费几百个时钟周期,在这几百个时钟周期中,处理器除了等待什么也不能做。于是有了Cache(Cache主要有3级)。

  • 通写(写通):write_through 是CPU写入高速缓存的数据同时也到写到主存中。
  • 回写(写回):write_back 是CPU写入高速缓存的数据并不同步到主存中,当这些数据要被丢弃的时候才写回主存。
  • 写时申请:write_allocate 是在CPU写cache未命中时,它会将数据写入主存,并将写入主存地址处的内存块放到高速缓存中,供CPU下次访问时使用。

总线

在计算机中,如果不同的设备想要交换数据,它们必须通过某个通道(即总线)进行交换。总线是用于在计算机的各个功能部件之间传输信息的通用通信干线。它是一种由电线组成的传输线束。PCI 和 PCIe 都是总线。

  • PCI、PCI-X:总线体系结构是多点(multi-drop)并行互连总线,其中多台设备共享一条总线,在一条PCI总线上可以挂接多个PCI设备,这些PCI设备通过一系列信号线与PCI总线相连,这些信号由地址/数据信号、控制信号、仲裁信号、中断信号等组成,是通过总线周期来实现的;
  • PCIe:能后实现两台设备之间的通信的串行、点对点类型的互连,多个PCIe设备使用交换器(Switch)实现互连;采用基于交换器的技术来互连大量设备,在串行互连上进行通信是利用基于数据包的通信协议来实现的。

寻址

CPU最大能查找多大范围的地址叫做寻址能力,CPU寻址是CPU从内存中装载指令或数据的过程。CPU要将虚拟地址翻译成物理地址才能访问实际的物理内存.
CPU的寻址能力以字节为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。

  • 地址总线的位数
    概念:地址总线的位数表示地址总线中包含的独立地址信号线数量,每根线代表一个位(0或1)。地址总线的位数决定了能够表示的不同地址的数量。 地址总线的位数是指地址总线上包含的二进制位数,它决定了地址总线能够传输的不同地址数。例如,一个32位地址总线可以传输32位的地址信息。
    例如,一个32位地址总线可以表示2^32个不同的地址 2^32B=4G 也就相当于最大存储空间按,因为每一位可以有两种状态(0或1),所以232等于大约42亿。16G=234B 8G=2^33B

  • 地址总线的宽度
    概念:地址总线的宽度是指地址总线的位数,它表示了可以访问的内存地址范围。地址总线的宽度是指地址总线中包含的物理连接线数量,每根线对应地址的一个位。例如,一个32位地址总线有32根连接线。
    例如,一个32位地址总线有32根信号线,每根线对应一个二进制位,它可以表示2^32个不同的地址。

  • CPU访问空间的大小
    概念:CPU访问空间的大小表示CPU能够访问的内存地址范围。它是由地址总线的宽度决定的。
    例如,如果CPU的地址总线是32位宽度,那么它可以访问2^32个不同的内存地址,这就是CPU的访问空间大小。CPU访问空间的大小是指CPU可以寻址的内存范围,它受限于地址总线的位数和宽度。CPU访问空间的大小通常以字节为单位。

CPU主频

CPU频率,就是CPU的时钟频率,简单说是CPU运算时的工作的频率(1秒内发生的同步脉冲数)的简称。单位是Hz。它决定计算机的运行速度。

操作系统

操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件。将底层硬件抽象成虚拟机。

  1. 功能
  • 统一管理计算机资源:处理器资源,IO设备资源,存储器资源,文件资源;
  • 实现了对计算机资源的抽象:IO设备管理软件提供读写接口,文件管理软件提供操作文件接;
  • 对上提供了用户与计算机之间的接口:GUI(图形用户界面),命令形式,系统调用形式。
  1. 特征
    最基本的特征,互为存在条件:并发,共享;
  • 并行:指两个或多个事件可以在同一个时刻发生,多核CPU可以实现并行,一个cpu同一时刻只有一个程序在运行;
  • 并发:指两个或多个事件可以在同一个时间间隔发生,用户看起来是每个程序都在运行,实际上是每个程序都交替执行。
  • 共享性:操作系统的中资源可供多个并发的程序共同使用,这种形式称之为资源共享。
  • 虚拟性:表现为把一个物理实体转变为若干个逻辑实体。
  • 异步性:在多道程序环境下,允许多个进程并发执行,但由于资源等因素的限制,使进程的执行以“停停走走”的方式运行,而且每个进程执行的情况(运行、暂停、速度、完成)也是未知的。

页表、页目录

在x86系统中,为了能够更加充分、灵活的使用物理内存,把物理内存按照4KB的单位进行分页。然后通过中间的映射表,把连续的虚拟内存空间,映射到离散的物理内存空间。
映射表中的每一个表项,都指向一个物理页的开始地址。但是这样的映射表有一个明显的缺点,映射表自身也是需保存在物理内存中的。
在 32 位系统中,它使用了多达4MB的物理内存空间(每个表项4个字节,一共有4G/4K个表项)。为了解决这个问题,x86处理器使用了两级转换:页目录和页表。

  • 线性地址空间:每个进程得到的内存是由内核把内存不连续的内存页组成的一个内存空间,此空间是逻辑的空间,虚拟的内存,
  • 线性地址空间:真实的内存空间叫做物理地址空间
  • 页(page):页指一系列的线性地址和包含于其中的数据
  • 页框(pageframe):分页单元认为所有的RAM被分成了固定长度的页框每个页框可以包含一页,也就是说一个页框的长度和一个页的长度是一样的页框是内存的一部分,是一个实际的存储区域。页只是一组数据块,可以存放在任何页框中也就是说页对应的是线性地址的东西 而页框对应的是物理地址 是实际的存储区域。
  • 页目录:在页目录中,每一个表项指向一个页表的开始地址(物理地址)。操作系统在加载用户程序的时候,不仅仅需要分配物理内存,来存放程序的内容;而且还需要分配物理内存,用来保存程序的页目录和页表。

内核

内核指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。
内核是操作系统非常重要的组成部分,同时也是操作系统的核心。内核管理着系统资源,内核向上连接着应用程序,向下连接着硬件,它是应用程序和硬件的桥梁。
简单来说,内核就是为操作系系统提供驱动、内存管理、网络、IO等功能的软件代码。

CPU的工作模式

  • 内核态:内核态的CPU,可以执行指令集中的所有指令,并使用硬件的所有功能。
  • 用户态:用户态的CPU,只允许执行指令集中的部分指令。一般而言,IO相关和把内存保护相关的所有执行在用户态下都是被禁止的,此外其它一些特权指令也是被禁止的,比如用户态下不能将PSW的模式设置控制位设置成内核态。

用户态CPU想要执行特权操作,需要发起系统调用来请求内核帮忙完成对应的操作。其实是在发起系统调用后,CPU会执行trap指令陷入(trap)到内核。当特权操作完成后,需要执行一个指令让CPU返回到用户态了。
系统调用会陷入内核,更多的是硬件会引起trap行为陷入内核,使得CPU控制权可以回到操作系统,以便操作系统去决定如何处理硬件异常。用户进程需要访问硬件资源需要切换成内核模式,这个过程需要发起系统调用。

进程

  • 狭义定义:进程就是一段程序的执行过程。一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程。
  • 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
  1. Linux进程结构
  • 可由三部分组成:代码段、数据段、堆栈段。也就是程序、数据、进程控制块PCB(Process Control Block)组成。进程控制块是进程存在的惟一标识,系统通过PCB的存在而感知进程的存在。
  • 系统通过PCB对进程进行管理和调度。PCB包括创建进程、执行程序、退出进程以及改变进程的优先级等。而进程中的PCB用一个名为task_struct的结构体来表示,定义在include/linux/sched.h中,每当创建一新进程时,便在内存中申请一个空的task_struct结构,填入所需信息,同时,指向该结构的指针也被加入到task数组中,所有进程控制块都存储在task[]数组中。
  1. 进程的状态
  • 就绪状态:进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
  • 运行状态:进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以 执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
  • 阻塞状态:由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生 前即使把处理机分配给该进程,也无法运行。
  1. 进程的类型
  • 交互进程:由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
  • 批处理进程:这种进程和终端没有联系,是一个进程序列。
  • 监控进程(也称守护进程):Linux系统启动时启动的进程,并在后台运行。

线程

是进程划分成的更小的运行单位,系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。是程序执行的最小单位。
一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。
同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈。
多个线程可以分别使用多个CPU进行执行,

文件描述符

在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。
文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引(fd),其是一个非负整数(通常是小整数),文件描述符fd和文件file指针是文件描述符表的重要内容,用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。
每个进程刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3,再去打开一个文件(可以是再次打开同一个文件),文件描述符fd就会递增。POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号码,因此,在网络通信过程中稍不注意就有可能造成串话。

  • 一个Linux进程启动后,会在内核空间创建一个PCB进程控制块,PCB是一个进程的私有财产。
  • 这个PCB中有一个已打开文件描述符表,记录着所有该进程打开的文件描述符以及对应的file结构体地址。
  • 默认情况下,启动一个Linux进程后,会打开三个文件,分别是标准输入、标准输出、标准错误分别使用了0、1 、2号文件描述符。
  • 当该进程使用函数open打开一个新的文件时,一般会在内核空间申请一个file结构体,并且把3号文件描述符对应的file指针指向file结构体,file结构体包含指向v-node节点的指针。再去打开一个文件(可以是再次打开同一个文件),文件描述符fd就会递增,并且file指针会指向新创建的file结构体。
  • Linux(在 x86 上)中的进程描述符存储在内核数据段中。

参考和转载

https://blog.csdn.net/S_o_l_o_n/article/details/102518959
https://blog.csdn.net/Royalic/article/details/119999404
https://zhuanlan.zhihu.com/p/421006318
https://blog.csdn.net/weixin_47187147/article/details/124860553
https://blog.csdn.net/wangguchao/article/details/109002488
https://www.liaoxuefeng.com/wiki/1016959663602400/1017627212385376

posted @ 2024-05-06 15:45  *一炁化三清*  阅读(3)  评论(0编辑  收藏  举报