目录
进程与程序概念
在Linux系统中,触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,成为PID,同时根据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。
- 程序(program):通常为二进制程序,存放在存储媒介中(如硬盘、光盘、软盘、磁带等),以物理文件的形式存在。
- 进程(process):程序被触发后,执行者的权限与属性、程序的代码与所需数据等都会被加载到内存中,操作系统给予这个内存中的单元一个标识符(PID),可以说进程就是一个正在运行中的程序。内核观点:担当分配系统资源(CPU时间,内存)的实体
如何产生一个进程?
执行一个程序或命令就可以触发一个事件而获取一个PID。系统只认识二进制文件,当我们要让系统工作的时候,就需要启动一个二进制文件,这个二进制文件就是程序(program)。
程序一般是放置在物理磁盘中,通过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程。
为了让操作系统可以管理进程,进程会给予执行者权限/属性等参数,以及进程所需要的脚本或数据等,最后再给予一个PID。操作系统通过这个PID来判断该进程是否具有执行权限。
描述进程-PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
task_struct-PCB的一种:
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
实际上,有太多的需要加载进CPU的程序,那么操作系统要不要管理这些加载进来的程序呢?答案是肯定的
PCB:
//进程控制块
struct task_struct{
//该进程所有属性
//该进程对应的代码和属性地址
struct task_struct* next;//用来链接PCB
}
我们在每个需要加载进入CPU的程序分配一个PCB,用来管理这些程序,通过该程序属性里的优先级决定什么时候加载进入CPU。
所谓对进程的管理,实际是对进程对应的PCB进行相关管理。对进程的管理转化成对链表的增删改。
task_ struct内容分类:
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
struct task_struct 内核结构体 -> 内核对象task_struct对象 -> 将该结构与代码和数据关联起来 -> 先描述再组织的工作
进程 = 内核数据结构(task_struct)+ 进程对应的磁盘代码
Windows进程与Linux进程
Windows下的进程:
Linux下的进程:
//显示进程标题
ps axj |head -1
//显示标题的同时将进程信息显示出来
ps axj |head -1 &&ps axj |grep'Test'
杀掉一个进程:
kill -9 +(PID)
进程在调度运行的时候,进程就具有动态属性
Linux进程操作
子进程
查看进程id(PID):
getpid();
另一种查看进程方法:
ls /proc
进程终止,这个以进程PID命名的文件会自动被系统回收
进入这个PID命名的进程目录
如果我们在进程正在运行的时候将进程的二进制文件删除,那么进程会继续运行吗?
一个进程对应的程序在加载到内存中后,理论上就与磁盘中的可执行程序没有关系了。(当然也有特殊情况)
父进程
父进程id(PPID)
getppid();
运行程序发现:
我们发现这个父进程的ID对应的就是bash,这个bash是什么呢?
shell是一个程序,可以称之为壳程序,用于用户与操作系统进行交互,bash命令是shell命令的超集,大多数shell脚本都可以在bash下运行。
当我们登陆系统后,会获取一个bash的shell,然后我们用这个bash提供的接口去执行各种命令,比如ll、ls、touch、mkdir等,这个另外执行的命名也会触发成为PID,这个后来执行命令所产生的PID就是子进程,而在我们原本的bash环境下就是父进程。
命令行上启动的进程,一般它的父进程没有特殊情况的话,都是bash
创建进程(初识-fork)
fork是一个函数,函数在执行前只有一个父进程,函数在执行后是为 父进程+子进程
上面的ID关系是 24923是爷爷 5338是儿子 5339是孙子
fork的返回值:
在父进程中返回子进程的PID,而在子进程中返回0
初识多进程:
fork()之后,就有父进程和子进程两个进程同时执行后续代码,fork后续的代码为父子进程共享,通过fork返回值的不同,使得父子进程运行的代码不同。
如有错误或者不清楚的地方欢迎私信或者评论指出🚀🚀
版权归原作者 侠客cheems 所有, 如有侵权,请联系我们删除。