🔥个人主页:Quitecoder
🔥专栏:linux笔记仓
01.冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系
截至目前,我们所认识的计算机,都是由一个个的硬件组件组成
- 输入单元:包括键盘, 鼠标,扫描仪, 写板等
- 中央处理器(CPU):含有运算器和控制器等
- 输出单元:显示器,打印机等
关于冯诺依曼,必须强调几点:
- 这里的存储器指的是内存
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
- 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
一句话,所有设备都只能直接和内存打交道
冯·诺依曼架构是现代计算机的基础,其核心是将程序存储在计算机内存中并按顺序执行。数据流的理解涉及如何处理、存储和传输数据。下面我们通过使用QQ聊天和发送文件的例子来探讨这一过程。
- 登录QQ
- 启动QQ应用: 当你点击QQ图标时,操作系统加载QQ程序到RAM中。
- 程序执行: CPU开始执行程序代码,包括初始化网络连接、用户界面等。
- 登录过程: 输入用户名和密码后,QQ客户端将这些信息封装成数据包,通过互联网发送到QQ服务器。
- 身份验证: 服务器检查凭证,验证成功后返回登录成功的信息,并可能包括好友列表、聊天记录等数据。
- 发送消息
- 打开聊天窗口: 选择一个好友开始聊天,此时客户端可能从本地缓存或服务器加载历史聊天记录。
- 输入并发送消息: 输入文本并点击发送,QQ客户端将消息数据打包,并标记发送目标(好友的唯一标识符)。
- 数据传输: 数据包通过你的网络连接发送到QQ服务器。
- 服务器处理: 服务器接收到数据包,解析并确定接收者,然后将消息转发到对应的接收者。
- 好友接收消息: 好友的QQ客户端通过其网络连接从服务器接收到消息,然后在其聊天窗口显示。
- 发送文件
- 选择并发送文件: 在聊天窗口中选择文件发送选项,选择一个文件后,客户端会先读取文件内容。
- 文件上传: 客户端可能会将文件分割成多个数据包,这些数据包依次上传到QQ服务器。
- 文件存储: 服务器接收到所有文件数据后,将文件暂存到服务器上。
- 通知接收方: 服务器向接收方的客户端发送有文件传来的通知,可能包括文件名、大小和下载链接。
- 文件下载: 接收方可以选择接收并下载文件。点击下载后,客户端通过服务器提供的链接请求文件数据。
- 文件传输完成: 文件数据通过网络传输到接收方的设备上,存储于指定位置,完成整个文件发送和接收过程。
在这整个过程中,数据流的管理和优化是至关重要的。这包括数据包的正确打包、有效的网络传输、数据安全和隐私保护等。通过这些例子,可以看到冯·诺依曼架构如何支持复杂的数据处理和传输活动,从而使得应用程序如QQ能够高效、安全地运行
02.操作系统(Operator System)
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。它是计算机系统中最基本的系统软件,提供了用户与整个计算机系统交互的基础环境。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
计算机系统体系结构成层状分布,操作系统起到承上启下的作用
设计OS的目的:
- 与硬件交互,管理所有的软硬件资源
- 为用户程序(应用程序)提供一个良好的执行环境
在计算机系统中,操作系统(OS)的核心角色可以理解为一个“管理者”。操作系统的管理功能涵盖了多个层面,主要包括对计算机硬件资源和软件应用的管理。这些资源包括CPU(中央处理器)、内存、存储设备和输入/输出设备等。以下是操作系统在这些方面的管理职责:
如何理解“管理”
“管理”在操作系统的语境中,指的是对计算机系统资源的有效分配、监控和调度,以确保系统的稳定运行和高效性能。操作系统通过一系列的程序和策略来实现这些管理任务,从而使得多个程序和用户可以高效、安全地共享计算机资源。
管理的例子
- 进程管理:操作系统负责创建、执行、暂停和终止进程。同时,它还负责进程间的同步和通信。
- 内存管理:操作系统管理所有程序在运行时的内存需求,确保每个程序获得足够的内存,并处理虚拟内存和物理内存之间的映射。
- 文件系统管理:操作系统负责文件的创建、删除、读取和写入。它管理磁盘空间的分配和文件的存储,提供用户级别的文件访问权限。
- 设备管理:操作系统通过设备驱动程序管理所有的硬件设备,如键盘、鼠标、硬盘等,控制硬件设备的数据输入输出操作。
- 用户界面提供:操作系统提供了与用户交互的界面,如命令行界面(CLI)或图形用户界面(GUI),让用户能够更方便地与计算机系统交互。
被操作系统管理的对象主要包括:
- 硬件资源:CPU、内存、存储设备(硬盘、SSD等)、输入输出设备(键盘、鼠标、显示器等)。
- 软件资源:应用程序、系统服务、用户数据和系统数据。
操作系统通过各种数据结构(如表格、队列和树)来组织被管理的对象:
- 进程表:用来跟踪各个进程的状态和资源占用。
- 内存映射:包括虚拟内存地址到物理内存地址的映射。
- 文件目录结构:用树状结构来组织文件系统中的文件和目录。
- 设备队列:管理各个设备请求的队列,确保高效的资源访问。
通过这些管理职责,操作系统确保了计算机系统的高效、稳定和安全运行,允许用户和应用程序更好地执行其任务。
在操作系统的上下文中,管理的“先描述再组织”原则可以被解释为首先定义和明确资源或任务的特征,然后根据这些定义来规划和优化资源的分配和任务的调度。操作系统作为计算机系统资源的管理者,必须精确地理解各种资源的状态、需求和优先级,然后才能有效地组织和调配这些资源以满足系统和用户的需求。这一原则确保了资源使用的最大效率和系统性能的优化。
操作系统中实现“管理的先描述再组织”
-
资源描述:
- 硬件资源:如CPU、内存、存储设备和输入输出设备。操作系统需要详细识别每个硬件资源的特性,包括类型、性能参数、当前状态和使用情况。
- 软件资源:如进程、线程、文件系统等。操作系统通过描述这些资源的属性(如进程的优先级、线程的状态、文件的权限等)来管理它们。
-
资源组织:
- 进程管理:操作系统首先通过进程表来描述所有进程的状态和属性。然后,基于这些描述信息,操作系统调度进程运行,管理它们的生命周期,优化CPU的使用效率。
- 内存管理:操作系统描述每个内存块的状态(如已分配、空闲)、大小和位置。根据这些描述,操作系统通过内存分配算法(如分页、分段)来有效地组织内存资源,确保每个应用程序和服务都能得到所需的内存。
- 文件管理:操作系统描述文件和目录的结构、权限和位置,然后根据这些信息来组织文件存储、执行文件访问控制和数据备份。
-
任务调度:
- 描述任务需求:操作系统描述每个任务的资源需求、优先级和截止时间。
- 组织和调度:根据这些描述,操作系统安排任务执行的顺序,优化资源分配,以达到最小化响应时间、最大化吞吐量或其他优化目标。
-
性能管理:
- 系统监控:操作系统通过持续监控和描述系统性能参数(如CPU利用率、内存使用、IO操作等),获取系统运行的实时画像。
- 资源再组织:根据性能监控的数据,操作系统可能会重新组织资源,调整任务优先级,或平衡负载,以保持系统性能的最优化。
通过这种方式,“先描述再组织”的管理策略帮助操作系统在不断变化的需求和资源状态中保持高效和稳定。这不仅优化了资源的使用,还提高了系统的整体性能和用户的满意度
03.系统调用与库函数
在理解操作系统和应用程序交互时,系统调用和库函数是两个核心概念,它们在功能和执行层面有明显的差异。
如果我们开发直接调用系统调用接口,这样的代码我们成它不具有跨平台性
系统调用
系统调用是应用程序与操作系统之间的接口,是程序在执行期间请求操作系统提供特定服务的一种方式。这些服务包括硬件操作、创建和执行进程、管理文件系统等底层操作。系统调用允许用户级应用程序执行通常不允许的操作,确保系统稳定性和安全性。
- 特点:
- 权限层级: 系统调用在较低的权限层级执行,通常是操作系统的核心层级。
- 功能范围:涵盖底层硬件管理、进程控制、文件操作等。
- 执行过程:执行系统调用时,CPU从用户模式切换到内核模式,这是一种权限升级。
库函数
库函数是一些预先编写好的、可以在程序中直接调用的函数,通常由各种标准或非标准库提供,如C标准库(libc
),提供字符串处理、文件操作、数学计算等功能。库函数可以包含系统调用,但也可以只是执行算法或其他计算任务而不直接请求操作系统资源。
-
特点:
- 权限层级:库函数通常在用户模式下执行,不涉及模式的切换。
- 功能范围:可以非常广泛,从简单的数学计算到复杂的图形渲染等。
- 依赖性:库函数可能调用系统调用来执行底层操作,如文件I/O。
-
系统调用示例:
open()
、read()
、write()
、fork()
、exec()
等是典型的系统调用,它们直接与操作系统内核交互,管理硬件资源或进程等。 -
库函数示例:
printf()
、strcpy()
、malloc()
等。这些函数可能在内部使用系统调用,例如printf()
最终会调用write()
系统调用来输出数据到标准输出,而malloc()
可能会调用brk()
或mmap()
系统调用来分配内存。
理解系统调用和库函数之间的区别对于系统编程和应用程序开发非常重要,因为它们影响代码的性能、安全性和可移植性。系统调用因涉及模式切换而通常比库函数调用成本更高;同时,对系统资源的直接控制能力也使得系统调用更加强大但使用时需要更加小心。