什么是进程,如何管理进程
基本概念(什么是进程?)
- 课本概念:程序的一个执行实例,正在执行的程序等
- 内核观点:担当分配系统资源(CPU时间,内存)的实体。
描述进程-PCB
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
- 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
kernel
是操作系统,他就像一款软件一样,对进程进行管理。
管理进程是通过进程的属性数据进行管理的。
即通过PCB:
struct tack_struct
{
int pid;
int status;
int prio;
void* memptr;
.....
上下文;
struct task_struct* next;
};
这是固定的一种数据结构,所以进程 = task_struct+ 程序的代码和数据。

CPU
将每个task_struct
进行排队,会根据优先级进行调度。就像面试官面试简历一样。是一个动态的特征。
进程 = 内核数据结构(task_struct) + 程序代码和数据
运行起来的程序 ----> 进行会根据task_struct属性 被OS调度器进行调度,运行。
为什么要有PCB?
因为OS要管理,先描述再组织。
task_struct 内部有什么属性?
Linux中的进程查看
在一个终端中运行程序,另一个进行查看
ps
:查看进程,当终止了程序之后,接着查看会看到ps ajx | head -1 && ps ajx | grep myproc
这是因为 我们使用grep myproc
的原因,grep
本身也是一个进程,刚好查看myproc
时,grep进程中有关键字myproc
。
我们可以再过滤掉grep:
ps ajx | head -1 | && ps ajx | grep myproc | grep -v grep
1.把程序运行起来,双击
或者./xxx.exe
--> 本质就是在系统中启动了一个进程.
进程分为:
a. 执行完就退出的进程 – ls
pwd
等指令
b. 一直不退出,直到用户退出 – 常驻进程
在运行myproc
后
ps ajx | head -1 && ps ajx | grep myproc
查看运行的进程
不查看grep在后面加上-v即可:
进程的id
每一个进程一旦运行就会有自己的pid
:
编译代码后运行,再另一个终端上查看pid
使用kill -9 + pid
即可杀掉指定pid 的进程。
根目录下的proc文件
proc全程process,里面的以数字命名的文件实际上就是进程的pid
。内部都是进程的属性。
运行进程后:
查看进程是否在/proc
内:
杀掉进程后查看是否在:
说明进程在proc
中是实时更新的。
进程文件中有什么
exe(原执行文件)
其中exe
对应的是进程文件的位置。
当我们删掉可执行程序:
发现进程还在运行
这是因为,进程文件已经在内存中,而我们删除的是磁盘中的文件。
接着我们再次查看进程文件内部:
发现exe
变为红色,在不断跳动。
所以exe
指向的是原执行文件。
cwd
(当前工作目录)
当log.txt
被创建时,需要以全路径的方式进行拼接。所以需要cwd
。
改变工作目录
chdir("/")
:改变到根目录
实际上再/proc
目录下可以查看到所有进程的属性信息,ps
指令实际上就是对该目录下的文件进行文本分析。
proc
目录不是磁盘级文件,而是内存级文件
例如:
村中100人,有20个低保名额,最后调查,真正低保名额只有十个,因为有十个人不在村里。
ppid
Linux
中的进程都是父进程创建的。
ppid
:
发现,每次终止之后重新运行,ppid
都不变。我使用ps
查看一下。
惊奇的发现它叫做bash
:
shell是所有命令解释器的统称,bash则是Linux
中的解释器。
bash是命令行解释器。
如果我们打开了俩个终端,那么就会有俩个-bash
:
使用fork函数
创建进程。
一个父进程可有多个子进程,但一个子进程只有一个父进程
树状结构
理解子父进程
父进程的fork返回值是>0
.
子进程的fork返回值是0
.
代码会共享,数据会各自有一份: