理解进程调度的基本过程,为学好多线程打好基础

简介: 操作系统是一组专门做计算机资源管理的软件的统称。目前常见的操作系统有:Windows,Unix,Linux,OSX,Android,ios等。

简单了解操作系统


操作系统是一组专门做计算机资源管理的软件的统称。目前常见的操作系统有:Windows,Unix,Linux,OSX,Android,ios等。


管理什么:


1. 管理下层的硬件设备---通过硬件的驱动程序来管理硬件


2. 管理上层的进程---在任务管理器中可以看到

微信图片_20221029141318.jpg

操作系统如何管理进程

要运行一个进程,需要先分配一些系统资源(内存,网络,硬盘等)


进程是系统分配资源的基本单位(最小的单位)


进程启动,需要先创建一个PCB(Process Control Block,进程控制块),进程也称作任务


操作系统管理进程就是在一个数据结构中(如双向链表),存储每个进程的pcb,通过pcb来管理进程


创建:数据结构中,新建一个pcb

关闭:数据结构中,删除一个pcb


关于PCB(进程控制块)

PCB包括以下:


1. pid:操作系统为每个进程分配的一个身份标识,一个系统中的pid是唯一的


2. 内存指针:用于标识进程占用在内存中的位置


3. 资源清单:


    (1) 设备资源:如打印机,键盘等等


    (2) 文件资源:通过一个文件描述表,里面记录了可以使用的文件列表(类似数组结构)


                           文件描述表:里边储存文件描述的信息,所在的索引也叫文件描述符


          每个程序运行时,打开都会默认三个文件描述符,对应Java中:System.out,in,err(分别代表标准输出,标准输入,错误输出)


还存在一些调度信息:


4. 优先级


5. 其他的调度信息:如进程已经执行/等待了多久,执行了那些代码


6 进程上下文:


进程在时间片轮转调度的时候,切换出去时的环境(运行的指令行需要的变量等等)为上文,恢复执行时的环境为下文


需要在切换出去时保存上文,恢复时,读取之前保存的信息到下文,类似玩游戏的存档,读档


进程调度算法

我们系统中,运行的进程数量,远远超过了cpu的核心数,原因就是操作系统调度进程,在cpu上来执行指令


操作系统调度进程时的调度算法:


先来先服务:根据时间先后顺序来执行


高优先级优先:优先级高的进程,优先执行,这里的优先级指的是总的优先级(优先级信息+进程等待时间)


短作业优先:某个作业(一组任务)执行的剩余时间越短,就优先执行 (非抢占式)

缺陷:某些耗时长的任务,就可能没有机会执行了(也叫做饥饿)


抢占式:某个高优先级的进程加入,就可能暂停优先级低的任务,先执行优先级高的。更多的用于实时性高的系统(执行进程,需要及时反馈,得到运行结果)

Java中的多线程,就是使用抢占式的方式


非抢占式(了解):某个进程,必须执行完毕,由进程告诉操作系统,我执行完了,可调度后续的进程。(也可能出现进程饥饿现象),这种一般用于批处理系统中,它不关注某个任务是否先执行,只关注总的执行效率


时间片轮转调度算法


采用这个算法,我们看起来,整个电脑中远远超出cpu核心数的进程,还是在同时在执行。

操作系统中,使用了一个就绪队列的数据结构,其中要存放要运行的进程。


每次使用头节点的进程,来运行一段时间,再放回到队尾,运行的时间叫做该进程这次运行的时间片,这个时间片的大小,是由操作系统计算出来的


进程执行表现的特性

并发:一个cpu以时间片轮转调度的方式一次执行多个进程(人肉眼感知是“同时”执行)


并行:多个cpu在一个时间点上,同时执行多个进程

image.png


image.png

多个程序的代码执行:既存在并发,也存在并行


表现特征:单个程序代码的执行顺序还是顺序的,多个程序的代码之间,就可能是无序的


虚拟地址空间(虚拟内存)


🌻为什么需要虚拟内存?虚拟内存有什么用?(大厂面试常问)


1. 进程内存独占性:隔离进程间使用的内存,进程不使用公用的物理内存,否则进程1修改了某个变量,就可能导致进程2整个程序挂掉


2. 扩展内存容量:某个进程如进入阻塞/时间片轮转切换出去,有一些从硬盘中读取到的内存数据,所有占用的总内存可能超过物理内存,采取的方案就是使用虚拟内存映射到硬盘

(使用硬盘容量作为虚拟内存的一个扩展)


某个进程在虚拟内存中,占用的空间是一个类似书籍一样的,一页一页的(分页式内存)


当某一页映射到物理内存,但是发现没有对应的数据,就会产生一个错误,“缺页式中断”,就会从外设中查找


进程间的通信

如上所述,进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到存

在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备“隔离性”。


但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程程进

行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换“的需求。进程间通信的需求应运而生。


由于虚拟内存隔离了进程使用的内存,需要共享数据,就需要采取通信的方式


目前主流操作系统中提供的进程通信机制如下:

管道  共享内存  文件   网络   信号量  信号


