[Java、Android面试]_04_进程、线程、协程

news/2024/4/28 15:01:35

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。
整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可收藏

文章目录

    • 1. 进程和线程
    • 2. 线程和协程

1. 进程和线程

(1)进程
进程是程序的一次执行过程,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有自己的地址空间,至少有5中状态,他们是: 初始,执行,等待,就绪,终止。
(2)线程
线程是CPU调度和分派的基本单位,它可与同属同一个进程的其他线程共享进程所拥有的全部资源。
(3)两者联系
线程是进程的一部分,一个线程只属于一个进程,但一个进程可以有多个线程;
(4)区别
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位;
开销方面:每个进程都有独立的代码和数据空间(程序上下文),它们之间的切换有较大的开销;线程可看作轻量级进程,同一类线程共享代码和数据空间,每个线程都有独立的运行栈和程序技术器,线程之间的切换开销较小。
(5)所处环境
在操作系统中能同时运行多个进程,而在同一个进程中可有多个线程执行(通过CPU调度,每个时间片中只有一个程序执行)
(6)内存分配方面
系统在运行时会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所有的资源均来自其所属的进程),线程组之间可以共享资源。

2. 线程和协程

(1)协程
协程这个其实很难解释,Android官网貌似都是描述成轻量化线程,主要讲讲它和线程的关系吧

(2)kotlin协程为什么比线程更轻量化
1)非阻塞调度: 协程是基于非阻塞的调度模型设计的。当一个协程在等待某些操作完成(例如 I/O 操作或计算)时,它会挂起,而不会占用线程的执行时间。这使得在单个线程上可以并发执行多个协程,而不需要为每个协程创建一个独立的线程。相比之下,线程是阻塞的执行单位,当一个线程被阻塞时,它会一直占用线程资源。

2)更少的内存消耗: 与线程相比,协程通常需要更少的内存。线程在创建时需要分配一定数量的堆栈内存,而协程共享线程的堆栈。这意味着可以在同一个线程上运行多个协程而不会引起堆栈内存的浪费。

3)切换更轻量化
协程的切换通常比线程切换轻量级,因为它不涉及操作系统的介入和保存整个线程上下文。相反,它只需要保存协程的上下文,这通常包括协程的局部变量、栈帧等。协程调度器可以高效地在同一个线程上切换多个协程,因为它们共享相同的线程资源。

线程的切换是操作系统层面的操作。在多线程编程中,操作系统负责线程的管理和调度。当一个线程被阻塞或者它的时间片耗尽时,操作系统会将当前线程的上下文(包括寄存器状态、堆栈指针等)保存起来,然后切换到另一个线程来执行。这个过程通常被称为线程切换。线程切换需要操作系统的介入,因此它的开销相对较大。

(3)kotlin协程和线程的区别
协程能有效解决“回调地狱”的场景,例如,多重登录的场景,先账户验证-获取用户信息-获取用户资料等,如果使用线程,需要判断每次成功与否,然后使用handler去更新UI。
而协程其自切换主线程,可以有效缓解回调地狱场景。

这些都是常问的,我对这块准备的也不充分,路过的大佬可以在评论区补充!

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

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

相关文章

【STL】stack栈容器与list链表容器

目录 1.栈stack 2.list链表容器 1.栈stack 栈具有先进后出的特性,最先进入的数据压在最底下,最后出来 2.list链表容器 list链表容器是一种双向链表,两端都可插入与删除,是双向访问迭代器,与vertor随机访问迭代器有不…

Etcd 介绍与使用(入门篇)

etcd 介绍 etcd 简介 etc (基于 Go 语言实现)在 Linux 系统中是配置文件目录名;etcd 就是配置服务; etcd 诞生于 CoreOS 公司,最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分发等问题。基…

2024/3/14打卡k倍区间(8届蓝桥杯)——前缀和+优化***

题目 给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗? 输入格式 第一行包含两个整数 N 和 K。 以下 N…

适用于系统版本:CentOS 6/7/8的基线安全检测脚本

#!/bin/bash #适用于系统版本:CentOS 6/7/8 echo "----------------检测是否符合密码复杂度要求----------------" #把minlen(密码最小长度)设置为8-32位,把minclass(至少包含小写字母、大写字母、数字、特殊…

PWM驱动直流电机

接线图项目结构 PWM.C #include "stm32f10x.h" // Device headervoid PWM_Init(void){// 开启时钟,这里TIM2是通用寄存器RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// GPIO初始化代码/*开启时钟*/RCC_APB2PeriphClockCmd(R…

下载chromedrive,使用自动化

1、先看一下自己浏览器的版本 2、访问 https://googlechromelabs.github.io/chrome-for-testing/