进程和线程(1)

前言:

在计算机中cpu就像一座工厂,这个工厂里面有许多的车间,但是假如工厂的电力有限,一次只能供给一个车间使用,也就是说当一个车间在进行工作的时候,其他车间是不能工作的(单个cpu只能运行一个任务),进程就想是车间,它代表一个cpu所能处理的单个任务。任一时刻,cpu总是运行一个进程,其他进程处于非运行状态。同时在一个车间里面,还有很多工人,他们协同去完成一个任务。线程就好比一个车间里面的工人。一个进程中可以有多个线程。车间的空间是共享的,比如许多房间允许工人进出,这象征了一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

但是因为不同的房间大小不一样,有些地方只能容纳一个人,比如厕所,里面有人其他人就不能进出,只能等前面人出来了,后面的人才能进去,解决办法就是,在门口上加一把锁,前面的人在使用厕所的时候,把门锁上,不允许其他的人来使用,后面的人看到了上锁就自动排队,当使用完了之后,把锁打开,后门的人才能进去这叫“互斥锁”(后面会详细说明),防止多个线程同时读取同一块内存区域。

但是又有些地方能容纳n个人(n>1),比如厨房,这时候的解决办法就是在门口挂n把锁,每进去一个人,就拿钥匙关闭一把锁,出来时,就把钥匙放回原处,当钥匙空了,后面的人就排队等。这种做法叫“信号量”,用来保证多个线程之间不会互相冲突。

进程:

1.进程的含义:

操作系统中的重要概念:一个运行起来的程序。

定义:进程是一个具有一定独立功能的程序在一个数据集合依次动态执行的过程。进程是一个正在执行的程序实例,其中涉及到程序计数器,寄存器和程序变量的参与(在cpu上)。

2.进程的特征:

1.进程是依赖于程序运行而存在的,进程是动态的,而程序是静态的。

2.进程是操作系统进行资源分配和调度的一个独立单位。

3.每个进程都有独立的地址空间,包括代码区,数据区,堆栈区。进程之间的地址空间隔离的,互不影响

3.在操作系统的视角里,如何管理这么多的进程呢?

1.对进程进行描述:

我们可以用结构体,描述出进程的核心属性(进程的状态,进程的优先级,进程的上下文,进程的记账信息)

进程控制块(PCB):非常大的结构体,有很多的属性。

2.将多个进程组织起来:

比如:可以使用链表一样的形式(不一定是链表),把多个PCB串到一起。

1)创建一个新的进程

1.创建一个PCB,初始化PCB中的各个属性。

2.再把PCB加到链表上

2)销毁一个进程:

把这个进程的PCB在链表中找到,并从链表中删除。

3)查看进程列表:

遍历链表,取出链表中的每一个元素,把里面的关键元素显示到屏

单任务和多任务:

在早期的计算机中,是“单任务”操作系统:

同一时刻,只允许一个进程,要想运行下一个进程,就要结束上一个进程。

多任务系统:(在多核处理器前,多任务系统就有了)

即使cpu只有一个核心,也能“同时”运行多个进程。这里有一个新的概念:分时复用。

*分时复用:

分时复用:把一个单位时间,分成很多份

第一份时间运行进程1的指令

第二份时间运行进程2的指令

这里的指令是前面提到的PCB中的内存指针(需要知道进程执行到哪了)

因为cpu运行速度足够快,上述的切换过程,也会很快,会超出我们人类的反应时间,所以我们看起来这些进程是“同时执行”的(但是如果进程也很多,就会增大cpu的消耗资源,就会出现卡顿的情况)

并发执行:

我们把单个cpu核心,按照分时复用,执行多个进程,这样的方式,称为“并发执行”。

人看起来是同时执行的,微观上,其实是一个cpu在串行执行,切换很快。

但是如今cpu中,并不只有一个核心,而是有多个核心,所以不同的核心,在不用分时复用的情况下,也能同时执行多个不同的进程

我们把多个cpu核心,同时执行多个不同进程的这样方式,称为“并行执行”也是“同时执行”。

但在cpu中,执行进程的时候,并发和并行是同时进行的。既有并发执行也有并行执行,统称为“并发

1.PCB中的一些关键要点:

1.Pid(进程id):进程的身份标识符。

