Linux Kernel(三) 进程创建

其他操作系统提供产生进程的机制,新的地址空间里创建进程,然后读入可执行文件,最后开始执行。

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;                                                      \
})                                                          \


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值