前言:在了解完冯诺依曼体系结构和操作系统之后,我们进入了Linux的下一篇章Linux进程,但在学习Linux进程之前,一定要阅读理解上一篇内容,理解“先描述,再组织”
才能更好的理解进程的含义。
Linux进程学习基础
本篇主要内容:
- 进程的概念
- 通过系统调用获取进程标示符
Linux进程
- 1. 进程的概念
- 1.1 描述进程-PCB
- 1.2 CPU对于进程列表的处理
- 2. 通过系统调用获取进程标示符
- 2.1 查看进程信息
- 2.2 终止进程
- 2.3 系统调用函数:getpid
- 2.4 父进程和子进程
- 3. 总结
1. 进程的概念
在学习进程之前,大家对进程肯定初步的了解,那么今天我们来深入了解一下
基本概念:
- 课本概念:程序的一个执行实例,正在执行的程序等
- 内核观点:担当分配系统资源(CPU时间,内存)的实体。
1.1 描述进程-PCB
在上一篇中,我们提到了:
管理的本质不是管理个体,而是管理个体的数据!
而操作系统管理进程也是如此,管理的进程对应的数据
而在操作系统对进程上,依然采用的是“先描述,再组织”的方法
操作系统将可执行程序的各种数据加载,拷贝出来,再用结构体把数据存进去,由于可能同时会存在多个进程,所以操作系统使用链表或其他数据结构将它们链接在一起!
而这个又操作系统产生控制进程的结构就是PCB
PCB:
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
- 课本上称之为PCB(process control block),Linux操作系统下的PCB是:
task_struct
1.2 CPU对于进程列表的处理
在CPU对进程列表进行处理时,PCB中的数据有时不会被CPU立刻处理,因此他会进入进程队列,排队等待处理
操作系统内由于进程的控制十分复杂,一个PCB可能链接到多个数据结构上。
因此: 进程=可执行程序 + 内核数据结构(PCB)
2. 通过系统调用获取进程标示符
2.1 查看进程信息
每一个进程都有自己对应的标识符当我们想查看进程的信息:
指令:
ps ajx
这样做的话我们查看的是所有进程,这里我们就要用到之前的学过的指令了。
现在我们来写一个程序来观察他的进程状态
写死循环方便我们更好观察,运行程序我们再打开一个窗口,搜索程序的进程:
指令:
ps ajx | grep mytest
此时,为什么会出现两个进程呢?
- 因为在grep指令发挥作用时,也会形成一个mytest文件
我们直接查看进程并不能知道每个数据表达的意思,所以我们可以加上:
指令:
ps ajx | head -1
来查看每一行的信息
指令:
ps ajx | head -1 && ps ajx | grep 可执行程序
2.2 终止进程
在我们刚接触Linux时,通常按CTRL+c可以结束进程,现在在学习Linux进程时,还有一种方法可以杀死进程:
指令:
kill -9 进程id
注意:这里的-9是信号参数,后面会提到,现在直接使用即可
使用指令能直接杀死进程
以上说明我们所有运行的指令,软件,自己写的可执行程序都是进程!
2.3 系统调用函数:getpid
每次查看进程使用如果都要使用ps查看这样的话很浪费时间且繁琐,因此我们可以使用即将学习到的第一个系统调用函数:
函数:
getpid
我们先来简单了解一下 getpid
用系统调用函数查看PID
2.4 父进程和子进程
在使用ps指令查看进程信息时,除了PID我们可以看见左边还有一个PPID,当我们不断地启动结束进程时,PID每一次的数据都不一样,但是PPID却不会改变。而这PPID就是父进程
我们依然可以用函数来查看父进程:
函数:
getppid
因此我们可以知道这两个函数:
当我们不断地启动结束进程时,PID每一次的数据都不一样,但是PPID却不会改变,让我们来查看一下父进程信息
如果我们直接杀死父进程bash,那么我们的shell会直接挂掉
3. 总结
本篇主要学习的是进程的概念,CPU如何对PCB进行处理,以及初步学习如何查看父进程与子进程,希望大家能理解好PCB,下篇我们将深入了解进程的创建!
谢谢大家支持本篇到这里就结束了