线程与进程

news2025/1/25 4:25:36

目录

1.为什么使用线程?

2.什么是线程?

3.进程和线程的工作原理

3.1 进程

3.2 线程

4.线程安全问题

5.总结:线程和进程的区别(面试题)


1.为什么使用线程?

线程与进程都是用来解决并发编程问题的,而进程自己就可以独立解决并发编程的问题,那么为什么还要引入线程的概念呢?

因为进程太重了

创建一个进程,开销较大;销毁一个进程,开销较大;调度一个进程,开销仍较大。

这样的情况就导致了进程的消耗资源多并且运行速度慢,这显然不是我们的预期。

而线程相对于进程来说更加轻量,更适合并发编程。

2.什么是线程?

了解线程首先要先了解进程,详见《进程的调度》博客,如下。

http://t.csdn.cn/kpd8T

在《进程的调度》中描述了进程的概念,一个进程就是一个PCB结构体,但是这样的说法仅限于一个进程中只有一个线程的情况,而一个进程中可以包含多个线程,一个线程对应了一个PCB,这个PCB中的状态、上下文、优先级、记账信息都是各自管理分配的,而同一个进程里面的线程,它们的pid、内存指针和文件描述符表都是相同的,这些属性代表了哪些线程同归属于哪一个进程。

如果一个进程中有了多个线程,那么每个线程都是在CPU上独立被调用的,也就是:线程是操作系统调度执行的基本单位。

3.进程和线程的工作原理

3.1 进程

比如有一家工厂,这家工厂里面有一个生产车间,一个生产车间对应了一条生产线路,如果这个工厂想要提高自己的收入,那么就需要建立更多的生产车间也就是并发生产,那么如果按照“多进程”区并发,那么则如下图:

也就是建造多个工厂,每个工厂还是之前的配置,来达到提高生产的目的,但是这样的方法弊端也很明显,就是太浪费空间。

3.2 线程

 相比于进程的方法,线程只是在同一个工厂里面增加了一个生产车间,不会过多的造成资源的浪费,相比于进程更加轻量。

但是相比于线程,进程并不是一无是处,因为线程相对于进程来说是不安全的。

4.线程安全问题

问题一:线程数量过多

上面说到,多线程可以减少很多空间的浪费,提高运行速度,那么如果无限制的在一个进程里面去添加线程的数量,会不会让运行速度更快呢?

如下图:

 可以看到很多人正在对桌子上的100个零件进行拼接,虽然有10个人,但是桌子只能容纳8个人去拼接零件,剩下的两个人如果想去拼接就只能等待别人拼接好了或者将其他人挤到一边,才能开始工作,这样的效率显然不如只有8个人要来得快。

上述对应的情况:一个CPU上都多个内核,一块内核一次可以执行一个线程,如果在一个进程中线程的数量超出了内核的数量,那么效率并不会因此加快,反而会将开销浪费在线程调度上。

问题二:线程不安全

 如果两个人同时看上了同一个零件,那么这两个人就可能会因为这一块零件打起来。

比如:两个线程同时访问同一个变量,就可能出现线程不安全。

但是多进程就不会出现这种情况,因为各自的都已经分配好了。

问题三:问题二延伸

 还是问题二的情况,如果有一个人已经将这个零件拿走了,这时另一个人就不开心, 把桌子给砸了。

比如:一个线程抛出了异常,如果没有处理好,那么整个进程可能就崩溃了。

5.总结:线程和进程的区别(面试题)

(1)进程包含线程,一个进程至少包含一个线程,一个进程也可以包含多个线程。

(2)进程在资源分配和回收上的消耗资源多、速度慢;线程相比于进程更加轻量。

创建线程比创建进程开销更小;销毁线程比销毁进程开销更小;调度线程比调度进程开销更小。

(3)进程是系统分配资源的基本单位,线程是系统调度的基本单位。

(4)在同一个进程的线程之间,共享的是同一块资源,而进程与进程之间的资源是相互隔离开的。

(5)进程相对于线程更加安全。

线程与线程之间很容易出现线程安全问题。比如:当多个线程争抢同一个变量时,就可能出现线程安全问题,而这种情况又是容易出现的。

而线程之间的资源是天然被隔离开的,不容易出现上述的情况,只有在进行进程间通信的时候,多个进程访问同一块资源时,才可能会出现问题。

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

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

相关文章

推荐 5 个不错的 React Native UI 库

最近在做一个 React Native 的项目,调研了下 UI 库,下面列举 5 个: React Native Elements React Native Element 是相当闻名的 UI 库,它遵循 Material 设计规范,同时你还可以精细地控制每一个组件。 TL;DR 22.2k G…

朴素贝叶斯——垃圾邮件过滤

文章目录利用朴素贝叶斯进行文档分类1、获取数据集2、切分文本3、构建词表和分类4、构建分类器5、测试算法利用朴素贝叶斯进行垃圾邮件过滤1、导入数据集2、垃圾邮件预测总结利用朴素贝叶斯进行文档分类 1、获取数据集 下载数据集,获取到一些邮件文档。其中ham文件…

Intersoft WebUI Studio for asp.net/asp.mvc

企业 Web 开发的终极工具集。WebUI 建立在坚实的框架之上,为 ASP.NET 提供创新和先进的 40 多个优质 UI 组件,让您轻松及时地构建强大的业务 Web 应用程序。 不仅仅是全面的 UI 工具集。 在提供业界最佳网络体验的愿景的支持下,WebUI 提供了前…

