进程和线程的区别

2023-10-29

前两天面试,被问到进程和线程的区别,由于是第一次面试软件测试岗,被问到这么“专业”的问题,有点惊讶,之后马上在脑海中努力回忆,还好能回答出7788。总算没给自己专业丢脸

1. 进程和线程的关系和区别

  • 进程是一个程序在其自身的地址空间中的一次执行活动,是资源申请、调度和独立运行的单位。线程是进程的一个单一的连续控制流程,一个进程可以拥有多个线程
  • 线程调度的两种方式:抢占式、非抢占式
  • 进程和线程的区别在于,线程没有独立的存储空间而是和所属进程中的其他线程共享一个存储空间
  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
  • 处理机分给线程,即真正在处理机上运行的是线程。
  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

2. 线程的状态

5个状态:新建、就绪、运行、阻塞/睡眠/等待、死亡

线程间的通信一般用wait()方法、notify()方法、和notifyAll()方法。他们都是object类的最终方法,每个类都默认拥有。

3.进程的状态

  • 运行状态:该状态下,进程正在CPU中执行,或者在运行队列(run queue)中等待运行
  • 停止状态:进程由于特定的信号(如SIGINT、SIGSTOP)而挂起就会处于该状态等待恢复信号。
  • 可中断的等待状态:该类进程处于拥塞状态,一旦达到某种条件,就会变为运行状态。同时该状态的进程也会由于接收到信号而被提前唤醒进入到运行状态。
  • 不可中断的等待状态:与“可中断的等待状态”类似,唯一不同的是处于该状态的进程对信号不做响应。不中断的等待状态最典型的例子就是进程等待磁盘I/O操作。
  • 僵尸状态:每个进程在结束后都会处于僵尸状态,等待父进程调用进而释放资源,处于该状态的进程已经结束,但是它的父进程还没有释放其系统资源。

4. 多线程的实现方法

多线程有三种实现方法:

  1. 继承Thread类
  2. 实现Runnable接口
    利用继承Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源没互不干扰。而通过实现Runnable接口可以使多个线程拥有同一资源。
  3. 实现Callable接口。接口中要覆盖的方法是 public call() 注意:此方法可以抛异常,而前两种不能 而且此方法可以有返回值

5. 使用多线程的优缺点

多线程的优点是:提高并发程度、提高效率;缺点是数据同步困难、开发调试难、任意使用多线程会降低效率(过犹不及)
多线程的不利方面:线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
多线程需要协调和管理,所以需要CPU时间跟踪线程;
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug。

6. 线程的 run()和 start()有什么区别?

每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。

start()方法来启动一个线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码; 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行状态, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。

run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。 如果直接调用run(),其实就相当于是调用了一个普通函数而已,直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用start()方法而不是run()方法。

7.什么是单线程和多线程

单线程是先执行完A再执行B。
多线程是A执行一段,B执行一段。然后共同完成。

举个很常见的例子来加深理解:
你正在刷朋友圈,你老妈微信语音给你,你是不是可以边听(假装在听)老妈的唠叨其实是在刷朋友圈根本没听老妈唠叨什么。这就是多线程。
如果你只能听老妈的唠叨啥事都不能干不能退出聊天界面,就是单线程。

