iOS面试题(二十六)RunLoop

本文深入剖析RunLoop的机制,解释其如何通过事件循环管理消息,实现线程的休眠与唤醒,探讨RunLoop与线程、Timer及多线程的关系,以及如何利用RunLoop实现常驻线程。

8.RunLoop

  • 什么是RunLoop?(RunLoop的实现机制?剖析RunLoop的源码)
  • 数据结构  (Mode/Source/Timer/Observer )
  • 事件循环机制(RunLoop有事做事,没事休息是由事件循环机制来维护的)
  • RunLoop与NSTimer之间的关系是怎样的?(我们在使用NSTimer的时候,应该怎样考虑和RunLoop的关系,包括RunLoop所带来的影响)
  • RunLoop与多线程之间有什么关系?(如何通过RunLoop来实现常驻线程?)

什么是RunLoop?

RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象

事件循环是什么呢?

  • 没有消息处理时,进入休眠以避免资源占用
  • 有消息时,立刻被唤醒

runloop循环不是单纯的for...while循环,而是发生一个用户态到内核态切换,以及内核态到用户态的一个切换
它维护的事件循环,可以用来不断的处理消息或者事件,对他们进行管理
当没有消息进行处理时,会从用户态经过系统调用进入到内核态,由此可以用来当前进程/线程的休眠,会把控制权交给内核态,避免资源占用
当有消息需要处理时,会发生从内核态到用户态的切换,当前的用户线程会被唤醒
所以说,状态切换才是Runloop的关键
 

关于用户态和内核态

  • 用户态:
    应用程序一般都是运行在用户态上,用户进程,包括我们开发所使用的绝大多数API,都是针对用户层面的
  • 内核态:
    在内核态往往有些陷阱指令,中断,以及一些开机关机的操作
    并且内核态里面的一些内容,可以对用户态中的一些线程进行调度和管理,包括进程间的通信

何时切换:

  • 当我们发生了系统调用,需要使用到操作系统以及一些底层内核相关的指令或者API时,就会触发系统调用,有些系统调用就会发生一个状态空间的切换,

为什么区分状态:

  • 之所以通过切换空间来区分出了用户态和内核态,是对计算机的资源调度,资源管理进行一个统一操作,就可以合理安排资源调度,避免特殊的异常(比如说在内核态,有一些陷阱指令、中断、开机关机的操作)
  • 试想下,如果每一个用户进程,或者说一个APP,都可以促使当前用户手机关机或者中断,就无法想象了.....

什么是事件循环?(总结):

  • 维护的事件循环,可以用来不断的处理消息或者事件,对他们进行管理。
  • 同时当没有消息进行处理时,会从用户态发生到内核态的切换,由此可以用来当前线程的休眠,避免资源占用
    当有消息需要处理时,会发生从内核态到用户态的切换,当前的用户线程会被唤醒
  • 所以说,状态切换才是Runloop的关键

入口函数:


在我们程序中,默认是从主函数进行程序启动
按说在main函数

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值