RunLoop概念:
是通过内部维护的事件循环来对事件/消息进行管理的一个对象。事件循环的定义:1)没有消息需要处理时,休眠以避免资源占用。2)有消息需要处理时,立刻被唤醒。
runLoop的数据结构:
NSRunloop是CFRunLoop的封装,提供了面向对象的API。
NSRunloop位于foundation框架中,CFRunLoop位于CoreFoundation中。
runLoop图示:
main函数中的runloop是UIApplicationMain中实现的。
其中,等待不等于死循环。
事件循环Event Loop:
1)没有消息需要处理时,进程或者线程会进入休眠状态,而休眠状态的过渡相当于把当前线程的控制权转移给了内核态。
2)有消息需要处理时,就会有一个从用户态到内核态的状态切换。
3)维护的事件循环可以用来不断的处理消息或事件,对他们进行管理,如果没有消息进行处理,会从用户态切换到内核态,进行资源的休眠避免资源占用;当有消息进行处理时,会发生从内核态到用户态的切换,当前用户线程会被唤醒;
状态的切换是回答该问题的关键点。
用户态和内核态介绍:
我们的应用程序都是运行在用户态上的。
用户进程以及开发中使用的绝大多数API都是在用户层面的,而发生的系统调用需要使用关于操作系统以及底层内核相关的指令和API就相当于触发了系统调用,有些系统调用就会发生状态空间的切换。
这种切换空间是对计算机的一些资源调度、管理进行统一或者一致性的操作,避免特殊的异常,合理的安排资源调度;同时内核态的一些内容可以对用户态的线程进行调度、管理、进程间通信。
CFRunLoopSource:
source0:需要手动唤醒线程,在我们添加一个source0到对应runloop中,并不会主动唤醒当前线程,需要手动唤醒,把当前线程从内核态切换到用户态。
source1:具备唤醒线程的能力
网友评论