测试实习面试时被问及的可不止这一个问题,更多面试题和经历可以看一下我的这篇☞软件测试实习面试都问啥,实习相对来说要求没那么高,最重要就是自信点,准备充分点。然而秋招面试时除了会考察你知识面的广度还会考察你知识的深度,所以问的也会更深入问题也不同,需要的看这篇☞秋招面试常考知识点

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程和线程的区别 的相关文章

  • 解决NestedScrollView嵌套RecyclerView滑动冲突导致无法正常调用加载更多功能

    解决NestedScrollView嵌套RecyclerView滑动冲突导致无法正常调用加载更多功能 在使用NestedScrollView嵌套RecyclerView中 首先会出现的问题就是RecyclerView滑动会出现卡顿 没有惯性
  • DB2 常见错误号 解释

    操作数据库过程中 遇到许多问题 很多都与SQL CODE和SQL State相关 现在把一个完整的SQLCODE和SQLState错误信息和相关解释作以下说明 一来可以自己参考 对DB2错误自行找出原因 声明 这是搜集网上的资料得来的 详细
  • Java获取JSONObject内指定字段key的value值

    项目场景一 获取 id code success data user id 6286f2c0 6399 11ec 800b f7f07b836bd8 exp 1667880458 解决方案 通过JSONObject解决 String id
  • Android studio 卸载

    Android studio 卸载 彻底卸载 Android studio 卸载 彻底卸载 1 卸载Android Studio前 要关闭 或重启电脑 2 控制面板 开始 控制面板 程序和功能 选择Android Studio 3 删除sd
  • JS中localStorage的使用

    localStorage的介绍使用 localStorage理论上来说是永久有效的 即不主动清空的话就不会消失 即使保存的数据超出了浏览器所规定的大小 也不会把旧数据清空而只会报错 localstorage为标准的键值对 Key Value
  • 使用Qgis按属性批量裁剪

    参考 QGIS按属性表批量裁剪 知乎 1 加载栅格图以及矢量 2 根据属性字段将矢量分割成单独的矢量文件 Vetor Data Management Tools Splt vector layer 3 根据单独矢量文件批量裁剪栅格图像 Ra
  • 为什么越多的通用寄存器,可以减少对栈的访问,提高性能

    为什么越多的通用寄存器 可以减少对栈的访问 提高性能 增加通用寄存器的数量可以减少对栈的访问 从而提高性能的原因如下 1 寄存器是位于CPU内部的存储器 访问速度非常快 远快于访问外部内存 相比之下 访问栈上的数据需要通过内存总线与内存进行
  • 微信登录接口对接

    微信开发文档 https open weixin qq com cgi bin showdocument action dir list t resource res list verify 1 id open1419316505 toke
  • 简单的Android端新闻App的实现。

    1 更新记录 2021 11 14 1 更新了数据来源的 api 使用了聚合数据的 新闻 api 2 使用了 TabLayout 代替原来的 textview 组 2021 11 13 1 解决下拉刷新出现崩溃的现象 1 更新了数据来源的
  • 基于FPGA的售货机

    文章目录 一 要求 二 效果 三 设计思路 1 按键 2 数码管 3 LED 4 蜂鸣器 四 程序流程图 五 项目RTL视图 六 代码实现 1 按键消抖 2 售货机 3 LED 4 数码管 5 音乐播放 6 蜂鸣器 7 顶层模块 七 仿真
  • 在uCGUI中添加汉字库

    在STM32上移植了uCGUI3 9 但是uGUI中没有带汉字库 于是网上找了一下资料 好多没有看懂 但后来还是找到了一个网友提供的uCGUI汉字库生成器 直接生成了 c文件 操作很简单 在此和有同样需求的同行分享一下 下面是uCGUI汉字
  • 用MobaXterm连接服务器

    用MobaXterm连接服务器 MobaXterm软件下载地址 MobaXterm连接服务器 MobaXterm连接Ubuntu MobaXterm软件下载地址 百度网盘分享码是 uvoj MobaXterm连接服务器 MobaXterm下

