無鎖編程
Double-checked Locking
在獲取鎖的先後都進行條件判斷,儘量減小加鎖訪問(經常使用於單例)
存在的問題(延遲初始化):
對象初始化分爲:內存分配、內存初始化、指針賦值三個階段。
後兩個階段可能被優化順序顛倒。
解決方案:
禁止優化volatile(根據機器可能不可行)
寫時複製 http://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/
原子鎖
執行過程不被打斷,內核中的原子操做一般是內聯函數,通常是經過內嵌彙編指令來完成
Lock-free:確保執行它的全部線程中至少有一個可以繼續往下執行
自旋鎖 spin-lock
一種很低級的非阻塞鎖
應用於多CPU
自旋鎖須要鎖總線
實現資源的互斥而不是同步
順序鎖 seq-slock
依賴一個序列計數器
當寫者寫入數據時,會獲得一把鎖,而且將序列值加1
當讀者讀取數據以前和以後,該序列號都會被讀取,若是序列號值都相同,則代表寫沒有發生;反之,則放棄已進行的操做,從新循環一次,直至成功
不能保護包含有指針的數據結構,由於當寫者修改數據結構時,讀者可能會訪問一個無效的指針
適用於小几率寫,大機率讀
RCU Read-Copy Update
經過延遲寫來提升同步性能,相似COW
讀者不須要得到任何鎖就能夠訪問它
寫者在訪問它時首先拷貝一個副本,而後對副本進行修改,在適當的時機把指向原來數據的指針從新指向新的被修改的數據
更新時經過原子操做產生內核屏障
https://www.ibm.com/developerworks/cn/linux/l-rcu/index.html
徹底無鎖
緩衝隊列,生產者和消費者須要修改的位置是分開的
https://www.ibm.com/developerworks/cn/linux/l-cn-lockfree/index.html
用戶態與內核態
內核態: CPU能夠訪問內存全部數據, 包括外圍設備
用戶態: 只能受限的訪問內存, 且不容許訪問外圍設備
http://wely.iteye.com/blog/2332327
內存分配原理
https://blog.csdn.net/xuduorui/article/details/75088443
內存碎片
內存爲程序分配空間有四種分配方式:
連續分配方式
固定分區分配
動態分區分配,有各類算法
可重定位分區分配,緊湊內存解決外部碎片問題,相似JVM
離散分配方式
分頁:離散的分配固定分區,知足操做系統的需求,最後一個頁有內部碎片(虛擬內存+頁表)
分段:離散的分配可變式分區,知足用戶的需求,有外部碎片
段頁:用分段管理進程地址空間,用分頁管理實際內存
內存碎片:
內部碎片:已經分配出去但未被使用的內存(由固定分區致使)
外部碎片:沒法分配出去的內存(由可變式分區致使)
http://blog.csdn.net/zephyr_be_brave/article/details/8944967
http://echo.vars.me/os/memory/
http://www.cnblogs.com/zlcxbb/p/5759873.html
內存分配算法
Freelist
把內存中空閒塊鏈接起來,進一步的須要制定分配策略和放回策略
Segregated-Freelist
STL::allocator在分配小於128 bytes內存時,使用16個free-list實現memory pool
Buddy-System:二叉樹
https://zhuanlan.zhihu.com/p/29415507
馮諾依曼體系
控制器、運算器、存儲器、輸入、輸出
字節對齊
提高CPU訪問數據的效率
驚羣效應
只發生於廣播觸發多個等待的情形
accept不會致使驚羣
對於大多數場景,epoll機制仍然存在「驚羣」,用mutex能夠解決
https://www.cnblogs.com/Anker/p/7071849.html
系統類型
實時、分時、批處理、網絡、分佈式
http://www.cnblogs.com/suyuan1573/p/3971574.html
http://www.voidcn.com/article/p-azgtpqev-ku.html
中斷系統
https://blog.csdn.net/keyue123/article/details/16959111
數據庫三範式
1NF:列的原子性,即列不可以再分紅其餘幾列
2NF:首先要知足第一範式,其次每一個非主屬性是由整個主鍵函數決定的,而不能由主鍵的一部分來決定
3NF:首先要知足第二範式,其次非主屬性之間不存在函數依賴(消除傳遞依賴)
http://aijuans.iteye.com/blog/1629645