设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

Linux是如何创建进程的?为什么说Linux与其他操作系统不同?(2)

发布时间:2019-08-06 12:18 所属栏目:117 来源:嵌入式时代
导读:(5)调用 alloc_pid() 函数为新进程分配一个独一无二的 pid,相关C语言代码如下,请看: 为新进程分配一个独一无二的 pid (6)根据 clone() 函数的参数标志位,拷贝或共享已经打开的文件、文件系统、信号处理函数、进

(5)调用 alloc_pid() 函数为新进程分配一个独一无二的 pid,相关C语言代码如下,请看:

Linux是如何创建进程的?为什么说Linux与其他操作系统不同?

为新进程分配一个独一无二的 pid

(6)根据 clone() 函数的参数标志位,拷贝或共享已经打开的文件、文件系统、信号处理函数、进程地址空间等资源,例如下面这段C语言代码:

Linux是如何创建进程的?为什么说Linux与其他操作系统不同?

拷贝或共享已经打开的资源

(7)将为新进程创建的 task_struct 结构体的指针返回给调用者,也即 do_fork() 函数。此时新创建的进程还没有被投入运行。

现在回到 do_fork() 函数。如果调用 clone() 函数时,没有传递 CLONE_STOPPED 参数,新创建的进程将被唤醒,并投入运行,这一过程的C语言代码如下:

Linux是如何创建进程的?为什么说Linux与其他操作系统不同?

唤醒,并投入运行

到这里,一个新的进程就被 Linux 创建完毕了。

Linux 内核有意让新创建的子进程先运行,因为子进程常常会立即调用 exec() 函数加载新的程序到内存中运行,这样就避免了写时拷贝的额外开销。如果父进程首先执行,显然极有可能开始往地址空间写入操作,导致拷贝动作发生。

小结

本节详细的从C语言代码层面分析了Linux内核创建进程的过程,可见,即使是复杂的操作系统代码,也是通过一系列基本C语言语法和函数实现的。那么,Linux 是如何创建线程的呢?之前我们曾经提到,Linux 系统并不特别区分进程和线程,线程其实是一种特殊的进程,Linux 是如何实现这一“特殊”过程的呢?限于篇幅,下一节再说了,敬请关注。

【编辑推荐】

  1. 从C语言源代码分析,神秘的Linux系统是如何记录和描述进程的?
  2. GNOME 和 KDE 在 Linux 桌面上联手合作
  3. 7月操作系统、浏览器份额出炉:Windows 10一路狂飙、Chrome依然逆天
  4. 如何查找Linux上的硬件规格?
  5. Window下不用安装虚拟机,也可以玩转Linux,玩转最新Redis
【责任编辑:华轩 TEL:(010)68476606】
点赞 0

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读