【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和进程调度的一些核心内容了

相关文章
|
1天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
3天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
3天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
3天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
37 2
|
14天前
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。
|
20天前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
20天前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
43 3
|
1天前
|
Java Linux API
[JavaEE]———进程、进程的数据结构、进程的调度
操作系统,进程任务,PCB,PID,内存指针,文件描述符表,进程的调度,并发编程,状态,优先级,记账信息,上下文
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
192 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)