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

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

?? 進程.txt

?? 講解linux內核 進程調度 部分經典講義
?? TXT
?? 第 1 頁 / 共 5 頁
字號:
進程  
      進程

目 錄
  進程 
    信號 
    sched.c 
    進程信號隊列 
    SMP 
    內核線程頁目錄的借用 
    代碼分析 
    線程 
    進程描述符 
    init進程從內核態切換到用戶態 
    SET_LINKS 
    REMOVE_LINKS 
    get_wchan() 
    sigframe的結構 
    rt_sigframe結構 
    信號隊列的結構 
    內核線程簡介 
    進程切換簡介 
    同步機制




進程

一  進程調度
    進程的狀態([include/linux.h]):
TASK_RUNNING, it means that it is in the "Ready List"
TASK_INTERRUPTIBLE, task waiting for a signal or a resource (sleeping)
TASK_UNINTERRUPTIBLE, task waiting for a resource (sleeping), it is in same 
"Wait Queue"
TASK_ZOMBIE, task child without father
TASK_STOPPED, task being debugged
       ______________     CPU Available     ______________
      |              |  ---------------->  |              |
      | TASK_RUNNING |                     | Real Running |
      |______________|  <----------------  |______________|
                           CPU Busy
            |   /|\
Waiting for |    | Resource
Resource   |    | Available
           \|/   |
    ______________________
   |                      |
   | TASK_INTERRUPTIBLE / |
   | TASK-UNINTERRUPTIBLE |
   |______________________|
                     Main Multitasking Flow
    從系統內核的角度看來,一個進程僅僅是進程控制表(process table)中的一項。進程控制表中的每一項都是一個task_struct 
結構,而task_struct 
結構本身是在include/linux/sched.h中定義的。在task_struct結構中存儲各種低級和高級的信息,包括從一些硬件設備的寄存器拷貝到進程的工作目錄的鏈接點。
    
進程控制表既是一個數組,又是一個雙向鏈表,同時又是一個樹。其物理實現是一個包括多個指針的靜態數組。此數組的長度保存在include/linux/tasks.h 
定義的常量NR_TASKS中,其缺省值為128,數組中的結構則保存在系統預留的內存頁中。鏈表是由next_task 
和prev_task兩個指針實現的,而樹的實現則比較復雜。
    
系統啟動后,內核通常作為某一個進程的代表。一個指向task_struct的全局指針變量current用來記錄正在運行的進程。變量current只能由kernel/sched.c中的進程調度改變。當系統需要查看所有的進程時,則調用for_each_task,這將比系統搜索數組的速度要快得多。
二、用戶進程和內核線程
    某一個進程只能運行在用戶方式(user mode)或內核方式(kernel 
mode)下。用戶程序運行在用戶方式下,而系統調用運行在內核方式下。在這兩種方式下所用的堆棧不一樣:用戶方式下用的是一般的堆棧,而內核方式下用的是固定大小的堆棧(一般為一個內存頁的大小)
    盡管linux是一個宏內核系統,內核線程依然存在,以便并行地處理一些內核的“家務室”。這些任務不占用USER 
memory(用戶空間),而僅僅使用KERNEL memory。和其他內核模塊一樣,它們也在高級權限(i386系統中的RING 
0)下工作作。內核線程是被kernel_thread 
[arch/i386/kernel/process]創建的,它又通過調用著名的clone系統調用[arch/i386/kernel/process.c] 
(類似fork系統調用的所有功能都是由它最終實現):
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
        long retval, d0;
        __asm__ __volatile__(
                "movl %%esp,%%esi\n\t"
                "int $0x80\n\t"         /* Linux/i386 system call */
                "cmpl %%esp,%%esi\n\t"  /* child or parent? */
                "je 1f\n\t"             /* parent - jump */
                /* Load the argument into eax, and push it.  That way, it does
                 * not matter whether the called function is compiled with
                 * -mregparm or not.  */
                "movl %4,%%eax\n\t"
                "pushl %%eax\n\t"
                "call *%5\n\t"          /* call fn */
                "movl %3,%0\n\t"        /* exit */
                "int $0x80\n"
                "1:\t"
                :"=&a" (retval), "=&S" (d0)
                :"0" (__NR_clone), "i" (__NR_exit),
                 "r" (arg), "r" (fn),
                 "b" (flags | CLONE_VM)
                : "memory");
        return retval;
}
    一旦調用,我們就有了一個新的任務(Task) (一般PID都很小, 例如2,3,等) 
