赞
踩
在Linux系统中,触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,成为PID,同时根据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。
如何产生一个进程?
执行一个程序或命令就可以触发一个事件而获取一个PID。系统只认识二进制文件,当我们要让系统工作的时候,就需要启动一个二进制文件,这个二进制文件就是程序(program)。
程序一般是放置在物理磁盘中,通过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程。
为了让操作系统可以管理进程,进程会给予执行者权限/属性等参数,以及进程所需要的脚本或数据等,最后再给予一个PID。操作系统通过这个PID来判断该进程是否具有执行权限。
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
task_struct-PCB的一种:
实际上,有太多的需要加载进CPU的程序,那么操作系统要不要管理这些加载进来的程序呢?答案是肯定的
PCB:
//进程控制块
struct task_struct{
//该进程所有属性
//该进程对应的代码和属性地址
struct task_struct* next;//用来链接PCB
}
我们在每个需要加载进入CPU的程序分配一个PCB,用来管理这些程序,通过该程序属性里的优先级决定什么时候加载进入CPU。
所谓对进程的管理,实际是对进程对应的PCB进行相关管理。对进程的管理转化成对链表的增删改。
task_ struct内容分类:
struct task_struct 内核结构体 -> 内核对象task_struct对象 -> 将该结构与代码和数据关联起来 -> 先描述再组织的工作
进程 = 内核数据结构(task_struct)+ 进程对应的磁盘代码
Windows下的进程:
Linux下的进程:
//显示进程标题
ps axj | head -1
//显示标题的同时将进程信息显示出来
ps axj | head -1 && ps axj | grep 'Test'
杀掉一个进程:
kill -9 +(PID)
进程在调度运行的时候,进程就具有动态属性
查看进程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是一个函数,函数在执行前只有一个父进程,函数在执行后是为 父进程+子进程
上面的ID关系是 24923是爷爷 5338是儿子 5339是孙子
fork的返回值:
在父进程中返回子进程的PID,而在子进程中返回0
初识多进程:
fork()之后,就有父进程和子进程两个进程同时执行后续代码,fork后续的代码为父子进程共享,通过fork返回值的不同,使得父子进程运行的代码不同。
如有错误或者不清楚的地方欢迎私信或者评论指出
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/635153
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。