进程和线程

news2024/11/16 16:29:33

1.关于进程

进程基本概念

进程(process)也叫任务(task)。

进程是操作系统对一个正在运行的程序的一种抽象。也就是说,可以把进程看作程序的一次运行过程。 (一个正在运行的程序——>进程。没有跑起来就不算是一个进程)。

在操作系统内部,进程又是操作系统进行资源分配基本单位。——>每个进程都对应一些资源

job和process的关系: job——>process是job的一种具体实现,但是job不一定全是process。

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

PCB和进程

计算机内部要管理任何现实食物,都需要将其抽象成一组有关联的、互为一体的数据(在Java中,可以通过类/对象来描述这个特征)

每一个PCB对象,就代表着一个实实在在运行着的程序,也就是进程。

描述:

讲清楚都有哪些属性特征。

使用结构体(C语言的结构体——>操作系统基本上都是C/C++来写的)来描述进程属性

用来描述进程的结构体——>PCB(进程控制块)

PCB里有哪些描述了进程的特征:

  • pid进程的身份标识符(唯一的数字)

  • 内存指针:指向了自己的内存是哪些

  • 文件描述符表:硬盘上的文件等其他资源

  • 内存指针和文件描述符表描述了进程持有哪些硬件资源。

由于CPU的资源不好分配。

现在大多数的CPU都是多核CPU,而日常生活工作中,存在多个进程但是CPU少。我们希望这些进程可以“同时运行”——>分时复用

并行:微观上同一时刻,两个核心的进程就是同时执行的。

并发:微观上同一时刻,一个核心上只能运行一个进程,但是它能够对进程快速地进行切换(只要切换数独足够快,宏观上人感知不到,人看起来就感觉这些进程在同时运行,但是微观上并不是同时进行的)

并行和并发由内核负责处理(应用程序感知不到)往往也把并行和并发统称为并发。

组织:

通过一定的数据结构把多个这样的基本单位串起来。

通过双向链表来把多个PCB串到一起。

创建一个进程,本质上就是创建一个PCB这样的结构体对象,把它插入到链表中。

销毁一个进程,本质上就是把链表上的PCB节点删除掉。

任务管理器查看进程列表,本质上就是遍历这个PCB链表。

调度器

操作系统中有一个重要的模块:调度器。就负责让有限的CPU来调度执行许多的进程(让这些进程看起来在同时进行)

进程调度相关的属性:

进程的状态:
  • 就绪状态:随叫随到。进程随时准备好上CPU执行。

  • 运行状态:正在CPU上执行。

  • 阻塞状态:短时间内无法响应,也无法到CPU上执行。

很多操作系统不会明确区分就绪状态和运行状态。
优先级:

