【Linux】初探进程:从硬件到软件的完美协同

前言:

计算机体系结构涵盖了硬件和软件两个方面,其中硬件层面包括了CPU、输入设备、输出设备、存储器以及设备之间的连接。这些硬件组件共同构成了计算机系统的基础,并为软件提供了执行的平台。而软件层面则由操作系统承担着管理和协调硬件资源的重要任务,保证计算机系统的稳定、高效和安全运行。

算机体系结构:硬件层面

在计算机体系结构中,硬件层面包括CPU、输入设备、输出设备、存储器以及设备之间的连接。
在这里插入图片描述

  1. CPU(中央处理器):作为计算机的核心,包括运算器和控制器,负责执行指令和控制计算机的运行。
  2. 输入设备:包括话筒、摄像头、键盘、鼠标、磁盘、网卡等,用于向计算机输入数据或命令。
  3. 输出设备:包括声卡、显卡、网卡、磁盘、显示器、打印机等,用于从计算机输出数据或结果。它们可以只做输入、只做输出,也可以即做输入又做输出。
  4. 存储器:包括内存(RAM),用于临时存储数据和程序。存储器具有掉电易失的特性,即在断电时数据会丢失。
  5. 设备连接:通过总线连接到主板,实现设备之间的数据传输和通信。

在这个体系结构中,CPU主要与内存进行数据交互,而外设也通过内存与CPU通信。因此,程序在运行时必须先加载到内存中。考虑到计算机效率,数据在设备之间的流动速度和拷贝的整体速度是重要的指标。
需要注意的是,磁盘等外部存储设备被视为外设,因为它们与CPU之间的数据传输通常需要经过内存。

  • 设备连接不是目的是手段,其目的是:设备之间的数据流动 考虑设备中数据的流动,拷贝的整体速度,是决定计算机效率的重要指标!

操作系统:软件层面

操作系统是计算机系统中负责管理软硬件资源的关键软件。它通过驱动程序对底层硬件进行管理,其中操作系统是管理者,驱动程序和底层硬件是被管理者。首先描述操作系统、驱动程序、底层硬件,然后组织讨论为什么需要操作系统以及其管理功能。

在这里插入图片描述

  • 操作系统、驱动程序、底层硬件:先描述再组织

1. 为什么需要操作系统?

  • 管理资源:操作系统负责管理计算机的各种资源,如CPU、内存、硬盘、网络等,以便程序能够正确高效地运行。
  • 提供运行环境:操作系统提供一个良好的运行环境,包括稳定性、高效性和安全性,使用户和应用程序能够在可靠的基础上工作。

2. 操作系统管理的重要性:

  • 对下管理好软硬件资源:操作系统通过合理分配资源和调度任务,确保系统资源的有效利用,提高系统整体性能。
  • 对上提供良好运行环境:操作系统提供稳定、高效、安全的运行环境,使用户能够方便地使用计算机,并保护系统不受恶意程序的侵害。

3. 系统调用接口和函数:

  • 系统调用接口是操作系统提供给应用程序的接口,通过这些接口应用程序可以请求操作系统提供的服务,如文件操作、网络通信等。
  • 函数如printf和scanf是由操作系统封装的系统调用接口的实现,它们提供了跨平台性和可移植性,使得应用程序可以在不同的操作系统上运行而不需要修改代码。

进程管理与PCB

进程与程序

在计算机中,程序是指一组指令的集合,它们按照特定的顺序执行以完成某个任务。程序通常以二进制文件的形式存储在磁盘上,并在需要时加载到内存中执行。而进程则是程序在执行过程中的一个实例,包括了程序的运行状态、内存分配情况、优先级等信息。

进程控制块(PCB)

PCB 是操作系统用来管理进程的数据结构。它包含了描述进程状态和属性的各种字段,如进程标识符、状态、优先级、内存指针等。PCB 还可以通过指针形成链表,便于操作系统对进程进行管理,如增加、删除、查找和修改。

struct XXX {
	// 状态
	// 优先级
	// 内存指针字段
	// 标识符
	// ...包含进程几乎所有的属性字段
	struct XXX *next;
};

进程管理

操作系统需要管理多个同时运行的进程,以保证系统资源的有效利用和进程间的合作与隔离。进程管理包括了进程的创建、调度、挂起、唤醒、终止等操作。在 Linux 中,进程管理的数据结构被称为 task_struct
为什么程序加载到内存,变成进程之后,我们要给每一个进程形成一个PCB对象呢?
因为操作系统要进行管理!

进程 = 内核PCB对象 + 可执行程序; 内核数据结构 + 可执行程序 = 进程;

未来,所有对程序的控制和操作,都只能和进程的PCB有关,和进程的可执行程序没有关系!
如果愿意,你可以把PCB(Node),放到任何数据结构中!

进程的属性

struct task_struct {
 	// 进程的属性
 };

task_ struct内容分类

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息
  • 查看进程可以通过 /proc 系统文件夹查看
    如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。
    在这里插入图片描述
    在这里插入图片描述
    cwd:当前工作目录

文件操作:

fopen("file.txt", "w"); // 如果不存在这个文件,就会在当前路径下,帮我们创建一个文件!  

父子进程关系

在操作系统中,通过 fork() 系统调用可以创建新的进程,新进程是以调用进程(父进程)为模板创建的。父子进程共享代码段,但各自拥有独立的 PCB 和内存空间。通过 fork() 返回值的不同,父子进程可以执行不同的代码块,实现进程间的分工合作。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
一般而言,我们想让父子进程做不同的事情
在这里插入图片描述

进程间独立性

操作系统设计时必须保证进程间具有独立性,即一个进程的崩溃不会影响其他进程的运行。每个进程都拥有独立的内存空间和 PCB,它们之间不能直接相互访问或修改数据。

为什么子进程和父进程会同时跑呢?

进程 = 内核数据结构 + 可执行程序的代码数据
在这里插入图片描述
创建进程的时候,系统中就会多一个进程!子进程的创建是以父进程为模板的!
子进程就会多一个独立的 task_struct
通过fork()的返回值,执行不同的代码块

fork()的返回值:

  1. 给父进程返回子进程的pid,给子进程返回0 ,为什么?
    父 : 子 = 1 :n n可以等于1 (父 标识 子)
  2. fork为什么会返回两次?
    返回的本质是写入,发生写时拷贝。
  3. id怎么可能同一个变量,即等于0,又大于0
    一个进程崩溃了,会不会影响其他进程?
    进程(任意)之间是具有独立性的,互相不能影响!OS在设计进程的时候,就必须保证这一点!
    在Linux中可以使用同一个变量名,表示不同的内存

总结:

在计算机体系结构中,硬件层面的各种组件如CPU、输入输出设备和存储器等通过设备之间的连接实现数据的流动和通信。操作系统作为软件层面的管理者,负责管理和协调这些硬件资源,提供稳定高效的运行环境。进程管理是操作系统的核心功能之一,通过进程控制块(PCB)对进程进行管理,确保系统资源的有效利用和进程间的合作与隔离。父子进程之间共享代码段但拥有独立的PCB和内存空间,保证了进程间的独立性和稳定性。操作系统的设计和实现需要考虑到硬件层面的特性和软件层面的功能需求,以实现计算机系统的高效运行和资源管理。

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q_hd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值