
基本概念(什么是进程?)

- 课本概念:程序的一个执行实例,正在执行的程序等
- 内核观点:担当分配系统资源(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:查看进程
有俩个进程,这是因为 我们使用grep myproc的原因,grep本身也是一个进程,刚好查看myproc时,grep进程中有关键字myproc。
ps ajx | head -1 && ps ajx | 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目录不是磁盘级文件,而是内存级文件
ppid
Linux中的进程都是父进程创建的。

ppid:

发现,每次终止之后重新运行,ppid都不变。我使用ps查看一下。
惊奇的发现它叫做bash:

shell是所有命令解释器的统称,bash则是Linux中的解释器。
bash是命令行解释器。

如果我们打开了俩个终端,那么就会有俩个-bash:

使用fork函数创建进程。


一个父进程可有多个子进程,但一个子进程只有一个父进程
树状结构
理解子父进程
父进程的fork返回值是>0.
子进程的fork返回值是0.


代码会共享,数据会各自有一份:




理解子进程

3294

被折叠的 条评论
为什么被折叠?



