2019-2020-1 20199323《Linux内核原理与分析》第七周作业

一 基本概念

1、进程概念

对正在运行的程序的一种抽象
可以分配处理器,并由处理器执行
内核观点:进程是分配系统资源(cpu时间、内存)的实体
进程的两个基本元素是程序代码(可能被执⾏行相同程序的其他进程共享)和代码相关联的数据集。进程是一种动态描述,但是并不代表所有的进程都在运⾏行。(进程在内存中因策略或调度需求,会处于各种状态)

2、进程的描述–PCB

进程的所有信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

进程控制块

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息;Linux内核的进程控制块是一个叫做task_struct结构体

task_struct是Linux内核的一种数据结构,每个进程都把它的信息放在 task_struct 这个数据结构⾥里

task_struct 包含了这些内容:

标⽰示符 : 描述本进程的唯⼀一标⽰示符,⽤用来区别其他进程。
优先级 :相对于其他进程的优先级。
程序计数器:程序中即将被执⾏行的下⼀一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下⽂文数据:进程执⾏行时处理器的寄存器中的数据。
I/O状态信息:包括显⽰示的I/O请求,分配给进程的I/O设备和被进程使⽤用的⽂文件列表。
所有运⾏在系统⾥里的进程都以 task_struct 链表的形式存在内核⾥里。

关于fork和vfork的却别:

1. fork():子进程拷贝父进程的数据段,代码段. vfork():子进程与父进程共享数据段.

2. fork():父子进程的执行次序不确定. vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec或_exit之后父进程才可能被调度运行。

3. vfork()保证子进程先运行,在她调用exec或_exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

4.当需要改变共享数据段中变量的值,则拷贝父进程。

二 实验








···
long do_fork(unsigned long clone_flags,
unsigned long stack_start,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
{
struct task_struct *p;
int trace = 0;
long nr;

// ...

// 复制进程描述符,返回创建的task_struct的指针
p = copy_process(clone_flags, stack_start, stack_size,
         child_tidptr, NULL, trace);

if (!IS_ERR(p)) {
    struct completion vfork;
    struct pid *pid;

    trace_sched_process_fork(current, p);

    // 取出task结构体内的pid
    pid = get_task_pid(p, PIDTYPE_PID);
    nr = pid_vnr(pid);

    if (clone_flags & CLONE_PARENT_SETTID)
        put_user(nr, parent_tidptr);

    // 如果使用的是vfork,那么必须采用某种完成机制,确保父进程后运行
    if (clone_flags & CLONE_VFORK) {
        p->vfork_done = &vfork;
        init_completion(&vfork);
        get_task_struct(p);
    }

    // 将子进程添加到调度器的队列,使得子进程有机会获得CPU
    wake_up_new_task(p);

    // ...

    // 如果设置了 CLONE_VFORK 则将父进程插入等待队列,并挂起父进程直到子进程释放自己的内存空间
    // 保证子进程优先于父进程运行
    if (clone_flags & CLONE_VFORK) {
        if (!wait_for_vfork_done(p, &vfork))
            ptrace_event_pid(PTRACE_EVENT_VFORK_DONE, pid);
    }

    put_pid(pid);
} else {
    nr = PTR_ERR(p);
}
return nr;

}
···

posted @ 2019-11-02 23:22  20199323王德胜  阅读(178)  评论(0编辑  收藏  举报