【进程和线程】操作系统中的并发执行机制

目录

一、什么是进程(Process)?

进程的管理

进程调度(重点)

二、什么是线程(Thread)?

三、进程和线程的区别与联系

进程(Process)

线程(Thread)

总结比较


一、什么是进程(Process)?

进程和线程是操作系统中一个非常核心的话题,也是程序员面试的高频考点。在计算机科学中,进程和线程是操作系统管理和调度任务的基本单位,对于理解计算机程序的执行、资源管理以及多任务处理都非常重要。

一个应用程序,运行起来,在操作系统中就会出现一个对应的进程。进程,就是一个跑起来的应用程序。

 打开任务管理器,这里就会把当前运行的所有进程都列出来(除了自己运行的应用程序,还会有很多系统自带/安装某些应用给你添加的进程

而对于一个操作系统,它管理的系统资源是有限的。操作系统需要管理计算机的各种资源,包括CPU、内存、硬盘空间、网络连接等等。这些资源都是有限的,而操作系统需要合理地分配和管理这些资源,以确保不同程序和用户能够有效地共享和利用这些资源。因此,进程是操作系统进行 资源分配/管理 的基本单位。

进程的管理

在操作系统中,对于进程管理,通常的做法是先描述,再组织。

描述:通常使用PCB(进程控制块)这样的结构体/数据结构来描述进程。结构体中会包含一些进程的核心信息。

组织:通常使用链表这样的结构(简化的说法),来把多个PCB串起来。

PCB 包含了很多关于进程的重要信息,此处只讨论几个比较关心的:

1. PID 进程标识信息:即进程的ID,同一个机器,同一时刻,进程ID一定是不同的。

2. 内存指针/内存管理信息:用于指向记录这个进程的指令和数据。

3. 文件描述符表:记录进程打开的文件和文件描述符。

接下来的几个属性更重要,更抽象,是用来支持进程调度的。

在此之前,先了解一下并行和并发。

在系统中包含了很多的进程,而进程的数量,是远远多于CPU的数量的,这就需要进程调度来负责了。一个核心,同一时刻只能运行一个进程,16个核心同一时刻就能同时运行16个进程。这就是并行执行。

但是,一个核心,不同时刻,可以执行不同的进程,这一刻执行进程1、下一刻执行进程2......为了能够同时处理这么多进程,CPU就会把总的执行时间,切换成若干个小的片段,每个片段执行一个进程,每个片段称为时间片。由于时间片比较短,CPU切换进程的速度非常快,人感知不到,站在人的角度看,这是若干个进程在同时执行(其实不是同时),这个就是并发执行。

并行(Parallelism)

  • 并行是指系统同时执行多个任务或操作,实现多个操作同时进行,可以显著提高系统的运行效率。
  • 在并行计算中,多个处理单元可以同时执行不同的指令或操作,以加快整体计算速度。
  • 并行通常指在多个处理器上同时执行多个任务或操作,以提高整体性能。

并发(Concurrency)

  • 并发是指系统能够同时处理多个任务或操作,但并不一定是同时执行这些任务,可能是通过时间片轮转的方式来实现看似同时处理的效果。
  • 在并发编程中,多个任务可以交替执行,通过合理的调度和资源管理来提高系统的吞吐量和效率。
  • 并发通常指系统能够处理多个任务的能力,可以是在单个处理器上通过多线程实现,也可以是在多个处理器上进行。

并行,本质上就是同时执行。而并发,并不是本质上的同时执行。但由于操作系统内核内部管理好了,编写应用程序的时候无法干预,普通用户也感知不到。

因此,往往把并行和并发统称为"并发",把编写解决并发问题的程序,称为"并发编程"。

进程调度(重点)

注意:这里的属性也属于PCB管理进程的信息。进程调度可以帮助处理并发编程中的一些问题。

1. 进程状态:就绪态、运行态、阻塞态。

我们可以通过一个生活中常见的例子来解释进程状态,比如做菜的过程可以用来说明进程状态。

  1. 就绪态:假设你打算做一顿晚餐,首先收集了所有需要的食材和调料,并且准备好了所有的厨具。此时,你已经准备好开始做菜,处于就绪态,等待开始动手。

  2. 运行态:当你开始处理食材、烹饪菜肴时,你处于运行态,正在实际执行做菜的过程,不断地进行下一步操作,直到菜肴做好为止。

  3. 阻塞态:在烹饪的过程中,有可能会出现一些情况使得你需要停下手头的工作,比如等待水开、等待肉类腌制等。这时候,你处于阻塞态,暂时停止了当前的操作,等待某个条件满足后才能继续往下进行。

  4. 就绪态到运行态:当等待的条件满足后,比如水开了或者肉腌制好了,你又可以继续进行烹饪,从就绪态转变为运行态。

  5. 运行态到阻塞态:在烹饪的过程中,可能会遇到需要等待的情况,比如等待煮面、等待炒菜等,这时候你会从运行态切换到阻塞态。

2. 优先级

假设有一个妹子(漂亮,有才华),有很多人追她。但是她找对象的标准几乎所有人都不能同时满足,于是她决定以每个标准找一个男朋友,然后她就找了三个小哥哥谈恋爱。

A. 有钱的小哥        B. 长的很帅的小哥       C. 非常会舔的小哥

那在约会的时候,妹子给男朋友们安排的时间不一定是公平的!

有的小哥,妹子会花更多的时间,那得到更多时间的小哥对应的等待时间也就更少。即进程的优先级决定了其在就绪队列中被调度的顺序,优先级高的进程会更早地得到处理器时间片,从而更快地执行。

周一周二周三:和A约(有钱,投入时间多,回报更多)

周四周五:和B约(长得帅,提供情绪价值)

周六:和C约(提供的情绪价值不如B)

3. 上下文:确保进程能够正确地切换和执行

妹子在和三个小哥哥聊天时,要记录好每次约会的时间和约定好的事情,即每次聊天都产生了哪些信息,接下来要干嘛,都要记录好,并且下次约会时,能够准确将信息对应到正确的小哥。不然就穿帮了,完蛋了~~

进程在CPU执行过程中,也会产生很多的"中间结果",在进程切换出cpu之前,就需要把这些中间结果(cpu的各种寄存器中的值)保存到pcb的上下文里(程序计数器(PC)、寄存器内容、堆栈指针等等)下次这个进程再次执行的时候,就需要将之前记录的状态恢复回来。

4. 记账信息

延续刚才的优先级,有的小哥分配时间多(资源倾斜),有的小哥(C)分配的时间少。

此时,就需要通过表格,来统计每个小哥分配了多少时间。此时就能发现,C最近分配的时间有点少,于是接下来就得给C多分配点。

为了不失去C,让C还能继续积极的来舔妹子,妹子就需要给C适当加点甜头~~

同样的,操作系统也是要避免某个进程一直吃不到CPU资源,导致进程关闭,就会进行类似的统计,给资源分配少的进程,适当的多分配一些。

相信通过这些形象的例子,对进程调度会有更清楚的认识!

二、什么是线程(Thread)?

线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程(Process)之中,是进程的实际执行单元。一个进程可以包含多个线程,称为主线程,主线程是程序的入口点。这些线程共享相同的内存空间和系统资源,但拥有独立的执行流程。

当前市面的CPU,都是多核心CPU。需要通过一些特定的编程技巧(并发编程),把要完成的任务,拆解成多个部分,并且分别让他们在不同的CPU上运行,否则多核心CPU,多出来的就浪费了。

通过"多进程"编程的模式,其实就可以起到”并发编程“的效果,因为进程可以被调度到不同的CPU上运行,此时,就可以把多个CPU核心都利用起来。

但是,多进程编程虽然可以解决上述问题,但也有一些新的麻烦

  • 假设我们正在开发一个Web服务器应用程序,该程序需要同时处理多个客户端请求。为了实现并发处理,我们可以使用进程和线程两种方式。
  • 使用进程的方式:
  • 我们将每个客户端请求看作一个独立的进程,每个进程都有自己的内存空间和系统资源。当收到一个新的客户端请求时,系统会为该请求创建一个新的进程,并在该进程中执行处理逻辑。这种方式的优点是进程之间相互独立,一个进程的崩溃不会影响其他进程。但是,这种方式的缺点是创建和销毁进程的开销比较大,进程之间的通信和同步也比较复杂

而引入线程,就是为了解决多进程创建和销毁开销太大的问题。

前面说到:一个进程可以包含多个线程,线程,其实就是进程的一部分。同一个线程共享相同的内存空间和系统资源。

因此线程解决多进程创建和销毁开销太大的核心就在于,只有创建第一个线程的时候(也就是创建进程的时候),才去进行资源申请操作。后续在创建线程,都没有申请资源的过程了。

再回头看上面服务器的例子

  • 使用线程的方式:
  • 我们将每个客户端请求看作一个线程,在一个主线程中不断轮询客户端请求,当收到新的请求时,将该请求放入等待队列中,并创建一个新的线程来处理该请求。处理完成后,该线程结束,等待队列中的下一个请求继续被处理。这种方式的优点是线程的创建和销毁开销较小,线程之间的通信和同步也比较简单。

虽然多线程编程解决了多进程创建和销毁开销太大的问题,但它存在一个缺点:一个线程的崩溃可能会导致整个进程的崩溃。进程和线程这两个概念比较抽象,下面用生活中的场景来描述一下。

  • 进程就像是一列火车,每个车厢都是一个独立的运行环境,车厢之间互不干扰,一个车厢的故障不会影响其他车厢。而线程就像是一列火车上的乘客,每个乘客都可以在火车上自由行动,但他们的行动是相互影响的,一个乘客的行为可能会影响其他乘客。
  • 比如,一列火车从北京开往上海,这列火车可以看作是一个进程,每个车厢都可以看作是一个线程,每个车厢都有自己的座位、空调、电视等设施,互不干扰。如果有一个车厢的空调坏了,其他车厢的乘客不会受到影响。而如果有一个乘客在车厢里吸烟,会影响到其他乘客的乘车体验。
  • 再比如,一家餐厅里有多个服务员在同时服务不同的客人,每个服务员可以看作是一个线程,他们都在同一个餐厅里工作,可以相互协作,提高服务效率。如果有一个服务员突然生病了,其他服务员可以顶替他的工作,保证服务质量。而如果餐厅里的客人太多,需要再招一个服务员来服务,这就相当于增加了进程,会增加餐厅的成本和管理难度。

多线程编程的难点:

  • 一个线程出问题,会影响到别的线程。
  • 一个进程出问题,一般不会影响到其他进程。

三、进程和线程的区别与联系

进程(Process)

  1. 定义:进程是程序执行时的一个实例,是操作系统分配资源的基本单位。
  2. 特点
    • 拥有独立的内存空间,进程之间互相隔离。
    • 进程之间通信需要额外的机制,如管道、信号等。
    • 进程拥有独立的地址空间和控制流程。
  3. 优点
    • 进程之间互相独立,一个进程崩溃不会影响其他进程。
    • 进程可以充分利用多核处理器的并行性能。
  4. 缺点
    • 进程切换开销大,资源消耗较高。

线程(Thread)

  1. 定义:线程是进程内的一个独立执行流程,是操作系统调度的最小单位。
  2. 特点
    • 共享进程的资源,如内存空间、文件描述符等。
    • 线程之间通信相对容易,可以直接访问共享数据。
    • 线程切换开销小,适合处理多个任务。
  3. 优点
    • 线程之间共享资源,通信方便,效率高。
    • 线程可以提高程序的并发性和响应速度。
  4. 缺点
    • 多线程编程需要考虑同步和竞态条件等问题,容易引发错误。

总结比较

  • 进程是程序的执行实例,拥有独立的内存空间,进程之间通信复杂,切换开销大;而线程是进程内的执行单元,共享进程资源,通信简单,切换开销小。
  • 进程之间互相独立,一个进程崩溃不会影响其他进程;而线程之间共享资源,一个线程的错误可能导致整个进程崩溃。
  • 进程适合处理独立的任务,线程适合处理并发任务和提高程序性能。在实际应用中,通常会同时使用进程和线程来充分发挥系统资源和提高程序效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS-@Provide装饰器和@Consume装饰器:与后代组件双向同步

Provide和Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,Provide和Consume摆脱参数传递机制的束缚,实现跨层级传递。 其中Provide装饰的变…

随笔】Git -- 常用命令(四)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

OpenHarmony实现一次开发多端部署分布式新闻客户端页面

分布式新闻客户端(ArkTS) 介绍 本篇Codelab基于栅格布局、设备管理和多端协同,实现一次开发,多端部署的分布式新闻客户端页面。主要包含以下功能: 展示新闻列表以及左右滑动切换新闻Tab。点击新闻展示新闻详情页。点…

产生死锁的四大条件

死锁 由于两个或两个以上的线程相互争夺对方的资源,而同时不释放自己的资源,导致所有线程同时被阻塞 产生死锁的四大条件 互斥条件:一个资源在同一时刻只能由一个运算单元(进程、线程或协程)占用(排它性&…

停车场引导与道闸系统工程解析

停车场引导和道闸系统工程是一个综合性的智能车辆管理系统,它结合了现代电子信息技术,旨在实现安全、高效、自动化的停车管理。以下是该系统的主要组成部分及其功能: 1. 车牌识别技术:这是现代停车场管理的核心,能够自…

华清远见作业第五十三天——ARM(第七天)

代码 key_inc.h #ifndef __KEY_INC_H__ #define __KEY_INC_H__ #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h"void key1_it_config();void key2_it_config(…

C++概述

目录 一、C关键字(63个) 二、C几个关键点: 三、C语言缺陷一:命名冲突 四、C新概念:命名空间(namespace) 五、命名空间的嵌套: 六、展开命名空间:(using …

【收藏】什么是API测试?这是我见过的最全的测试指南!

在最近的部署中,当我被问到“什么是API测试?”时,我正与客户一起制定API测试策略。那时我突然意识到,要描述API测试居然是一件如此具有挑战性的事情,即使你如实地描述了它,也往往听起来很无聊和复杂。 好吧…

FloodFill算法——岛屿数量

文章目录 题目解析算法解析代码解析 题目解析 岛屿数量 题目依旧是熟悉的配方,熟悉的味道,还是那个0还是那个1还是那个二维矩阵,这时候BFS和DFS闻着味就来了,我们来看一下这个题目,这个题目也很容易理解如下图有一个…

【No.14】蓝桥杯贪心法|最少硬币问题|活动安排问题(4)|翻硬币|快乐司机|防御力|答疑(C++)

算法优点 容易理解:生活常见 操作简单:在每一步都选局部最优 效率高:复杂度常常是O(1)的 算法缺点 局部最优不一定是全局最优 贪心算法(Greedy algorithm),又称贪婪算法。是一种在每一步选择中都采取在…

教你在PC客户端中集成镭速高速传输插件

企业一直以来对文件传输的速度和安全性都有着严苛的要求,传统的FTP/HTTP传输方式因速度慢、易受网络延迟影响、数据包丢失等问题而不再适应现代企业的需求。镭速高速传输插件应运而生,为企业提供了一个快速、安全的文件传输新选择。本文将详细介绍如何在…

代码随想录算法训练营第day54|392.判断子序列 、 115.不同的子序列

目录 392.判断子序列 115.不同的子序列 392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字…

【WEEK4】 【DAY3】整合SSM框架之功能实现—修改、删除数据【中文版】

2024.3.20 Wednesday 接上文【WEEK4】 【DAY2】整合SSM框架之功能实现—总览、添加数据【中文版】 目录 7.6.修改功能7.6.1.修改BookController.java7.6.2.修改allBook.jsp7.6.3.新建updateBook.jsp7.6.4.修改MyBatis-config.xml7.6.5.运行 7.7.删除功能7.7.1.修改BookContro…

unicloud快速上手,unicloud项目创建以及项目创建注意事项

uniCloud快速上手 本项目地址https://gitee.com/qayrup/unicloud-demo 创建unicloud项目 新建一个uni项目,并选择启用unicloud,选择阿里云或腾讯云 阿里云和支付宝云都支持一个月免费的云,如果只想体验啥的,可以选择这两个, 但是需要注意,支付宝云需要配置跨域,否则很多云函…

ModuleNotFoundError: No module named ‘Crypto‘的解决办法

Crypto模块是什么 在Python中,Crypto模块(有时也被称为pycrypto)是一个强大的加密库,它提供了各种加密算法的实现,包括AES、DES、RSA等。 在Python 3中,由于pycrypto库与新版本的Python3不兼容&#xff0…

DES加密原理及python脚本

一、加密 1、秘钥处理 ​ DES算法会先对64位密钥进行处理生成48位子密钥后再参与到算法的轮操作中,在每一轮的迭代过程中,使用不同的子密钥。其中的处理包括置换选择、循环左移、压缩置换。 1.1 置换选择 DES秘钥有64位,其中每8位有一个校…

[HackMyVM]靶场 XMAS

kali:192.168.56.104 靶机:192.168.56.126 注意在/etc/hosts 添加 192.168.56.126 christmas.hmv # cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 kali2 192.168.223.131 dc-2 192.168.223.134 wordy 192.168.56.105 midn…

【嵌入式开发 Linux 常用命令系列 4.3 -- git add 时单独排除某个目录或者文件】

文章目录 git add 时单独排除某个目录或者文件使用 .gitignore 文件使用命令行排除文件或目录 git add 时单独排除某个目录或者文件 在使用 git add 命令时,如果你想要排除特定的目录或文件,可以使用 .gitignore 文件或使用路径规范来指定不想添加的文件…

智能T0算法交易促进年化收益

T0交易越来越得到普及,越来越多的人在关注T0交易。按照交易主体来看,一种是人工T0交易,另一种是自动化智能T0算法交易。人工T0交易会受制于操作员的计算能力、反应速度以及主观判断等因素的影响,稳定性不如智能自动化T0算法交易。…

搭建自己的博客-拾壹博客

写在前面 唠叨两句 作为一个技术开发人员,没有一个自己的博客,人生注定缺少点什么东西,是不是?最近研究了一些博客搭建,本文是使用开源项目”拾壹博客“进行搭建。 推荐等级 所需技术难度:4星 后续自定义…