欢迎来到天天文库
浏览记录
ID:40560548
大小:20.72 KB
页数:4页
时间:2019-08-04
《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
此文档下载收益归作者所有