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

简介: 操作系统是一组专门做计算机资源管理的软件的统称。目前常见的操作系统有: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月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
5月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
237 67
|
9月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
3月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
102 0
|
6月前
|
SQL 监控 网络协议
YashanDB进程线程体系
YashanDB进程线程体系
|
8月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
257 16
|
8月前
|
消息中间件 调度
如何区分进程、线程和协程?看这篇就够了!
本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
229 11
|
7月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
315 0
|
8月前
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
167 6
|
9月前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
298 6