lunix clone函数

lunix clone函数

ID:40560548

大小:20.72 KB

页数:4页

时间:2019-08-04

lunix clone函数_第1页
lunix clone函数_第2页
lunix clone函数_第3页
lunix clone函数_第4页
资源描述:

《lunix clone函数》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux的Process信息保存在structtask_struct中,是由slab分配的而另一个重要的数据结构是thread_info,是存在每个process堆栈的底部,这样的好处是访问的时候可以少用一个寄存器,thread_info有一个task的成员,指向它所隶属的task_struct有一个重要的宏current来表明当前的task,在x86平台,current是通过计算当前thread_info的task成员来得到的,宏或者是函数current_thread_info()可以非常方便的从当前processstack中得到当前的thread_info,而其成员

2、task即是当前task即current_thread_info()->task;ProcessState·TASK_RUNNING(Runningorwaitingonarunqueue)·TASK_INTERRUPTIBLE(Sleeping/blocked,waitingforsomeconditiontoexit)·TASK_UNINTERRUPTILBLE ·TASK_ZOMBIE(Terminated,waitingparent'swait4()systemcall)·TASK_STOPPED(ThisoccursifthetaskreceivestheSIG

3、STOP,SIGTSTP,SIGTTIN,orSIGTTOUsignalorifitreceivesanysignalwhileitisbeingdebugged.)两个函数可以操作set_task_state(task,state); set_current_state(state);ProcessCreation Linux通过clone()系统调用来实现的fork(),clone()在内核中调用是的do_fork()函数,而do_fork()又调用了copy_process()来forkingprocess,copy_process()的流程如下:·calldup_

4、task_struct,这个创建一个kernelstack/thread_info/task_struct给新的process;·检测是否超过了当前user的资源限制;·将child和parent区分开,将processdescriptor的成员清空或设置初始值;·child的state被置为TASK_UNINTERRUPTIBLE,来保证child还不被运行;·设置child的task_struct的flags成员,标示是超级用户权限的PF_SUPERPRIV被清空,标示还未调用exec()的PF_FORKNOEXEC被置上;·通过get_pid()给pid成员赋值;·

5、根据传给clone()的参数来决定是否赋值openfiles/filesysteminfo/signalhandlers/processaddressspace/namespace·分割parent的剩余时间片·最后copy_process返回一个指向新child的指针给callerTheLinuxImplementationofThreadsLinux实现thread的方法比较特别,在linux内核中并没有thread这么一个概念,所有的线程在Linux内核中被看做是标准进程,LinuxKernel并不提供针对线程的调度,取而代之的是,在Linux中线程仅仅是一个与其他

6、进程共享某些特定资源的进程,每个线程有独立的task_struct。Linux的线程是由带有如下参数的clone()系统调用创建的:clone(CLONE_VM

7、CLONE_FS

8、CLONE_FILES

9、CLONE_SIGHAND,0);参数的含义:CLONE_VM:Parentandchildshareaddressspace.CLONE_FS:ParentandchildsharefilesysteminformationCLONE_FILES:Parentandchildshareopenfiles.CLONE_SIGHAND:Parentandchildshare

10、signalhandlersandblockedsignals. KernelThreadsKernelthread可以由如下函数创建:intkernel_thread(int(*fn)(void*),void*arg,unsignedlongflags)这个函数实际上也是由clone()带有一个CLONE_KERNEL参数而创建的 ProcessTermination 一个进程的结束,是由调用exit()系统调用来完成的,exit()将在内核中调起do_exit()函数,流程如下:·将current->flag的PF_EXI

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。