2.内存指针:进程就需要知道执行的指令在哪,指令依赖的数据在哪。

3.文件描述符表:进程运行过程中,很多时候,需要和一个硬盘这个硬件设备进行交互,硬盘上的数据就是以文件形式来组织的。(进程每一次打开一个文件,就会把这个文件的信息保存到文件描述符表中)

2.PCB进一步属性:

4.进程的状态

5.进程的优先级

6.进程的上下文

7.进程的记账信息

4.进程的状态:

进程状态有两种:1.就绪状态,2.阻塞状态

1.就绪状态:随叫随到,此时进程随时都能到cpu上进行执行(不区分就绪和执行,都是就绪)

2.阻塞状态:进程当前不适合当cpu去执行

5.进程的优先级:

在很多进程中,它们能够到cpu上面执行的机会并不是均等的。有的进程优先级会更高一些,吃的资源就会更多。

6.进程的上下文:

因为进程在cpu执行的时候是“并发执行”。所以进程在调度的时候,一个进程执行一会,会失去cpu资源,过一段时间该进程还会回到cpu上去执行。

但是有了进程的上下文,就会沿着上次执行到的状态,继续往下执行(非重头开始执行)

进程在cpu中运行的过程中:

cpu上的各种寄存器,就表示了当前进程运行的“中间状态”

保存上下文:将cpu中的这些寄存器中的值保存在内存中(PCB对应的属性中)

恢复上下文:把PCB刚才保存的属性,填回到对应的cpu寄存器中。

7.进程的记账信息:

进程的记账信息(统计功能):统计每个进程都在cpu中运行了多久。

当发现一个进程很长时间没有吃到cpu资源了,就会给这个进程倾斜一些资源。

进程调度:

1.进程调度主要是决定将CPU资源分配给哪个进程使用。当系统中有多个进程处于就绪状态情况下(已经准备好运行,只是等待CPU资源),进程调度器会按照一定算法,来选择一个进程在CPU上运行。

2.每个进程在创建时都会生成对应一个PCB,PCB是进程调度器的基础,通过管理和控制进程的PCB,操作系统能够对进程进程调度,合理利用CPU资源,提高系统性能。

3.后面即将提到的线程调度也是如此。

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

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

相关文章

入门-C编程基础部分:16、 预处理器

飞书文档https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf C 预处理是编译过程中一个单独的步骤,是一个文本替换工具而已。所有的预处理命令都是以井号(#)开头。 指令描述#define定义宏#ifdef如果宏已经定义,则返…

Ubuntu下安装和卸载MySQL

Ubuntu下安装和卸载MySQL 下面的演示系统版本:Ubuntu 24.04 更新系统软件包 在开始安装之前,建议先更新系统的软件包列表,以确保所有依赖项是最新的。 sudo apt update && sudo apt upgrade -y安装MySQL服务器 Ubuntu的官方软件…

【Python爬虫实战篇】--爬取豆瓣电影信息(静态网页)

网站,:豆瓣电影 Top 250 爬取豆瓣前250电影的信息, F12打开网页控制台,查看网页元素, 发现网页数据直接可以查看到,为静态网页数据,较为简单 目录 1.第一步使用urllib库获取网页 2.第二步使…

【Unity知识点详解】Unity中泛型单例的使用,兼容WebGL

今天来讲下Unity中泛型单例的使用,包含普通单例和继承MonoBehaviour的单例。重点是需要两种泛型单例兼容WebGL平台,话不多说直接开始。 泛型单例的设计目标 作为泛型单例,需要实现以下几个目标: 全局唯一,在程序的整个…

Python进程与线程的深度对比

一、核心概念对比 1. 进程(Process) 操作系统级独立单元:每个进程拥有独立的内存空间(堆、栈、代码段) 资源隔离性:崩溃不影响其他进程 多核并行:可充分利用多核CPU资源 2. 线程&#xff0…

Django 入门指南:构建强大的 Web 应用程序

什么是 Django? Django 是一个开源的高层次 Python Web 框架,旨在快速开发安全且可维护的网站。它通过简化常见的 Web 开发任务,帮助开发者专注于开发应用的核心功能。Django 实现了“快速开发”和“尽量少的重复”的理念,提供了…

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之IS31FL3216)

