文章目录
- 1.何为进程?
- 1.1对进程的认识
- 1.2基本概念
- 2.OS如何管理大量进程?
- 2.1图解
- 2.2进程的形成
- 3.何为PCB?
- 3.1对PCB的认识
- 3.2task_ struct内容分类
- 3.2对进程表的认识
- 4.查看进程
- 4.1基础指令
- 4.2获取某进程的PID(process id)
- 4.3杀死进程
- 4.4获取当前进程的父进程的ppid(parent process id)
1.何为进程?
1.1对进程的认识
- 一个软件,本质就是启动了一个进程
- Linux一条命令运行的时候,如
./test
就是在系统层面创建了一个进程 - Linux可以同时加载多个程序,Linux可能同时存在大量的进程在系统中的(软件在OS,硬件在内存)
- Linux系统要管理进程 如何管理大量的进程------先描述,在组织
- 每个进程都有自己的内存空间、代码、数据和执行状态。
- 进程可以独立运行,相互之间不会干扰。
- 操作系统可以同时运行多个进程,通过分配时间片轮流执行它们,从而实现多任务处理。
- 进程可以与其他进程进行通信和协作,共享资源和数据。
1.2基本概念
- 程序的一个执行实例,正在执行的程序
- 担当分配系统资源(CPU时间,内存)的实体
2.OS如何管理大量进程?
2.1图解
- PCB:进程的属性信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。这类数据结构被称为PCB(process control block)。
- 对进程的管理,变成了对进程PCB结构体链表的管理
- 进程 = 代码+数据 ➕PCB结构体
- 当一个程序加载到内存后 os会对当前进程建立一个PCB用来存放进程的属性信息
- 描述进程:PCB结构体描述进程的属性
- 组织进程:使用数据结构将各进程的PCB结构体组织起来,形成进程表
所有运行在系统里的进程都以task_struct链表(双链表)的形式存在内核里。
2.2进程的形成
- 将存储在磁盘中的可执行文件的代码和数据拷贝的内存中
- 创建一个PCB结构体并初始化其属性
- 将创建好的PCB加入到操作系统的进程队列
3.何为PCB?
3.1对PCB的认识
PCB[Process Control Block]:进程的属性信息被放在进程控制块(进程属性的集合 一种数据结构)
不同的操作系统PCB的名称不同 在Linux中描述进程的结构体叫做task_struct(task_struct是PCB的一种)
task_struct是Linux内核的一种数据结构 它会被装载到RAM(内存)里并且包含着进程的属性信息
Linux内核使用双向链表
组织和维护所有进程的PCB,用于管理和调度进程
。
3.2task_ struct内容分类
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据
- I/O状态信息:显示的I/O请求 分配给进程的I/O设备 被进程使用的文件列表。
- 记账信息:处理器时间总和,使用的时钟数总和,时间限制,记账号
- 其他信息
3.2对进程表的认识
进程表:进程表是操作系统中的数据结构,用于组织记录系统中所有进程的PCB。每个进程都有一个对应的进程表项(PCB),包含进程的标识符、状态、优先级、资源使用情况等信息。进程表可以用于管理和调度进程,操作系统可以根据进程表中的信息对进程进行分配资源、切换上下文等操作。
4.查看进程
4.1基础指令
top: 相当于win下的任务管理器 查看系统所有进程
./test : 从执行这条指令到结束(加载运行调度退出) 这就是一个进程的开始与结束
pwd/touch等指令也是一个进程
ps : 只显示当前终端进程信息
ps axj: 显示系统中所有进程信息
ps axj | grep 'test'
或ps axj | head -1 && ps axj | grep 'test':
- 显示系统中所有进程信息
- head -1: 只取第一行(进程信息的标题行
- 包含’test’的信息
ls /proc: 内存级的文件系统
- 系统中进程的属性数据都保存在/proc下以PID为名的目录
- /proc目录下的文件是动态的,每创建进程就会新增一个PID目录,进程结束该PID目录也会被删除
- 假定一个进程的PID为xxx 那么通过ls /proc/xxx 可显示PID为xxx的进程的所有属性信息
- ls /proc/xxx: 会显示cwd: current work directory当前进程的工作目录 exe: 其实就是我们的test
- 每个进程都会有一个属性 保存当前所在的工作路径
4.2获取某进程的PID(process id)
pid_t id = getpid();//程序只有被运行才会被调用 即变成进程 编译期间不调用
printf("pid: %d\n", id);
4.3杀死进程
kill -9 xxx
相当于windows下
4.4获取当前进程的父进程的ppid(parent process id)
pid_t id = getpid();
printf("pid: %d\n", getppid());
一般进程的ppid是bash: bash是shell的一种 一般进程的父进程都是bash 当在一个界面开两个终端 每一个终端都有一个bash 杀死A的bash不影响B的bash