河南省新聞出版學(xué)校怎么樣全網(wǎng)優(yōu)化哪家好
參考:
- 《程序員面試筆試寶典》(何昊、葉向陽)
進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。線程是進(jìn)程的一個(gè)實(shí)體,是cpu調(diào)度和分配的基本單位。線程基本不擁有系統(tǒng)資源,只擁有必須的,但是同屬于一個(gè)進(jìn)程的其他線程可以共享進(jìn)程所擁有的全部資源。
引入線程的4個(gè)優(yōu)點(diǎn):1)易于調(diào)度2)提高并發(fā)性3)開銷小4)充分發(fā)揮多處理器的功能(每個(gè)線程都在一個(gè)處理器上運(yùn)行,有助于并行)
線程與進(jìn)程的區(qū)別?
1)一個(gè)線程只能屬于一個(gè)進(jìn)程,一個(gè)進(jìn)程可以有多個(gè)線程,并且至少有1個(gè)
2)屬于一個(gè)進(jìn)程的所有線程共享進(jìn)程的所有資源,不同進(jìn)程相互獨(dú)立
3)線程又稱為輕量級進(jìn)程,線程之前切換代價(jià)小,進(jìn)程之間切換代價(jià)大
4)進(jìn)程是程序的一次執(zhí)行,線程可以理解為程序中一段程序片段的執(zhí)行
5)每個(gè)進(jìn)程有獨(dú)立的內(nèi)存空間,而線程共享其所屬進(jìn)程的內(nèi)存空間
線程同步機(jī)制?
1)臨界區(qū):通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數(shù)據(jù)訪問
2)互斥量:只有擁有互斥對象的線程才有權(quán)限去訪問系統(tǒng)的公共資源。因?yàn)榛コ鈱ο笾挥幸粋€(gè),所以能保證資源不會被多個(gè)線程訪問
3)信號量:它允許多個(gè)線程在同一個(gè)時(shí)刻去訪問同一個(gè)資源,但是會限制同一時(shí)刻訪問該資源的最大線程數(shù)目
4)事件:用來通知線程有一些事件已經(jīng)發(fā)生,從而啟動后繼任務(wù)
內(nèi)核線程:操作系統(tǒng)內(nèi)核可感知的線程
用戶線程:是在用戶程序中實(shí)現(xiàn)的線程。unix系統(tǒng)
用戶線程的優(yōu)點(diǎn):(內(nèi)核線程的優(yōu)缺點(diǎn)與之相反、os可以使用混合方式實(shí)現(xiàn)線程)
1)可以在不支持線程的os中實(shí)現(xiàn)
2)創(chuàng)建和銷毀線程、線程切換等線程管理的代價(jià)小
3)允許每個(gè)進(jìn)程定制自己的調(diào)度算法,線程管理很靈活
4)線程能利用的表空間和堆??臻g比內(nèi)核線程多
缺點(diǎn):
1)同一進(jìn)程中只能同時(shí)有一個(gè)線程在運(yùn)行,如果有一個(gè)線程使用了系統(tǒng)調(diào)用而阻塞,那么整個(gè)進(jìn)程都會被掛起
2)頁面失效也會產(chǎn)生類似的問題
內(nèi)存管理的方式:
1)塊式管理:把主存分成一大塊一大塊的,當(dāng)所需的程序片段不在主存時(shí)就分配一塊主存空間,將程序片段load入。這樣易于管理但是浪費(fèi)空間
2)頁式管理:把主存分成一頁一頁(比塊式小),提高空間利用率
3)段式管理:把主存分段(比頁小),這樣提高空間利用率但是一個(gè)程序片段可能會分成幾十段,導(dǎo)致計(jì)算每段的物理地址時(shí)浪費(fèi)時(shí)間
4)段頁式管理:先把主存分成若干段,每段再分頁。段頁式管理沒取一次數(shù)據(jù),要訪問3次內(nèi)存
分段和分頁的區(qū)別:
1)頁是信息的物理單位,分頁是出于管理系統(tǒng)的需要;段是信息的邏輯單位,它含有一組意義相對完整的信息,分段是出于用戶需要。
2)頁的大小固定且由系統(tǒng)確定,將邏輯地址分為頁號和頁內(nèi)地址兩部分,是由機(jī)器硬件實(shí)現(xiàn)的。段的長度不固定,取決于用戶編寫的程序,通常由編譯程序在對源程序進(jìn)行編譯時(shí),根據(jù)信息的性質(zhì)來劃分。
3)分頁的作業(yè)地址空間是單一的線性空間,分段的作業(yè)地址空間是二維的,需要給出段名+段內(nèi)地址
虛擬內(nèi)存:它使得應(yīng)用程序認(rèn)為它擁有一個(gè)連續(xù)完整的地址空間,允許程序員編寫并運(yùn)行比實(shí)際系統(tǒng)擁有的內(nèi)存大得多的程序。實(shí)際上,它通常被分割成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲在外部磁盤上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。
虛擬內(nèi)存比實(shí)存的好處:
1)擴(kuò)大地址空間:尋址空間比實(shí)際大
2)內(nèi)存保護(hù):每個(gè)進(jìn)程運(yùn)行在各自的虛擬內(nèi)存地址空間,互不干擾。虛存還對特定的內(nèi)存地址提供寫保護(hù),防止代碼或數(shù)據(jù)被惡意篡改
3)公平分配內(nèi)存:每個(gè)進(jìn)程相當(dāng)于有同樣大小的虛存空間
4)當(dāng)進(jìn)程需要通信時(shí),可采用虛存共享的方式實(shí)現(xiàn)
壞處:
1)虛存管理需要建立很多數(shù)據(jù)結(jié)構(gòu),而數(shù)據(jù)結(jié)構(gòu)要占用額外的內(nèi)存
2)虛擬地址到物理地址的轉(zhuǎn)換,增加了指令的執(zhí)行時(shí)間
3)頁面的換入換出需要磁盤IO,耗時(shí)
4)如果一頁中只有一部分?jǐn)?shù)據(jù),會浪費(fèi)內(nèi)存
內(nèi)存碎片:是由多次進(jìn)行內(nèi)存分配造成的。很多空白段因?yàn)樘?#xff0c;不能滿足用戶需求而被放棄,這些小的空白段就是碎片
內(nèi)碎片:是處于區(qū)域內(nèi)部或頁面內(nèi)部的存儲塊,占用這些區(qū)域的進(jìn)程不使用這個(gè)存儲塊,系統(tǒng)頁因?yàn)檫M(jìn)程在占有,無法使用,需要等到進(jìn)程釋放或結(jié)束。
外碎片:一些不屬于任何進(jìn)程的、因?yàn)樘∏业刂凡贿B續(xù)導(dǎo)致系統(tǒng)無法分配給其他進(jìn)程的空閑存儲塊。一般處于已分配區(qū)域或頁面外部
一種特定的內(nèi)存分配算法,很難同時(shí)解決內(nèi)碎片和外碎片問題,只能根據(jù)應(yīng)用特點(diǎn)進(jìn)行取舍。
虛擬地址:是指由程序產(chǎn)生的、由段選擇符和段內(nèi)偏移地址組成的地址。不能直接訪問物理內(nèi)存,需要通過分段地址的變換處理才行
物理地址:是指現(xiàn)在CPU外部地址總線上的尋址物理內(nèi)存的地址信號,是地址變換的最終結(jié)果
邏輯地址:是由程序產(chǎn)生的段內(nèi)偏移地址。有時(shí)候直接把邏輯地址當(dāng)成虛擬地址
線性地址:是指虛擬地址到物理地址變換之間的中間層,是處理器可尋址的內(nèi)存空間(即線性地址空間)中的地址。如果啟用了分頁機(jī)制,線性地址再變換就產(chǎn)生物理地址,否則線性地址就是物理地址。
不同的邏輯地址可以映射到同一個(gè)線性地址上,不同的線性地址頁可以映射到同一個(gè)物理地址上。
cache的替換算法:
1)隨機(jī)算法RAND:隨機(jī)產(chǎn)生一個(gè)要替換的塊號,替換出去。優(yōu)點(diǎn):簡單、容易實(shí)現(xiàn)、沒有使用”歷史經(jīng)驗(yàn)“,因此不能提高cache命中率(正好讀到有用的信息=命中)
2)先進(jìn)先出FIFO:將最早進(jìn)入Cache的子塊替換。優(yōu)點(diǎn):容易實(shí)現(xiàn),系統(tǒng)開銷小;缺點(diǎn):可以替換掉早來但常用的程序塊,頁不能提高命中率
3)最近最久未使用算法LRU:least recently used,字面意思,但也不能保證過去不常用的未來也不常用,而且實(shí)現(xiàn)復(fù)雜,開銷大。常用的方法有:計(jì)數(shù)器法、寄存器棧法、硬件邏輯比較對法
4)最優(yōu)替換算法OPT:OPTimal replacement。要實(shí)現(xiàn)的話是先讓程序跑一遍,記錄下實(shí)際的頁地址流情況,根據(jù)這個(gè)找出它需要替換的頁面。但這是理想型算法,可以作為評估標(biāo)準(zhǔn),哪個(gè)的命中率與其相近就是好的
5)最近最少使用LFU:least frequently used 選擇近期最少最少訪問的頁面作為被替換的頁面。需要為每個(gè)頁面設(shè)置一個(gè)很長的計(jì)數(shù)器,并且選擇一個(gè)固定的時(shí)鐘為每個(gè)計(jì)數(shù)器計(jì)數(shù),在選擇時(shí),要從所有計(jì)數(shù)器中找到計(jì)數(shù)值最大的計(jì)數(shù)器。實(shí)現(xiàn)復(fù)雜
庫函數(shù)調(diào)用是語言或者應(yīng)用程序的一部分,運(yùn)行在用戶空間(如c庫的system malloc)。系統(tǒng)調(diào)用是os的一部分,是在內(nèi)核空間執(zhí)行的,因此調(diào)用時(shí)需要把上下文環(huán)境切換到內(nèi)核模式(如chdir write)。
靜態(tài)鏈接是把要調(diào)用的函數(shù)直接鏈接到可執(zhí)行文件中,所以一個(gè)exe文件會包含所需的所有代碼。而動態(tài)鏈接沒有拷貝所需代碼,只寫了所調(diào)用函數(shù)的描述信息,只有當(dāng)應(yīng)用程序被裝入內(nèi)存開始運(yùn)行時(shí),才會在應(yīng)用程序和動態(tài)鏈接庫(dll, dynamic link library)之間建立鏈接,os才能去執(zhí)行dll中對應(yīng)的代碼。所以前者的exe可以拷貝到別的機(jī)子運(yùn)行,后者未必可以,因?yàn)橐WCdll存在+版本正確。
靜態(tài)鏈接庫:.lib (不能包含其他dll或lib)
動態(tài)鏈接庫:.dll(能包含其他dll或lib)
核心態(tài)與用戶態(tài):當(dāng)CPU處于核心態(tài)時(shí),可以隨時(shí)進(jìn)入用戶態(tài);當(dāng)CPU處于用戶態(tài)時(shí),只有系統(tǒng)調(diào)用和中斷時(shí)才能切換到核心態(tài)。一般程序一開始都是運(yùn)行于用戶態(tài),當(dāng)程序需要使用系統(tǒng)資源時(shí),就通過調(diào)用軟中斷進(jìn)入核心態(tài)。
運(yùn)行在核心態(tài)的程序可以訪問的資源多,但是可靠性、安全性要求高,管理和維護(hù)比較復(fù)雜;用戶態(tài)程序訪問的資源有限,但是要求低,維護(hù)簡單。
核心態(tài)實(shí)現(xiàn)的功能:CPU管理和內(nèi)存管理、診斷和測試程序、輸入輸出管理、文件系統(tǒng)本身的管理。但用戶數(shù)據(jù)的管理、編譯器、網(wǎng)絡(luò)管理的部分功能等都可以放在用戶態(tài)。
內(nèi)核在創(chuàng)建進(jìn)程時(shí),會為進(jìn)程創(chuàng)建相應(yīng)的堆棧。每個(gè)進(jìn)程都有一個(gè)用戶棧,存在于用戶空間,一個(gè)內(nèi)核棧,存在于內(nèi)核空間。當(dāng)進(jìn)程在用戶空間運(yùn)行時(shí),CPU堆棧指針寄存器里面的內(nèi)容都是用戶堆棧的地址;否則是內(nèi)核??臻g地址。當(dāng)進(jìn)程陷入內(nèi)核態(tài)時(shí),進(jìn)程所用的堆棧要從用戶棧轉(zhuǎn)到內(nèi)核棧。此時(shí)先把用戶態(tài)堆棧的地址保存在內(nèi)核棧中(此時(shí)內(nèi)核??偸强盏?#xff09;,然后將寄存器內(nèi)容改為內(nèi)核棧的地址?;謴?fù)到用戶態(tài)時(shí),直接恢復(fù)之前保存的用戶棧地址。