博客主页:小智_x0___0x_
欢迎关注:点赞收藏✍️留言
系列专栏:Linux入门到精通
代码仓库:小智的代码仓库
一个程序想要运行,就必须加载到内存中,那么我们把一个已经加载到内存中的程序,叫做进程!(也可以叫做任务)
我们在Windows操作系统下,可以通过任务管理器来查看进程Ctrl+Shift+Esc
:
在Linux下,我们可以通过下面指令进行查看进程:
ps axj
#或者
top
我们来写一个C语言程序,通过编译来形成可执行程序。
#include
#include
int main()
{
while(1)
{
printf("我是一个进程\n");
sleep(1);
}
return 0;
}
编译之后形成可执行程序myprocess
:
此时这个myrocess
是一个可执行程序,在我们冯诺依曼体系结构来看,这个文件目前存放在磁盘中,属于外设,我们可以通过./myprocess
来将这个可执行程序加载到内存中,加载完成运行起来之后它就会变成一个进程。
ps axj | grep myprocess
#ps axj查看所有进程通过管道传给grep来过滤出含有myprocess的进程
ps axj| head -1 && ps axj | grep myprocess
#ps axj使用管道传递给head将表头属性打印出来
# ps axj查看所有进程通过管道传给grep来过滤出含有myprocess的进程
# 两个通过&&链接起来
我们平时写的代码,编译成可执行程序之后都是通过CPU来运行的,CPU想要拿到这些数据只能通过内存来获取,所以可执行程序先要加载到内存中,我们日常开机的时候就是将操作系统从磁盘中加载到内存,再通过CPU来运行。
我们再来画图理解一下一个可执行程序变成进程的过成>
一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程。操作系统必须将进程管理起来!
通过上篇操作系统是如何进行管理的我们可以知道,操作系统想要管理就必须还是这6个字>先描述,再组织!!!
操作系统先定义一个进程结构体struct
里面包含了进程的各种属性,一个对象表示一个进程,再使用结构体指针将这些对象组织起来,这样就能完成对进程的管理,其实就是对链表数据的增删查改!
在计算机中,进程是由一个或多个线程执行的计算机程序实例。它包含程序代码和当前活动。进程由操作系统内核管理,为每个进程创建和维护一个称为进程控制块(PCB)的数据结构。PCB 包含有关进程的信息,例如其进程 ID、状态、优先级、内存使用情况、指针信息和其他相关细节。操作系统使用此信息来高效地管理和调度进程。
课本上称之为PCB(process control block),
操作系统将所有PCB对象通过链表组织起来存储在内核里,将对进程的管理,变成了对PCB单链表的管理。
Linux操作系统下的PCB是: task_struct.
Linux内核中最基本的组织进程task_struct的方式,采用的是双链表组织的,在Linux中,PCB不仅仅在双链表中,还存在于内核用于管理进程的其他数据结构中。例如,每个进程都有一个称为进程ID(PID)的唯一标识符,存储在PCB中,并由内核用于识别和管理进程。 PCB还包含有关进程状态、优先级、内存使用情况和其他相关细节的信息。
进程的信息可以通过 /proc 系统文件夹查看
proc 是 Linux 系统下的一个目录,关机后,目录里面的信息全都没了,开机的时候操作系统会帮我们创建对应的目录和文件。proc 目录下的所有信息都是 Linux 操作系统用文件系统的方式把内存中的文件包括进程信息给我们展现出来,其中蓝色的数字表示一个目录,该数字就是进程的唯一标识 PID。该目录里面保存了进程的所有属性。
myprocess
进程:./myprocess
进程,这里还有一个grep -- color=auto myprocess
的进程,这是因为我们在使用grep
过滤内容的时候,首先先要将grep
加载入内存中运行,成为一个进程被CPU调度才能进行过滤,而这个进程名中也包含了myprocess
所以最终过滤会出现两个进程。我们也可以通过-v
选项来去除掉包含grep
的进程。head -1 && ps axj | grep myprocess |grep -v grep
我们再来查看一下myprocess
这个进程在/proc
目录下的内容
在一个进程中,当前工作目录(cwd)是进程当前正在执行的目录。它是进程的一个属性。比如我们使用touch
创建一个文件,在只写文件名的情况下,touch
这个进程就会默认在当前目录下查找文件或者将创建的文件放在当前目录下。exe 是一个链接文件,它就指向当前进程所对应的可执行程序的路径。
我们来举个例子:
重新编译跑起来之后我们可以看到在当前目录下创建了一个log.txt
我们没在程序中写我们的当前目录,程序确能在我们的根目录下创建文件,是因为程序执行时,会将cwd中的目录拼接在log.txt
之前fopen("cwd/log.txt","w");
今天我们学习了"Linux进程探秘"
相信大家看完有一定的收获。种一棵树的最好时间是十年前,其次是现在!
把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波~~~
,本文中也有不足之处,欢迎各位随时私信点评指正!