Linux是如何创建进程的?为什么说Linux与其他操作系统不同?
(5)调用 alloc_pid() 函数为新进程分配一个独一无二的 pid,相关C语言代码如下,请看: ![]() 为新进程分配一个独一无二的 pid (6)根据 clone() 函数的参数标志位,拷贝或共享已经打开的文件、文件系统、信号处理函数、进程地址空间等资源,例如下面这段C语言代码: ![]() 拷贝或共享已经打开的资源 (7)将为新进程创建的 task_struct 结构体的指针返回给调用者,也即 do_fork() 函数。此时新创建的进程还没有被投入运行。 现在回到 do_fork() 函数。如果调用 clone() 函数时,没有传递 CLONE_STOPPED 参数,新创建的进程将被唤醒,并投入运行,这一过程的C语言代码如下: ![]() 唤醒,并投入运行 到这里,一个新的进程就被 Linux 创建完毕了。 Linux 内核有意让新创建的子进程先运行,因为子进程常常会立即调用 exec() 函数加载新的程序到内存中运行,这样就避免了写时拷贝的额外开销。如果父进程首先执行,显然极有可能开始往地址空间写入操作,导致拷贝动作发生。 小结 本节详细的从C语言代码层面分析了Linux内核创建进程的过程,可见,即使是复杂的操作系统代码,也是通过一系列基本C语言语法和函数实现的。那么,Linux 是如何创建线程的呢?之前我们曾经提到,Linux 系统并不特别区分进程和线程,线程其实是一种特殊的进程,Linux 是如何实现这一“特殊”过程的呢?限于篇幅,下一节再说了,敬请关注。 【编辑推荐】
点赞 0 (编辑:南京站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Firefox 70 将引入“非活跃 CSS”,快速排查 CSS 属性
- Win11 升级卡 TPM 2.0/ 安全启动解决方法 可以先通过dll绕过
- windows-server-2003 – 如何在Windows中监视镜像磁盘的运行
- Linux下如何拆分大的日志文件?
- Windows是否尝试查找IPv6 AAAA记录,即使它没有可路由的IPv6
- Linux系统安全小妙招,这些或许能够帮助到你
- 用OpenStack Designate构建一个DNS即服务(DNSaaS)
- Windows 10隐私指南:人人都应使用的设置
- 如何在Linux上复制文件/文件夹到远程系统?
- 你可以在新的Windows 10(Ubuntu)bash用户空间本地运行Docke