前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS - 多线程(一):初识

iOS - 多线程(一):初识

作者头像
师大小海腾
发布2020-04-16 11:47:47
6500
发布2020-04-16 11:47:47
举报
文章被收录于专栏:iOS 技术分享iOS 技术分享
  • 1. 线程和进程  1.1 线程的定义  1.2 进程的定义  1.3 线程和进程的关系和区别  1.4 为什么要在主线程更新UI?
  • 2. 多线程  2.1 多线程的意义  2.2 多线程的执行原理  2.3 iOS中的多线程技术方案
  • 3. 线程与RunLoop的关系
  • 相关链接

1.线程和进程

1.1 线程的定义

  • 线程是资源分配的最小单位,也是处理器调度的基本单位;
  • 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行;
  • 进程要想执行任务,必须得有线程,进程至少要有一条线程;
  • 程序启动会默认开启一条线程,这条线程被称为主线程或者 UI 线程。

1.2 进程的定义

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

1.3 线程与进程的区别

  • 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间;
  • 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程里的资源,如内存、I/O、CPU等,但是进程之间的资源是独立的;
  • 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮;
  • 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程;
  • 执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制;
  • 线程是处理器调度的基本单位,但是进程不是;
  • 多进程,允许多个任务同时运行;多线程,允许单个任务分为不同的部分运行。

1.4 为什么要在主线程更新UI?

安全+效率:因为 UIKit 框架不是线程安全的框架,当在多个线程进行 UI 操作,有可能出现资源抢夺,导致问题。

2.多线程

2.1 多线程的意义

优点:
  • 能适当提高程序的执行效率;
  • 能适当提高资源的利用率(CPU,内存);
  • 线程上的任务执行完成后,线程会自动销毁;
  • 可以解决程序阻塞的问题。
缺点:
  • 开启线程需要占用一定的内存空间(默认情况下,每一个线程都占 512 KB);
  • 如果开启大量的线程,会占用大量的内存空间,降低程序的性能;
  • 线程越多,CPU 在调用线程上的开销就越大;
  • 程序设计更加复杂,比如线程间的通信、多线程的数据共享。

2.2 多线程的执行原理

  • (单核CPU)同一时间,CPU 只能处理一个线程,只有一个线程在执行;
  • 多线程同时执行:是 CPU 在单位时间片里快速在多个线程之间切换;
  • CPU 调度线程的时间足够快,就造成了多线程“同时”执行;
  • 如果线程数非常多, CPU 会在 n 个线程之间切换,消耗大量的 CPU 资源。每个线程被调度的次数会降低,线程的执行效率降低。

2.3 iOS中的多线程技术方案

技术方案

简介

语言

线程声明周期

使用频率

pthread

● 一套通用的多线程API● 适用于Unix\Linux\Windows等系统● 跨平台\可移植● 使用难度大

C

程序员管理

几乎不用

NSThread

● 使用更加面向对象● 简单易用,可直接操作线程对象

OC

程序员管理

偶尔使用

GCD

● 旨在替代NSThread等线程技术● 充分利用设备的多核

C

自动管理

经常使用

NSOperation

● 基于GCD(底层是GCD)● 比GCD多了一些更简单实用的功能● 使用更加面向对象

OC

自动管理

经常使用

3. 线程与RunLoop的关系

  苹果官方文档:线程编程指南——RunLoop

  从苹果官方文档可以看到,RunLoop的相关介绍写在线程编程指南中,可见RunLoop和线程的关系不一般。

  • RunLoop对象和线程是一一对应关系
  • RunLoop保存在一个全局的Dictionary里,线程作为keyRunLoop作为value
  • RunLoop创建时机:线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建
  • RunLoop销毁时机:RunLoop会在线程结束时销毁
  • 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop
  • 主线程的RunLoop对象是在UIApplicationMain中通过[NSRunLoop currentRunLoop]获取,一旦发现它不存在,就会创建RunLoop对象

相关链接:深入浅出 RunLoop(四):RunLoop 与线程

相关链接

Threading Programming Guide(苹果官方文档)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.线程和进程
    • 1.1 线程的定义
      • 1.2 进程的定义
        • 1.3 线程与进程的区别
          • 1.4 为什么要在主线程更新UI?
          • 2.多线程
            • 2.1 多线程的意义
              • 2.2 多线程的执行原理
                • 2.3 iOS中的多线程技术方案
                • 3. 线程与RunLoop的关系
                • 相关链接
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档