˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客系列专栏:xiaoxie的JAVAEE学习系列专栏——CSDN博客●'ᴗ'σσணღ
我的目标:"团团等我💪( ◡̀_◡́ ҂)"( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝+关注(互三必回)!
一.CPU
1.CPU是什么
CPU(Central Processing Unit)中文翻译为中央处理器,是计算机硬件系统的核心组件之一,负责执行计算机程序的指令,进行各种算术和逻辑运算,控制数据的流动,并管理计算机系统内部的整体操作。CPU可以看作是计算机的大脑,它承担了几乎所有的计算任务和协调其它硬件组件的工作。
2.CPU的工作原理
CPU(中央处理器)的工作原理基于一种称为“指令周期”的循环过程,这个过程主要包括以下几个基本步骤:
-
取指令(Fetch)
- CPU从内存中按照程序计数器(Program Counter, PC)所指向的位置取出下一条待执行的指令。程序计数器是一个专门的寄存器(可以看作一个轻量级的内存,存储空间小于内存不过访问数据的速度远大于内存),它保存着即将执行的指令地址。
- 当指令被取出后,程序计数器通常自动递增(或按需调整),以便准备取出下一条指令。
-
指令解码(Decode)
- 取出的指令进入指令解码器,CPU对其进行分析以确定这条指令的操作码(Opcode)和相关操作数(Operand)。
- 操作码告诉CPU要执行何种操作(例如加法、减法、跳转等),而操作数则指示参与操作的具体数据源或目标位置。
-
执行(Execute)
- 根据解码后的指令信息,CPU调用相应的功能部件(如算术逻辑单元ALU、浮点运算单元FPU等)来执行实际操作。
- 如果指令涉及到数据读取或写入,CPU会通过地址总线与内存交互,从内存读取数据到寄存器或把寄存器中的结果写回内存。
-
访存(Memory Access)
- 在执行过程中,如果需要访问主存,CPU会发出控制信号,通过内存管理单元(MMU)与内存进行数据交换。
-
写回(Write Back)
- 执行完毕后,如果有运算结果需要保存,CPU会将结果写回到相应的寄存器中,或者写入内存指定位置。
-
更新程序计数器(PC Update)
- 根据指令类型,程序计数器可能会被更新以执行顺序执行的下一条指令,或者是跳转到新的指令地址执行分支或循环操作。
以上步骤概括了一个简化版的CPU工作循环,现代CPU为了提高效率,采用了流水线、乱序执行、预测执行等多种优化技术,使得多个指令能够在不同的处理阶段并行工作,极大地提升了CPU的性能表现。不过,上述基本原理依然适用于理解CPU工作的核心逻辑
3.CPU执行指令的流程
上述的内容可能比较抽象,博主举一个具体的示例来演饰一下CPU执行指令的流程
第一轮操作
1.CPU取出0号地址的指令
0 -> 00101110
2.根据指令表解析指令
因为该指令表表示前4位为操作码 0010 对照指令表的LOAD_A操作将后4位的 1110(14) 地址所指向的数据 存储到寄存器A
3.执行指令
第二轮操作
1.CPU取出1号地址的指令(PC++)
1 -> 00011111
2.根据指令表解析指令
因为该指令表表示前4位为操作码 0001 对照指令表的LOAD_B操作将后4位的 1111(15) 地址所指向的数据 存储到寄存器B
3.执行指令
第三轮操作
1.CPU取出2号地址的指令(PC++)
2 -> 10000100
2.根据指令表解析指令
因为该指令表表示前4位为操作码 1000 对照指令表的ADD操作,计算两个寄存器里的数据的和,并将结果放到第二个寄存器中,并且说明了后4位操作码,两个为一组,分别对应两个寄存器的ID(这里ID都是提前约定好的,我们就假设01为B,00为A)
3.执行指令
第四轮操作
1.CPU取出3号地址的指令(PC++)
3 -> 01001101
2.根据指令表解析指令
因为该指令表表示前4位为操作码 0100 对照指令表的STORE_A操作,将寄存器A的数据写入到后4为操作码指定的地址1101中
3.执行指令
第五轮操作
1.CPU取出3号地址的指令(PC++)
4 -> 00000000
2.根据指令表解析指令
发现指令表没有0000 的操作,就表示程序运行完毕
3.执行指令
退出程序
以上只是CPU操作的一点小实例,实际过程更复杂,并且一秒时间内CPU就能运行上亿条指令,我们简单了解一下它的工作原理即可,具体实现,我们这里就不深究了
二.进程(process)
1.什么是进程
进程是计算机操作系统中一个非常核心的概念,它是系统进行资源分配和独立运行的基本单位。进程是正在运行的程序的实例.
2.进程的几个关键特性
-
动态性:进程是动态生成和消亡的,它的存在始于程序的执行,终于程序执行的结束或被操作系统终止。
-
独立性:每个进程都有自己的地址空间(虚拟内存空间),其中包含了程序代码、数据、堆栈和共享库等,彼此之间相互独立,互不影响。
-
并发性:操作系统允许多个进程同时存在于内存中,并通过进程调度算法在多个进程之间切换执行,形成并发执行的效果,尽管实际上单个CPU在同一时刻只能执行一个进程。
-
异步性:进程执行不是连续的,而是按照各自独立且不可预知的速度向前推进,进程间的执行进度相互不受对方影响。
-
资源分配:操作系统以进程为单位分配系统资源,如CPU时间、内存空间、I/O设备等。
-
系统调度:操作系统通过进程调度器决定哪个进程获取CPU使用权,进程状态可以在就绪、运行、等待(阻塞)等状态间转换。
-
进程控制块(PCB):操作系统为每个进程维护一个进程控制块(Process Control Block),记录了进程的相关信息,如状态、优先级、CPU寄存器值、内存管理信息等。
总之,进程是操作系统实现多任务并行处理的基础,它将程序的执行表现为一系列操作系统可管理、可调度的任务单元。
3.进程运行的过程
进程运行的过程可以概括为以下几个主要阶段:
-
进程创建:
- 应用程序启动或由已运行的进程请求创建新进程时,操作系统首先会响应这个请求。
- 操作系统为新进程分配必要的系统资源,包括创建一个新的进程控制块(PCB)来存储该进程的状态信息、优先级、程序计数器、内存指针等重要控制信息。
- 在某些操作系统(如Windows)中,通过类似
CreateProcess()
这样的系统调用创建进程,并为新进程分配一个独立的地址空间,通常是从父进程复制或者映射文件到内存中加载程序代码和数据段。
-
进程加载:
- 操作系统将程序的代码和静态数据从磁盘加载到进程的地址空间中,设置初始堆栈和全局变量。
- 如果有需要,初始化动态链接库和资源。
-
进程调度:
- 新创建的进程被置于就绪队列中等待CPU资源。
- 当调度程序选择此进程时,将其状态变为“运行”状态,并把CPU控制权交给该进程。
-
进程执行:
- 进入“运行”状态的进程开始执行其第一条指令。
- 进程在CPU上运行,执行程序代码,访问内存,可能涉及到IO操作或其他系统调用。
- 进程在其生命周期内可能会经历各种状态变迁,例如由于等待某个事件而进入阻塞状态,或因时间片用完而重新回到就绪队列等待下次调度。
-
进程同步与通信:
- 在执行过程中,进程可能与其他进程交互,使用同步机制(如信号量、互斥锁等)协调对共享资源的访问,或通过IPC(进程间通信)机制交换数据。
-
进程终止:
- 当进程执行完毕或因异常、错误、用户请求等原因被终止时,操作系统释放该进程占用的所有资源,包括内存空间、打开的文件等,并从系统中移除相应的进程控制块。
-
进程切换:
- 当前进程因为时间片耗尽、发生中断、等待I/O完成或者其他原因需要让出CPU时,操作系统会保存当前进程的上下文(CPU寄存器状态等),恢复下一个即将运行进程的上下文,然后开始执行新的进程。
整个进程中,操作系统扮演着管理和调度的角色,确保进程在多任务环境下正确地并发执行。
其中进程调度是最核心的一步,接下来我们来详细介绍一下进程调度的过程
4.进程调度
进程调度是操作系统中的一项核心功能,它负责决定哪一个进程在什么时候获取CPU资源并执行。在多道程序设计系统中,由于CPU、内存等系统资源有限,而同时存在多个进程需要执行,因此必须有一个机制来公平有效地分配这些资源。进程调度主要涉及以下几个方面:
1.进程调度的目的与意义
- 资源利用率:最大化CPU的使用率,避免CPU空闲。
- 响应时间:确保交互式系统中的进程能及时响应用户的请求。
- 公平性:确保所有进程都能得到合理的执行机会,避免饥饿现象(一个进程长时间得不到执行的情况)。
- 系统吞吐量:提高系统处理任务的整体速度。
- 平衡性:兼顾进程执行的紧迫性和等待时间。
2.进程调度的时机
- 进程主动放弃CPU:进程执行时发生I/O请求或其他阻塞事件,此时进程转入阻塞状态,调度程序会选择其他就绪进程运行。
- 当前进程的时间片用完:在分时系统中,每个进程执行一段时间后会被强制让出CPU,这是时间片轮转调度策略的特点。
- 新进程创建并进入就绪状态:当有新的进程被创建并且准备好运行时,也可能触发进程调度。
3.进程调度的方式
-
非抢占式调度(Non-preemptive scheduling):一旦进程获得CPU,它会一直执行直到自己主动放弃(如执行完毕或阻塞)或系统中没有其他进程需要执行为止。例如,先来先服务(FCFS)调度算法。
-
抢占式调度(Preemptive scheduling):操作系统可以根据需要随时中断当前正在运行的进程,并把CPU分配给另一个进程。这种调度方式允许更灵活的响应实时性和优先级变化,例如短进程优先(SPN)或时间片轮转(Round Robin, RR)调度算法。
4.进程调度的算法
- 先来先服务(First-Come, First-Served, FCFS):按照进程到达就绪队列的顺序依次执行。
- 短进程优先(Shortest Process Next, SPN 或 Shortest Job First, SJF):优先选择预计执行时间最短的进程执行。
- 优先级调度(Priority Scheduling):根据进程的优先级高低选择进程执行,优先级高的进程优先执行。
- 时间片轮转(Round Robin, RR):每个进程都分配一个固定的时间片,时间片结束后不论进程是否执行完毕都要让出CPU,转至下一个进程。
- 多级反馈队列(Multilevel Feedback Queue):使用多个就绪队列,每个队列有不同的优先级和时间片长度,进程可以根据一定条件在队列间迁移。
5.进程调度的过程
- 进程状态转换:进程在就绪、运行、阻塞等状态间切换。
- 上下文切换:当进行进程调度时,操作系统需要保存当前进程的上下文(CPU寄存器状态、程序计数器等信息),并恢复即将执行进程的上下文。
- 调度决策:调度程序根据所采用的调度算法和当前系统状态作出调度决策。
6.进程调度准则
- 公平性:保证所有进程都能得到合理的执行机会。
- 效率:尽量减少进程在就绪队列中的等待时间,降低进程的响应时间。
- 平衡性:既考虑进程的紧迫程度,也顾及进程的等待时间长短。
- 系统开销:最小化进程调度引起的上下文切换开销。
总之,进程调度是操作系统内核中的核心组成部分,其性能直接影响到整个系统的性能和用户体验。通过精心设计和实现高效的进程调度算法,操作系统能够更好地满足各类应用程序的需求,提高系统的整体效能。
三.PCB(进程控制块)
1.PCB是什么
进程控制块是操作系统中用于管理和控制进程的一个数据结构。操作系统为系统中的每一个进程都维护一个唯一的PCB,其中包含了描述进程状态、控制信息以及与该进程相关的一些重要数据。注意这里提的PCB在每个操作系统中的名字是不一样的,例如在Linux里的PCB是叫task_struct
2.操作系统如何组织PCB
操作系统组织进程控制块(PCB)的方法主要有以下几种:
-
线性表方式: 在这种方式下,操作系统将所有进程的PCB连续地存放在内存的一个区域内。这是一种简单的组织形式,适合于进程较少且系统不支持复杂调度策略的情况。查找、添加和删除操作需要遍历整个线性表,所以当系统中进程数量较多时,这种方式效率较低。
-
索引表方式: 改进线性表方法,按照进程的状态(如就绪、运行、阻塞等)建立不同的索引表。这样,操作系统可以更快地定位到处于特定状态的进程。例如,系统会有一个就绪队列的索引表,一个阻塞队列的索引表等,每个表中包含了对应状态的所有进程的PCB地址。
-
链接表方式: 使用链表数据结构来组织PCB,将具有相同状态的进程PCB链接在一起,形成不同的队列,如就绪队列、阻塞队列、运行队列等。每个PCB中包含一个指向下一个PCB的指针,这样可以方便地插入和删除进程,同时也便于进行调度操作。
在现代操作系统中,往往结合以上几种方法的优点,采用更为复杂的数据结构和技术来组织PCB。例如,可能会采用优先级队列、红黑树、哈希表等高效的数据结构,依据进程的不同属性(如优先级、状态等)来组织和管理PCB,以提高调度和管理的效率。此外,还可能结合多级队列或多维数据结构来应对不同的调度策略和系统需求。
3.PCB所包含的信息
1.几个重要的信息
1.进程标识符(PID, Process ID)每个进程都有一个独一无二的标识符,用于区分系统中的不同进程就像我们的身份证一样,用于区别每一个进程
2.内存指针:一个进程运行时,就会被从硬盘加载到内存中,同时加载这个进程所的指令/依赖的数据
注意这个指针不是一个,而是一组,这一组就告诉操作系统,这个进程要运行的指令在内存的那个地址上,以及这个进程依赖的数据存储在内存的那个地址上.
2.和进程调度有关的信息
上文也提到了进程调度是进程运行的核心部分主要也是因为解决了操作系统如何在有限资源条件下管理大量并发任务的问题特别是我们现如今的CPU都是多核心的,所要求的如何在单一CPU核心上轮流执行多个进程以提供并发效果,而且更要在多个CPU核心之间智能分配任务,以实现真正意义上的并行执行,最大限度地利用硬件资源。
在PCB(进程控制块)中,与进程调度相关的几个关键属性包括
1.进程状态:进程状态字段记录了进程的当前状态,如就绪,阻塞等。调度器会根据进程状态来决定具体的调度
举一个例子说明: 博主同时约了两个人,一个叫小美,一个叫小花.其中小美是富二代,家里有矿,我约她她随时就可以出来,属于是随叫随到, (随叫随到 -> 在操作系统那里看来,就说明进程处于就绪状态)
而小花,就是一个普通人,因为需要考研,所以现在就在图书馆学习,所以呢约不出来(约不出来 ->在操作系统那里看来,就说明进程处于阻塞状态);
2.优先级:
进程优先级决定了进程在调度算法中的优先级,优先级高的进程通常会比优先级低的进程更早得到CPU资源。操作系统可以根据不同的调度策略赋予进程不同的优先级。
这个很好理解,博主就不举例说明,就是很简单的优先级问题
3.上下文切换信息:
包括程序计数器(PC)、栈指针等,这些信息在进程切换时用于保存和恢复进程上下文,确保进程能在合适的时候恢复执行。
举一个例子说明:
假设博主是一位老师,一天之中我需要辅导多位学生做作业。我手中有一份详细的“学生辅导计划表”,这份计划表就像进程控制块(PCB)一样,记录了每位学生的学习进度、需要解答的问题和当前的状态(正在辅导、等待辅导、已完成辅导)。
当我正在辅导第一个学生A做数学题时,突然电话响了,通知你马上要去接待一位来访的家长B。这时,你必须放下学生的作业和教学思路(这就是保存当前进程A的上下文),记下A做到哪一题、思考到何处(相当于保存CPU寄存器状态和程序计数器)。
接着,我接待了家长B讨论了一会儿孩子的学习情况(执行另一个“进程”),完成后我返回继续辅导学生A。这时,我需要查看辅导计划表(PCB)并回想刚才中断的地方(恢复上下文),然后继续从之前离开的地方帮助学生A解答数学题。
上下文切换”就好比我从辅导一个学生切换到处理其他事务,再回到辅导学生的过程中保存和恢复执行状态的过程。在计算机中,上下文切换则是操作系统在多个进程或线程之间切换执行时,保存和恢复进程或线程状态的过程。
4.进程调度标志
有些系统中,PCB还可能包含特殊的调度标志,比如是否需要立即调度、是否可以被抢占等,用于指导调度器做出更细致的决策。
5.等待原因(Wait Reason)
如果进程处于阻塞状态,PCB会记录进程等待的原因,可能是等待某个资源(如I/O操作完成),当等待条件满足时,调度器会改变其状态。
四.总结
CPU(Central Processing Unit)是计算机硬件系统的核心部件,负责执行指令、处理数据和控制计算机系统的运行。CPU执行指令流,对数据进行算术逻辑运算,并根据操作系统提供的指令控制整个系统的运作。
进程(Process)是计算机操作系统中运行的程序的实例,它包含了程序代码、数据、堆栈以及进程控制块(PCB)。进程是一个动态的概念,代表着程序在执行过程中的实体,是系统资源分配和调度的基本单位。操作系统通过创建、调度和销毁进程来管理计算机系统的并发执行。
PCB(Process Control Block)是操作系统内维护的一个数据结构,用于记录进程的状态信息以及控制进程运行所需的各种参数。每个进程都有一个与之对应的PCB,它包含了进程标识符、进程状态(如就绪、运行、阻塞等)、程序计数器(PC)、CPU寄存器的上下文、内存管理信息、优先级、资源列表(如打开的文件描述符、内存地址空间等)、以及与进程调度有关的信息如时间片、等待事件等。操作系统通过PCB来管理和调度进程,实现进程的创建、切换、同步、通信以及资源的分配和回收等功能。
感谢你的阅读,祝你一天心情愉悦.