Linux内核 ——进程管理之进程诞生(基于版本4.x)

  int
i;

 

标题二:上面程序会打印多少个“_”?

题目一:在基本中怎样拿到当前经过的task_struct数据结构?

  内核有一个常用的常量current用于获取当前经过task_struct数据结构,它选取了内核栈的风味。首先通过sp寄存器获取当前内核栈的地址,对齐后拿到struct
thread_info数据组织指针,最后经过thread_info->task成员取得task_struct数据结构。图1为linux内核栈的构造图。

图片 1图1
内核栈

   fork,vfork,clone的落到实处都以由此调用do_fork()函数完毕的,只是函数调用不平等。

  return
0;}

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

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

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

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

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

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

 

标题三:用户空间进度的页表是哪天分配的,其中一级页表曾几何时分配?二级页表呢?

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

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

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

进程是Linux内核最中央的肤浅之一,它是高居执行期的先后。它不仅仅局限于一段可实施代码(代码段),还包蕴经过要求的其余资源。在Linux内核中常被称作职分。

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

    fork();

  wait(NULL);wait(NULL);

线程被称呼轻量级进度,是操作系统调度的细小单元,平常一个经过可以享有三个线程。

    printf(“_\n”);}

  clone函数完结:do_fork(clone_flags, newsp, 0, parent_tidptr,
child_tidptr);clone用于成立线程,并且参数通过寄存器从用户空间传递下去,日常会指定新的栈地址(newsp)。

 

int
main(void){

图片 2图2
fork解题思路

相关文章