【进程与线程】最好懂的讲解

news2024/9/25 19:17:45

目录

1.CPU的管理

2.进程

2.1.概述

2.2.数据结构

2.3.进程状态

2.4.进程与内存

2.5.PCB队列

3.线程

3.1.概述

3.2.实现


1.CPU的管理

进程和线程是操作系统里面的概念,这个概念其实是对CPU的管理策略。整个操作系统都可以看作计算机硬件的管理软件,而进程和线程则是对于CPU的管理。

CPU作为计算机的核心,其职责概括起来就是:

取指执行。

CPU是一个只知道处理指令的部件,而具体处理什么指令则有程序计数器来决定。程序计数器就像CPU的饲养员,会不断地给CPU传去要执行的指令在内存中的地址,CPU则执行取指指令,去对应地址中拿要执行的指令,然后执行。整个流程如下图所示:

整个cpu的取指过程中存在几个问题:

  • 利用率不高

  • 缺少控制

利用率不高:

假设CPU在执行某一个程序的指令,那么他就会连续去执行这个程序的指令代码,当整个程序有慢速的操作,比如IO操作之类的,由于IO的速度要远远低于CPU的速度,那么CPU会在一段时间内处于等待IO的状态。等待的这段时间以CPU的效率来说要是用去执行其它任务,能执行很多内容。

缺少控制:

程序之间存在轻重缓急,比如当前CPU正在运行一个打印文件的程序指令,由于要和IO设备打交道,这个程序是比较耗时间的。此时进来了一条发射核弹的程序指令,明显优先级高的程序等到优先级低的程序执行完毕,而且前一条指令合适执行完毕,完全无从得知。

解决以上问题的思路:

让CPU在程序之间切来切去,让程序交替执行。

不让程序一口气执行完,而是将CPU的时间分成时间片,这一秒属于程序A,下一秒属于程序B,下一秒又属于程序A…让程序交替的去执行,这样的话即使遇到了诸如IO这种耗时操作也能利用其期间的空闲时间。比如一个IO操作本来要三秒,也就是说CPU从执行这个IO操作开始要苦等三秒钟才能能到返回结果,但是时间分片、程序交叉执行后,假设时间片分成了一秒一个,这一秒遇见了IO,下一秒分给了其他程序,下一秒再回来,这样中间的时间就被利用起来了。

2.进程

2.1.概述

前面我们说到为了充分利用CPU,需要将CPU时间分片、程序交叉执行。但是这样做之后随之就有一个问题是要解决的:

如何描述运行中的程序?

要让程序切来切去就一定要对这些运行的程序进行描述,要描述某个程序执行到了何处之类的消息。这样来回调度的时候才能接着上次继续运行。当然对线程的描述肯定不止一个上次运行到哪里这一个内容还有很多细节的内容,比如可以给每个运行中的程序一个优先级,优先级大的多分点时间片给它,也需要给每个运行中的程序一个编号好进行区分。注入此类的一堆的对运行中的程序的描述叫做——进程。

进程的定义:

用于描述和管理程序的“运行过程”。是指程序在某个数据集合上的一次运行活动。是分配资源的一个基本单位

进程的特点:

  • 并发性,由于CPU在程序间切来切去的执行,使得多个进程会有种被并发执行的感觉。

  • 独立性,进程是分配资源和运行调度的基本单位。

进程雨程序的区别:

程序是静态的,是一组指令放在存储中,长期存在。 进程式动态的,是程序的一次执行过程,短期存在。 一个程序可能有多个进程。

2.2.数据结构

进程由三部分组成:

  • PCB

  • 代码

  • 数据

数据和代码没什么好讲的,程序要执行肯定要这些东西,重点要注意一下PCB。

进程控制块(Process Control Block,PCB):用来记录比如当前执行到了何处、优先级、名称等重要消息。PCB在创建进程时被创建,进程撤销时同时被撤销。PCB是操作系统管理进程的单位。

2.3.进程状态

理论上进程有三种状态:

运行态(Running):进程占有CPU,在CPU上运行。 就绪态(Ready):具备运行条件,暂未运行,等待CPU资源。 阻塞状态(Block):已经开始执行的进程,在执行过程中等待某个资源。也叫等待状态(wait)。 以上只是理论上的三种必须的基本状态,各类型操作系统的具体实现会有差异。

2.4.进程与内存