先给谁排,后给谁排,给谁排多点,给谁排少点。(进程也是有优先级的,而不是一碗水端平的。

上下文:

本质上就是存档的内容

操作系统在进行进程切换的时候,需要将进程执行的“中间状态”记录下来,保存好。‘存档’

下次这个进程再上CPU上运行的时候,就可以修复上次的状态然后继续向下执行

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

寄存器是CPU内置的存储数据的模块保存的就是程序运行过程中的中间结果

保存上下文就是把这些CPU寄存器的值记录保存到内存中。

恢复上下文就是把内存中的这些寄存器值恢复回去。

记账信息

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

内存管理

内存(物理上是内存条——>可以存很多数据)

内存——>随机访问(闪现)——>数组取下标操作是O(1)

2.认识线程

一个线程就是一个“执行流”,每个线程之间都可以按照顺序执行自己的代码。多个线程之间“同时”执行着多份代码。

PCB和进程

PCB是使用链表来组织的(这句话并不具体),实际情况并不是一个简单的链表,而是一系列以链表为核心的数据结构。

操作系统对于调度这种事情只认PCB(系统内核中看不到‘进程’‘线程’这样的概念)。

一个进程可以包含一个线程(一个PCB)或者是多个线程(多个PCB)。

同一时刻,操作系统上有很多的进程,内核里就管理着十几号,上百号的PCB。这些PCB轮番去系统上调度执行,操作系统并不关心这些PCB哪些是一个进程中的。

如果每个进程有多个线程,那么每个线程都是独立上CPU调度的(线程是系统调度执行的基本单位)。每个线程也都有着自己的执行逻辑(执行流)

线程和进程

线程和进程的关系进程包含线程一个进程可以包含一个线程或者是多个线程,但不能没有

线程比进程更轻量——>把申请资源/释放资源的操作省下了。

只有第一个线程启动的时候,开销是比较大的,后续的线程就比较省事。

同一个进程的多个线程之间共用了进程的同一份资源(内存和文件描述符表)

内存:在线程1中new的对象,在其他线程中都可以使用。

文件描述符表:线程1打开的文件,在其他线程中都可以直接使用。

Java语言的特点:跨平台。(一次编译到处运行)

  1. 不同版本的JVM支持的·。

  1. 不同的JVM内部都封装了。

  1. 不同系统的API都执行同样的规则。

进程和线程的区别:

进程是包含线程的,每个进程至少有一个线程存在,即主线程

进程和进程之间不共享内存空间,同一进程的线程之间共享同一个内存空间。

进程是系统分配资源的最小单位,线程是系统调度的最小单位。

Java的线程和操作系统线程的关系

线程是操作系统中的概念,操作系统内核实现了线程这样的机制,并且对用户层提供了一些API供用户使用。

Java标准库中的Thread类可视为是对操作系统提供的API进行了进一步的抽象和封装。

补充内容:

  • 一个核心上执行的是一个线程。操作系统在调度的时候不关心进程只关心线程。

  • 一个线程也是通过一个PCB来描述的。

  • 一个进程里面可能是对应一个PCB也可能是对应多个。

  • PCB里的状态,上下文,优先级,记账信息,都是每个线程有自己的,各自记录各自的,但是在同一个进程里的PCB之间的pid是一样的,内存指针和文件描述符表也是一样的。

  • “调度”已经和进程没什么关系了,进程专门负责资源分配。线程来接管和调度相关的一切内容。

  • 增加线程的数量时,不是可以一直提高速度的(线程太多,核心数目有限,不少的开销反而浪费在线程的调度上了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/175027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS语法与CSS选择器

目录 CSS 语法 实例 例子解释 CSS 选择器 CSS 元素选择器 实例 CSS id 选择器 实例 CSS 类选择器 实例 实例 实例 CSS 通用选择器 实例 CSS 分组选择器 实例 所有简单的 CSS 选择器 延伸阅读 CSS 语法 CSS 规则集(rule-set)由选择器和…

java spring IOC外部Bean注入

外部Bean注入也是一种Bean操作的属性注入 但这次我们要注入的是一个类对象 我们先创建spring项目 引入基本依赖 然后在src下创建两个包 gettingStarted 和 generate 这个名字可以随便取 但和我同名 可以让你们不会出现 名称不一样导致资源找不到的问题 然后在 gettingStarte…

【寒假每日一题】AcWing 4729. 解密(补)

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴韦达定理及其逆定理一、题目 1、原题链接 4729. 解密 2、题目描述 给定一个正整数 k,有 k次询问,每次给定三个正整数 ni,ei,di,求两个正…

腾讯云GPU服务器环境部署与连接配置

先前博主购买了腾讯云的GPU服务器后,发现上面预装的环境存在一些问题,因此便来重新部署一下。 为了操作方便,博主这里使用了一个远程控制端软件:Xshell 博主在初始化时已经安装过pytorch了,我们首先看看安装的路径 测…

python winio的驱动级按键模拟

一,环境准备 电脑进入BIOS中关闭安全启动项菜单 电脑需要配备PS2接口的鼠标和键盘 二,安装rabird.winio环境 1、终端下执行pip install rabird.winio 然后重启电脑进入高级启动(禁止驱动程序强制签名),这个方法网上…

探索SpringMVC-DispatcherServlet

前言 在《探索SpringMVC-web上下文》中,我们介绍了DispatcherServlet的上下文的初始化。然后为了让大家对DispatcherServlet的各个组件有所了解,我们花了很多的时间来介绍各大组件。现在我们来看看DispatcherServlet是如何使用这些组件完成功能的。 Di…

【前端杂货铺】一个普通人在CSDN创作的一周年

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

Python---列表和元组

专栏:python 个人主页:HaiFan. 专栏简介:本专栏主要更新一些python的基础知识,也会实现一些小游戏和通讯录,学时管理系统之类的,有兴趣的朋友可以关注一下。 列表和元组前言列表的的概念列表的创建访问下标…

【微服务】Eureka注册中心

本系列介绍的是Spring Cloud中涉及的知识点,如有错误欢迎指出~ 一.引子 假如我们的服务提供者user-service部署了多个实例,如图: 大家思考几个问题: 问题一:order-service在发起远程调用的时候,该如何得知…

Linux——一文彻底了解进程id和线程id的关系(什么是pid、tgid、lwp、pthread_t)

目录 一.内核层面:pid & tgid 二.函数调用层面:getpid & gettid & pthread_self 三.用户层面:PID & LWP(TID) 四.总结 一.内核层面:pid & tgid 首先,我们要清楚&#…

【运筹优化】凸多面体重叠判断算法:GJK 算法详解 C++代码实现二维情形的凸多边形重叠判断

文章目录一、GJK 算法简介二、前置知识2.1 二维向量的点乘和叉乘2.2 三维向量叉乘2.3 凸多边形2.4 闵可夫斯基差2.5 单纯形2.6 Support 函数三、GJK 算法讲解3.1 熟悉 GJK 算法流程3.1.1 多边形重叠的情形3.1.2 多边形不重叠的情形3.2 总结 GJK 算法步骤3.3 讲解 GJK 算法细节3…

HTML5(下)

目录 表格标签 表格的主要作用 表头单元格标签 表格结构标签 合并单元格 列表标签 无序列表 有序列表 自定义列表 表单 表单域 表单控件(表单元素) 表单元素 label标签 select下拉列表 textarea文本域元素 案例-注册页面 表格标签 表格的主…

面试官: 你们生产环境的JVM怎么设置的?

前言 这篇文章,给大家聊一个生产环境的实践经验:线上系统部署的时候,JVM堆内存大小是越大越好吗? 先说明白一个前提,本文主要讨论的是Kafka和Elasticsearch两种分布式系统的线上部署情况,不是普通的Java应…

【附代码】十大经典排序算法

常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:名词解释:n:数据规模。k:“桶”的个数。In-place:占用常数内存,不占用…

TryHackMe-Docker_Rodeo

The Docker Rodeo 在此引导式展示中了解各种 Docker 漏洞。 以下内容均来自TryHackMe 前提设置 /etc/docker/daemon.json {"insecure-registries" : ["docker-rodeo.thm:5000","docker-rodeo.thm:7000"] }Docker注册表 在我们开始利用 Docke…

【Java开发】Spring Cloud 05 :远程服务调用Openfeign 替代 WebClient

在前边章节中,我们借助 Nacos 的服务发现能力,使用 WebClient 实现了服务间调用。从功能层面上来讲,我们已经完美地实现了微服务架构下的远程服务调用,但是从易用性的角度来看,这种实现方式似乎对开发人员并不怎么友好…

软件测试复习10:测试文档

专栏:《软件测试》 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 测试大纲:招标用,总体策略,对软件的了解,测试人员,资质等。 测试计划&#…

将Bean创建到Spring容器,从Spring容器拿出Bean

目录一、XML文件中,将Bean创建到Spring容器1. 基本类型注册2. 类装配3. 有参构造方法装配4. 扩展注入5. Bean的作用域6. Bean的其他配置二、配置类中,将Bean创建到Spring容器1. 在mapper、service、controller中创建,等着被componentScan扫描…

C++ | 关于STL中的空间配置器 | 源码剖析

文章目录为什么需要空间配置器一级空间配置器二级空间配置器内存池解析refill 填充内存池chunk_alloc 申请堆空间deallocate 资源的归还空间配置器的再次封装空间配置器与容器的结合我们知道在C和C中都有关于内存管理的问题,C语言用malloc和free这两个函数体现内存管…

ClassLoader-在spring中的应用

背景标题起的挺大,忽悠人的。其实是我跟着视频学习手写模拟spring底层原理中遇到的问题,关于classLoader的几行代码,不知道是什么意思,所以特地来记下笔记。关于ClassLoader我好像在遥远的几年前看深入理解虚拟机时看到过&#xf…