亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 4.html

?? 介紹linux下文件和設備編程
?? HTML
?? 第 1 頁 / 共 5 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD>   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">   <META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富國,http://winking.126.com">   <TITLE>進程</TITLE></HEAD><BODY style="font-family: 宋體; font-size: 9pt">&nbsp;<CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" ><TR><TD ALIGN=CENTER><FONT SIZE=+2><!--標題由此開始-->進程</TD></TR></TABLE></CENTER><p><h3>目       錄</h3><!--目錄由此開始--><A NAME="Content" ID="Content"></A><OL><LI><A HREF="#I407">進程</A></LI><OL><LI><A HREF="#I408">信號</A></LI><LI><A HREF="#I409">sched.c</A></LI><LI><A HREF="#I410">進程信號隊列</A></LI><LI><A HREF="#I411">SMP</A></LI><LI><A HREF="#I412">內核線程頁目錄的借用</A></LI><LI><A HREF="#I413">代碼分析</A></LI><LI><A HREF="#I414">線程</A></LI><LI><A HREF="#I415">進程描述符</A></LI><LI><A HREF="#I416">init進程從內核態(tài)切換到用戶態(tài)</A></LI><LI><A HREF="#I417">SET_LINKS</A></LI><LI><A HREF="#I418">REMOVE_LINKS</A></LI><LI><A HREF="#I419">get_wchan()</A></LI><LI><A HREF="#I420">sigframe的結構</A></LI><LI><A HREF="#I421">rt_sigframe結構</A></LI><LI><A HREF="#I422">信號隊列的結構</A></LI><LI><A HREF="#I423">內核線程簡介</A></LI><LI><A HREF="#I424">進程切換簡介</A></LI><LI><A HREF="#I425">同步機制</A></LI></OL></OL><hr><br><A NAME="I407" ID="I407"></A><center><b><font size=+2>進程</font></b></center><br>一&nbsp; 進程調度<p>&nbsp;&nbsp;&nbsp; 進程的狀態(tài)([include/linux.h]):<p>TASK_RUNNING, it means that it is in the &quot;Ready List&quot;<br>TASK_INTERRUPTIBLE, task waiting for a signal or a resource (sleeping)<br>TASK_UNINTERRUPTIBLE, task waiting for a resource (sleeping), it is in same &quot;Wait Queue&quot;<br>TASK_ZOMBIE, task child without father<br>TASK_STOPPED, task being debugged<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ______________&nbsp;&nbsp;&nbsp;&nbsp; CPU Available&nbsp;&nbsp;&nbsp;&nbsp; ______________<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; ----------------&gt;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | TASK_RUNNING |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Real Running |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |______________|&nbsp; &lt;----------------&nbsp; |______________|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPU Busy<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; /|\<br>Waiting for |&nbsp;&nbsp;&nbsp; | Resource<br> Resource&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; | Available<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \|/&nbsp;&nbsp; |<br>&nbsp;&nbsp;&nbsp; ______________________<br>&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>&nbsp;&nbsp; | TASK_INTERRUPTIBLE / |<br>&nbsp;&nbsp; | TASK-UNINTERRUPTIBLE |<br>&nbsp;&nbsp; |______________________|<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Main Multitasking Flow<p>&nbsp;&nbsp;&nbsp; 從系統(tǒng)內核的角度看來,一個進程僅僅是進程控制表(process table)中的一項。進程控制表中的每一項都是一個task_struct 結構,而task_struct 結構本身是在include/linux/sched.h中定義的。在task_struct結構中存儲各種低級和高級的信息,包括從一些硬件設備的寄存器拷貝到進程的工作目錄的鏈接點。<p>&nbsp;&nbsp;&nbsp; 進程控制表既是一個數(shù)組,又是一個雙向鏈表,同時又是一個樹。其物理實現(xiàn)是一個包括多個指針的靜態(tài)數(shù)組。此數(shù)組的長度保存在include/linux/tasks.h 定義的常量NR_TASKS中,其缺省值為128,數(shù)組中的結構則保存在系統(tǒng)預留的內存頁中。鏈表是由next_task 和prev_task兩個指針實現(xiàn)的,而樹的實現(xiàn)則比較復雜。<p>&nbsp;&nbsp;&nbsp; 系統(tǒng)啟動后,內核通常作為某一個進程的代表。一個指向task_struct的全局指針變量current用來記錄正在運行的進程。變量current只能由kernel/sched.c中的進程調度改變。當系統(tǒng)需要查看所有的進程時,則調用for_each_task,這將比系統(tǒng)搜索數(shù)組的速度要快得多。<p>二、用戶進程和內核線程<p>&nbsp;&nbsp;&nbsp; 某一個進程只能運行在用戶方式(user mode)或內核方式(kernel mode)下。用戶程序運行在用戶方式下,而系統(tǒng)調用運行在內核方式下。在這兩種方式下所用的堆棧不一樣:用戶方式下用的是一般的堆棧,而內核方式下用的是固定大小的堆棧(一般為一個內存頁的大小)<p>&nbsp;&nbsp;&nbsp; 盡管linux是一個宏內核系統(tǒng),內核線程依然存在,以便并行地處理一些內核的“家務室”。這些任務不占用USER memory(用戶空間),而僅僅使用KERNEL memory。和其他內核模塊一樣,它們也在高級權限(i386系統(tǒng)中的RING 0)下工作作。內核線程是被kernel_thread [arch/i386/kernel/process]創(chuàng)建的,它又通過調用著名的clone系統(tǒng)調用[arch/i386/kernel/process.c] (類似fork系統(tǒng)調用的所有功能都是由它最終實現(xiàn)):<p>int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long retval, d0;<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __asm__ __volatile__(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;movl %%esp,%%esi\n\t&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;int $0x80\n\t&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Linux/i386 system call */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;cmpl %%esp,%%esi\n\t&quot;&nbsp; /* child or parent? */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;je 1f\n\t&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* parent - jump */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Load the argument into eax, and push it.&nbsp; That way, it does<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * not matter whether the called function is compiled with<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * -mregparm or not.&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;movl %4,%%eax\n\t&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;pushl %%eax\n\t&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;call *%5\n\t&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* call fn */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;movl %3,%0\n\t&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* exit */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;int $0x80\n&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;1:\t&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&quot;=&amp;a&quot; (retval), &quot;=&amp;S&quot; (d0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&quot;0&quot; (__NR_clone), &quot;i&quot; (__NR_exit),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;r&quot; (arg), &quot;r&quot; (fn),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;b&quot; (flags | CLONE_VM)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : &quot;memory&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return retval;<br>}<p>&nbsp;&nbsp;&nbsp; 一旦調用,我們就有了一個新的任務(Task) (一般PID都很小, 例如2,3,等) 等待一個響應很慢的資源,例如swap或者usb事件,以便同步。下面是一些最常用的內核線程(你可以用ps x命令):<p>PID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMAND<br> 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init<br> 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keventd<br> 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kswapd<br> 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kreclaimd<br> 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bdflush<br> 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kupdated<br> 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kacpid<br>67&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; khubd<p>&nbsp;&nbsp;&nbsp;&nbsp; init內核線程也是啟動以后最初的進程。 它會調用其它用戶模式的任務,(/etc/inittab)例如控制臺守護進程(daemons), tty守護進程以及網絡守護進程(rc腳本)。<p>下面是一個典型的內核線程kswapd [mm/vmscan.c].<br>kswapd是被clone()建立的 [arch/i386/kernel/process.c]''<p>|do_initcalls<br>&nbsp;&nbsp; |kswapd_init<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |kernel_thread<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |syscall fork (in assembler)<p>&middot;do_initcalls [init/main.c]<br>&middot;kswapd_init [mm/vmscan.c]<br>&middot;kernel_thread [arch/i386/kernel/process.c]<p>三 進程創(chuàng)建,運行和消失<p>&nbsp;&nbsp;&nbsp; Linux系統(tǒng)使用系統(tǒng)調用fork( )來創(chuàng)建一個進程,使用exit( )來結束進程。fork( )和exit( )的源程序保存在kernel/fork.c and kernel/exit.c中。fork( )的主要任務是初始化要創(chuàng)建進程的數(shù)據(jù)結構,其主要的步驟有:<p>1)申請一個空閑的頁面來保存task_struct。<br>2)查找一個空的進程槽(find_empty_process( ))。<br>3)為kernel_stack_page申請另一個空閑的內存頁作為堆棧。<br>4)將父進程的LDT表拷貝給子進程。<br>5)復制父進程的內存映射信息。<br>6)管理文件描述符和鏈接點。<p>|sys_fork<br>&nbsp;&nbsp; |do_fork<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |alloc_task_struct<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |__get_free_pages<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |p-&gt;state = TASK_UNINTERRUPTIBLE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |copy_flags<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |p-&gt;pid = get_pid<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |copy_files<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |copy_fs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |copy_sighand<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |copy_mm // should manage CopyOnWrite (I part)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |allocate_mm<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |mm_init<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |pgd_alloc -&gt; get_pgd_fast<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |get_pgd_slow<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |dup_mmap<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |copy_page_range<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |ptep_set_wrprotect<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |clear_bit // set page to read-only<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |copy_segments // For LDT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |copy_thread<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |childregs-&gt;eax = 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |p-&gt;thread.esp = childregs // child fork returns 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |p-&gt;thread.eip = ret_from_fork // child starts from fork exit<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |retval = p-&gt;pid // parent fork returns child pid<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |SET_LINKS // insertion of task into the list pointers<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |nr_threads++ // Global variable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |wake_up_process(p) // Now we can wake up just created child<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |return retval<p>&middot;sys_fork [arch/i386/kernel/process.c]<br>&middot;do_fork [kernel/fork.c]<br>&middot;alloc_task_struct [include/asm/processor.c]<br>&middot;__get_free_pages [mm/page_alloc.c]<br>&middot;get_pid [kernel/fork.c]<br>&middot;copy_files<br>&middot;copy_fs<br>&middot;copy_sighand<br>&middot;copy_mm<br>&middot;allocate_mm<br>&middot;mm_init<br>&middot;pgd_alloc -&gt; get_pgd_fast [include/asm/pgalloc.h]<br>&middot;get_pgd_slow<br>&middot;dup_mmap [kernel/fork.c]<br>&middot;copy_page_range [mm/memory.c]<br>&middot;ptep_set_wrprotect [include/asm/pgtable.h]<br>&middot;clear_bit [include/asm/bitops.h]<br>&middot;copy_segments [arch/i386/kernel/process.c]<br>&middot;copy_thread<br>&middot;SET_LINKS [include/linux/sched.h]<br>&middot;wake_up_process [kernel/sched.c]<p>&nbsp;&nbsp;&nbsp; 撤消一個進程可能稍微復雜些,因為撤消子進程必須通知父進程。另外,使用kill( )也可以結束一個進程。sys_kill( )、sys_wait( )和sys_exit( )都保存在文件exit.c中。<p>&nbsp;&nbsp;&nbsp; 使用fork ( )創(chuàng)建一個進程后,程序的兩個拷貝都在運行。通常一個拷貝使用exec ( )調用另一個拷貝。系統(tǒng)調用exec ( )負責定位可執(zhí)行文件的二進制代碼,并負責裝入和運行。Linux系統(tǒng)中的exec ( )通過使用linux_binfmt結構支持多種二進制格式。每種二進制格式都代表可執(zhí)行代碼和鏈接庫。linux _binfmt結構種包含兩個指針,一個指向裝入可執(zhí)行代碼的函數(shù),另一個指向裝入鏈接庫的函數(shù)。<p>&nbsp;&nbsp;&nbsp; Unix系統(tǒng)提供給程序員6種調用exec( ) 的方法。其中的5種是作為庫函數(shù)實現(xiàn),而sys_execve( )是由系統(tǒng)內核實現(xiàn)的。它執(zhí)行一個十分簡單的任務:裝入可執(zhí)行文件的文件頭,并試圖執(zhí)行它。如果文件的頭兩個字節(jié)是#! ,那么它就調用在文件第一行中所指定的解釋器,否則,它將逐個嘗試注冊的二進制格式。<center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I408" ID="I408"></A><center><b><font size=+2>信號</font></b></center><br>struct semaphore {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; atomic_t count; 進程抓取semaphore時減1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sleepers; 抓取semaphore失敗時增1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wait_queue_head_t wait; semaphore的等待隊列<br>};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; down(&amp;sem) 編繹成:<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl $sem,% ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通過寄存器ecx向__down函數(shù)傳遞sem指針<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decl sem<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; js 2f 如果為負值,表示semaphore已被占用,執(zhí)行__down_failed過程<br>1:<br>由于出現(xiàn)semaphore競爭的可能性比較小,將分支代碼轉移到.text.lock段,以縮短正常的指令路徑.<br>.section .text.lock,&quot;ax&quot;<br>2:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call __down_failed<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp 1b<br>.previous<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; up(&amp;sem) 編繹成:<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl $sem,% ecx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incl sem<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jle 2f 如果小于或等于0,表示該semaphore有進程在等待,就去調用__up_wakeup<br>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www国产精品av| 亚洲国产乱码最新视频 | 久久色在线观看| 日韩精品在线网站| 日韩欧美三级在线| 久久久久久久久久久久久夜| 欧美成人福利视频| 久久久av毛片精品| 亚洲综合色噜噜狠狠| 美女网站色91| av高清久久久| 精品理论电影在线| 亚洲日本一区二区| 麻豆久久久久久久| 懂色中文一区二区在线播放| 风间由美一区二区三区在线观看 | 91原创在线视频| 精品国产乱码久久久久久久| 国产精品国产馆在线真实露脸| 亚洲观看高清完整版在线观看 | 欧美激情在线免费观看| 午夜精品aaa| 色综合久久中文字幕综合网| 日韩片之四级片| 免费高清视频精品| 在线电影一区二区三区| 日韩成人dvd| 韩国v欧美v亚洲v日本v| 欧美午夜不卡在线观看免费| 国产欧美一区二区三区在线看蜜臀| 亚洲成人一二三| 在线观看不卡视频| 一区二区三区在线观看视频| 成人激情校园春色| 中文字幕乱码亚洲精品一区| 国产69精品久久99不卡| 中文一区二区在线观看| 久久福利资源站| 日韩无一区二区| 蜜芽一区二区三区| 精品国产123| 国产美女娇喘av呻吟久久| 国产三级久久久| 色就色 综合激情| 香蕉久久夜色精品国产使用方法| 欧美日韩一二三| 久久福利资源站| 成人免费一区二区三区在线观看| 91美女在线视频| 亚洲一区二区三区国产| 91久久精品一区二区三区| 亚洲国产精品久久久男人的天堂 | 亚洲色图都市小说| 欧美精品免费视频| 国产酒店精品激情| 亚洲v精品v日韩v欧美v专区| 久久先锋影音av鲁色资源| 日本精品免费观看高清观看| 免费人成在线不卡| 亚洲精品欧美二区三区中文字幕| 日韩视频在线观看一区二区| 9i看片成人免费高清| 久88久久88久久久| 美女视频黄免费的久久| 亚洲男人的天堂在线aⅴ视频| 粉嫩aⅴ一区二区三区四区| 亚洲免费视频成人| 欧美一级免费大片| 欧美色爱综合网| 日韩欧美一卡二卡| 色婷婷av久久久久久久| 国产精品中文字幕欧美| 日本视频在线一区| 亚洲狠狠爱一区二区三区| 中文字幕亚洲在| 国产精品免费人成网站| 亚洲国产精品黑人久久久| xnxx国产精品| 欧美久久婷婷综合色| 91精品福利视频| 欧美性大战久久久久久久蜜臀| www.欧美色图| 成人av资源站| 91久久精品一区二区| 欧美中文字幕一区二区三区| 色综合激情久久| 欧美日本精品一区二区三区| 欧美群妇大交群的观看方式| 在线播放欧美女士性生活| 91精品国产综合久久精品图片| 欧美电影一区二区三区| 精品国精品国产| 亚洲视频一二三区| 日产国产欧美视频一区精品| 久久99国产精品麻豆| 9人人澡人人爽人人精品| 在线观看免费亚洲| 久久久亚洲高清| 久久精品国产秦先生| 国产91对白在线观看九色| 欧美最猛性xxxxx直播| 欧美一级片在线| 中文字幕日韩精品一区 | 国产91精品久久久久久久网曝门| 色婷婷综合在线| 精品福利av导航| 亚洲中国最大av网站| 久久国产成人午夜av影院| 成人三级在线视频| 播五月开心婷婷综合| 欧美一区欧美二区| 国产精品福利在线播放| 久久99久久99精品免视看婷婷| 99精品热视频| 久久久精品tv| 麻豆精品国产传媒mv男同| 色婷婷国产精品| 国产精品理论片在线观看| 精品影视av免费| 日韩欧美一级二级三级| 偷拍亚洲欧洲综合| 在线观看视频欧美| 亚洲色图20p| 色婷婷综合久色| 亚洲午夜电影网| 欧美视频在线观看一区| 亚洲成人免费av| 日韩精品中文字幕一区二区三区| 天天av天天翘天天综合网| 欧美日韩一卡二卡三卡 | 日本丶国产丶欧美色综合| 亚洲人成亚洲人成在线观看图片 | 亚洲一区影音先锋| 在线精品视频免费播放| 午夜精品福利一区二区三区av| 日韩一区二区三区电影在线观看 | 免费在线看成人av| 亚洲国产岛国毛片在线| 99re热视频精品| 天天综合日日夜夜精品| 久久久久久久久伊人| 本田岬高潮一区二区三区| 国产亚洲欧洲一区高清在线观看| 免费精品99久久国产综合精品| 精品欧美黑人一区二区三区| 97久久精品人人做人人爽| 高清不卡一二三区| 成人免费va视频| 免费观看成人av| 色天天综合色天天久久| 日日欢夜夜爽一区| 中文字幕第一区综合| 91精品国产品国语在线不卡| www.日韩精品| 国产成人在线视频播放| 午夜视频在线观看一区二区| 久久久久久久久久久电影| 欧美精品三级日韩久久| 色诱视频网站一区| 国产精品一区二区你懂的| 蜜臀av性久久久久蜜臀aⅴ流畅 | 精品一区二区国语对白| 午夜日韩在线电影| 亚洲综合视频在线观看| 亚洲精品水蜜桃| 日韩一区二区中文字幕| 欧美日韩一区 二区 三区 久久精品| 国产91综合一区在线观看| 久久国产欧美日韩精品| 亚洲第一福利一区| 一区二区高清免费观看影视大全| 欧美成人性福生活免费看| 在线国产亚洲欧美| 精品1区2区3区| 欧美专区日韩专区| 日韩欧美成人午夜| 日韩精品自拍偷拍| 欧美激情一区二区三区不卡| 国产农村妇女毛片精品久久麻豆| 国产日产欧产精品推荐色 | 经典一区二区三区| 国产91精品久久久久久久网曝门| 成人av电影免费观看| 欧美老年两性高潮| 久久亚洲综合色一区二区三区| 久久在线免费观看| 亚洲精品日产精品乱码不卡| 精品一区二区三区av| 欧洲一区二区av| 欧美mv和日韩mv的网站| 国产视频911| 一区二区免费在线| 亚洲国产精品一区二区久久恐怖片| 国产精品不卡在线观看| 亚洲一区二区三区三| 高清成人在线观看| 欧美另类变人与禽xxxxx| 国产日韩欧美亚洲| 国内久久精品视频| 在线观看免费亚洲|