程序排程之建立程序

2021-08-19 22:15:20 字數 2804 閱讀 7987

do_fork

=>struct pid *pid = alloc_pid();

=>struct pid *pid = kmem_cache_alloc(pid_cachep, gfp_kernel);//分配pid結構體空間

=>nr = alloc_pidmap(current->nsproxy->pid_ns);//分配pid程序號

=>pid->nr = nr;//關聯

=>for (type = 0; type < pidtype_max; ++type)//初始化程序pid, pgid和sid私有hash表

==>init_hlist_head(&pid->tasks[type]);

=>hlist_add_head_rcu(&pid->pid_chain, &pid_hash[pid_hashfn(pid->nr)]);//將程序pid加入程序全域性hash表

=>return pid;//返回pid結構體

=>p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, pid);//拷貝父程序的東東到子程序

=>p = dup_task_struct(current);

=>struct task_struct *tsk = alloc_task_struct();

=>struct thread_info *ti = alloc_thread_info(tsk);

=>*tsk = *orig;//建立task_struct和thread_info的關係

tsk->stack = ti;

setup_thread_stack(tsk, orig);

=>retval = copy_files(clone_flags, p)//拷貝父程序的資源

retval = copy_fs(clone_flags, p)

retval = copy_sighand(clone_flags, p)

retval = copy_mm(clone_flags, p)

=>if (clone_flags & (clone_parent|clone_thread))//建立父子關係和夥伴關係列表

p->real_parent = current->real_parent;

else

p->real_parent = current;

p->parent = p->real_parent;

=>if (clone_flags & clone_thread)//如果是執行緒,則認祖歸宗,找到組織

=>p->group_leader = current->group_leader;

=>list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);//插入到領頭執行緒的鍊錶;新版本取消掉了tgid雜湊表

=>if (likely(p->pid))

==>add_parent(p);

==>if (thread_group_leader(p))

p->signal->tty = current->signal->tty;

p->signal->pgrp = process_group(current);

set_signal_session(p->signal, process_session(current));

attach_pid(p, pidtype_pgid, task_pgrp(current));//將p加入到當前程序的各種雜湊鍊錶中

=>struct pid_link *link;

link = &task->pids[type];

link->pid = pid;//指向領頭程序的pid

hlist_add_head_rcu(&link->node, &pid->tasks[type]);//加到領頭程序的雜湊表

attach_pid(p, pidtype_sid, task_session(current));

list_add_tail_rcu(&p->tasks, &init_task.tasks);

==>attach_pid(p, pidtype_pid, pid);

=>retval = copy_thread_tls(clone_flags, stack_start, stack_size, p, tls);

frame->ret_addr = (unsigned long) ret_from_fork; // 新程序的第一條指令

=>wake_up_new_task(p, clone_flags);//將新程序加到就緒佇列,專門一章用來講這個

=>return nr;//返回進行pid給應用層,pid結構體對應用層不可見

如果建立子程序,那麼還有如下場景需要處理

if (clone_flags & clone_vfork)//clone_vfork代表建立子程序

wait_for_completion(&vfork);//等一下子程序

載入子程序會通過execve系統呼叫進行

.load_binary	= load_aout_binary

=>retval = flush_old_exec(bprm);

=>retval = exec_mmap(bprm->mm);

=>mm_release(tsk, old_mm);

=>if (vfork_done)

程序名在核心態如何獲取,方法是 current->comm,作為字串列印即可

程序排程二 程序建立do fork

一 前言 kernel在啟動初期並沒有 程序 這個概念,因為不涉及多工併發 排程,kernel 起來後會在start kernel 中建立kthread和init程序,在0號程序的基礎上建立init程序 pid為1 0 程序會被設定成idle程序,加入到執行 佇列中。當cpu上沒有可排程程序時,排程...

OS之程序排程

處理機排程 在多道程式程式的環境中,記憶體中存在著多個程序,程序往往大於處理機數目,這就要系統按照某種演算法,動態的將處理機分配給處於就緒狀態的程序。是之執行,分配處理機的任務就是由處理機排程完成的。排程實質上是一種資源分配。處理機排程演算法的目標 處理價排程演算法的共同目標 1 資源利用率,為了提...

程序排程之喚醒

關於 wait event interruptible中的for迴圈裡面的condition怎麼才能為真,自己很迷惑,因為如果condition為真,那麼在wait event interruptible就直接退出了。根本走不到for迴圈裡面。define wait event interrupti...