等待一個響應很慢的資源,例如swap或者usb事件,以便同步。下面是一些最常用的內核線程(你可以用ps x命令):
PID      COMMAND
1        init
2        keventd
3        kswapd
4        kreclaimd
5        bdflush
6        kupdated
7        kacpid
67        khubd
     init內核線程也是啟動以后最初的進程。 它會調用其它用戶模式的任務,(/etc/inittab)例如控制臺守護進程(daemons), 
tty守護進程以及網絡守護進程(rc腳本)。
下面是一個典型的內核線程kswapd [mm/vmscan.c].
kswapd是被clone()建立的 [arch/i386/kernel/process.c]''
|do_initcalls
   |kswapd_init
      |kernel_thread
         |syscall fork (in assembler)
·do_initcalls [init/main.c]
·kswapd_init [mm/vmscan.c]
·kernel_thread [arch/i386/kernel/process.c]
三 進程創建,運行和消失
    Linux系統使用系統調用fork( )來創建一個進程,使用exit( )來結束進程。fork( )和exit( 
)的源程序保存在kernel/fork.c and kernel/exit.c中。fork( )的主要任務是初始化要創建進程的數據結構,其主要的步驟有:
1)申請一個空閑的頁面來保存task_struct。
2)查找一個空的進程槽(find_empty_process( ))。
3)為kernel_stack_page申請另一個空閑的內存頁作為堆棧。
4)將父進程的LDT表拷貝給子進程。
5)復制父進程的內存映射信息。
6)管理文件描述符和鏈接點。
|sys_fork
   |do_fork
      |alloc_task_struct
         |__get_free_pages
       |p->state = TASK_UNINTERRUPTIBLE
       |copy_flags
       |p->pid = get_pid
       |copy_files
       |copy_fs
       |copy_sighand
       |copy_mm // should manage CopyOnWrite (I part)
          |allocate_mm
          |mm_init
             |pgd_alloc -> get_pgd_fast
                |get_pgd_slow
          |dup_mmap
             |copy_page_range
                |ptep_set_wrprotect
                   |clear_bit // set page to read-only
          |copy_segments // For LDT
       |copy_thread
          |childregs->eax = 0
          |p->thread.esp = childregs // child fork returns 0
          |p->thread.eip = ret_from_fork // child starts from fork exit
       |retval = p->pid // parent fork returns child pid
       |SET_LINKS // insertion of task into the list pointers
       |nr_threads++ // Global variable
       |wake_up_process(p) // Now we can wake up just created child
       |return retval
·sys_fork [arch/i386/kernel/process.c]
·do_fork [kernel/fork.c]
·alloc_task_struct [include/asm/processor.c]
·__get_free_pages [mm/page_alloc.c]
·get_pid [kernel/fork.c]
·copy_files
·copy_fs
·copy_sighand
·copy_mm
·allocate_mm
·mm_init
·pgd_alloc -> get_pgd_fast [include/asm/pgalloc.h]
·get_pgd_slow
·dup_mmap [kernel/fork.c]
·copy_page_range [mm/memory.c]
·ptep_set_wrprotect [include/asm/pgtable.h]
·clear_bit [include/asm/bitops.h]
·copy_segments [arch/i386/kernel/process.c]
·copy_thread
·SET_LINKS [include/linux/sched.h]
·wake_up_process [kernel/sched.c]
    撤消一個進程可能稍微復雜些,因為撤消子進程必須通知父進程。另外,使用kill( )也可以結束一個進程。sys_kill( )、sys_wait( 
)和sys_exit( )都保存在文件exit.c中。
    使用fork ( )創建一個進程后,程序的兩個拷貝都在運行。通常一個拷貝使用exec ( )調用另一個拷貝。系統調用exec ( 
)負責定位可執行文件的二進制代碼,并負責裝入和運行。Linux系統中的exec ( 
)通過使用linux_binfmt結構支持多種二進制格式。每種二進制格式都代表可執行代碼和鏈接庫。linux 
_binfmt結構種包含兩個指針,一個指向裝入可執行代碼的函數,另一個指向裝入鏈接庫的函數。
    Unix系統提供給程序員6種調用exec( ) 的方法。其中的5種是作為庫函數實現,而sys_execve( 
)是由系統內核實現的。它執行一個十分簡單的任務:裝入可執行文件的文件頭,并試圖執行它。如果文件的頭兩個字節是#! 
,那么它就調用在文件第一行中所指定的解釋器,否則,它將逐個嘗試注冊的二進制格式。 
[目錄]




信號