其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络同一主机上的进程间进行通信。


相关文章
|
7天前
|
算法 人机交互 调度
进程调度算法_轮转调度算法_优先级调度算法_多级反馈队列调度算法
轮转调度算法(RR)是一种常用且简单的调度方法,通过给每个进程分配一小段CPU运行时间来轮流执行。进程切换发生在当前进程完成或时间片用尽时。优先级调度算法则根据进程的紧迫性赋予不同优先级,高优先级进程优先执行,并分为抢占式和非抢占式。多队列调度算法通过设置多个具有不同优先级的就绪队列,采用多级反馈队列优先调度机制,以满足不同类型用户的需求,从而优化整体调度性能。
28 15
|
2天前
|
算法 调度 Python
探索操作系统的内核——一个简单的进程调度示例
【9月更文挑战第17天】在这篇文章中,我们将深入探讨操作系统的核心组件之一——进程调度。通过一个简化版的代码示例,我们将了解进程调度的基本概念、目的和实现方式。无论你是初学者还是有一定基础的学习者,这篇文章都将帮助你更好地理解操作系统中进程调度的原理和实践。
|
5天前
|
算法 调度 Python
深入理解操作系统:进程管理与调度
【9月更文挑战第14天】操作系统是计算机系统的核心,负责管理和控制计算机硬件资源,并提供用户和应用程序所需的服务。本文将介绍操作系统中进程管理与调度的基本概念、原理和实现方法,并通过代码示例进行说明。通过阅读本文,读者可以深入了解操作系统的工作原理和机制,提高对计算机系统的理解和掌握能力。
|
1天前
|
算法 调度 开发者
深入理解操作系统的进程调度策略
【9月更文挑战第18天】本文将通过浅显易懂的方式,带你深入了解和掌握操作系统中一个至关重要的概念——进程调度。我们将从基础概念出发,逐步探讨进程调度的策略、算法及其在操作系统中的实现方式。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往操作系统深层知识的大门,让你对进程调度有更深刻的理解和认识。
9 3
|
5天前
|
开发者 Python
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第46天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将揭开进程与线程这两个核心概念的神秘面纱,通过生动的比喻和实际代码示例,带领读者理解它们的定义、区别以及如何在编程中运用这些知识来优化软件的性能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技巧。
|
9天前
|
算法 调度 Python
深入浅出操作系统之进程调度
【9月更文挑战第10天】本文以浅显易懂的语言,深入浅出地介绍了操作系统中的进程调度机制。通过对比不同调度算法的特点和适用场景,帮助读者理解进程调度在操作系统中的重要性。同时,结合代码示例,展示了进程调度的实现过程,使读者能够更直观地感受进程调度的魅力。
|
6天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【9月更文挑战第13天】操作系统是计算机科学的核心领域之一,它负责管理和控制计算机的硬件资源,提供软件运行的环境。在众多操作系统的功能中,进程管理是其核心组成部分,涉及到进程的创建、执行、同步和通信等方面。本文将探讨进程管理的基本概念,并深入分析不同的进程调度算法,以及它们如何影响系统性能和用户体验。通过理论阐述与实际应用的结合,我们旨在为读者提供对操作系统进程调度机制的全面理解,同时辅以代码示例,增强内容的实用性和互动性。
17 4
|
7天前
|
算法 调度 云计算
深入理解操作系统的进程调度
【9月更文挑战第12天】本文旨在探索操作系统中一个关键组件——进程调度器,其设计哲学和实现方式直接影响系统性能与用户体验。我们将从基础概念出发,逐步剖析进程调度的目标、策略以及面临的挑战,并以实际代码示例具体演示如何实现一个简单的进程调度算法。通过本文,读者将获得对操作系统进程调度机制的深刻理解和实际应用能力。
15 4
|
10天前
|
算法 调度 UED
深入理解操作系统之进程调度算法
【9月更文挑战第9天】在操作系统的心脏跳动中,进程调度扮演着关键角色,就如同指挥家控制交响乐的节奏。本文将通过浅显易懂的语言和生动的比喻,带领读者走进进程调度的世界,探索不同调度算法背后的哲学与实践,以及它们如何影响系统的性能和用户体验。从最简单的先来先服务到复杂的多级队列和反馈循环,我们将一同见证操作系统如何在众多任务中做出选择,确保系统的高效与公平。
|
13天前
|
存储 Java 数据处理
进程中的线程调度
进程是应用程序运行的基本单位,包括主线程、用户线程和守护线程。计算机由存储器和处理器协同操作,操作系统设计为分时和分任务模式。在个人PC普及后,基于用户的时间片异步任务操作系统确保了更好的体验和性能。线程作为进程的调度单元,通过覆写`Thread`类的`run`方法来处理任务数据,并由系统调度框架统一管理。微服务架构进一步将应用分解为多个子服务,在不同节点上执行,提高数据处理效率与容错性,特别是在大规模数据存储和处理中表现显著。例如,利用微服务框架可以优化算法,加速业务逻辑处理,并在不同区块间分配海量数据存储任务。