freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于dos的多任務(wù)系統(tǒng)實現(xiàn)(編輯修改稿)

2025-08-31 14:25 本頁面
 

【文章內(nèi)容簡介】 原先將over()函數(shù)的入口地址壓入線程的私有堆棧中;那么當線程所對應(yīng)的函數(shù)正常結(jié)束時, over()函數(shù)的入口地址將作為函數(shù)的返回地址被彈出到CS,IP寄存器,控制自動轉(zhuǎn)向over()函數(shù)執(zhí)行*/ ptflags=0x200。 /*flags寄存器的允許中斷位*/ ptcs=FP_SEG(code)。 /*代碼段的段地址*/ ptip=FP_OFF(code)。 /*代碼段的段內(nèi)偏移地址*/ ptds=_DS。 /*數(shù)據(jù)段的段地址*/ ptes=_ES。 /*附加數(shù)據(jù)段的段地址*/ ptoff=FP_OFF(over)。 /*撤銷線程代碼的偏移地址*/ ptseg=FP_SEG(over)。 /*撤銷線程代碼的段址*/ /*第四步:初始化線程的控制塊TCB*/ strcpy(tcb[i].name,name)。 /*填入線程的外部標識符*/ tcb[i].state=ready。 /*將線程的狀態(tài)置成就緒態(tài)*/ tcb[i].stack=pstacklen。 /*私有堆棧的起始地址*/ tcb[i].ss=FP_SEG(pt)。 /*當前線程的段地址*/ tcb[i].sp=FP_OFF(pt)。 /*當前線程的棧頂指針*/ return i。 /*返回線程的內(nèi)部標示符*/}/************new_int8函數(shù)的實現(xiàn)***************//*系統(tǒng)調(diào)度,即時間中斷到達后,判斷時間片到后才運行,調(diào)用老的時鐘中斷*/void interrupt new_int8(void){ int i。 (*old_int8)()。 /*調(diào)用原來的時鐘中斷服務(wù)程序*/ timecount++。 /*每次發(fā)生中斷時加1*/ if(timecount=TL){ /*時間片到時*/ if(DosBusy()) /*如果Dos忙*/ return。 disable()。 /*關(guān)中*/ /*保護正在執(zhí)行的線程current的現(xiàn)場,暫停它的執(zhí)行*/ tcb[current].ss=_SS。 tcb[current].sp=_SP。 if(tcb[current].state==running) /*將執(zhí)行狀態(tài)變?yōu)榫途w狀態(tài),暫停執(zhí)行*/ tcb[current].state=ready。 /*找到以新的就緒線程*/ for(i=1。iNTCB。i++){ if(tcb[i].state==ready amp。amp。 i!=current) /*找到除了當前線程的其他就緒線程*/ break。 } /*如果沒有找到就緒線程,那么就回復當前線程,繼續(xù)執(zhí)行*/ if(i=NTCB){ if(tcb[current].state==ready) tcb[current].state=running。 enable()。 return。 /*如果超出了NTCB則恢復現(xiàn)場然后返回*/ } /*如果找到就緒線程,那么恢復線程i的現(xiàn)場,把CPU分配給它*/ _SS=tcb[i].ss。 _SP=tcb[i].sp。 tcb[i].state=running。 /*置線程i為現(xiàn)有線程,并且重新開始計時*/ current=i。 timecount=0。 enable()。 /*開中*/ } return。}/*********swtch函數(shù)的實現(xiàn)************//*針對Swtch()函數(shù)的實現(xiàn):由于它是解決由其他因素所引起的CPU調(diào)度,在這個實現(xiàn)過程,只需要判斷線程的執(zhí)行狀態(tài)即可,其他阻塞等狀態(tài)不需要進行判斷,或者可以直接對當前線程的現(xiàn)場進行保護,然后尋找就緒線程,分配CPU以及現(xiàn)場進行執(zhí)行*//*Find()函數(shù)是為了尋找就緒線程而且是優(yōu)先權(quán)大的線程(根據(jù)優(yōu)先數(shù)越大,優(yōu)先權(quán)越小的思想,在TCB設(shè)置以優(yōu)先數(shù),然后進行選擇)*/int Find(){ int i,j。 for(i=0。iNTCB。i++) if(tcb[i].state==readyamp。amp。i!=current) break。 if(i==NTCB) return 1。 for(j=i+1。jNTCB。j++) { if(tcb[j].state==readyamp。amp。j!=current) if(tcb[j].valuetcb[i].value) i=j。 } return i。}/*swtch()調(diào)度,手工調(diào)度才能運行,處理因其他因素引起的中斷*/void interrupt swtch(void){ int i。 i=Find()。 if(i0) i=0。 disable()。 tcb[current].ss=_SS。 tcb[current].sp=_SP。 if(tcb[current].state==running) tcb[current].state=ready。 _SS=tcb[i].ss。 _SP=tcb[i].sp。 tcb[i].state=running。 current=i。 enable()。}/****************線程的阻塞和喚醒的實現(xiàn)****************//**(阻塞)block函數(shù)的實現(xiàn)**/void block(struct TCB **qp){ struct TCB *tp。 disable()。 tp=*qp。 tcb[current].state=blocked。 /*首先要將當前線程的狀態(tài)置為阻塞狀態(tài)*/ /*需要將線程插入到指定的阻塞隊列未尾,并重新進行CPU調(diào)度*/ (*qp)next=NULL。 if(tp==NULL) tp=amp。tcb[current]。 /*由于tp是一個指針,所以操作的是指針*/ else{ while(tpnext!=NULL) tp=tpnext。 tpnext=amp。tcb[current]。 /*將阻塞線程插入到隊尾*/ } enable()。 swtch()。 /*并重新進行CPU調(diào)度*/}/**(喚醒)wakeup_first函數(shù)的實現(xiàn)**/void wakeup_first(struct TCB **qp){ int i。 struct TCB *tp。 disable()。 tp=*qp。/*尋找阻塞線程,因為線程狀態(tài)的改變需要在TCB中修改,所以需要知道阻塞隊列里面需要喚醒的線程對應(yīng)TCB數(shù)組里面的哪一個*/ for(i=1。iNTCB。i++){ if(strcmp(tcb[i].name,(*tpnext).name)==0){ /*如果兩個外部標示符一樣 說明找到需要喚醒的線程*/ break。 } tcb[i].state=ready。 /*將其狀態(tài)改為就緒狀態(tài)*/ enable()。 }}
點擊復制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1