struct semaphore {
        atomic_t count; 進程抓取semaphore時減1
        int sleepers; 抓取semaphore失敗時增1
        wait_queue_head_t wait; semaphore的等待隊列
};
        down(&sem) 編繹成:
        movl $sem,% ecx        通過寄存器ecx向__down函數傳遞sem指針
        decl sem
        js 2f 如果為負值,表示semaphore已被占用,執行__down_failed過程
1:
由于出現semaphore競爭的可能性比較小,將分支代碼轉移到.text.lock段,以縮短正常的指令路徑.
.section .text.lock,"ax"
2:        call __down_failed
        jmp 1b
.previous
        ...
        up(&sem) 編繹成:
        movl $sem,% ecx
        incl sem
        jle 2f 如果小于或等于0,表示該semaphore有進程在等待,就去調用__up_wakeup
1:
.section .text.lock,"ax"
2:        call __up_wakeup
        jmp 1b
.previous
        ...
__down_failed:
        pushl % eax
        pushl % edx
        pushl % ecx ; eax,edx,ecx是3個可用于函數參數的寄存器
        call __down
        popl % ecx
        popl % edx
        popl % eax
        ret
__up_wakeup:
        pushl % eax
        pushl % edx
        pushl % ecx
        call __up
        popl % ecx
        popl % edx
        popl % eax
        ret
