【Linux】进程

我们已经有了之前的一些知识,就可以来谈进程了,那么什么是进程呢?我们知道可执行程序,难道一个可执行程序运行起来就是一个进程吗?这个说法是错误的。

进程:内核数据结构+可执行程序

什么是内核数据结构呢?我们上篇博客说到操作系统要进行管理要先描述再组织,同样操作系统要对于进程进行管理就要对于进程进行描述,比如说:每个进程都有自己独立的标识符,用于唯一确定某个进程,我们可以用一个整形存起来;每个进程都有自己的状态,是运行状态还是阻塞状态等等。这些不同的特征我们可以用一个结构体存起来,这个结构体就叫做PCB(全称是进程控制块Process Control Block)),并且在Linux内核的代码中,这个结构体就叫做struct task_struct{....},有了这个概念,那么,操作系统对于进程的管理就变成了对于PCB对象的管理。比如说进程之间要排队进入CPU进行运算,不是可执行程序在排队,而是PCB对象在排队。

有了这些概念,那我们先来见一见进程,我们如何在Linux中看到进程呢?

我们可以用这样的命令,意思是:

但是这进程实在是太多了,我们不如自己来创建一个进程试一试,我们可以写一个死循环

我们可以看到左边正在死循环的执行,右边可以通过我们的指令查看到对应的进程,为什么有两个呢?因为我们的ps ajx这个指令也算一个进程

下面我们来具体的看一看PCB中都有什么:

首先是进程的标识符,也叫PIDProcess Identifier),因为task_struct中存的是操作系统内部的数据,所以一定要用系统调用,我们可以通过一个系统调用getpid函数来得到一个程序的PID,因为是系统调用,所以只能Linux这个操作系统可以用,别的操作系统有别的系统调用

我们可以用man查一下,系统调用都在2号库

我们多编译运行几次,可以看到,每次的pid几乎都会变化,因为每次创建的都是一个新的进程

每个进程都有它的父进程,所以我们也可以看一下它的父进程

我们可以看到虽然pid每次都不同,但是ppid(父进程)却是相同的,这就证明每次都是由一个进程创建出来的,我们看看1517这个进程是什么

我们可以看到,这个进程正是bash,我们之前说过shell外壳的名字就叫做bash,bash就是一个进程,它可以创建子进程。

我们进程的信息其实是可以查到的,Linux中放在/proc这个目录下,我们可以通过如下指令看看其中放了什么,4713就是pid

其中cwd中放的是当前工作目录

exe中放的是究竟哪个可执行文件在运行

当前工作路径是啥?还记不记得我们之前写fopen函数

我们当前路径下如果没有这个文件,就在当前路径下创建一个,这里的路径就是工作路径,当然我们也可以用chdir改一下工作路径

我们可以看到,改完工作目录后确实创建了一个文件。

我们如果想要杀掉某个进程可以用kill -9 pid来杀掉某个进程

下面要说的fork也是一个Linux系统中的系统调用,它可以在一个进程运行的时候创建一个新的进程,这个新的进程自然就是我们运行中的进程的子进程,我们可以在二号手册查一下fork

fork其实是有返回值的,因为fork之后就有两个进程了,所以如果成功创建,它给父进程返回子进程的PID,给子进程返回0,如果创建失败,给父进程返回-1

那我们下面就可以写一个程序来用一下fork

运行结果是下面这样,为什么会有两个after呢?就是因为fork之后创建了一个子进程,这个子进程和父进程是共享代码的

一般而言,我们是想让父子进程做不同的事情,所以我们可以根据它们的返回值的差别来做出不同 的事情,比如下面这么写

父子进程是共享代码和数据的,如果子进程要改变某个数值,那么就给这个数据单独开一块空间,也叫写时拷贝

为什么给父进程返回0,给子进程返回父进程的pid呢?因为每个子进程都有一个唯一的父进程,返回父进程的pid就可以找到父进程,而每个父进程可能有多个子进程,返回0表示创建成功就可以了

fork函数它是如何做到返回两次的呢?其实在fork函数内部就已经分父子进程了,这样就可以给它们返回不同的值,并且在Linux中,我们可以用一个变量名(比如上面的id)表示不同的内存

一个进程崩溃了,不会影响其他的进程,因为任意进程之间是独立的,不能相互影响,操作系统就必须保证这一点

下面有一个比较有意思的代码,可以同时创建多个进程

我们可以看到进程不断变多然后又不断变少的过程

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 19:04:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 19:04:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 19:04:04       87 阅读
  4. Python语言-面向对象

    2024-05-11 19:04:04       96 阅读

热门阅读

  1. SpringBoot 中检测文件编码格式

    2024-05-11 19:04:04       37 阅读
  2. SpringBoot 中 zip 文件解压工具类

    2024-05-11 19:04:04       32 阅读
  3. 【Python】如何训练模型并保存本地和加载模型

    2024-05-11 19:04:04       35 阅读
  4. 计算机答辩常见问题汇总(一)

    2024-05-11 19:04:04       34 阅读
  5. 蒙特卡洛求PI(抛点法)TypeScript实现

    2024-05-11 19:04:04       33 阅读
  6. 第十周笔记

    2024-05-11 19:04:04       36 阅读
  7. WHAT - npm和npx

    2024-05-11 19:04:04       31 阅读
  8. 【LeetCode】每日一题:2960. 统计已测试设备

    2024-05-11 19:04:04       30 阅读