目录
引言
硬件
冯诺依曼体系结构
硬件解读
内存的必要性
实例解读
软件(OS)
硬件管理
先描述后组织
总结:
进程的概念
何为进程
进程控制块:pcb
访问OS
引言
Linux操作系统以其稳定性和灵活性而闻名于世,它是当今服务器、嵌入式设备以及超级计算机等领域的重要基石。在Linux系统中,进程是核心概念之一,它是操作系统进行资源管理和任务调度的基本单位。进程可以看作是正在执行的程序实例,它包含了程序代码、数据以及进程执行所需的系统资源。本文将着重讨论三个方向的话题:1.先谈硬件 2.再谈软件(OS) 3.再聊进程
硬件
冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
示意图
结构简介
冯·诺伊曼结构(Von Neumann architecture)是计算机体系结构的一种设计理念,它以数学家约翰·冯·诺伊曼(John von Neumann)的名字命名。冯·诺伊曼在1945年发表了一篇名为《关于EDVAC的报告初稿》(First Draft of a Report on the EDVAC)的论文,其中概述了这种结构的基本原理。
冯·诺伊曼结构的主要特点如下:
-
存储程序概念:程序指令和数据都被存储在同一类型的存储器中,通常是随机存取存储器(RAM)。这意味着程序指令可以被修改,就像数据一样,从而使得计算机能够执行更复杂的任务。
-
五大组件:
- 中央处理单元(CPU):执行计算和逻辑操作,是计算机的核心部件。
- 内存:用于存储程序指令和数据。
- 输入设备:如键盘、鼠标等,用于向计算机输入数据。
- 输出设备:如显示器、打印机等,用于从计算机输出数据。
- 控制器:通常集成在CPU中,负责从内存中取出指令,解释指令,然后指导其他部件执行指令。
-
指令和数据存储:指令和数据都使用二进制形式存储,并通过相同的总线传输。
-
顺序执行:除非程序指令明确指示跳转,否则CPU按照存储在内存中的指令顺序执行。
冯·诺伊曼结构的这种设计有以下几个优点:
- 简化了计算机的设计:由于指令和数据使用相同的存储和处理机制,计算机的设计变得更加简单。
- 提高了灵活性:存储程序概念允许计算机执行各种不同的任务,只需更改存储的程序即可。
- 促进了软件发展:程序的存储和修改变得容易,这为软件工程的发展奠定了基础。
尽管冯·诺伊曼结构自提出以来已经历了多次改进,但它仍然是现代计算机体系结构的基础。然而,这种结构也存在一些局限性,如所谓的“冯·诺伊曼瓶颈”,即CPU和内存之间的数据传输速率限制了计算机的整体性能。为了克服这些限制,研究人员和工程师开发了各种新技术和体系结构,如并行处理、多核处理器和量子计算等。
截至目前,我们认识的计算机都是一个个硬件构成。
硬件解读
这些一个个硬件都独立存在的
内存的必要性
存储分级图
存储的级别大体符合金字塔结构。自上而下:运行速度越来越慢、单价越来越便宜。
矛盾的产生:
对于cpu而言,大部分都是寄存器构成,存储单元小,成本高,读写、算罗运算速度快(这里的计算指的是算术运算、逻辑运算)。
对于磁盘等外设而言,存储单元大,成本低,读写速度慢。
因此假如外设与cpu直接进行交互,那么就存在cpu长时间等待外设的现象(外设拖后腿)。
因此为了中和cpu和外设之间的“矛盾”,内存就出现了。内存介于两者之间,速度适中。这样就可以让外设先和内存及逆行交互,内存再和cpu进行交互。
因此内存就像是一个和事佬,一边鼓励外设、一边安慰cpu。
实例解读
假如你和远方的好朋友同时登上了QQ,你们想进行文件的互传,当你把文件传给你朋友的时候,具体的流程是什么样的呢?
这时候,你和你朋友的电脑就可以看作是两个冯诺依曼结构机器。
对于你而言
输入设备:磁盘----读取到内存----经过cpu的打包----交给内存----通过输出设备:网卡,发送到网络
对于你的朋友而言
输入设备:网卡:接收数据----读取到内存----cpu分析计算----交给内存---发送到输出设备:你的硬盘
软件(OS)
这里要谈及的软件主要是操作系统Operator System(OS)
操作系统是一款进行软硬件资源管理的软件。通过对软硬件的管理,提供给用户良好的软件使用体验。
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括: 内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
如果没有操作系统,那我们手中的电脑、手机只不过是一块”破铜烂铁“。
那操作系统是如何对软硬件维护的呢?
可以看到OS主要进行内存管理、进程管理、文件管理、驱动管理。本文将着重介绍进程与驱动的管理。
文件管理: 文件
驱动管理:硬件
进程管理:进程
其中内存管理:内存资源的申请和释放与进程相伴相生
硬件管理
操作系统在硬件之上,中间存在一个夹层:驱动程序。OS对于硬件的管理主要以驱动为媒介进行。
举个栗子:
校长需要管理学生,他并不需要直接见到学生本人,而是只是需要一个学生的信息(学号、姓名、、、、)即可,它可以将获得这些信息的任务发放给导员,让导员去执行这些任务。
导员只需要将得到的结果汇报给校长即可。
因次,OS在管理硬件的时候,并不需要直接和硬件见面,只需要像驱动获取硬件的相关信息(运行状态、、、、、)即可。
操作系统通过驱动中描述的硬件信息去管理硬件
操作系统通过驱动程序来管理硬件。驱动程序包含了关于硬件设备的具体信息以及如何与之通信的指令。以下是操作系统如何通过驱动程序管理硬件的几个方面:
硬件识别:操作系统在启动或者添加新硬件时,会通过驱动程序来识别硬件设备,确定其类型和功能。
资源分配:驱动程序会告诉操作系统如何为硬件分配系统资源,如中断请求、I/O端口、内存地址等。
硬件操作:驱动程序提供了一套标准化的接口,操作系统通过这些接口发送命令来控制硬件的行为,例如读/写数据、启动/停止设备等。
状态监控:驱动程序可以监控硬件的状态,并将状态信息报告给操作系统,操作系统据此可以做出相应的管理决策。
错误处理:当硬件发生错误时,驱动程序可以识别错误,并通知操作系统,操作系统再根据错误类型做出响应,比如重试操作、记录错误日志或通知用户。
性能优化:驱动程序可以根据硬件的特点进行优化,以提高系统性能。
操作系统和驱动程序共同构成了用户与硬件之间的桥梁,使得硬件设备可以在不需要用户了解硬件具体实现细节的情况下正常工作。在Windows、Linux、macOS等操作系统中,驱动程序都是必不可少的组成部分。
先描述后组织
描述
由于linux是C写的,因此在描述这些硬件的相关信息时,一定是通过struct结构去描述的,这个结构内部可能包括:硬件的健康状态、硬件的使用情况……
组织
当OS得到一个个的硬件信息时,需要将这些硬件信息管理起来(如使用链表等数据结构)。可见OS内部一定存在大量的数据结构。
总结:
管理硬件时:不需要见到硬件,只需要借助驱动描述硬件资源的信息,利用合理的数据结构组织管理硬件
至于软件管理,则是通过进程进行
进程的概念
操作系统管理软件主要是通过进程 + 内存管理实现。本节着重介绍进程管理,顺带着OS的内存管理。
内存管理(简介)
操作系统的内存管理是确保计算机系统中内存资源有效和高效使用的关键功能。以下是操作系统内存管理的主要方面:
1. 内存分配
-
静态内存分配:在程序编译时分配固定大小的内存区域,适用于程序大小已知且固定的场景。
-
动态内存分配:在程序运行时根据需要分配和释放内存,提供了更大的灵活性。
2. 内存分区
-
单一连续分配:早期操作系统只支持单一程序运行,整个内存被分配给该程序。
-
固定分区:内存被划分为若干固定大小的区域,每个分区只能分配给一个进程。
-
可变分区:根据进程的需要动态分配内存,分区大小不固定,可能导致外部碎片。
-
分页:将物理内存和逻辑内存划分为固定大小的页,通过页表进行映射,减少了外部碎片,但可能产生内部碎片。
-
分段:内存按逻辑结构划分为段,每个段可以是不同大小,有利于保护和共享。
3. 虚拟内存
-
分页虚拟内存:操作系统维护一个页表,将虚拟地址转换为物理地址,允许进程使用比实际物理内存更大的地址空间。
-
分段虚拟内存:与分页类似,但以段为单位进行映射。
4. 页面置换
-
FIFO(先进先出):最先进入内存的页面最先被置换。
-
LRU(最近最少使用):最少使用的页面被置换。
-
OPT(最优置换):置换将来最长时间内不会被访问的页面(理论算法,实际不可行)。
-
Clock算法:类似于时钟的指针来选择置换页面。
5. 内存保护
-
操作系统确保每个进程只能访问它被分配的内存区域,防止一个进程访问或修改另一个进程的数据。
6. 内存共享
-
允许多个进程访问同一内存区域,用于实现进程间通信和数据共享。
7. 内存映射
-
将文件或设备直接映射到进程的地址空间,简化了文件I/O和设备访问。
8. 内存优化
-
压缩:通过压缩数据来减少内存使用。
-
缓存:使用缓存机制来提高内存访问速度。
9. 内存监控
- 操作系统监控内存的使用情况,包括已用内存、空闲内存、交换空间使用情况等。
内存管理的目标是最大化内存利用率和系统性能,同时保证系统的稳定性和安全性。操作系统通过上述机制实现这些目标,以适应不同应用程序和系统负载的需求。
何为进程
一般而言,我们将加载到内存的程序称为一个进程(任务)。
但是科学的将,进程是一个复杂的概念。
进程是操作系统中程序执行的一个实例,它包含以下几部分:
程序代码:这是进程执行的指令集合,通常存储在磁盘上的可执行文件中,当进程被创建时,这部分代码会被加载到内存中。
数据:进程在执行过程中需要处理的数据,包括全局变量、常量、静态变量等,这些数据也存储在内存中。
堆(Heap):动态分配的内存区域,用于存储程序运行时创建的对象和数据结构。
栈(Stack):用于存储局部变量、函数调用的上下文信息(如返回地址、参数等)以及执行过程中的临时数据。
//栈和堆这是占用物理资源的部分
进程控制块(PCB):操作系统为每个进程维护的一个数据结构,用于存储进程的元数据,如进程ID、状态、优先级、程序计数器、寄存器值、内存管理信息、I/O状态等。
因此,进程 = 代码 + data + PCB + 物理资源(后续将着重强调data + 代码 + pcb)
进程控制块:pcb
OS在管理进程的时候,更多的是通过对pcb的管控实现的 。pcb存在着属于这个进程的属性值。
一个加载到内存的程序就是一个进程。
操作系统对进程的管理核心是对pcb的管理,而不是对程序本身code/data的管理
多进程:
在我们的电脑中,往往是有多个程序在运行的,OS就是对这些程序的PCB进行管理的。
pcb提供了哪些有用的信息呢?
进程标识符(PID):唯一标识一个进程的标识符。
进程状态:指示进程当前的状态(如运行、就绪、阻塞等)。
程序计数器:记录下一条要执行的指令的地址。
寄存器集合:包括通用寄存器、程序状态字(PSW)、指令寄存器(IR)等,这些寄存器保存了进程执行时的状态信息。
内存管理信息:如页表、段表等,用于管理进程的内存空间。
调度信息:包括进程优先级、调度策略所需的其他信息等。
I/O状态信息:包括分配给进程的I/O设备列表、使用状态等。
账单和计时信息:记录进程使用的处理器时间、实际运行时间等统计信息。
操作系统通过以下方式使用PCB来维护进程:
创建进程:操作系统在创建一个新进程时,会为其分配一个PCB,并初始化相关信息。
进程调度:操作系统根据调度算法和PCB中的信息决定哪个进程获得CPU时间。
状态转换:当进程状态发生变化时(如从运行状态变为阻塞状态),操作系统会更新PCB中的状态信息。
进程同步和通信:操作系统利用PCB中的信息来管理进程间的同步和通信。
资源管理:操作系统通过PCB跟踪进程所占用的资源,如内存、文件句柄等。
进程终止:当进程结束时,操作系统会释放PCB所占用的资源,并从系统中删除该PCB。
因此,可以说PCB是进程存在的“灵魂”,它使得进程可以被操作系统识别、控制和有效地管理。
pcb是一个统称,linux下叫做task_struct
访问OS
OS并不信任任何用户,另外OS的访问成本极高,因此,OS给出了一个个接口函数去访问OS内部---操作系统调用
因此对OS的访问主要是通过调用接口实现的。