目录 ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之IS31FL3216)简介模块概述功能定义架构位置核心特性 IS31FL3216外设分析IS31FL3216外设概述IS31FL3216外设层次架构图 IS31FL3216外设API和数据结构外设层…

【计算机网络 | 第三篇】常见的网络协议(二)

没有看过我写的关于网络协议的第一篇博客可以看【计算机网络 | 第二篇】常见的通信协议(一)-CSDN博客 TCP的三次握手和四次挥手 TCP三次握手 三次握手是TCP协议建立可靠连接的过程,目的是确保客户端和服务端双方的双向通信能力正常&#x…

HAL库(STM32CubeMX)——高级ADC学习、HRTIM(STM32G474RBT6)

系列文章目录 文章目录 系列文章目录前言存在的问题HRTIMcubemx配置前言 对cubemx的ADC的设置进行补充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选 ADC_Se…

Unity接入安卓SDK(3)厘清Gradle的版本

接入过程中,很多人遇到gradle的各种错误,由于对各种gradle版本的概念不甚了了,模模糊糊一顿操作猛如虎,糊弄的能编译通过就万事大吉,下次再遇到又是一脸懵逼。所以我们还是一起先厘清gradle的版本概念。 1 明晰概念 …

python-67-基于plotly的绘图可视化和智能推荐图表

文章目录 1 各种图表的适用场景1.1 面积图1.2 饼图1.3 散点图1.3.1 散点1.3.2 散点加线1.4 折线图1.5 箱线图1.5.1 不同类别的箱线图1.5.2 一个变量的箱线图1.5.3 多个变量的箱线图1.6 小提琴图1.6.1 不同类别的小提琴图1.6.2 一个变量的小提琴图1.7 直方图1.7.1 直方图1.7.2 分…

Spring AI MCP

MCP是什么 MCP是模型上下文协议(Model Context Protocol)的简称,是一个开源协议,由Anthropic(Claude开发公司)开发,旨在让大型语言模型(LLM)能够以标准化的方式连接到外…

c++_csp-j算法 (3)

弗洛伊德算法(Floyd) Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊…

QT常见输入类控件及其属性

Line Edit QLineEdit用来表示单行输入框,可以输入一段文本,但是不能换行 核心属性: 核心信号 信号 说明 void cursorPositionChanged(int old,int new) 当鼠标移动时发出此型号,old为先前位置,new为新位置 void …

【k8s系列1】一主两从结构的环境准备

环境准备 虚拟机软件准备及安装,这里就不详细展开了,可以看文章:【一、虚拟机vmware安装】 linux环境准备及下载,下载镜像centOS7.9,以前也有写过这个步骤的文章,可以看:【二、安装centOS】 开始进入正题…

【C++类和数据抽象】类的作用域

目录 一、类的作用域基本概念 1.1 什么是类的作用域 1.2 作用域层次体系 1.3 类作用域的特点 1.4 基本访问规则 二、访问控制三剑客 2.1 public:开放接口 2.2 private:数据封装 2.3 protected:继承通道 2.4 跨作用域访问示例 三…

opencv图片颜色识别,颜色的替换

图片颜色识别 1. RGB颜色空间2. 颜色加法2.1使用numpy对图像进行加法2.2使用opencv加法(cv2.add) 3 颜色加权加法(cv2.addWeighted())4. HSV颜色空间5. 制作掩膜4. 与运算(cv2.bitwise_and)5.颜色的替换7 R…

ADC数据不稳定的解决方案

问题如图: 解决方案:上图第一个通道后来接入GND,就稳定了 上图第一个通道后来接入VCC,就稳定了

Spark(18)Yarn-概述

Hadoop三大核心组件:HDFS、MapReduce和YARN 一)Yarn的概念 YARN(Yet Another Resource Negotiator,另一种资源协调者)是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。它的引入为集群在利用率,资源统一管…

Flowith AI,解锁下一代「知识交易市场」

前言 最近几周自媒体号都在疯狂推Manus,看了几篇测评后,突然在某个时间节点,在特工的文章下,发现了很小众的Flowith。 被这段评论给心动到,于是先去注册了下账号。一翻探索过后,发现比我想象中要有趣的多&…