进程与内存 每个程序的数据和代码装入内存空间,每个进程都会有独立的一个对应的数据结构(内存管理中的页表)来记录该进程的数据和代码存放在哪些位置。 每个程序装入内存,生成对应的一个进程,进程生成时,会同时生成属于该进程的PCB,PCB中会记录页表项,即当前程序执行到了何处。 CPU会根据PCB队列来调度执行各个进程。

2.5.PCB队列

等待被调度执行的进程:

对应的还有阻塞队列等,都是类似上图的结构。 CPU会根据调度算法从就绪队列中选择进程来执行,当执行的进程无法继续推进时,将该进程暂时放入阻塞队列,重新从就绪队列中选一个进程来执行,之前进程重新准备好后,某个时间点上CPU再切回来继续推进该进程。

3.线程

3.1.概述

线程我们可以理解为对进程进行了多路复用,线程的出现带来两个优势:

  • 程序之间的切换更加轻量级

  • 并发度更高

1.程序之间的切换更加轻量级:

进程之间的切换会造成CPU上下文的切换,性能开销很大,如果对CPU上下文不是很了解的同学可以移步:

详解CPU的态__BugMan的博客-CSDN博客

2.并发度更高:

我们来举个例子:

假设在CPU的某个时间片里要执行如下指令:

第一行代码调用IO设备后,即使已经完成使用,后续不再需要此资源,但是在第N行代码执行结束前,IO设备仍然被该进程所占有,其它要用到该资源的进程只能等待。当然在单CPU架构中不会存在这个问题,但是一旦是多CPU的架构中就会出现这种情况。

3.2.实现

线程的实现有两种:

  • 用户级线程

  • 内核级线程

用户级线程:

用户在程序层面通过手动编码的方式来实现逻辑上的线程,通过编码来手动实现线程的切换逻辑,即在用户空间的调度以线程为单位,在CPU上的调度以进程为单位。

内核级线程:

用户空间的调度以进程为单位,CPU的调度以线程为单位。

总结起来说,线程可以理解为对进程的多路复用,当操作系统支持线程时,CPU的上下文切换仍然是以进程为单位进行的。线程的控制块称为TCB,作用和结构和进程几乎是一样的,属于同一个进程的线程的TCP存储于该进程的内存空间中。

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

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

相关文章

git本地选项配置

一,简介 在git工具安装完成之后,需要设置一下常用的配置,如邮箱,缩写,以及git commit模板等等。本文就来详细介绍些各个配置如何操作,供参考。 二,配置步骤 2.1 查看当前git的配置 git conf…

JVM性能分析-jstat工具观察gc频率

jstat jstat是java自带的工具&#xff0c;在bin目录下 用法 语法&#xff1a;jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] [kqkyyj-2 bin]$ jstat -help Usage: jstat -help|-optionsjstat -<option> [-t] [-h&l…

C++ 面向对象三大特性——继承

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C 继承 ☂️<3>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;面向对象三大特性的&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff…

官网下载安装达芬奇18.5详细步骤

目录 一、介绍 &#xff08;一&#xff09;特色功能介绍 &#xff08;二&#xff09;版本介绍 二、下载安装教程 &#xff08;一&#xff09;达芬奇官网下载 &#xff08;二&#xff09;安装 一、介绍 &#xff08;一&#xff09;特色功能介绍 以下是达芬奇视频剪辑软件…

【UE4 RTS】11-HUD functionality Part1

前言 本篇实现了将游戏状态中的游戏时间和游戏日期通过蓝图接口的方式传递给控件蓝图&#xff0c;并且正确显示&#xff0c;另外还实现了控件蓝图界面上切换12小时和24小时制的游戏时间显示方式。 效果 步骤 一、显示游戏日期 1. 打开蓝图接口“RTS_GameTime_IF” 添加一个…

回声消除-卡尔曼滤波

卡尔曼滤波 卡尔曼滤波的设计过程中需要定义两个变量&#xff0c;一个是状态量&#xff0c;另一个是观测量 状态量 状态量是跟踪目标。将状态量记作 x n \mathbf{x}_n xn​&#xff0c;状态量的协方差矩阵记作 P n \mathbf{P}_n Pn​&#xff0c;可以由前一个时刻的状态&…

视频集中存储/云存储/磁盘阵列EasyCVR平台接入RTSP设备出现离线情况的排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

20天部署,支持每天上百家门店咖啡物料配送,顺丰供应链是这样做到的

走进顺丰供应链华北智能仓&#xff0c;映入眼帘是多台自如穿梭的智能搬运机器人和自动高效的分拣设备。1200平米内&#xff0c;拆零输入、分货、按订单取出……通过自动化解决方案&#xff0c;作业效率大幅提升。 这是顺丰供应链与全球仓储机器人引领者极智嘉(Geek)的又一次智…

