基本概念
书本上:加载到内存的程序,被叫做进程。
-这里引出一个问题 -> 进程和程序有什么区别?
程序就是文件。
进程 = 程序 + OS维护进程的相关数据结构
进程包括程序文件内容,以及与进程相关的数据结构(如:struct task_struct),这是由OS帮我们自动创建的。
进程控制块PCB
process control block,Linux操作系统下的PCB是:task_struct,task_struct包含了进程中的所有属性信息。PCB->task_struct的关系类似shell->bash的关系。task_struct是Linux内核的一种数据结构,会被装载到内存里。
磁盘中的文件或者exe,加载到内存中,操作系统还要创建PCB(进程控制块)。
有了PCB,所有的进程管理任务和进程对应的程序毫无关系,和进程相关的内核创建的该进程的PCB强相关!
PCB内部构成
1、标识符:描述本进程的唯一标示符,用来区别其他进程。
pid、ppid
2、状态:任务状态,退出代码、退出信号等。
echo $?
输出最近执行命令的退出码。
3、优先级:相对于其他进程的优先级。
-这里需要区分优先级和权限?
权限围绕能不能的问题,而优先级是在能的前提下,先后的问题。
4、程序计数器:程序中即将被执行的下一条指令的地址、
5、内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
6、上下文数据:进程执行时处理器寄存器中的数据
理解上下文数据:进程的代码可能不是很短的时间就能完成的,可能要被调度成千上百次,规定每个进程单次运行的时间片(比如10ms,超时就放在队列末端)。在一个CPU情况下,用户感受到的多个进程同时在进行,本质是通过 CPU的快速切换完成的。所以进程在运行时,是会切换的,进程可能存在大量临时数据~这些数据暂时保存在CPU的寄存器中,可是CPU只有一套寄存器。所以为了 保护上下文,恢复上下文,寄存器中的数据需要保存到自己结构体里。
由此,可以感受到,进程是被切换的!
7、I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
8、记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制等
9、其他信息
查看进程
方法一:
ps axj | head -1 && ps axj | grep "test"
方法二:
ls /proc
ls /proc/pid
方法三:
getpid()
进程id — PID
getppid()
父进程id — PPID