Linux Kernel(三) 进程创建
2013-12-31 13:27
155 查看
其他操作系统提供产生进程的机制,新的地址空间里创建进程,然后读入可执行文件,最后开始执行。
Unix采用了不同的实现方式实现进程的创建。
通过fork()和exec()两个函数
首先,fork()函数拷贝当前进程创建一个新的子进程,exec函数负责读取可执行文件,并将其载入地址空间开始运行,
fork()函数:
Linux通过clone()系统调用实现fork(),这个调用通过一系列的参数标志来指明父、子进程需要共享的资源, fork(),vfork(),__clone()库函数都根据各自需要的参数标志去调用clone(),然后clone()去调用do_fork()函数 (do_fork()函数在kernel/fork.c头文件中),该函数调用拷贝进程的函数,运行进程
copy_process()函数基本工作简单介绍如下:
为新进程创建内核栈,thread_info()和task_struct,与当前值相同,子进程和父进程描述符完全相同(关于描述符见前一章),然后进行进程的资源检查,即进程数目是否超出最大限制,接下来子进程会把自己的许多成员恢复为初始值以与父进程区别,子进程的状态被设置为TASK_UNINTERRUPTIBLE,接下来copy_process调用copy_flags()以更新task_struct的flags成员,再会调用PID分配函数为新进程获得一个有效PID, 然后根据传递给clone()的参数表标志,copy_process()拷贝,共享打开的文件,文件系统信息,信号处理函数,进程地址空间和命名空间,
最后copy_process()函数返回一个指向子进程的指针。
Linux把所有的线程都当做进程处理
创建线程:
上面讲到了利用fork()类的函数与exec()类的函数创建进程,线程创建和普通进程类似,,只是在调用clone() 的时候传递了已明确的需要共享的资源关于clone()参数标志以及他们的作用,都是在<linux/sched.h>中定义的。
内核线程:
内核经常在后台执行操作,可通过内核线程来完成,flush对缓冲的操作一般通过内核线程实现,
root 1 0 0 12:27 ? 00:00:00 /sbin/init showopts
root 2 0 0 12:27 ? 00:00:00 [kthreadd]
root 3 2 0 12:27 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 12:27 ? 00:00:00 [kworker/0:0H]
root 7 2 0 12:27 ? 00:00:00 [migration/0]
root 8 2 0 12:27 ? 00:00:00 [rcuc/0]
root 9 2 0 12:27 ? 00:00:00 [rcub/0]
root 10 2 0 12:27 ? 00:00:02 [rcu_preempt]
root 11 2 0 12:27 ? 00:00:01 [rcuop/0]
root 12 2 0 12:27 ? 00:00:00 [rcuop/1]
root 13 2 0 12:27 ? 00:00:00 [rcuop/2]
root 14 2 0 12:27 ? 00:00:00 [rcuop/3]
root 15 2 0 12:27 ? 00:00:00 [rcuop/4]
root 16 2 0 12:27 ? 00:00:00 [rcuop/5]
root 17 2 0 12:27 ? 00:00:00 [rcuop/6]
root 18 2 0 12:27 ? 00:00:00 [rcuop/7]
root 19 2 0 12:27 ? 00:00:00 [rcuop/8]
root 20 2 0 12:27 ? 00:00:00 [rcuop/9]
root 21 2 0 12:27 ? 00:00:00 [rcuop/10]
root 22 2 0 12:27 ? 00:00:00 [rcuop/11]
root 23 2 0 12:27 ? 00:00:00 [rcuop/12]
root 24 2 0 12:27 ? 00:00:00 [rcuop/13]查看linux内核线程,部分截图
在<linux/kthread.h>可看到关于内核线程创建有关内容,当然,内核线程也只有内核线程创建。
Unix采用了不同的实现方式实现进程的创建。
通过fork()和exec()两个函数
首先,fork()函数拷贝当前进程创建一个新的子进程,exec函数负责读取可执行文件,并将其载入地址空间开始运行,
fork()函数:
Linux通过clone()系统调用实现fork(),这个调用通过一系列的参数标志来指明父、子进程需要共享的资源, fork(),vfork(),__clone()库函数都根据各自需要的参数标志去调用clone(),然后clone()去调用do_fork()函数 (do_fork()函数在kernel/fork.c头文件中),该函数调用拷贝进程的函数,运行进程
copy_process()函数基本工作简单介绍如下:
为新进程创建内核栈,thread_info()和task_struct,与当前值相同,子进程和父进程描述符完全相同(关于描述符见前一章),然后进行进程的资源检查,即进程数目是否超出最大限制,接下来子进程会把自己的许多成员恢复为初始值以与父进程区别,子进程的状态被设置为TASK_UNINTERRUPTIBLE,接下来copy_process调用copy_flags()以更新task_struct的flags成员,再会调用PID分配函数为新进程获得一个有效PID, 然后根据传递给clone()的参数表标志,copy_process()拷贝,共享打开的文件,文件系统信息,信号处理函数,进程地址空间和命名空间,
最后copy_process()函数返回一个指向子进程的指针。
Linux把所有的线程都当做进程处理
创建线程:
上面讲到了利用fork()类的函数与exec()类的函数创建进程,线程创建和普通进程类似,,只是在调用clone() 的时候传递了已明确的需要共享的资源关于clone()参数标志以及他们的作用,都是在<linux/sched.h>中定义的。
内核线程:
内核经常在后台执行操作,可通过内核线程来完成,flush对缓冲的操作一般通过内核线程实现,
root 1 0 0 12:27 ? 00:00:00 /sbin/init showopts
root 2 0 0 12:27 ? 00:00:00 [kthreadd]
root 3 2 0 12:27 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 12:27 ? 00:00:00 [kworker/0:0H]
root 7 2 0 12:27 ? 00:00:00 [migration/0]
root 8 2 0 12:27 ? 00:00:00 [rcuc/0]
root 9 2 0 12:27 ? 00:00:00 [rcub/0]
root 10 2 0 12:27 ? 00:00:02 [rcu_preempt]
root 11 2 0 12:27 ? 00:00:01 [rcuop/0]
root 12 2 0 12:27 ? 00:00:00 [rcuop/1]
root 13 2 0 12:27 ? 00:00:00 [rcuop/2]
root 14 2 0 12:27 ? 00:00:00 [rcuop/3]
root 15 2 0 12:27 ? 00:00:00 [rcuop/4]
root 16 2 0 12:27 ? 00:00:00 [rcuop/5]
root 17 2 0 12:27 ? 00:00:00 [rcuop/6]
root 18 2 0 12:27 ? 00:00:00 [rcuop/7]
root 19 2 0 12:27 ? 00:00:00 [rcuop/8]
root 20 2 0 12:27 ? 00:00:00 [rcuop/9]
root 21 2 0 12:27 ? 00:00:00 [rcuop/10]
root 22 2 0 12:27 ? 00:00:00 [rcuop/11]
root 23 2 0 12:27 ? 00:00:00 [rcuop/12]
root 24 2 0 12:27 ? 00:00:00 [rcuop/13]查看linux内核线程,部分截图
在<linux/kthread.h>可看到关于内核线程创建有关内容,当然,内核线程也只有内核线程创建。
struct task_struct *kthread_create(int (*threadfn)(void *data),...)
struct task_struct *kthread_run
#define kthread_run(threadfn, data, namefmt...) \ ({ \ struct task_struct *k; \ k=kthread_create(threadfn,data,namefmt,## __VA_ARGS__ ); \ if(!IS_ERR(k)) \ wake_up_process(k); \ k; \ }) \
相关文章推荐
- android进程创建分析
- Android Studio创建AIDL文件并实现进程间通讯
- 对linux 0.11版本内核中进程创建fork()的理解
- Linux下C语言编程--进程的创建
- Android 进程创建流程(Context的创建)
- Linux同一进程下创建多个可分离线程
- Cubietruck---19.andorid进程创建过程分析
- 创建守护进程记录时间.c
- 进程外服务器的代理存根DLL的创建
- Linux操作系统实验二:进程的创建与可执行程序的加载
- 如何获取某个进程的主窗口以及创建进程的程序名?
- erlang 创建一个进程所占的内存
- 创建进程 和 列出所有进程
- 14,多进程编程--创建进程
- 进程的创建与可执行程序的加载
- Linux下C语言编程入门-3关于进程的创建和执行
- 认识initrd进程的作用,及创建小Linux
- Linux进程创建之fork()函数
- 实验二:进程的创建与可执行程序的加载
- 如何利用Win32服务进程去创建一个GUI用户进程?