進程是指在系統中正在運行的一個應用程序(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