Linu進程狀態與調度_第1頁
Linu進程狀態與調度_第2頁
Linu進程狀態與調度_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Linux進程狀態與調度目錄一.進程的狀態schedule_timeoutwake_uptask_structcurrent二?內核與用戶空間信號傳遞fasync—.進程的狀態1.Schedule_timeout當我們調用schedule_timeout時,有兩種情況能打斷該定時器,一種為超時,一種為有信號打斷。在該函數的申明中提到*%TASK_INTERRUPTIBLE-theroutinemayreturnearly訐asignalisdeliveredtothecurrenttask.Inthiscasetheremainingtimeinjiffieswillbereturned,or0訐thetimerexpiredintime**ThecurrenttaskstateisguaranteedtobeTASK_RUNNINGwhenthis*routinereturns.配合schedule_timeout,使用—set_currnet_state.對于支持信號打斷的schedule_timeout,調用—set_currnet_state設置taskstate為TASK_INTERRUPIBLE,如下,__set_current_state(TASK_INTERRUPTIBLE);Timeout=schedule_timeout(timeout);__set_current_state(TASK_RUNNING);調用schedule_timeout如果超時之后會自動設置task_state為TASK_RUNNING,在調用schedule_timeout之后,進程會進入休眠狀態,退出進程調度,只有在有關于此進程的事件到來時會被喚醒(各種信號),重新加入進程調度中。用過msleep都知道所在的task會sleep相應ms,而實際上其原理就與schedule_timeout和進程狀態有關。當設置current_state為TASK_UNINTERRUPTIBLE時,只能等待超時,signal無法打斷這就是msleep的原理,msleep調用的函數為schedule_timeout_uninterruptible()如下,signedlong__schedschedule_timeout_uninterruptible(signedlongtimeout){_set_current_state(TASK_UNINTERRUPTIBLE);returnschedule_timeout(timeout);}2?Wake_upschedule_timeout會被信號喚醒,那么具體是如何操作的?以Linuxkernel中的n_tty.c中的n_tty_read函數為例,Wait_queue_head_tread_waitInit_waitqueue_head(&tty->read_wait)DECLARE_WAITQUEUE(wait,current);〃初始化一個wait_queue_twait,task為currentadd_wait_queue(&tty->read_wait,&wait);〃將wait添加到read_wait隊列中去if(waitqueue_active(&tty->read_wait))//判斷read_wait是否為空wake_up_interruptible(&tty->read_wait)//喚醒等待隊列這里喚醒的是自己定義的read_wait隊列,在wake_up_interruptible中,會將該進程重新加入run_queue中進行調度(實際調用的是try_to_wake_up函數),這樣schedule_timeout被打斷。以上就是schedule_timeout(schedule())和wake_up的應用,實際上很多機制如wait_event_interrupt,wake_event_interrupt,wait_for_completion,complete等機制都是在這些基礎上封裝而實現的機制。3?Task_structCurrentCurrent是一個很重要的task_struct,代碼部分通過thread_info->task得到,而thread_info通過current_thread_info()得到,這是在2.6之后的一個設計,current_thread_info()代碼如下,staticinlinestructthread_info*current_thread_info(void){registerunsignedlongspasm("sp");return(structthread_info*)(sp&?(THREAD_SIZE-1));}THREAD_SIZE8192or4096因為每一個進程都一個自己的堆棧(4Kor8K),而SP寄存器只有一個,當進行調度時,會將一個進程堆棧的SP轉換到另一個進程的SP,而SP寄存器永遠為當前運行的進程的SP值。而每一個進程堆棧的低地址(12位或者13位)就存放了該進程的thread_info起始的信息。這是內核進程的堆棧空間,空間大小固定,必須物理地址連續,溢出為固定堆棧大小溢出。而對應用戶空間進程而言,它的堆棧空間可大可小,并且物理地址可以不連續(由MMU管控),出現溢出問題的時候有可能用戶空間進程本身沒有問題,而溢出部分將用戶空間的其他進程的堆棧進行了修改導致這些進程運行出現錯誤。二.fasync使用fasync實現內核信號到用戶空間的信號傳遞(比uevent簡單)內核部分:(以tty為例)Structfasync_struct*fasync;在tty_fasync(intfd,structfile*filp,inton)中Fasync_helper(fd,filp,on,&tty->fasync);//initfasync當需要發送信號給用戶空間時,調用Kill_fasync(&tty->fasync,SIGIO,POLL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論