进程的基本概念
进程 在课本中的描述一般为:程序的一个执行实例,正在执行的程序,或者是一个程序运行起来(程序被加载到内存)就是进程,进程的内核观点是担当分配系统资源(CPU时间,内存)的实体。但是这些概念都很肤浅,我们应该如何去描述一个进程呢?
? 描述进程
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct
当我们把多个程序加载到内存中时,操作系统会对这些程序进行先描述,后组织。那么操作系统是如何对我们的程序进行描述和组织的呢?我们将写好的代码编译链接形成可执行程序存放在磁盘上,然后我们运行这个程序时,需要先将这个程序加载到内存中,然后通过CPU进行运算。当我们的程序加载到内存中时,操作系统会对我们的程序进行管理,对程序的管理方法我们在上面也提及到了:先描述,在组织。
操作系统在对我们的进程进行先描述,后组织的时候,会先将我们的程序的共有属性创建一个结构体,然后对我们的每一个进程创建一个结构体对象,这就是先描述的过程。接下来我们的操作系统会使用特性的数据结构(比如链表)将我们的结构体对象组织起来,这就是后组织的过程。然后我们的操作系统对进程的管理就会转换成对特定数据结构的管理。当然了,这个描述和组织进程的东西就被称为进程控制块(PCB)。
所以,在这里我们也引出了进程真正的概念:进程=内核关于进程的相关数据结构+当前进程的代码和数据。进程控制块(PCB) 是我们操作系统用来描述进程的工具,他包含了进程属性的集合。在Linux中描述进程的结构体叫做task_struct。他是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
下面我们看一下task_ struct内容分类:
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
查看进程和杀死进程
? 查看进程
查看进程有两种方式,这里我们先来讲解第一种:ps ajx | head -1 && ps ajx | grep '进程名' 这里我们还可以看到在我们的myproc进程的下面还有一个grep进程,这是因为grep指令也是一个进程,进程在调度的时候是具有动态属性的。这里我们还需要解释一个概念那就是PID和PPID的概念,操作系统里指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。 当然了,PPID就是父进程的进程ID号。当然了我们还可以直接到==/proc/进程pid==目录下去查看进程对应的可执行程序。? 杀死进程\n\n我们要结束我们的进程可以有两种方法:直接按ctrl+c结束进程或者杀死进程。杀死进程需要的命令是:kill -9 进程标识符父进程和子进程\n上面我们已经介绍了父进程和子进程有各自的进程ID,但是究竟什么是父进程呢?什么又是子进程呢?其实,我们平常所写的进程都是由bash这个父进程来创建的,bash其实就是shell外壳,shell为了防止自身奔溃,一帮会通过派生子进程的方式去执行我们的指令。\n\n我们可以通过getpid和getppid函数来获取当前进程的ID和当前进程父进程的Id










没有回复内容