多线程 --- 进程和线程的基本知识

进程

前面我们提到了一个概念是,多任务操作系统,即希望该系统能够同时运行多个程序。本质上说,进程,就算用来解决”并发编程“这样的问题的。

在一些特定的情况下,进程的表现,其实并不能很好的解决”并发编程“,比如,在一些需要频繁的创建和销毁进程的场景时,此时再使用多进程编程,就会造成较大的系统开销(主要体现在资源的申请和释放上)

早期编写服务器程序的时候,是使用C语言来进行编写的(基于一种CGI技术,该技术是一种基于多进程的编程模式)。服务器同一时刻就会收到很多请求,针对每个请求,都会创造出一个进程,给这个请求提供一定的服务,返回对应的相应。一旦这个请求处理完之后,这个进程就要被销毁了。如果请求很多,就意味着,服务器需要不停的创建新的进程,也需要不停的销毁旧的进程。这样频繁的进行创建和销毁操作,造成的系统开销是比较大的!!!、

关键原因:资源的申请和释放。前面我们提到,进程是资源(CPU,硬盘,内存,网络带宽...)分配的基本单位。

一个进程,在刚刚启动的时候,首当其冲,会把内存资源。进程需要把依赖的代码和数据,加载到内存资源中。

从系统中分配一个内存的过程是比较繁琐的。一般来说,先需要指定一个大小,系统内部把各种大小的空闲内存,通过一定的数据结构,给组织起来,然后再给进程分配过去。

如果有一个很大的进程,找不到那么大的内存空间怎么办呢?

答:系统报错,无法启动。(在Windows系统上并不明显,在Linux上较为明显)

进程在调度的时候,是”分时复用“的,进程消耗的内存,在内存空间上,也是”分时复用“的。当前没在运行的进程,所消耗的内存空间,可以暂时不必真正放在”内存上“,可以暂时放在硬盘的特定区域(swap 空间),当进程真正执行的时候,再把这些内存数据装载进去。这样就可以有效的保证,正在运行的进程内存比较充裕。(Linux系统上就不是了,swap是可以配置的,如果没有进行配置,并且运行消耗内存比较大的程序,就容易报错无法启动)

线程

如何解决上述问题呢? --> 线程

线程,也可以称之为”轻量级进程“,是在进程的基础上,做了一些改进。对比进程,他保持了独立调度执行支持”并行开发“同时也省去了”分配资源“ ”释放资源“所带来的额外开销

线程是如何实现的呢?

前面我们使用PCB来描述一个进程:

在上图中,是一个进程有一个PCB,但是实际上,一个进程是可以有多个PCB的,即,一个进程可以包含多个线程

操作系统在进行”多任务调度“的时候,其本质其实是在调度PCB(线程在系统中的调度规则,和进程是一样的,线程中的PCB也有状态 优先级 上下文 记账信息)

PCB中有一个属性,是内存指针,多个线程的PCB的内存指针,指向的是同一个内存空间。这就意味着:只是创建第一个线程的时候,需要从系统分配资源,后续的线程,就不必再分配了,直接共用前面的资源即可。(除了内存之外,文件描述操作符也是多个线程共用一份的)

补充:也不是随意两个线程,都可以实现资源共享,只是把能够资源共享的线程,分成组,称为”线程组“。每个进程,都可以包含一个 / 多个线程。

理解进程和线程的关系:

在引出线程前,进程需要扮演两个角色-->1.资源分配的基本单位,调度执行的基本单位

有了线程之后,进程专注于-->资源分配的基本单位,线程负责-->调度执行。

创建进程,资源就分配了,只不过,一个进程中,至少要包含一个线程。

总结:

        1.进程是包含线程的。

        2.每个线程,都是一个独立的执行流,可以执行一些代码,并且单独的参与到CPU的调度中(状态,上下文,优先级,记账信息...每个线程都是自己的独立的一份)

        3.每个进程,也有自己的资源,并且与其中的线程共用内存空间和文件描述符表。

        ==》 进程是资源分配的资本单位,线程的调度执行的基本单位

        4.进程和进程之间,并不会相互影响。

        5.同一个进程的线程之间,可能会相互干扰 --> 引起线程安全问题

        6.线程并不是越多越好,合理适当才重要。(如果线程太多了,那调度开销可能会剧增)

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

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

相关文章

SCI英文论文Accepted后的第一步——Rights and Access

SCI英文论文Accepted后的第一步——Rights and Access 目录 SCI英文论文Accepted后的第一步——Rights and AccessBased on information provided the embargo period/end date is 24 months. 因为选择闭源**Rights and Access(版权与访问权限)**环节是关键第一步,具体操作流…

流程控制语句

python中的流程控制语句有三种,顺序结构、条件结构和循环结构 1)顺序结构: 从上往下,从左到右,依次逐行执行。 #顺序结构python print(start) print(hello world1 ) print(hello world2 ) print(hello world3 ) pri…

2.4 关键路径法

项目进度管理核心工具全解析 🚀 一、关键路径法(CPM)精要 1. 核心概念图解 #mermaid-svg-5MOABZm9lR8A53ss {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5MOABZm9lR8A53ss .e…

Unity 实现一个简易可拓展性的对话系统

本人能力有限,一切实现仅供参考,如有不足还请斧正 起因是我看到学校社团内有人做了对话系统的分享,我想了想之前没写过这种东西,而Fungus插件教程太老了,NodeCanvas插件学习成本又比较高,我就干脆寻找资料 加上自己迭代一下,花了一天时间完成了这个对话系统 目录 1.介绍 2.核…

