iOS ------ 多线程基础

一,进程和线程

1,进程

定义:

  • 进程是指在系统中正在运行的一个应用程序
  • 每个进程之间是独立的,每个进程均运行在其专有的且受保护的内存
  • 进程是系统进行资源分配和调度的一个独立单位

补充:iOS系统是相对封闭的系统,App在各自的沙盒中运行,每个APP都只能读取系统为该应用程序创建的文件夹AppData下的内容,不能随意跨域自己的沙盒去访问别的App沙盒中的内容。也就是说iOS是单线程的,一个App就是一个进程。

特点:

  • 独立性:是系统独立存在的实体,拥有自己独立的资源,有自己私有的地址空间。在没有经过进程本身的允许的情况下,一个用户的进程不可以直接访问其他进程的地址空间。
  • 动态性:程序是一个静态的指令集合,而进程是一个正在系统中活动的指令集合,进程中加入了时间的概念。进程具有自己的生命周期和不同的状态,这些都是程序不具备的
  • 并发性:多线程可以在单个处理器上并发执行,多个进程之间不会相互影响

2,线程

定义:

  • 线程是进程的基本执行单位,一个进程的所有任务都在线程中执行
  • 进程要想执行任务,至少要有一个线程
  • 程序启动会默认开启一条线程,这条线程被称为主线程和UI线程

3,进程和线程的关系

  • 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
  • 资源拥有:同一进程内的线程共享本进程的资源如内存,I/O,CPU等,但是进程之间的资源是独立的。
  • 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程
  • 执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由程序提供多个线程执行控制。
  • 线程是处理器调度的基本单位,但是进程不是

4,任务

  • 通俗的说任务就是一件事情或一段代码,线程其实就是去执行这个时期

5,队列

  • 队列是先进先出的线性表。装载线程任务的队形结构。队列只允许新数据在后端进行添加。
    在这里插入图片描述

队列的类型

  • 并发队列:线程执行可以同时一起执行,不需要上一个执行完,才能执行下一个的
  • 串行队列:线程执行只能依次逐一先后有序的执行,等待上一个执行完,再执行下一个
  • 主队列:绑定主线程,所有任务都在主线程执行,有经过特殊处理的串行队列
  • 全局队列:系统提供的并发队列

6,同步和异步

  • 同步sync:只能在当前线程按先后顺序依次执行任务,不具备开启新线程的能力
  • 异步async:在新的线程执行任务,具备开启新线程的能力
    在这里插入图片描述

二,多进程和多线程

  • 在早期单核CPU

如何理解多进程?在早期单核CPU时代,由于CPU执行代码都是顺序执行的,那么单核CPU如何执行多任务?
比如说一边用浏览器上网,一边听音乐,一边写代码

这里用到时间片轮换调度:简单就是把一个处理器划分为若干个段的时间片,每个进程会被操作系统分配一个时间片(即每次被CPU选中来执行当前进程所用的时间),每个时间片依次轮流地执行处理各个应用程序,时间一到,无论进程是否运行结束,操作系统就会强制将CPU这个资源转到另一个进程去执行,由于每个时间片很短,对于每个程序,就好像为自己单独服务,从而达到多个程序同时进行的效果。

如何理解多线程?
在一个程序中,以QQ聊天为例,当QQ这个进程被CPU分配时间处理时,这时我们需要处理聊天还是处理界面的刷新。如果处理了聊天,界面就不会刷新,看起来界面就卡死了。同样上上面一样,每次 CPU 执行100ms,其中30ms用于处理聊天,40ms用于处理传文件,剩余的30ms用于处理界面刷新,这样快速切换处理。就可以达到多线程的效果。

  • 在当前的多核CPU

多核CPU拥有多个物理核心,每个物理核心可以同时执行一个进程(线程)或多个进程(线程)。这意味着在多核CPU下,多个进程(线程)可以正真并行执行,每个线程在各自的核心上独立运行。

在多核CPU的情况下,也可能会出现一个CPU核心处理多个进程(线程)的情况。

每个线程在自己的核心上独立执行,互不干扰,可以充分利用CPU的并行处理能力。这种并行执行可以提高系统的响应性和吞吐量。

区别:
在多核CPU下,多线程的并发编程相对复杂,需要考虑线程间的同步、互斥和数据共享等问题。由于多个线程可以同时访问和修改共享数据,可能会出现竞态条件和数据不一致的问题,需要使用同步机制(如锁、信号量等)来实现线程安全。
而在单核CPU下,由于只有一个线程在执行,不存在多个线程同时访问共享数据的问题,因此并发编程的复杂性相对较低。

三,多线程的生命周期

