计算机原理探险系列(五)-- 磁盘存储探秘OS中的进程

简介: 计算机原理探险系列(五)-- 磁盘存储探秘OS中的进程

什么是进程



以下几种说法我感觉都是正确的理解:

1.进程是一个动态执行的过程,是CPU分配虚拟内存空间的基本单位。

2.进程包含了程序,是程序执行的一种表现,二者之间呈现多对多的一种关系。


进程包含了什么



包含的内容非常丰富:


1.执行的程序代码

2.程序代码运行时候产生的临时变量

3.指令执行的地址信息

4.系统资源信息,例如正在打开的文件

简单一句话就是进程包含了一个程序在运行时候所需要的所有资源信息。


程序和进程的关系



程序是进程的一个基础,计算机执行的所有功能都是基于进程为单位进行的,但是进程内部真正执行任务的核心却是程序的代码逻辑,程序的每次执行都有可能构成不同的进程。


虽然我们的程序一般都是存储在磁盘当中,但是数据如果不一样的,就有可能进程的执行最终结果不一样,从而说明进程不一样。所以一个程序其实是可以对于多个进程的。二者的关系准确应该说是多对多的关系。


程序:静态的代码结合

进程:程序的执行表现


程序进入内核态

例如一个进程需要读取磁盘文件的信息,此时需要和系统的硬盘打交道,那么这个时候读取文件的信息就需要交给操作系统内核来替代进程执行,这种场景我们一般就称之为进程进入了内核态。


进程的状态


创建

此时会向操作系统内核申请一个PCB,在此过程中需要向操作系统申请一些管理进程的基本信息,完成资源的分配,如果操作系统此时没有额外的空间就无法满足,此时会导致进程无法正常进入创建状态。


就绪

当操作系统为进程创建并开辟了一定的资源空间之后,只需要等待CPU的时间分片进程便可以开始执行。此时进程在外存,但只要进入内存,即可运行。


执行

CPU调度开始执行指定的进程,进程进入执行状态。


阻塞

已经在运行的进程如遇到了一些io堵塞,或者缓存区申请失败的问题,就会处于一个阻塞的状态。此时进程在外存并等待某事件的出现。


终止

进程执行结束,或者被意外终止,就会进入一个终止的状态。


状态切换的本质,CPU时间片切换

OS的底层实际上有着一个专门处理CPU调度的模块用于给不同的进程分配时间片:


网络异常,图片无法展示
|


看起来我们在使用计算机的时候各个程序都是在同时运行,但是实际上是cpu给不同程序分配了不同的时间片执行,然后进行快速切换,由于切换的速度非常快,所以让人们从宏观的角度上看起来似乎都在并行执行。


CPU分片给到指定的程序执行,如果分片时间截止,进程依旧没有执行完毕,那么此时CPU会将时间片剥夺分给下一个进程。如果在分片期间遇到了进程堵塞状态,那么CPU也会自动将时间片提早结束分配给下一个进程使用。


进程之间的通信


无名管道


A,B两个进程在进行通信的时候无法读取到各自的用户态中的变量信息,此时需要进行通信的话需要将变量统一写入到操作系统内核一个共享缓冲区中,然后供对方进行内核调用的时候去读取,就如同下图所示:


图片


这种方式进行进程间通信的弊端在于多次的用户态到内核态的调用会比较消耗计算机性能。


局限性


1.只能用作与具有亲缘关系的进程之间进行通信操作,例如 父子进程。


2.固定了管道的读取和写入端,它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。如下图:

图片


按照上图所示,当父进程希望和子进程进行通信的时候,首先父进程需要开启写入口,然后子进程开启读入口。


FIFO命名管道


FIFO命名管道是利用了文件来充当共享数据区域,将变量都存储到这个区域之后对该文件进行写入和读取数据从而实现进程间的通信功能。


类似的案例:服务端和客户端利用FIFO进行进程间的通信功能。


如下图所示:


网络异常,图片无法展示
|


但是这种设计有个弊端,就是当有多个客户机发送请求的时候,服务端需要针对不同客户机进行响应数据的时候会比较麻烦,因此就有了以下设计:


网络异常,图片无法展示
|


消息队列进行通信


在unix操作系统内部,提供了消息队列相关的接口供外界进行调用使用,多个进程之间进行通信可以借助消息队列的帮助,这种通信是同步的机制,一端写入,一端读取即可。如下图:


网络异常,图片无法展示
|


信号量进行通信


信号量只允许程序对其访问是原子操作,只允许进程对它进行等待操作。对信号量进行+ 或者 - 操作(即P(信号变量))和发送(即V(信号变量)) 来限制多个进程之间对相同共享资源的访问,是属于同步进程的一种操作(使在任一时刻只能有一个执行线程访问代码的临界区域)。


共享内存


对一片共享的内存区域进行加锁控制,防止多进程访问出现资源竞争,然后往里面写入和读取数据,从而实现多进程的互相通信。


进程控制块PCB



什么是进程控制块

描述进程的数据结构,操作系统管理控制进程运行所用的信息集合。可以用于作为进程存在的唯一标识。


当创建了一个进程之后就会立即创建一个PCB控制块。


PCB用于存储进程在执行过程中需要用到当一些内存信息,上下文资源内容。


PCB内部有什么


1.进程创建者标识记录信息。


2.进程执行程序的过程中需要使用到的寄存器信息,栈指针信息


3.进程控制信息,例如进程执行程序中打开的资源文件信息,调度状态信息,进程间通信信息等等。


PCB的组织方式


统一状态的进程其PCB成一链表,多个状态对应多个不同的链表,各状态的进程形成不同的链表,例如就绪链表和阻塞链表。


索引链表


同一状态的进程归入一个index表(由index指向PCB),多个状态对应多个不同的index,各状态的进程形成不同的索引表,例如就绪索引表,阻塞索引表。


网络异常,图片无法展示
|


各状态的进程形成不同的链表,例如:就绪状态:就绪链表,堵塞状态:堵塞链表。


多进程和多线程之间的性能开销差异性


多个进程之间的通信是比较复杂的,开销较大,需要额外分配资源,建立PCB,回收资源等等。所以在处理一些复杂程序的时候,我们更加愿意使用多线程技术。

目录
相关文章
|
28天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
65 1
|
2月前
|
算法 调度 Python
深入理解操作系统中的进程调度算法
在操作系统中,进程调度是核心任务之一,它决定了哪个进程将获得CPU的使用权。本文通过浅显易懂的语言和生动的比喻,带领读者了解进程调度算法的重要性及其工作原理,同时提供代码示例帮助理解。
|
1月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
30天前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
29天前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
30天前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
30天前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
1月前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
2月前
|
算法 Linux 调度
深入浅出操作系统的进程管理
本文通过浅显易懂的语言,向读者介绍了操作系统中一个核心概念——进程管理。我们将从进程的定义出发,逐步深入到进程的创建、调度、同步以及终止等关键环节,并穿插代码示例来直观展示进程管理的实现。文章旨在帮助初学者构建起对操作系统进程管理机制的初步认识,同时为有一定基础的读者提供温故知新的契机。
|
1月前
|
消息中间件 算法 调度
深入理解操作系统之进程管理
本文旨在通过深入浅出的方式,带领读者探索操作系统中的核心概念——进程管理。我们将从进程的定义和重要性出发,逐步解析进程状态、进程调度、以及进程同步与通信等关键知识点。文章将结合具体代码示例,帮助读者构建起对进程管理机制的全面认识,并在实践中加深理解。