如何快速搭建app自动化环境编写用例?

使用Airtest 作为测试开发工程师&#xff0c;快速搭建app自动化环境并编写用例可以使用Airtest解决方案来实现。Airtest是一款基于Python的全平台UI自动化测试框架&#xff0c;支持多种移动设备和模拟器&#xff0c;同时集成了丰富的图像识别和手势操作功能。 以下是使用Airt…

有理数思维导图怎么画?这种方法绘制很方便

有理数思维导图怎么画&#xff1f;为什么要绘制思维导图&#xff1f;因为它可以帮助我们更好地组织和理解信息。在数学中&#xff0c;绘制有理数思维导图也可以帮助我们更好地理解有理数的概念和性质。 有理数是我们日常生活中经常接触到的数学概念&#xff0c;包括正整数、负整…

动态内存分配及管理——C语言

目录 一、为什么存在动态内存分配 二、动态内存函数介绍 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 三、常见的动态内存错误 3.1 对NULL指针的解引用操作 3.2 对动态开辟空间的越界访问 3.3 对非动态开辟内存使用free释放 3.4 使用free释放一块动态开辟内存的一部…

AUTOSAR NvM协议栈集成方法

一、涉及的模块 Bsw&#xff1a;NvM、MemIf、Fee、Crc Mcal&#xff1a;Fls 其中一些芯片厂商的MCAL也会提供Fee模块&#xff0c;本文选择使用ETAS提供的Fee模块&#xff0c;好处是Fee的Block不需要手动配&#xff0c;在NvM中配好了Block之后&#xff0c;生成Bsw代码的同时会…

c语言——查找特定字符在字符串中出现的次数

fgets 函数用于从标准输入&#xff08;stdin&#xff09;中读取一行字符串&#xff0c; 并将其存储在指定的字符数组 str 中。 sizeof str/sizeof str[0] 是用来计算字符数组 str 的大小。 这个表达式计算的结果是字符数组 str 可以容纳的元素个数&#xff08;包括…

linux vscode 下开发

linux vscode 下开发 javajdk插件 java jdk 各种JAVA JDK的镜像分发 编程宝库 - 技术改变世界 jdk 镜像 ubuntu22.04 安装 # Linux x64 64位 jdk-8u351-linux-x64.tar.gztar -zxf jdk-8u351-linux-x64.tar.gz mv jdk1.8.0_351 jdk8/ vim ~/.profile expo…

KEY接口ESD静电保护器件:DW05D5BC-B-E和DW05MS-S

静电在我们日常生活中&#xff0c;可谓是无处不在&#xff0c;我们身上和周围环境就带有很高的静电电压。都知道&#xff0c;ESD静电放电会对电子设备带来威胁甚至损坏。为此&#xff0c;电子设备中按键部位、接口部位以及触摸屏等防静电保护措施是非常有必要的。针对按键KEY接…

Java网络编程(一)网络基础

概述 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递 网络分类 局域网(LAN) 局域网是一种在小区域内使用的,由多台计算机组成的网络,覆盖范围…

如何使用Python获取SAP Temporary key 临时密钥

什么是Sap 临时密钥&#xff1f; SAP 临时密钥是用于激活 SAP 软件的一种许可证&#xff0c;只能在有限的时间内使用。这些密钥可用于评估目的或在系统迁移期间使用。它们是临时解决方案&#xff0c;通常在一定时间后过期。 如何获取Sap Temporary keys? 临时密钥: 如果创建…

Web网页浏览器远程访问jupyter notebook服务器【内网穿透】

文章目录 前言1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook&#xff0c;它是一个交互式的数据科学和计算环境&#xff0c;支持多种编程语言&#xff0c;如…

【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进

访问html页面 如果我们想访问html页面其实就是将本地的html文件以流的方式响应给前端即可&#xff0c;下面我们对HttpResponseServlet这个类做一些改造 package com.tomcatServer.domain;import com.tomcatServer.utils.ScanUtil;import java.io.IOException; import java.io…

全国产EtherCAT运动控制边缘控制器(二):统一的上位机API接口

上节课程我们介绍了全国产EtherCAT运动控制边缘控制器ZMC432H的硬件接口与功能&#xff0c;本节课程我们主要讲解一下正运动API函数封装原理以及自定义API封装例程。 一、功能简介 全国产EtherCAT运动控制边缘控制器ZMC432H是正运动的一款软硬件全国产自主可控&#xff0c;运…