在这里插入图片描述

  • 新建:实例化线程对象
  • 就绪:向线程对象发送start消息,线程对象被加入可调度线程池等待CPU调度。
  • 运行:CPU负责调度可调度线程池中线程的执行,线程执行完成之前,状态可能会在就绪和运行之间来回切换。就绪和执行之间的状态变化由CPU负责。
  • 阻塞:当满足某个预定条件时,可以使用休眠或锁,阻塞线程执行,所谓阻塞状态是正在运行的线程没有运行结束,暂时让出CPU,这时其他处于就绪状态的线程就可以获得CPU时间,进入运行状态。
  • 死亡:正常死亡,线程执行完毕。非正常死亡,当满足某个条件后,在线程内部终止执行/在主线程终止线程对象

线程池
线程池是一种“池化”的线程使用模式。线程的创建,销毁,调度都有一定的开销,通过预先创建一定数量的线程,让这些线程处于就绪状态来提高系统响应速度,在线程使用完成后归还到线程池达到重复利用的目的,从而降低系统资源的消耗,提高响应速度,增加了线程的可管理性。

四,多线程的四种使用方法

在这里插入图片描述

我们一般使用比较多的是 GCD,因为开发者只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码,但这也是 GCD 的不够灵活的地方,我们无法监控线程的各个状态,这也是很多大框架中使用 NSOperation 的原因,NSOperation 相比 GCD 更加灵活,开发者可以通过 KVO 监测 Operation 的状态,自定义 NSOperation 等。

五,多线程的意义

  • 某个操作可能会陷入长时间等待,等待的线程会进入睡眠状态,无法继续执行。多线程执行可以有效利用等待时间进行线程切换。如等待网络响应。
  • 某个操作可能会消耗大量的时间,如果只有一个线程,程序和用户之间的交互会被中断。多线程可以让一个线程负责交互,另一个线程负责计算。
  • 多CPU或多核处理器,本身具备同时执行多个线程的能力,因此单线程程序无法全面发挥计算机的全部计算能力。
  • 多线程可以提高程序的效率。多线程同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。

多线程的不足:

  • 开启线程需要占用一定的内存空间(默认情况下,每条线程占512kb);如果开启大量的线程,会占用大量的内存空间,降低程序的性能。
  • 线程越多,CPU在调用线程上的开销就越大(因为要在线程之间切换);
  • 多线程编程的程序设计会更加复杂(如线程间的通信、多线程的数据共享等)。

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

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

相关文章

SQL中的LAG函数与LEAD函数用法

