程序员应如何理解进程创建

末蓝、 2022-12-31 03:29 215阅读 0赞

本文是《操作系统:以程序员的角度》第四章,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要的,本章就从程序员的角度来讲解到底什么是进程、操作系统是如何实现进程的。本文承接上篇《程序员应如何理解进程》以下为本篇目录:

  • 进程是由谁创建的?在什么情况下创建的?
  • 操作系统创建进程:初始化
  • 进程创建进程:系统调用
  • 程序员什么情况下需要创建进程
  • 任务处理
  • 充分利用多核
  • 增强系统稳定性
  • 从进程的角度来理解操作系统
  • 实例讲解进程创建:fork与exec
  • 总结

从这一节起,我们将详细讲解进程的一生。进程如人生,进程的一生同样包含三个阶段,创建,运行和终结,本节是进程三部曲的开篇:进程创建。

接下来,我们讲解关于进程创建的诸多问题。

进程是由谁创建的?在什么情况下创建的?

幸好这个问题不像鸡生蛋蛋生鸡那样,这个问题的答案相对简单,进程的创建者有两种:

  • 操作系统可以创建新的进程
  • 进程也可以创建新的进程

其中,进程的创建者被称为父进程,创建出的进程被称为子进程。

1,操作系统创建进程:初始化

作为计算机的Boss,最初的进程是由操作系统创建的,操作系统在初始化的过程中会创建一系列进程。这些进程中有的是用户可见的,主要用来和用户进行交互,比如Windows或Linux开机后输入用户密码,这就是一个进程,这类进程被称之为前端进程(Foreground Processes);

有的是用户看不到的在背后默默运行的进程,比如用来检测系统是否有更新的进程,这类进程被称之为后端进程(Background Process)。在Windows或Linux系统中,虽然开机后我们没有打开任何程序,但是使用Windows下的任务管理器或者Linux中的ps命令,你都会发现操作系统已经创建了很多进程。

2,进程创建进程:系统调用

其实从本质上来说,进程最终都是由操作系统创建出来的,但是操作系统把创建进程作为一项服务提供给了用户程序。还记得程序员应该怎样向操作系统请求服务吗,没错,就是通过系统调用。用户程序可以通过系统调用来创建新的进程。在Linux(Unix)下这个系统调用是大名鼎鼎的fork,在Windows下这个系统调用叫做CreateProcess。

比如在Linux系统中,我们通过命令行来运行程序,其实命令行解释器,比如常用的bash,也是一个进程,bash进程等待用户输入,然后调用系统调用创建新的进程来执行命令。比如我们常用的ps命令,注意ps本身就是一个可执行程序,当用户敲击回车按键后,bash调用fork创建新的进程,这个新的进程运行的就是ps程序,bash本身不关心ps进程是如何工作的,bash要做的就是等待,等待ps运行完成并输出结果后返回到bash,然后等待用户的下一次输入,如图所示:

format_png

从操作系统使用者的角度来说,一切皆为进程。操作系统中你能看到的、能用的都是进程

因此,学习操作系统要以进程为核心,须知,操作系统中的一切都是为进程来服务的。

程序员什么情况下需要创建进程

本文剩余部分请参见这里《深入理解操作系统》。

发表评论

表情:
评论列表 (有 0 条评论,215人围观)

还没有评论,来说两句吧...

相关阅读

    相关 程序员如何理解进程创建

    本文是《[操作系统:以程序员的角度][Link 1]》第四章,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要的,本章就从程序员的角度来讲解到底什么是

    相关 程序员如何理解进程

    本文是《[操作系统:以程序员的角度][Link 1]》第四章,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要、极其关键的,本章就从程序员的角度来讲解

    相关 程序员如何理解中断

    本文是《操作系统:以程序员的角度》第三章,本章的主题是从程序员的角度来理解操作系统到底是如何工作的。本篇承接上文《[操作系统是如何获取键盘按键的][Link 1]》以下为本篇目

    相关 程序员如何理解内存:下篇

    本节是操作系统系列教程的第三篇文章,属于操作系统第一章即基础篇,在真正开始操作系统相关章节前在这一部分回顾一些重要的主题,以下是目录,由于本文篇幅较多因此按[上篇][Link

    相关 程序员如何理解机器学习

    什么是机器学习 人工智能领域先锋Arthur Samuel曾给出过一个很好的关于机器学习的定义,是这样说的: > 这一领域的研究主要是在不明确的编写程序的情况下赋予计算机学

    相关 程序员如何理解多态

    面向对象编程领域有个非常重要的概念,那就是多态,但是你真的理解这到底是什么意思吗?程序员该如何理解多态? 英文中的多态 多态一词其英文为“polymorphism”,在

    相关 程序员如何理解标准库

    记得当年在学了C/C++语言后一直有这样的疑惑,常用的printf函数以及C++中的cout函数到底是在哪里实现的? 相信不止我有这个疑问,这篇文章就来回答这个问题。 C