架构思维:通用系统设计方法论_从复杂度分析到技术实现指南

文章目录 Question订单履约原始架构痛点目标架构架构图说明关键设计点优点 设计方法论复杂来源解决方案评估标准从设计原则出发 技术实现 (以选型Redis为例)Redis消息队列的实现细节高可用设计 总结 Question 我们经常聊如何设计一个比较完善的系统&…

llama源码学习·model.py[7]Transformer类

一、源码展示 class Transformer(nn.Module):def __init__(self, params: ModelArgs):super().__init__()self.params paramsself.vocab_size params.vocab_sizeself.n_layers params.n_layersself.tok_embeddings VocabParallelEmbedding(params.vocab_size, params.dim,…

MD2Card(markdown)

MD2Card 介绍: 1.小红书爆款神器,Markdown笔记秒转高颜值卡片 2.实时预览15种主题,自动拆长文,图片/SVG导出即用 3.零门槛不登录,免费无限生成,专治排版废和设计手残党 网站地址: https://md2…

第二节第一部分:String字符串

一、导包 二、String字符串 三、String注意事项 四、字符串的比较 五、面试例题 六、String案例一 需求分析: 代码: package com.StringTest;import java.util.Scanner;public class StingTest {public static void main(String[] args) {//1.开发一个…

动态规划(01背包恰好装满型详解):和为目标值的最长子序列长度

0-1背包:有n个物品,第i个物品的体积为w[i],价值为v[i],每个物品至多选择一个,求体积和不超过capacity的最大价值和。 对于第i个物品,我们只有两种选择:选,或者不选。如果选&#xf…

Spring漏洞再现

一、CVE-2017-8046 1、开环境 2、访问目录 /customers/1 3、在当前页抓包,并修改数据包 PATCH /customers/1 HTTP/1.1 Host: 150.158.199.164:8080 Accept-Encoding: gzip, deflate Accept: */* User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;…

Ftrans飞驰云联受邀参加“2025汽车零部件CIO年会“并荣获智象奖

2025年3月6日,由栖观汽车、栖观资讯和飞羽商务主办的“2025第二届中国汽车&零部件CIO年会暨智象奖颁奖盛典”于上海盛大召开,Ftrans飞驰云联作为国内领先的企业文件传输与数据交换解决方案提供商,受邀出席了年会,并凭借卓越的…

西门子 CPU 1513-1 PN TCP Server 接收字符串前多了一个问号

TIA V17编程环境中(CPU 1513-1 PN),调用TSEND_C以TCP协议向TCP Server发送字符串:abded1234,TCP Server接收到的字符串多了一个问号:?avded1234. TSEND_C 指令的 DATA DB为非优化string类型数据 截图如下: 字符串前面两个字节不是起始字符,第一个是字节是字符串最大长度…

Matlab2024a免费版下载教程

Matlab是一个高性能的数学计算与仿真软件,广泛应用于科学计算、数据分析、算法开发以及工程绘图等多个领域。它提供了强大的矩阵运算能力、丰富的内置函数库以及灵活的编程环境,使得用户能够高效地解决复杂的数学问题。本文,我将为大家详细介…

SpringCould微服务架构之Docker(1)

项目中微服务比较多的时候,一个一个手动的部署太麻烦了,所以就需要用到Docker。 项目部署中的问题: Docker是一种快速交付应用、运行应用的技术。

软件公司高新技术企业代办:机遇与陷阱并存-优雅草卓伊凡

软件公司高新技术企业代办:机遇与陷阱并存-优雅草卓伊凡 在科技飞速发展的当下,软件公司如雨后春笋般涌现,众多企业渴望通过申请高新技术企业来获得政策支持与发展助力。随之而来的,是高新技术企业代办业务的兴起。然而&#xff…

动捕技术革新虚拟直播:解码虚拟主播的“拟真感“破局之路

在元宇宙技术加速落地的今天,虚拟直播已从早期的卡通形象展示,进化为具备情感交互的沉浸式体验,用户对"高拟真度互动"的需求也逐渐增加,这场行业变革的核心驱动力,离不开动捕技术的持续迭代。 虚拟直播的&q…

python字节码文件.pyc反编译成.py文件

一、前言 在 Python 开发过程中,.pyc 文件(Python 字节码文件)是 Python 解释器运行程序时生成的一种中间文件。它通常用于提高程序的运行效率,避免每次运行时都重新编译源代码。然而,由于各种原因,我们可…

C++友元:跨墙访问的三种姿势

目录 友元 友元之普通函数形式 友元之成员函数形式 友元类 友元的特点 友元 什么叫友元? 一般来说,类的私有成员只能在类的内部访问,类之外是不能访问它们的。但如果将其他类/函数设置为类的友元,那么友元类/函数就可以在前…

Typora安装使用教程 简单易用的Markdown编辑器

Typora markdown 编辑器下,最后一个免费版本 0.11.18,但可能会提示过期无法使用, 建议大家可以使用 0.9.96 Windows 版,下载 Windows X64 版。 Typora简介 Typora 是一款由 Abner Lee 开发的轻量级 Markdown 编辑器,与其他 Mark…

图解AUTOSAR_SWS_WatchdogInterface

AUTOSAR Watchdog Interface (WdgIf) 详解 AUTOSAR经典平台看门狗接口模块技术详解 目录 1. 概述 1.1 WdgIf模块的作用1.2 WdgIf在AUTOSAR中的位置2. 架构设计 2.1 WdgIf架构概览2.2 接口设计2.3 序列设计3. 配置详解 3.1 配置参数3.2 配置结构3.3 配置类型4. 总结 4.1 主要特点…