• 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;
    

    }
    ···

  • 相关阅读:
    ThinkPHP如果表名有下划线需要用Model应该怎么做?
    JS三级联动实例
    Sublime的使用!emmet常用快捷键梳理
    MUI极简的JS函数
    Atitit 自然语言处理原理与实现 attilax总结
    Atitit 自然语言处理原理与实现 attilax总结
    Atitit  自动化gui 与 发帖机 技术
    Atitit  自动化gui 与 发帖机 技术
    Atitit 衡量项目的规模
    Atitit 衡量项目的规模
  • 原文地址:https://www.cnblogs.com/w741741/p/11784747.html
Copyright © 2020-2023  润新知