新聞中心
隨著互聯(lián)網(wǎng)技術(shù)不斷升級(jí)和發(fā)展,Linux系統(tǒng)作為一款完全開(kāi)源的操作系統(tǒng),也在日益被廣泛使用。同時(shí),對(duì)于其核心部分——內(nèi)核,也在不斷被開(kāi)發(fā)和改進(jìn),以適應(yīng)不同場(chǎng)景下的需求。其中,關(guān)于內(nèi)存管理的研究與實(shí)現(xiàn)是非常重要的一環(huán)。本文將著重討論Linux內(nèi)核中的pagein過(guò)程,以加深讀者對(duì)其內(nèi)部實(shí)現(xiàn)的理解。

在鶴城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需搭建網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),網(wǎng)絡(luò)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè),鶴城網(wǎng)站建設(shè)費(fèi)用合理。
一、前置知識(shí)
在正式介紹Linux系統(tǒng)中的pagein過(guò)程之前,我們需要了解一些相關(guān)的背景知識(shí)。
內(nèi)核中的頁(yè)面調(diào)度算法
在Linux操作系統(tǒng)中,內(nèi)存管理一課通的重要內(nèi)容就是頁(yè)面調(diào)度。頁(yè)面調(diào)度算法主要用于在有限的物理內(nèi)存空間下,對(duì)進(jìn)程所請(qǐng)求的虛擬內(nèi)存頁(yè)面進(jìn)行置換。常規(guī)的算法有FIFO(先進(jìn)先出)、LRU(最近最少使用)、Clock算法等等,每種算法都有其優(yōu)點(diǎn)和不足,根據(jù)場(chǎng)景和具體情況進(jìn)行選擇和調(diào)優(yōu)。
內(nèi)存地址空間(Virtual Memory)
內(nèi)存地址空間是指計(jì)算機(jī)程序中的內(nèi)存分配單元所占的虛擬地址范圍,并通過(guò)內(nèi)存管理單元(MMU)將其映射到物理內(nèi)存地址空間的操作過(guò)程。在操作系統(tǒng)中,通常每個(gè)進(jìn)程都有自己獨(dú)立的虛擬地址空間,這樣就可以隔離不同程序之間的內(nèi)存訪問(wèn),從而提高系統(tǒng)的穩(wěn)定性和安全性。
二、pagein過(guò)程
pagein過(guò)程是指在進(jìn)程經(jīng)過(guò)內(nèi)存空間的時(shí)候,內(nèi)核將由虛擬地址映射到的物理地址所對(duì)應(yīng)的頁(yè)面,從磁盤(pán)上載入到內(nèi)存中的過(guò)程。這個(gè)過(guò)程通常是由操作系統(tǒng)自動(dòng)完成的,而不需要人工干預(yù)。所謂頁(yè)面是指操作系統(tǒng)對(duì)內(nèi)存空間進(jìn)行管理的基本單元,大小通常為4KB或者8KB,每個(gè)頁(yè)面都有自己的頁(yè)框和頁(yè)表來(lái)管理。
在pagein過(guò)程中,有一條很重要的命令是fault,也叫缺頁(yè)中斷。當(dāng)運(yùn)行進(jìn)程訪問(wèn)一個(gè)地址空間中不存在的頁(yè)面時(shí),內(nèi)核將發(fā)出一個(gè)中斷,系統(tǒng)即發(fā)生了缺頁(yè)事件。此時(shí),內(nèi)核需要將缺失頁(yè)面所對(duì)應(yīng)的物理頁(yè)面從磁盤(pán)上載入到內(nèi)存中,并且更新進(jìn)程的頁(yè)表,以保證進(jìn)程能夠完成其所需要執(zhí)行的操作。
圖1:pagein過(guò)程的調(diào)用流程
(圖片來(lái)源:http://web.cs.ucla.edu/classes/fall16/cs111/projects/p3.html)
1.缺頁(yè)處理
缺頁(yè)中斷是pagein過(guò)程的入口,它是由MMU硬件自動(dòng)發(fā)起的,通常是由CPU上的MMU硬件設(shè)備檢測(cè)到缺頁(yè)并通過(guò)TRAP/TRAPV指令生成中斷(缺頁(yè)異常)。此時(shí)Linux內(nèi)核會(huì)通過(guò)page fault handler函數(shù)來(lái)處理缺頁(yè),檢測(cè)到該頁(yè)面不在主存中,于是它會(huì)調(diào)用do_page_fault函數(shù)。
2.do_page_fault
do_page_fault是Linux內(nèi)核用來(lái)處理缺頁(yè)事件的主要核心函數(shù)之一。在該函數(shù)中,內(nèi)核首先會(huì)判斷當(dāng)前的缺頁(yè)原因,然后根據(jù)不同的情況嘗試去恢復(fù)進(jìn)程的執(zhí)行。如果是由于不存在(not present)或權(quán)限(protection)原因造成的缺頁(yè)事件,內(nèi)核會(huì)調(diào)用handle_mm_fault來(lái)處理。
例:在Linux系統(tǒng)中,當(dāng)進(jìn)程訪問(wèn)不存在的頁(yè)面時(shí),會(huì)發(fā)生如下的缺頁(yè)情況。
圖2:不存在頁(yè)面的情況
3.handle_mm_fault
handle_mm_fault函數(shù)是真正的缺頁(yè)處理函數(shù)。它通過(guò)計(jì)算出目標(biāo)頁(yè)在磁盤(pán)上的位置,將該頁(yè)從磁盤(pán)讀入緩存區(qū),并將該頁(yè)面映射到進(jìn)程的虛擬地址空間中。同時(shí),它會(huì)將新讀入的頁(yè)面添加到進(jìn)程的內(nèi)存空間運(yùn)行隊(duì)列和頁(yè)面LRU鏈表中,作為后續(xù)內(nèi)存頁(yè)面置換算法的參考。
通過(guò)上述介紹,我們可以發(fā)現(xiàn)pagein過(guò)程在Linux內(nèi)核中起到了非常關(guān)鍵的作用。它通過(guò)Linux內(nèi)核提供的缺頁(yè)中斷處理機(jī)制,將請(qǐng)求頁(yè)面從磁盤(pán)中讀入到內(nèi)存中,提供了加速進(jìn)程運(yùn)行、提高系統(tǒng)穩(wěn)定性的優(yōu)秀機(jī)制。在實(shí)際的運(yùn)用過(guò)程中,我們可以進(jìn)行針對(duì)性地調(diào)整頁(yè)面調(diào)度算法、緩存區(qū)及LRU鏈表等參數(shù),以提升系統(tǒng)的性能及穩(wěn)定性。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220linux下python怎么寫(xiě)爬蟲(chóng)獲取圖片
跟linux有什么關(guān)系,python是跨平臺(tái)的,爬取圖片的代碼如下:
import urllib.requestimport osimport randomdef url_open(url):
req=urllib.request.Request(url) #為請(qǐng)求設(shè)置user-agent,使得程序看起來(lái)更像一個(gè)人類
req.add_header(‘User-Agent’,’Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/Firefox/43.0′) #代理IP,使用戶能以不同IP訪問(wèn),從而防止被服務(wù)器發(fā)現(xiàn)
”’iplist=
proxy_support=urllib.request.ProxyHandler({‘http’:random.choice(iplist)})
opener=urllib.request.build_opener(proxy_support)
opener.addheaders=
urllib.request.install_opener(opener)”’
response=urllib.request.urlopen(req)
html=response.read() 運(yùn)穗租 return htmldef get_page(url):
html=url_open(url).decode(‘旁兆u(yù)tf-8’)
a=html.find(‘current-comment-page’)+23
b=html.find(‘>’,a) #print(html)
return htmldef find_imgs(url):
html=url_open(url).decode(‘utf-8’)
img_addrs=
a=html.find(‘img src=’) while a!=-1:
b=html.find(‘.jpg’,a,a+140)if b!=-1:if html!=’h’:
img_addrs.append(‘http:’+html)else:
img_addrs.append(html)else:
b=a+9
a=html.find(‘img src=’,b) for each in img_addrs:
print(each+’我的打印’) return img_addrsdef save_imgs(folder,img_addrs):
for each in img_addrs:#print(‘one was saved’)
filename=each.split(‘/’)with open(filename,’wb’) as f:
img=url_open(each)
f.write(img)def download_mm(folder=’ooxx’,pages=10):
os.mkdir(folder)
os.chdir(folder)
url=””
page_num=int(get_page(url)) for i in range(pages):
page_num=page_num-1
page_url=url+’page-‘+str(page_num)+’#comments’
img_addrs=find_imgs(page_url)
save_imgs(folder,img_addrs)if __name__==’族鋒__main__’:
download_mm()
完成
linux pagein的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux pagein,Linux系統(tǒng):pagein過(guò)程解析,linux下python怎么寫(xiě)爬蟲(chóng)獲取圖片的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)是成都專業(yè)網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、SEO優(yōu)化、手機(jī)網(wǎng)站、小程序開(kāi)發(fā)、APP開(kāi)發(fā)公司等,多年經(jīng)驗(yàn)沉淀,立志成為成都網(wǎng)站建設(shè)第一品牌!
當(dāng)前文章:Linux系統(tǒng):pagein過(guò)程解析(linuxpagein)
當(dāng)前地址:http://fisionsoft.com.cn/article/cocpopj.html


咨詢
建站咨詢
