lunix clone函数.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
lunix clone函数

Linux的Process信息保存在structtask_struct中,是由slab分配的而另一个重要的数据结构是thread_info,是存在每个process堆栈的底部,这样的好处是访问的时候可以少用一个寄存器,thread_info有一个task的成员,指向它所隶属的task_struct有一个重要的宏current来表明当前的task,在x86平台,current是通过计算当前thread_info的task成员来得到的,宏或者是函数current_thread_info()可以非常方便的从当前process stack中得到当前的thread_info,而其成员task即是当前task即current_thread_info()-task;Process StateTASK_RUNNING (Running or waiting on a runqueue)TASK_INTERRUPTIBLE (Sleeping/blocked, waiting for some condition to exit)TASK_UNINTERRUPTILBLE?TASK_ZOMBIE (Terminated, waiting parents wait4() system call)TASK_STOPPED (This occurs if the task receives the SIGSTOP, SIGTSTP, SIGTTIN, or SIGTTOU signal or if itreceives any signal while it is being debugged.)两个函数可以操作set_task_state(task, state);?set_current_state(state);Process Creation?Linux通过clone()系统调用来实现的fork(), clone() 在内核中调用是的do_fork()函数, 而do_fork()又调用了copy_process()来forking process,copy_process()的流程如下:call dup_task_struct,这个创建一个kernel stack/thread_info/task_struct给新的process;检测是否超过了当前user的资源限制;将child和parent区分开,将process descriptor的成员清空或设置初始值;child的state被置为TASK_UNINTERRUPTIBLE,来保证child还不被运行;设置child的task_struct的flags成员,标示是超级用户权限的PF_SUPERPRIV被清空,标示还未调用exec()的PF_FORKNOEXEC被置上;通过get_pid()给pid成员赋值;根据传给clone()的参数来决定是否赋值open files/file system info/signal handlers/process address space/name space分割parent的剩余时间片最后copy_process返回一个指向新child的指针给callerThe Linux Implementation of ThreadsLinux实现thread的方法比较特别,在linux内核中并没有thread这么一个概念,所有的线程在Linux内核中被看做是标准进程,Linux Kernel并不提供针对线程的调度,取而代之的是,在Linux中线程仅仅是一个与其他进程共享某些特定资源的进程,每个线程有独立的task_struct。Linux的线程是由带有如下参数的clone()系统调用创建的:clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);参数的含义:CLONE_VM: Parent and child share address space.CLONE_FS: Parent and child share filesystem informationCLONE_FILES: Parent and child share open files.CLONE_SIGHAND: Parent and child share signal handlers and blockedsignals. ?Kernel ThreadsKernel thread可以由如下函数创建:intkernel_thread(int (*fn)(void *), void * arg, unsigned long flags)这个函数实际上也是由clone()带有一个CLONE_KERNEL参数而创建的?Proce

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档