AQS源码解析 8.共享模式_Semaphore信号量

AQS源码解析—共享模式_Semaphore信号量 简介 synchronized 可以起到锁的作用,但某个时间段内,只能有一个线程允许执行。 Semaphore(信号量)用来限制能同时访问共享资源的线程上限,非重入锁。 Semaphore 是什么&am…

377. 组合总和 Ⅳ【完全背包】求排列数:外层for背包,内层for物品;求组合数:外层for物品,内层for背包;

377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1: 输入:nums [1,2,3], target 4 输出&#x…

如何利用快解析远程访问家庭智能网关

随着家庭宽带用户的暴增,涌现出了许多连接家居设备和控制中心的产品,如家庭智能网关。家庭智能网关是家居智能化的心脏,通过它实现系统的信息采集、信息输入、信息输出、集中控制、远程控制、联动控制等功能。 ​ 智能家庭网关具备智能家居控…

springcloud24:分布式事务 Seata处理分布式事务总结篇

分布式事务: 分布式事务的问题: 1:1 一个servlet 对应一个 数据库1:N 一个servlet对应多个数据库N:N 多个servlet对应多个数据库 全局事务一致性问题(全局数据一致性的保证) Seata是分布式事务的解决方案 分…

Python标准库之os

1. OS标准库简介 顾名思义,OS表示Operating System,即操作系统。OS标准库是一个操作系统接口模块,提供一些方便使用操作系统相关功能的函数,具体安装位置可通过导入os模块查看os.__file__属性得到。当需要在Python代码中调用OS相…

WPF-页面-DataGrid数据处理-多线程-Winform嵌入

页面 if(NavigationService.CanGoBack true) NavigationService.GoBack(); NavigationService.Navigate(new Uri("Page.xaml",UriKind.Relative));打印对话框PrintDialog如果要一下启动两个窗口,可以重写App.cs中的OnStartUP方法设置窗口所属关系&#…

【我的渲染技术进阶之旅】你知道数字图像处理的标准图上的女孩子是谁吗?背后的故事你了解吗?为啥这张名为Lenna的图会成为数字图像处理的标准图呢?

文章目录一、先来看一张神图:Lenna图二、图片中的妹子是谁?三、为何要使用Lenna图像?四、谁制作了Lenna图像?五、人红是非多六、福利时间七、岁月神偷文末有福利 一、先来看一张神图:Lenna图 想必所有搞过图像处理的人…

LQ0265 汉诺塔【水题】

题目来源:蓝桥杯2012初赛 Java A组C题 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。 大梵天创造世界的时候做了三…

Map和Set常见操作汇总

作者:~小明学编程 文章专栏:Java数据结构 格言:目之所及皆为回忆,心之所想皆为过往 目录 Map 介绍 什么是Map? Map.Entry,> 常用方法 代码 Map中的注意点总结 Set 常见方法汇总 Set中的注意点总结 Map …

Ngxin--源码分析 缓冲区链表

1.基本数据结构 在处理 TCP/HTTP 请求时会经常创建多个缓冲区来存放数据, Nginx缓冲区块简单地组织一个单向链表struct ngx_chain_s {ngx_buf_t *buf;ngx_chain_t *next; };buf: 缓冲区指针 next 下一个链表节点 注意: ngx_chain_t是…

自定义数据类型:结构体、枚举、联合

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C/C】 目录结构体结构体类型的声明结构的自引用结构体变量的定义和初始化结构体内存对齐练习1练习2(结构体嵌套问题&#x…

JSP表达式(EL)

一、介绍: EL(Expression Language)可用来代替JSP中的各类脚本,提高编程的灵活度,简化代码的编写。 二、EL的限制: 不能声明变量,需要使用JSTL或者JavaBean Action设置变量。 三、EL的标准格…

使用D435i+Avia跑Fast-LIVO

前言 最近Fast-LIVO开源了,之前看它的论文的时候发现效果很优秀,于是用实验室现有的设备尝试一下。这里主要记录一下使用不带外触发功能的D435i Avia跑Fast-LIVO的过程,为了适配代码,主要修改了雷达的驱动、相机的launch文件、以…

【Flink】各种窗口的使用(处理时间窗口、事件时间窗口、窗口聚合窗口)

文章目录一 Flink 中的 Window1 Window(1)Window概述(2) Window类型a 滚动窗口(Tumbling Windows)b 滑动窗口(Sliding Windows)c 会话窗口(Session Windows)2…

ATJ2157内存篇【炬芯音频芯片】---sct语法

ATJ2157 sct语法公共知识篇BNF 简介Sct脚本Sct的作用Sct的语法规则1. 加载域描述(Loadd region descriptions)2. 执行域描述3. 输入节的描述ATJ2157平台使用的sctRO的等效写法ScatterAssert()函数LoadLength()函数LoadBase()函数ImageLimit()函数ATJ2157平台什么数据编译出来是…

CentOS 7.6上安装SqlServer2017

一、 安装 SQL Server 1、 安装 SQL Server 所需的python2 sudo alternatives --config python # If not configured, install python2 and openssl10 using the following commands: sudo yum install python2 sudo yum install compat-openssl10 # Configure python2 a…

Python自动化小技巧12——根据论文题目自动导出参考文献格式

案例背景 在写论文的时候,弄参考文献格式也很麻烦,不可能手打人名题目期刊名称年月日卷号页码这些,我们一般都是使用系统自动导出的格式复制粘贴就行。中国知网可以直接导出论文的格式,但是知网基本只有中文的论文,英…