美文网首页
iOS-线程与进程简介

iOS-线程与进程简介

作者: 似水流年_9ebe | 来源:发表于2021-08-01 10:25 被阅读0次

    前言

    线程和进程在我们开发中,跟我们一直形影不离,那么什么是进程,什么是线程,它们又有什么关系,这篇文章将为您简单介绍。

    线程和进程的定义

    线程概念

    • 线程是进程的基本执⾏单元,⼀个进程的所有任务都在线程中执⾏
    • 进程要想执⾏任务,必须得有线程,进程⾄少要有⼀条线程
    • 程序启动会默认开启⼀条线程,这条线程被称为主线程或UI线程

    进程概念

    • 进程是指在系统中正在运⾏的⼀个应⽤程序
    • 每个进程之间是独⽴的,每个进程均运⾏在其专⽤的且受保护的内存空间
    • 通过“活动监视器”可以查看Mac系统中所开启的进程

    进程与线程的关系

    地址空间:同⼀进程的线程共享本进程的地址空间(TLS是本地的线程栈存空间,线程的局部空间是某些操作系统为线程提供的私有空间,只具备有限的容量,并不属于线程,由操作系统单独安排的),⽽进程之间则是独⽴的地址空间。
    资源拥有:同⼀进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独⽴的。

    1. ⼀个进程崩溃后,在保护模式下不会对其他进程产⽣影响,但是⼀个线程崩溃整个进程都死掉。所以多进程要⽐多线程健壮。
    2. 进程切换时,消耗的资源⼤,效率⾼。所以涉及到频繁的切换时,使⽤线程要好于进程。同样如果要求同时进⾏并且⼜要共享某些变量的并发操作,只能⽤线程不能⽤进程
    3. 执⾏过程:每个独⽴的进程有⼀个程序运⾏的⼊⼝、顺序执⾏序列和程序⼊⼝。但是线程不能独⽴执⾏,必须依存在应⽤程序中,由应⽤程序提供多个线程执⾏控制。
    4. 线程是处理器调度的基本单位,但是进程不是。
    5. 线程没有地址空间,线程包含在进程地址空间中。

    多线程的意义

    优点:

    1. 能适当提⾼程序的执⾏效率
    2. 能适当提⾼资源的利⽤率(CPU,内存)
    3. 线程上的任务执⾏完成后,线程会⾃动销毁

    缺点:

    1. 开启线程需要占⽤⼀定的内存空间(默认情况下,每⼀个线程都占512KB)
    2. 如果开启⼤量的线程,会占⽤⼤量的内存空间,降低程序的性能
    3. 线程越多,CPU在调⽤线程上的开销就越⼤
    4. 程序设计更加复杂,⽐如线程间的通信、多线程的数据共享

    多线程的原理

    时间⽚的概念:CPU在多个任务直接进⾏快速的切换,这个时间间隔就是时间⽚。

    • (单核CPU)同⼀时间,CPU只能处理1个线程
    • 换⾔之,同⼀时间只有1个线程在执⾏

    多线程同时执行

    • 是CPU快速的在多个线程之间的切换
    • CPU调度线程的时间⾜够快,就造成了多线程的“同时”执⾏的效果

    如果线程非常多

    • CPU会在N个线程之间切换,消耗⼤量的CPU资源
    • 每个线程被调度的次数会降低,线程的执⾏效率降低

    多线程技术方案

    1

    线程生命周期

    2

    线程池

    3

    饱和策略

    • AbortPolicy直接抛出RejectedExecutionExeception异常来阻⽌系统正常运⾏
    • CallerRunsPolicy将任务回退到调⽤者
    • DisOldestPolicy 丢掉等待最久的任务
    • DisCardPolicy直接丢弃任务
      这四种拒绝策略均实现的RejectedExecutionHandler接口

    互斥锁

    互斥锁⼩结

    • 保证锁内的代码,同⼀时间,只有⼀条线程能够执⾏!
    • 互斥锁的锁定范围,应该尽量⼩,锁定范围越⼤,效率越差!

    互斥锁参数

    • 能够加锁的任意NSObject对象
    • 注意:锁对象⼀定要保证所有的线程都能够访问
    • 如果代码中只有⼀个地⽅需要加锁,⼤多都使⽤self,这样可以避免单独再创建⼀个锁对象

    atomic与nonatomic的区别

    nonatomic⾮原⼦属性
    atomic原⼦属性(线程安全),针对多线程设计的,默认值,保证同⼀时间只有⼀个线程能够写⼊(但是同⼀个时间多个线程都可以取值)
    atomic本身就有⼀把锁(⾃旋锁)
    单写多读:单个线程写⼊,多个线程可以读取

    atomic:线程安全,需要消耗⼤量的资源
    nonatomic:⾮线程安全,适合内存⼩的移动设备

    iOS开发建议
    所有属性都声明为nonatomic
    尽量避免多线程抢夺同一块资源
    尽量将加锁,资源抢夺的业务逻辑交给服务器处理,减少APP的压力

    线程和Runloop的关系

    1. runloop与线程是⼀⼀对应的,⼀个runloop对应⼀个核⼼的线程,为什么说是核⼼的,是因为runloop是可以嵌套的,但是核⼼的只能有⼀个,他们的关系保存在⼀个全局的字典⾥。
    2. runloop是来管理线程的,当线程的runloop被开启后,线程会在执⾏完任务后进⼊休眠状态,有了任务就会被唤醒去执⾏任务。
    3. runloop在第⼀次获取时被创建,在线程结束时被销毁。
    4. 对于主线程来说,runloop在程序⼀启动就默认创建好了。
    5. 对于⼦线程来说,runloop是懒加载的,只有当我们使⽤的时候才会创建,所以在⼦线程⽤定时器要注意:确保⼦线程的runloop被创建,不然定时器不会回调。

    结语

    这篇文章简单介绍了线程与进程的概念,烦请大家不吝赐教。

    相关文章

      网友评论

          本文标题:iOS-线程与进程简介

          本文链接:https://www.haomeiwen.com/subject/ehplvltx.html