计算机的系统架构
用户部分
这是用户直接与计算机交互的部分,包括以下三种操作:
- 指令操作:用户通过命令行界面(CLI)输入指令来操作计算机。
- 开发操作:开发人员编写和调试程序代码,与计算机系统进行更高级别的交互。
- 管理操作:系统管理员进行系统配置、维护和管理。
用户操作接口
这是用户与操作系统交互的接口层,包括:
- Shell外壳:提供命令行界面,允许用户输入命令以与系统交互。
- 库(Lib):程序库提供系统调用的接口,程序员可以使用这些库函数来实现系统级操作。
- 图形指令:通过图形用户界面(GUI)进行操作,用户可以通过点击、拖动等方式与系统进行交互。
系统调用接口(System Call Interface)
系统调用接口是用户程序请求操作系统服务的接口。用户操作接口通过系统调用与操作系统内核进行交互。系统调用包括文件操作、进程控制、内存管理等功能。
操作系统
操作系统是计算机系统的核心软件部分,负责管理硬件资源和提供基础服务,包括:
- 内存管理:管理内存的分配和回收,确保各个进程能够有效使用内存。
- 进程管理:负责进程的创建、调度和终止,确保系统能够高效地运行多个任务。
- 文件管理:提供文件系统接口,负责文件的存储、读取和写入操作。
- 驱动管理:管理硬件驱动程序,确保硬件设备能够正常工作。
驱动程序
驱动程序是操作系统与硬件设备之间的中间层,提供统一的接口,使操作系统能够控制硬件设备。包括:
- 网卡驱动:管理网络接口卡(NIC),负责网络通信。
- 硬盘驱动:管理硬盘,负责数据的存储和读取。
- 其他驱动:管理其他硬件设备,如显示器、键盘、鼠标等。
底层硬件
底层硬件是计算机系统的物理部分,包括:
- 网卡:负责网络通信。
- 硬盘:用于数据存储。
- 其他硬件:包括中央处理器(CPU)、内存(RAM)、输入输出设备(如键盘、显示器、打印机等)。
为什么要有操作系统
操作系统(Operating System,OS)是计算机系统中必不可少的核心软件,主要功能是管理硬件资源和提供用户与计算机之间的接口。以下是操作系统存在的几个关键原因:
硬件抽象
- 统一接口:操作系统为不同硬件设备提供了统一的接口,使得应用程序不必关心底层硬件的具体实现细节。
- 硬件管理:操作系统管理硬件资源,如CPU、内存、硬盘、网络接口等,确保资源的高效利用。
资源管理
- 内存管理:操作系统负责内存的分配和回收,确保各个进程能高效使用内存,避免内存冲突和泄漏。
- 进程管理:操作系统管理进程的创建、调度和终止,确保系统能平稳运行多个任务,提高系统的响应速度和吞吐量。
- 文件系统管理:操作系统提供文件系统接口,管理文件的存储、读取和写入,确保数据的持久性和安全性。
提高用户体验
- 用户界面:操作系统提供图形用户界面(GUI)和命令行界面(CLI),方便用户与计算机进行交互。
- 多任务处理:操作系统允许多个程序同时运行,提高用户的工作效率和系统的利用率。
提供平台
- 应用程序支持:操作系统为应用程序提供运行环境和基础服务,使得开发者可以专注于应用逻辑,而不必关心底层硬件细节。
- 驱动程序支持:操作系统管理和加载设备驱动程序,使得新硬件可以快速被系统识别和使用。
安全性
- 用户权限管理:操作系统通过用户账户和权限管理,确保只有授权用户可以访问和操作系统资源,提高系统的安全性。
- 安全防护:操作系统提供防火墙、病毒扫描等安全功能,保护系统免受恶意软件和网络攻击的侵害。
稳定性和容错
- 错误处理:操作系统提供错误检测和处理机制,确保系统在遇到错误时能够平稳恢复,减少系统崩溃的可能性。
- 资源隔离:通过进程和内存管理,操作系统可以隔离不同应用程序的运行环境,防止一个程序的错误影响到其他程序的正常运行。
为什么要有操作系统的管理
操作系统的管理是计算机系统正常、高效、稳定运行的关键,下面详细说明为什么需要操作系统的管理及其主要功能:
资源管理
操作系统负责管理计算机的所有硬件资源,包括CPU、内存、存储设备和输入输出设备。其主要目的是确保资源的高效利用和公平分配:
- CPU管理:操作系统调度不同的进程,确保每个进程都能公平地使用CPU资源,提高系统响应速度和吞吐量。
- 内存管理:操作系统负责内存的分配与回收,防止内存泄漏和冲突,并提供虚拟内存技术,扩展物理内存的使用范围。
- 存储管理:操作系统管理硬盘和其他存储设备的使用,包括文件系统的维护,确保数据的有序存储和快速访问。
- 设备管理:操作系统通过设备驱动程序控制各种外围设备,如打印机、显示器和网络接口,提供统一的接口和控制方法。
多任务处理
操作系统允许多个任务同时运行,提高计算机的利用效率和用户的工作效率:
- 进程管理:操作系统创建、调度和终止进程,确保系统能够高效地运行多个任务。
- 线程管理:操作系统支持线程的并发执行,提高程序的运行效率和响应速度。
文件系统管理
操作系统提供文件系统,管理数据的存储、组织和检索:
- 文件管理:操作系统负责文件的创建、删除、读取、写入和权限管理,确保数据的安全性和持久性。
- 目录管理:操作系统提供目录结构,组织文件,方便用户和程序查找和管理文件。
用户界面
操作系统为用户提供交互界面,使用户能够方便地操作计算机:
- 命令行界面(CLI):允许用户通过输入命令来操作系统。
- 图形用户界面(GUI):通过图形界面,使用户可以通过点击、拖动等方式与系统交互,更加直观和易用。
安全性
操作系统通过多种机制保障系统的安全:
- 用户认证和权限管理:操作系统通过用户账户和权限管理,确保只有授权用户可以访问和操作系统资源。
- 安全防护:操作系统提供防火墙、病毒防护和入侵检测等安全功能,保护系统免受恶意软件和网络攻击的侵害。
- 数据加密和备份:操作系统支持数据加密和备份,确保数据的保密性和可靠性。
错误检测与处理
操作系统提供错误检测和处理机制,确保系统在遇到错误时能够平稳恢复:
- 故障隔离:操作系统通过进程隔离技术,防止一个进程的故障影响到其他进程的运行。
- 日志记录与诊断:操作系统记录系统日志,帮助系统管理员诊断和解决问题。
提供平台支持
操作系统为应用程序提供运行环境和基础服务,使开发者可以专注于应用逻辑,而不必关心底层硬件细节:
- API和库支持:操作系统提供丰富的应用编程接口(API)和库函数,简化应用程序的开发。
- 兼容性和移植性:操作系统提供兼容性支持,使得应用程序可以在不同硬件平台和操作系统版本上运行。
系统调用vs库函数
调用上下文
- 系统调用:涉及从用户模式到内核模式的切换。由于需要与操作系统内核交互,系统调用会导致上下文切换,开销较大。
- 库函数:在用户模式下执行,不涉及内核模式的切换,调用开销较小。
功能权限
- 系统调用:具有访问和操作硬件资源的权限。例如,直接进行文件操作、内存管理、进程控制等。
- 库函数:通常不直接操作硬件资源,而是在用户模式下执行常见的编程任务,如字符串操作、数学计算等。
性能开销
- 系统调用:开销较高,因为涉及到用户模式和内核模式的切换,以及可能的内核安全检查。
- 库函数:开销较低,因为它们是在用户模式下直接执行的函数调用。
实现与来源
- 系统调用:由操作系统内核实现,提供底层操作功能。
- 库函数:由标准库或第三方库实现,提供高层次的编程接口。
联系
封装关系
- 库函数封装系统调用:许多库函数会封装系统调用,为程序员提供更简单的接口。例如,
printf
库函数在底层会使用write
系统调用来输出数据。
互补作用
- 协同工作:库函数和系统调用协同工作,共同完成任务。库函数提供便捷的高层次接口,系统调用执行具体的底层操作。
示例
printf
库函数:printf
是一个标准库函数,它通过格式化输出功能向标准输出打印字符串。在内部,printf
最终会调用write
系统调用来完成实际的输出操作。write
系统调用:write
直接与操作系统内核交互,将数据写入指定文件描述符(在此例中是标准输出)。
Linux是怎么描述进程的
在Linux操作系统中,进程的描述是通过数据结构task_struct
来完成的。这个结构体包含了一个进程的所有必要信息。
task_struct
数据结构
task_struct
是内核中用于描述进程的主要数据结构,定义在内核源码的include/linux/sched.h
文件中。它包含了大量关于进程的信息,包括但不限于以下内容:
- 进程状态:
state
字段描述了进程的当前状态,如运行、等待、停止等。 - 进程号:
pid
字段表示进程的唯一标识符。 - 父进程和子进程:
parent
字段指向父进程,children
字段是一个链表,包含所有子进程。 - 进程的优先级:
prio
字段表示进程的优先级,用于调度。 - 进程内存信息:
mm
字段指向进程的内存描述符mm_struct
,包含进程的虚拟内存信息。 - 进程的调度信息:
sched_class
字段和相关的调度实体描述了进程在调度器中的信息。 - 文件系统信息:
fs
字段指向进程的文件系统信息,如当前工作目录和根目录。 - 文件描述符表:
files
字段指向进程的文件描述符表files_struct
。 - 信号处理:
signal
字段指向进程的信号处理信息signal_struct
。 - CPU时间:
utime
和stime
字段记录了进程的用户态和内核态的CPU时间。
进程控制块(PCB)
task_struct
即是进程控制块(Process Control Block,PCB),它是操作系统用来管理进程的核心数据结构。每个进程在内存中都有一个对应的task_struct
实例。、
为什么我们需要对每个进程形成一个PCB对象
在操作系统中,为每个进程创建一个进程控制块(Process Control Block,PCB)对象是非常必要的。以下是具体原因和好处:
集中管理进程信息
PCB集中存储了与进程相关的所有信息,包括进程状态、进程号、程序计数器、寄存器内容、内存管理信息、I/O状态信息等。通过PCB,操作系统可以快速访问和管理每个进程的所有相关信息。
实现多任务调度
操作系统需要在多个进程之间进行切换(上下文切换),以实现多任务处理。PCB保存了进程的上下文信息(如CPU寄存器状态、程序计数器等),使操作系统能够在切换进程时保存当前进程的状态并恢复另一个进程的状态,从而实现进程的无缝切换。
资源分配和保护
PCB包含了进程使用的资源信息(如打开的文件、使用的内存段等)。操作系统通过PCB确保每个进程只能访问其合法分配的资源,从而实现资源的安全和公平分配。PCB的存在有助于实现资源保护和进程间的隔离,防止一个进程的错误或恶意行为影响其他进程。
进程控制和管理
PCB支持进程的创建、执行、挂起、唤醒和终止等控制操作。操作系统通过操作PCB来实现对进程的各种控制和管理功能,如:
- 创建进程:初始化一个新的PCB,并将其加入进程调度队列。
- 挂起进程:保存当前进程的上下文信息到PCB,并将进程状态设为挂起。
- 唤醒进程:从PCB中恢复进程的上下文信息,并将进程状态设为可运行。
- 终止进程:释放进程占用的资源,并移除相应的PCB。
进程间通信和同步
PCB可以包含进程间通信和同步所需的信息,如消息队列、信号、信号量等。通过PCB,操作系统可以实现进程间的有效通信和同步,确保多进程环境下的协调运行。
错误检测和调试
PCB提供了进程运行状态和资源使用情况的详细记录,有助于错误检测和系统调试。操作系统可以通过检查PCB中的信息来发现进程运行中的异常情况,并采取相应的纠正措施