进程是指在系统中正在运行的一个应用程序(App);每一个进程之间是独立的,每一个进程均运行在其专用的且受保护的内存空间中;经过活动监视器能够查看Mac系统中所开启的进程。 markdown
线程是进程的基本执行单元,一个进程的全部任务都是在线程中执行;进程想要执行任务必读得有线程,进程至少有一条线程。程序启动后会默认开启一条线程,这条线程被称做主线程或者UI线程。 多线程
地址空间:同⼀进程的线程共享本进程的地址空间,⽽进程之间则是独⽴的地址空间。 资源拥有:同⼀进程内的线程共享本进程的资源如内存、I/O、cpu等,可是进程之间的资源是独⽴的。并发
objc_init
函数中也存在)多线程并非真正原理上的并发,只是CPU在多个任务直接进⾏快速的切换,这个时间间隔就是时间⽚。真正的并发创建在一个多核的基础上函数
优势:oop
缺点:性能
单核同一时间,cpu只能处理一个线程,换言之,同一时间只有1个线程在执行 多线程同时执行实际上是cpu快速的在多个线程之间的切换;cpu线程调度的时间足够快,就形成了多线程的同时执行的假象。 若是线程数量很是多的话,cpu会在N个线程之间切换,消耗大量的cpu资源,每一个线程被调度的次数会下降,线程的执行效率下降。 ui
为了不出现饿死状态,cpu调度 IO密集型会提升优先级atom
atomic
:是原子属性,是为多线程开发准备的,是默认属性!仅仅在属性的 setter
方法中,增长了锁(自旋锁),可以保证同一时间,只有一条线程对属性进行写
操做。可是同一个时间多个线程均可以取值 nonatomic 是非原子属性。没有锁!性能高!spa
看源码:操作系统
void objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id newValue, BOOL atomic, signed char shouldCopy)
{
bool copy = (shouldCopy && shouldCopy != MUTABLE_COPY);
bool mutableCopy = (shouldCopy == MUTABLE_COPY);
reallySetProperty(self, _cmd, newValue, offset, atomic, copy, mutableCopy);
}
复制代码
static inline void reallySetProperty(id self, SEL _cmd, id newValue, ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy)
{
//....
if (!atomic) {
oldValue = *slot;
*slot = newValue;
} else {
spinlock_t& slotlock = PropertyLocks[slot];
slotlock.lock();
oldValue = *slot;
*slot = newValue;
slotlock.unlock();
}
}
复制代码
从上面咱们能够看出atomic
不是锁,只是一个加锁的标识。
Runloop
__bridge
只作类型转换,可是不修改对象(内存)管理权; __bridge_retained
将oc对象转换为CoreFoundation
,内存管理权限交给咱们,后续须要使用CFRealeas或者相关的方法来释放对象 __bridge_transfer
将CoreFoundation
转换为oc对象,同时将内存的管理权限交回给ARC