《奔跑吧linux内核》3.1笔记,不足之处还望大家批评指正

进程是Linux内核最基本的抽象之一,它是处于执行期的程序。它不仅局限于一段可执行代码(代码段),还包括进程需要的其他资源。在Linux内核中常被称作任务。

线程被称为轻量级进程,是操作系统调度的最小单元,通常一个进程可以拥有多个线程。

进程和线程的区别在于进程拥有独立的资源空间,而线程则共享进程的资源空间。

问题一:在内核中如何获取当前进程的task_struct数据结构?

  内核有一个常用的常量current用于获取当前进程task_struct数据结构,它利用了内核栈的特性。首先通过sp寄存器获取当前内核栈的地址,对齐后获取struct thread_info数据结构指针,最后通过thread_info->task成员获取task_struct数据结构。图1为linux内核栈的结构图。

图1 内核栈

问题二:下面程序会打印几个“_”?

int main(void){

  int i;

  for(i=0; i<2; i++){

    fork();

    printf("_\n");}

  wait(NULL);wait(NULL);

  return 0;}

  答案是6个“_”,具体思路如图2所示。(i=0,调用一次fork后,父进程a创建子进程b,此后a和b进行打印,打印两个“_”;后i=1,a和b均调用fork,a创建子进程a_1,b创建子进程b_1,4个进程执行打印操作,打印出四个“_”;i=2,返回)

图2 fork解题思路

问题三:用户空间进程的页表是什么时候分配的,其中一级页表什么时候分配?二级页表呢?

  (此问有点疑问,暂且认为一级页表为页目录项(pgd),二级页表为也表项(pte))

  对于内核来说,进程的“鼻祖”是idle进程,称为swapper进程;对于用户空间来说,进程“鼻祖”是init进程,所有用户空间进程都由init进程创建或派生。

  在mm_init()函数中,首先给新进程的mm_struct数据结构进行初始化,然后对mm_users,mm_count进行初始化,设置进程空间地址读写信号量,设置保护进程页表的spinlock锁,最后调用pgd_alloc()函数进行pgd页表的分配工作。在pgd_alloc()函数中,调用pte_alloc_map()函数进行第0,第1个页表的分配,此后在dup_mmap()函数中将父进程所有的VMA对应的pte页表项复制到子进程对应的pte页表项中。

问题四:请简述fork,vfork和clone之间的区别?

  fork,vfork,clone的实现都是通过调用do_fork()函数实现的,只是函数调用不一样。

  fork函数实现:do_fork(SIGCHLD,0,0,NULL,NULL);只使用SIGCHLD标志位,在子进程终止后发送SIGCHLD信号通知父进程。fork是重量级调用,为子进程建立了一个基于父进程的完整副本,然后子进程基于此运行。为了减少工作量采用写时复制技术(COW),子进程只复制父进程的页表,不复制页面内容。当子进程需要写入新内容时,才触发写时复制机制,为子进程创建一个副本。

  vfork函数实现:do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,0,0,NULL,NULL);它比fork多了两个标志位,分别为CLONE_VFORK和CLONE_VM。CLONE_VFORK表示父进程会被挂起,直至子进程释放虚拟内存资源。CLONE_VM表示父子进程运行在相同的内存空间中。

  clone函数实现:do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);clone用于创建线程,并且参数通过寄存器从用户空间传递下来,通常会指定新的栈地址(newsp)。

Linux内核 ——进程管理之进程诞生(基于版本4.x)的更多相关文章

  1. Linux进程管理 (1)进程的诞生

    专题:Linux进程管理专题 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 L ...

  2. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  3. 十天学Linux内核之第二天---进程

    原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲 ...

  4. Linux内核分析-创建新进程的过程

    分析Linux内核创建一个新进程的过程 task_struct结构体分析 struct task_struct{ volatile long state; //进程的状态 unsigned long ...

  5. Linux内核分析— —创建新进程的过程

    分析Linux内核创建一个新进程的过程 实验过程 要求:使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环 ...

  6. 实验 六:分析linux内核创建一个新进程的过程

    实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...

  7. 《Linux内核--分析Linux内核创建一个新进程的过程 》 20135311傅冬菁

    20135311傅冬菁 分析Linux内核创建一个新进程的过程 一.学习内容 进程控制块——PCB  task_struct数据结构 PCB task_struct中包含: 进程状态.进程打开的文件. ...

  8. 作业六:分析Linux内核创建一个新进程的过程

    分析Linux内核创建一个新进程的过程 进程描述符PCB----task_struct数据结构 操作系统:1.进程管理 2.内存管理 3 文件系统 一.新进程如何创建和修改task_struct数据结 ...

  9. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

  10. 第六周分析Linux内核创建一个新进程的过程

    潘恒 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 task_struct结构: ...

随机推荐

  1. echarts散点图重叠

    今天做echarts图标,使用了散点图.很快实现,发现数据不对,应该是3个的企业,页面只显示了2个,查了半天才发现原来是有两个重叠了.想办法解决了,在网上费劲九牛二虎只力终于找到了解决的方法,下面来解 ...

  2. EasyUI/TopJUI可编辑表格的列根据返回数据判断是使用 combobox 还是 numberbox

    这两天研究了一下topjui的可编辑表格edatagrid,想在每一列的后面根据返回的数据判断是使用 combobox 还是 numberbox,期间遇到了一些坑,下面实现代码,需要的朋友可以参考一下 ...

  3. 三维BFS Poj 2251

    #include <iostream> #include <cstdio> #include <string> #include <cstring> # ...

  4. 转 PHP函数---$_Get()和$_Post()的用法

    一.$_Get()和$_Post()函数是用来传值的,即对应两种提交表单的方法,get和post. 二.$_Get方法 (1)获取通过URL的传值 Example 1 新建两个PHP文件,1.php, ...

  5. nodejs 学习(1) http与fs

    var http=require("http"), fs=require('fs'); var server=http.createServer(function(req,res) ...

  6. 174. 删除链表中倒数第n个节点

    描述 笔记 数据 评测 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 您在真实的面试中是否遇到过这个题? Yes 样例 给出链表1->2-&g ...

  7. HTML 5的革新——更简洁的结构

    今天我们阐述HTML 5的革新之一:更简洁的结构. 新的文档类型 DOCTYPE 先来解释一下文档类型 DOCTYPE:文档类型位于HTML源文件的第一行,在HTML4的标准中,DOCTYPE在被归在 ...

  8. #118. 【UR #8】赴京赶考

    链接:#118. [UR #8]赴京赶考 高中,高中,短暂的三年.NOI是高中结业考试,而高考在每年暑假举行. 高二暑假,这是你最后一次参加高考的机会.你已经为了高考停课很久了,OI的知识很久没管了. ...

  9. pay-spring-boot 开箱即用的Java支付模块,整合支付宝支付、微信支付

    关于 使用本模块,可轻松实现支付宝支付.微信支付对接,从而专注于业务,无需关心第三方逻辑. 模块完全独立,无支付宝.微信SDK依赖. 基于Spring Boot. 依赖Redis. 我能做什么 支付宝 ...

  10. leetcode287 Find the Duplicate Number

    思路: 转换成链表之后使用floyed判环法.转换之后重复的那个数字是唯一一个有多个前驱和一个后继的节点,因此是环的起始节点. 实现: class Solution { public: int fin ...