随机推荐

  • vue实现搜索功能

    通过列表里面的月份来进行搜索 需要用到日期选择器和filter方法
  • nginx集群报错“upstream”directive is not allow here 错误

    nginx集群报错 upstream directive is not allow here 错误 搭建了一个服务器 采用的是nginx apache 多个 php mysql 两个 多个apache负载均衡及后端mysql读写分离的服务器
  • 看了这篇文章,别再说你不会制作纹理逼真的法线贴图了

    下图是一只恐龙的低模布线 细心的朋友估计会看到恐龙头部的布线密度是要远远高于身体和四肢的 这种布线的好处就是可以在你需要着重刻画的部位经过细分后生成的模型面数会远远高于那些次要部分 会使你的细节刻画更方便 精度更高 如果想更多了解游戏建模可
  • 小程序路由跳转

    1 在小程序中路由跳转分为两种方式 声明式导航和编程式导航 路由导航就是我们在进行路由跳转的时候选择的方式 2 小程序中的声明式导航 概念 通过小程序提供的组件navigator 进行路由跳转 想要了解更多关于小程序navigator组件用
  • Setup&Hold互卡问题和Useful Skew的影响

    setup与hold timing互卡 conflict 现象的成因主要有哪些 如何解决 成因上来说 setup hold互卡主要有几种因素的影响 a 不同PVT条件下的cell delay variation较大 b 某些cell的lib
  • 小程序数据请求的方式和注意事项

    1 小程序中网络数据请求的限制 出于安全性方面的考虑 小程序官方对数据接口的请求做出了如下两个限制 只能请求HTTPS类型的接口 必须将接口的域名添加到信任列表中 2 配置request合法域名 假设要在自己的微信小程序中 希望请求某一域名
  • 怎么在网页或其他应用中打开你的app

    转载自 有改动 https segmentfault com a 1190000005967865 前言 对于一个完备的互联网产品而言需要有app端与web端两个不同前端 对于产品而言很多都希望能够将wap页上的用户引向native app
  • AndroidX设计架构MVVM之ViewModel生命周期分析

    本文基于ViewModel 2 1 0 先来一张ViewModel生命周期图 原文 AndroidX设计架构MVVM之ViewModel创建流程原理分析 AndroidX设计架构MVVM之ViewModel生命周期分析 AndroidX设计
  • ISCC SSTI

    先找参数吧 通过信息搜集 参数是xiaodouni 就是小豆泥的英文 这个是暹罗猫的一个名字吧 然后直接放两个payload的吧 看不懂的可以看一下我以前的文章CTFshow ssti里面讲了思路 这里就不再解释了 set pp dict
  • QT下配置Boost库

    QT下配置Boost库 前言 当使用别人的QT工程 复制到自己机器上 发现报如下错误 从QtCreator报错来看是找不到Boost相关文件和库 问题解决 首先去官网下载Boost库 编译boost库 下载boost源码 大家可以在boos
  • Ubuntu 18.04.6 单系统深度学习环境搭建(pytorch)

    1 系统安装 网上有很多这类教程 U盘制作 系统安装 2 显卡驱动安装 其他安装方法 ubuntu18 04安装显卡驱动 四种方式 我的安装方法 首先换清华源 选择一个附加驱动 然后应用更改 如果安装后重启黑屏 再尝试另外一个驱动 我是四个
  • R语言——方差分析

    一 方差分析的基本概念 方差分析是在20世纪20年代发展起来的一种统计方法 它是由英国统计学家费希尔在进行实验设计时为解释实验数据而首先引入的 从形式上看 方差分析是比较多个总体的均值是否相等 但是其本质上是研究变量之间的相互关系 方差分析
  • vue中使用echarts-liquidfill实现水球图

    先看效果图 echarts liquidfill查看官方文档 安装 npm install echarts save npm install echarts liquidfill save vue main js 中注册 import ec
  • postgresql从入门到菜鸟(十)initdb流程分析-环境设定

    分析完了参数解析 接下来分析环境设置 首先设定的是认证方式 static void check authmethod unspecified const char authmethod if authmethod NULL strlen a
  • 第三章网络传输介质

    一 信息 1 信号灯组成和类型 1 信号的组成 信息 定义数据类型 数据 描述事物的度量值 信号 信号时信息传输媒介 2 信息类型 数字信号 模拟信号 2 数字信号和模拟信号特点 1 数字信息 计算机通信使用 传输距离远 抗干扰能力强 通过
  • 如何定位CodeMirror插件

    CodeMirror插件不是普通的input textarea输入 无法使用selenium的input方法输入值 需要触发插件的事件才能真正实现值的更改 如何查看改插件有哪些事件 调用js触发setValue事件即可 document e
  • HDFS--读写测试

    读写测试 1 写测试 2 读测试 3 删除测试文件 1 写测试 cd export servers hadoop 2 6 0 cdh5 14 0 yarn jar share hadoop mapreduce hadoop mapreduc
  • 开发板BMP图片显示(6818开发板)

    BMP图片的前54个字节保存图片信息 不保存像素点 确认图片是不是BMP类型 读取整个图片大 pragma pack 1 typedef struct tagBITMAPFILEHEADER unsigned short bfType 2B
  • HR筛选简历内幕全解析

    我们已经把你的简历放进了公司的 人才库 在准备简历素材 挑选简历格式 着手创作简历的过程中 有一句话 可以用来作为戒条 Your resume is scanned not r ead YRIS 为什么让求职者以此为鉴呢 因为招聘者就是这样
  • 进程和线程的区别

    进程和线程的区别 1 进程和线程的关系和区别 2 线程的状态 3 进程的状态 4 多线程的实现方法 5 使用多线程的优缺点 6 线程的 run 和 start 有什么区别 7 什么是单线程和多线程 前两天面试 被问到进程和线程的区别 由于是