【Java|多线程与多并发】PCB和进程调度的基本过程

简介: 进程是正在运行的程序的实例(an instance of a computer program that is being executed)

什么是进程


进程是正在运行的程序的实例(an instance of a computer program that is being executed)

进程(process)也叫任务(task)。如果想看电脑的进程,可以按 ctrl + alt + delete 调出任务管理器。

30.png

进程是重要的”软件资源“,由操作系统内核来负责管理,这里的管理就是描述+组织

描述:使用C语言的结构体来描述进程,这里的结构体也叫PCB(进程控制块/进程管理块)

组织:使用一个双向链表来把多个进程串在一起

创建一个进程就是创建了一个PCB对象,然后把它插入链表中,关闭一个进程就是将管理这个进程的结点给删掉,打开任务管理器查看进程,本质上就是遍历链表。


PCB的组成


PCB进程控制块是进程的静态描述,由PCB、有关程序段和该程序段对其进行操作的数据结构集三部分组成。

PCB一般包括:

1.程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID

2.特征信息:一般分系统进程、用户进程、或者内核进程等

3.进程状态:运行、就绪、阻塞,表示进程现的运行情况

4.优先级:表示获得CPU控制权的优先级大小

5.通信信息:进程之间的通信关系的反映,由于操作系统会提供通信信道

6.现场保护区:保护阻塞的进程用

7.资源需求、分配控制信息

8.进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中

9.其他信息:工作单位,工作区,文件信息等

PCB里面的的东西很多,下面给大家介绍一下关于进程的一些核心知识


PID


PID是进程的标识符了,是唯一的,一个进程都必须对应一个PID。PID一般是整形数字

32.png


内存指针


内存指针包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

内存指针是描述当前进程占用的内存是哪些

文件描述符表


内核为每个进程维护一个文件描述符表,该表记录了文件描述符的相关信息,包括文件描述符、指向打开文件表中记录的指针。

文件描述符表描述了进程的硬盘文件等其它资源。


并行和并发


硬盘、内存等这些资源都好分给进程,但有的资源不好分 就比如:CPU

虽然现在的CPU是多核的,但架不住进程有几百个,所以CPU的资源就很难分给这些进程。我们希望这些进程可以“同时进行”,这里的同时并不是真正的同时,而是分时复用 这里就有两个重要的概念—并行和并发

并行在操作系统中是指,一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。

并发是指:在同一个时间段内,两个或多个程序执行,但一个核心只能运行一个进程,但它可以对进程进行快速的切换(宏观上是同时,微观上仍是顺序执行)。

并发可以理解为CPU一次只能执行一个进程,虽然有多个进程,但它对进程之间的切换比较快,一秒内可以执行多次进程,虽然是顺序执行的,我们是感受不到的。

对于并行和并发,往往也统称为并发,除非显示声明,否则并发就是指并行+并发


进程调度相关属性


进程的状态


进程有三个状态:

就绪状态:进程具备运行条件,等待系统分配处理器以便运行的状态

运行状态:进程占有处理器正在运行的状态

阻塞状态: 正在执行的进程由于发生某事件而暂时无法继续执行时(如:请求I/O、申请缓冲空间等)。有时也称“等待”状态或“睡眠”状态。


优先级


优先级表示获得CPU控制权的优先级大小

进程是有优先级的,操作系统来管理进程的时候并不是“一视同仁”的


上下文


进程上下文,意思是可执行程序代码,是进程的重要组成部分。这些代码从可执行文件载入到进程的地址空间执行。一般程序在用户空间执行当一个程序调用了系统调用或者触发了某个异常,它就陷入了内核空间。此时,我们称内核“代表进程执行”并处于进程上下文。在此上下文中current宏是有效的。除非在此间隙有更高优先级的进程需要执行并由调度器做出了相应调整,否则在内核退出的时候,程序恢复在

举个例子:进程的上下文本质上就是游戏的存档和读档。

进程的上下文就是CPU中各个寄存器中的值。

寄存器是PU内置的存储数据的模块

保存上下文就是将CPU寄存器中的值保存到内存中

恢复上下文就是将CPU中的值恢复回去


进程的记账信息


操作系统统计每个进程在CPU上执行的时间和执行指令的数目,来决定下一阶段如何调度

以上就是是一些关于PCB和进程调度的一些核心内容了

相关文章
|
7天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
27 9
|
10天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
7天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
10天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
24 3
|
8天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
10天前
|
Java UED
Java中的多线程编程基础与实践
【10月更文挑战第35天】在Java的世界中,多线程是提升应用性能和响应性的利器。本文将深入浅出地介绍如何在Java中创建和管理线程,以及如何利用同步机制确保数据一致性。我们将从简单的“Hello, World!”线程示例出发,逐步探索线程池的高效使用,并讨论常见的多线程问题。无论你是Java新手还是希望深化理解,这篇文章都将为你打开多线程的大门。
|
10天前
|
安全 Java 编译器
Java多线程编程的陷阱与最佳实践####
【10月更文挑战第29天】 本文深入探讨了Java多线程编程中的常见陷阱,如竞态条件、死锁、内存一致性错误等,并通过实例分析揭示了这些陷阱的成因。同时,文章也分享了一系列最佳实践,包括使用volatile关键字、原子类、线程安全集合以及并发框架(如java.util.concurrent包下的工具类),帮助开发者有效避免多线程编程中的问题,提升应用的稳定性和性能。 ####
38 1
|
3月前
|
安全 Java 调度
解锁Java并发编程高阶技能:深入剖析无锁CAS机制、揭秘魔法类Unsafe、精通原子包Atomic,打造高效并发应用
【8月更文挑战第4天】在Java并发编程中,无锁编程以高性能和低延迟应对高并发挑战。核心在于无锁CAS(Compare-And-Swap)机制,它基于硬件支持,确保原子性更新;Unsafe类提供底层内存操作,实现CAS;原子包java.util.concurrent.atomic封装了CAS操作,简化并发编程。通过`AtomicInteger`示例,展现了线程安全的自增操作,突显了这些技术在构建高效并发程序中的关键作用。
69 1
|
14天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
2月前
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。