; semaphore.c
void __down(struct semaphore * sem)
{
        struct task_struct *tsk = current;
        DECLARE_WAITQUEUE(wait, tsk);
        tsk->state = TASK_UNINTERRUPTIBLE;
        add_wait_queue_exclusive(&sem->wait, &wait);
        // 將當前進程加入到該semaphore的等待隊列中
        spin_lock_irq(&semaphore_lock);
        sem->sleepers++;
        for (;;) {
                int sleepers = sem->sleepers;
                /*
                * Add "everybody else" into it. They aren't
                * playing, because we own the spinlock.
                */
                // atomic_add_negative(int i,atomic_t *v)將i + v->counter相加,
                // 結果為負返回1,否則返回0
                if (!atomic_add_negative(sleepers - 1, &sem->count)) {
                // 如果(sleepers - 1 + sem->count.counter)非負,則說明
                // semaphore已經被釋放,可以返回
                        sem->sleepers = 0;
                        break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99国产麻豆精品| 91精品国产麻豆| 五月激情综合婷婷| 丝袜亚洲另类丝袜在线| 亚洲乱码国产乱码精品精小说| ㊣最新国产の精品bt伙计久久| 国产精品国产精品国产专区不蜜 | 韩国欧美国产一区| 麻豆精品蜜桃视频网站| 激情av综合网| 成人久久视频在线观看| 色综合久久精品| 欧美亚洲国产一区在线观看网站| 欧美日韩一级片网站| 秋霞国产午夜精品免费视频| 亚洲另类在线一区| 午夜一区二区三区视频| 激情久久五月天| 91免费视频网址| 日韩欧美一卡二卡| 国产欧美精品一区二区色综合| 1区2区3区欧美| 日韩福利视频网| 亚洲福利一区二区三区| 国产一区二区三区久久久| 麻豆91精品视频| 成人精品鲁一区一区二区| av日韩在线网站| 91精品国产综合久久精品图片| 欧美电影免费提供在线观看| 日韩精品一区二区在线| 日韩欧美精品在线| 日韩久久一区二区| 九色综合狠狠综合久久| 色婷婷av一区二区三区软件 | 亚洲精品成a人| 天天色 色综合| 亚洲高清视频在线| 麻豆成人综合网| 日本韩国欧美一区| 久久久久久久久久久久电影| 亚洲亚洲人成综合网络| 婷婷六月综合亚洲| 91麻豆国产福利在线观看| 日韩精品一区二区三区三区免费| 日韩限制级电影在线观看| 中文字幕一区二区三区av| 日韩精品成人一区二区三区 | 国产一区二区三区黄视频| 色国产综合视频| 国产精品久久久久四虎| 精品亚洲欧美一区| 97se亚洲国产综合自在线观| 欧美猛男超大videosgay| 国产精品久久三| 国产成人午夜99999| 日韩免费福利电影在线观看| 亚洲午夜私人影院| 91麻豆.com| 亚洲少妇最新在线视频| 综合欧美一区二区三区| 菠萝蜜视频在线观看一区| 亚洲精品一区二区三区香蕉| 日本特黄久久久高潮| 欧美日韩国产综合视频在线观看| 亚洲人成在线播放网站岛国| 99精品视频中文字幕| 国产日韩v精品一区二区| 精品在线观看视频| 欧美日韩高清不卡| 中文字幕在线免费不卡| 国产精品一区二区三区99| 精品捆绑美女sm三区| 久久97超碰色| 国产日韩一级二级三级| 国产99精品国产| 欧美国产丝袜视频| 国内精品国产三级国产a久久| 久久亚洲一区二区三区四区| 国产激情视频一区二区三区欧美| 久久久久久麻豆| 国产69精品一区二区亚洲孕妇| 国产欧美久久久精品影院| 99久久精品国产一区二区三区| 国产精品拍天天在线| 一本大道久久a久久综合| 国产欧美一二三区| 色综合天天综合给合国产| 亚洲国产成人va在线观看天堂| 欧美日本国产视频| 久久国产生活片100| 久久精品人人做| 91网站在线播放| 国产精品美女久久久久久久网站| 国产91精品入口| 夜夜揉揉日日人人青青一国产精品| 欧美天堂亚洲电影院在线播放| 午夜精品123| 久久精品人人做人人爽人人| 色狠狠桃花综合| 日韩成人免费看| 国产欧美一区二区三区在线看蜜臀| 色综合久久99| 精品亚洲国产成人av制服丝袜 | 国产黑丝在线一区二区三区| 一区二区三区在线免费视频| 欧美一卡2卡3卡4卡| 国产成人免费网站| 日韩影院精彩在线| 国产精品高潮呻吟久久| 91丝袜美女网| 日韩vs国产vs欧美| 自拍偷拍亚洲激情| 日韩一区二区免费电影| 99久久国产综合精品女不卡| 麻豆国产欧美日韩综合精品二区| 亚洲乱码中文字幕| 久久影院视频免费| 7777精品伊人久久久大香线蕉的| 成人动漫精品一区二区| 国产精品每日更新在线播放网址| 91精品国产综合久久精品| 91在线精品秘密一区二区| 精品制服美女久久| 免费观看91视频大全| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲精品乱码久久久久久久久| 国产成人av在线影院| 久久疯狂做爰流白浆xx| 亚洲国产综合色| 亚洲欧美日韩国产另类专区| 久久综合九色综合久久久精品综合| 欧美亚洲愉拍一区二区| 91蝌蚪国产九色| a4yy欧美一区二区三区| 国产一区二区三区日韩| 免费高清不卡av| 日本伊人色综合网| 26uuu国产电影一区二区| 9191国产精品| 69精品人人人人| 欧美伦理电影网| 欧美日韩一级片网站| 欧美中文字幕一二三区视频| 色天使久久综合网天天| 91亚洲国产成人精品一区二三| 成人精品视频.| 国产精品一二三区| 国产成人av电影在线观看| 国产乱码精品1区2区3区| 久久99精品久久久久婷婷| 老司机午夜精品| 极品美女销魂一区二区三区免费| 日韩精品免费专区| 久久成人综合网| 麻豆成人久久精品二区三区红| 久久精品国产第一区二区三区| 一级精品视频在线观看宜春院| 久久久久久亚洲综合| 日韩精品中文字幕在线不卡尤物| 欧美成人一级视频| 国产亚洲欧洲997久久综合| 国产亚洲欧美日韩日本| 2欧美一区二区三区在线观看视频| 91精品国产高清一区二区三区| 欧美白人最猛性xxxxx69交| 欧美一区二区三区啪啪| 欧美视频精品在线观看| 91麻豆精品国产91久久久久久久久| 欧美日韩精品一区二区在线播放| 欧美一级欧美三级| 日韩欧美亚洲国产精品字幕久久久| 欧美伊人久久久久久午夜久久久久| 91精品国产综合久久福利| 精品国产乱子伦一区| 亚洲同性gay激情无套| 午夜精品久久久久久不卡8050| 日本aⅴ亚洲精品中文乱码| 亚洲国产精品一区二区久久 | 亚洲品质自拍视频网站| 精品国产麻豆免费人成网站| 最新国产精品久久精品| 日韩有码一区二区三区| 成人网页在线观看| 9191成人精品久久| 欧美国产日产图区| 三级久久三级久久| 国产精品国产三级国产aⅴ无密码| 亚洲bt欧美bt精品777| 国产成a人无v码亚洲福利| 91亚洲男人天堂| 色老汉av一区二区三区| 国产馆精品极品| 91片在线免费观看| 精品国产免费人成在线观看| 亚洲一区在线播放| 福利91精品一区二区三区| 在线亚洲一区二区| 制服.丝袜.亚洲.中文.综合| 国产亚洲女人久久久久毛片|