LAG:函数用于获取结果集中当前行之前的某一行的值 LAG (scalar_expression [,offset] [,default]) OVER ([partition_by_clause ] order_by_clause ) -----汉字解释 LAG (字段 [,偏移量默认为1] [,如果没有值时候默认值]) OVER ( [ partition_by 字段 ] order_by 字…

服务网格 SolarMesh v1.13 重磅发布

SolarMesh是行云创新推出的流量治理平台,它基于Istio,为部署在K8s集群上的应用提供全面的流量治理能力。 在之前的版本中,SolarMesh提供的能力有:流量视图,流量控制策略批量配置,API级别的流量数据采集和展…

【上海大学计算机组成原理实验报告】五、机器语言程序实验

一、实验目的 理解计算机执行程序的实际过程。 学习编制机器语言简单程序的方法。 二、实验原理 根据实验指导书的相关内容,指令的形式化表示是指采用一种规范化的符号系统,以更清晰、精确地描述和表示指令的逻辑功能和操作步骤。 汇编是一种编程语言…

MM模块学习二 (供应商,物料后台相关配置)

公司代码配置 新建条目(只是建了一个名字出来,后面很多表都是没有得) 接下来定义公司代码: 公司代码复制完成(后续修改交给财务顾问去做) 复制工厂: 复制工厂完成: 修改复制过去的工…

Linux服务器lvm磁盘管理fdisk和df磁盘大小不同修改

服务器端由于硬盘是通过VCenter原来100G磁盘复制的虚拟机,复制完成后,原来100G的磁盘通过选择 磁盘重新复制出150G的磁盘,开机后发现还是原来的100G的磁盘,通过fdisk -l 查看有个sdb是150G, 但是已经划转的lvm盘只有100G, 通过df查看也是原来的100G: pvs查看pv里也是10…

用c++实现快速排序、最大子段和问题

6.2.2 快速排序 【问题】快速排序(quick sort)的分治策略如下(图6-5)。 (1)划分:(选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列,轴值的位置在划分的过程中确定,并且左侧子序列的所有记录…

26 分钟惊讶世界,GPT-4o 引领未来人机交互

前言 原文链接:OpenAI最新模型——GPT-4o,实时语音视频交互,未来人机交互近在眼前 - Kaiho小站 北京时间 5 月 14 日凌晨,OpenAI 发布新一代模型——GPT-4o,仅在 ChatGPT 面世 17 个月后,OpenAI 再次通过…

qt的udp通讯

QString mylocalip; const QList interfaces QNetworkInterface::allInterfaces(); foreach(QNetworkInterface ip, interfaces) { if (ip.humanReadableName() QStringLiteral(“以太网”)) { //if (ip.type() QNetworkInterface::Ethernet) { const QList iplist ip.addr…

【EasyX】快速入门——静态图形篇

1.基本说明 EasyX 是针对 C 的图形库,可以帮助 C/C 初学者快速上手图形和游戏编程。 比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练…

Go 注释生成 api文档

在 Go 语言中,通常会使用 godoc 工具来从注释中生成 API 文档。godoc 是 Go 官方提供的文档生成工具,它可以解析 Go 源代码中的注释,并生成在线的、可交互的文档。 为了使用 godoc 生成 API 文档,你需要遵循一些特定的注释格式。…

使用VMware或VirtualBox安装eNSP Pro并使用CRT连接设备

文章目录 使用Oracle Virtual Box安装eNSP Pro创建虚拟机配置网卡配置带外管理网络 使用VMware Workstation安装eNSP Pro转换文件格式及虚拟磁盘模式配置网卡创建虚拟机配置使用CRT连接管理设备 前一段时间是开放了eNSP Pro的账号权限,但是在写博客时,权…

2024OD机试卷-字符串分割(二) (java\python\c++)

题目:字符串分割(二) 题目描述 给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。 对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有 大写字母转换为小…

27.哀家要长脑子了!

目录 1.316. 去除重复字母 - 力扣(LeetCode) 2. 1209. 删除字符串中的所有相邻重复项 II - 力扣(LeetCode 哎哟 烦死了 刚刚不小心退出又没保存 又要写一遍 烦死了 最近刷题不得劲啊 感觉这脑子没长一点 1.316. 去除重复字母 - 力扣&am…

(实测验证)【移远EC800M-CN 】GNSS功能打开和关闭关闭步骤验证

引言 本文章使用自研“超小体积TTL转4GGPS集成模块”进行实测验证; 一、打开GNSS功能 步骤一、通过 ATQGPSCFG 配置 GNSS 参数 (1)该命令用于查询和配置 GNSS 不同的设置,包括 NMEA 语句输出端口、NMEA 语句的输出类型等。 1.1…

NSSCTF | [SWPUCTF 2021 新生赛]easyupload2.0

先传一个普通的一句话木马试一试 GIF89a <?php eval($_POST[shell]);?> 可以看到回显&#xff0c;不允许上传php文件。 使用Burpsuite抓包只修改ContentType后发现也不能绕过&#xff0c;说明服务器使用了黑名单后缀限制&#xff0c;那么我们可以使用其他的后缀代替ph…

RPA的实施过程通常包括哪些步骤?

RPA&#xff08;Robotic Process Automation&#xff09;的实施过程通常涉及一系列详细的步骤&#xff0c;旨在确保自动化项目的成功部署和运行。以下是RPA实施过程的一般步骤&#xff1a; ### 1. 需求分析与目标设定 实施RPA的第一步是进行需求分析&#xff0c;明确企业希望通…

电路板维修【四】

【开关电源输出电压偏低不稳&#xff0c;用示波器立马锁定故障范围】&#xff1a;https://www.bilibili.com/video/BV1pf421D73K?vd_source3cc3c07b09206097d0d8b0aefdf07958 可以用示波器查看MOS的输出波形来查看其是否损坏&#xff1a; 电源芯片的供电电压来回跳变&#xf…

嵌入式C语言与人工智能融合开发高级教程:实现手势识别系统

目录 文章主题环境准备人工智能与嵌入式系统基础代码示例&#xff1a;实现手势识别系统应用场景&#xff1a;智能家居与穿戴设备问题解决方案与优化 1. 文章主题 文章主题 本教程将详细介绍如何在STM32嵌入式系统中使用C语言实现手势识别系统&#xff0c;特别是如何在资源受…

基于卷积神经网络CNN,使用二维卷积Conv2D实现MNIST数字识别的四种方法

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

ROS 2边学边练(48)-- 将URDF与robot_state_publisher一起使用

前言 本篇将完成一个行走的机器人&#xff0c;并以tf2消息的方式实时发布机器人状态&#xff0c;以便我们在Rviz中同步查看。 首先&#xff0c;我们创建描述机器人装配的URDF模型。接下来&#xff0c;我们编写一个节点&#xff0c;用于模拟运动并发布JointState和位姿变换。然后…