文章目录
- 进程
- 进程PCB
- task_struct
- 查看进程
- 方法一
- 方法二
进程
教材观点
- 加载到内存中的程序
- 正在运行的程序
进程 = 内核PCB对象 + 可执行程序
内核数据结构 + 可执行程序 = 进程
-
在计算机中可以同时打开多个程序,此时一定将多个.exe文件加载到了内存中
-
操作系统需要管理多个加载到内存中的程序
-
操作系统将加载到内存中的程序先进行描述,再进行组织管理、
几乎所有的独立的指令也是程序,所有在执行指令的时候也要变成进程。
进程PCB
- 一个进程就是操作系统对一个加载到内存中的程序的描述。
- 每个进程都有一个描述这个进程所对应的一个结构体变量。这种数据结构结构体变量在操作系统层面中称为PCB(process ctrl block - 进程控制块)。
struct
{//状态//优先级//内存指针字段//...包含进程几乎所有的属性字段struct PCB *next; //指向下一个进程的PCB
}
- 一个可执行程序加载到内存中,操作系统会先给这个进程创建一个PCB,这个pcb会有描述这个可执行程序的所有属性,以及指向这个进程代码块在内存中的位置的指针,再将这个进程的PCB链接到整个系统中的进程管理链表中。
- 加载到内存中的可执行程序的代码块加上描述其的PCB才是一个进程
- 先描述再组织
进程排队,是让进程的pcb去排队。
进程调度,是对进程的pcb进行调度。
所有对进程的控制和操作,都只和进程的PCB有关,和进程的可执行程序没有关系。
可以将pcb放入任何数据结构(容器)中,对pcb进行管理。
例如放入链表中,对pcb管理也就是对链表的结点进行管理。
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB,Linux操作系统下的PCB是:task_struct
task_struct
Linux操作系统下的PCB是:task_struct
- task_struct是Linux内核的一种数据结构,它会被装载到RAM内存里面ing其包含进程的信息。
内容分类
- 标示符:描述本进程的唯一标示符,用来区别其他进程。
- 状态:任务状态、退出代码、退出信号等。
- 优先级:相对于其他进程的优先级。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
- 上下文数据:进程执行时处理器的寄存器中的数据。
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件猎豹。
- 记账信息:可能包括处理器时间综合,使用的时钟数综合,时间限制,记账号等。
查看进程
方法一
Linux会将进程信息以文件的方式,显示在系统中的某一个目录中
- `ls /proc`
Linux会将进程的相关信息,在/proc目录下,以一个目录的形式存放,这个进程的所有属性都存放在这个目录下面。
一个进程启动之后,将可执行程序删除,进程仍在执行。在运行一个程序的时候,本质是将程序从磁盘拷贝到了内存中。在程序执行期间,运行中的程序已经与磁盘中的程序没有了关联。
exe -> 指向可执行程序在磁盘中的具体位置
cwd -> 指向当前进程所对应的当前工作目录
int chdir(const char *path);
- 更改当前进程的工作目录
- 返回0成功,-1失败
方法二
ps axj
while :; do ps axj | head -1 && ps axj | grep myprogress | grep -v grep; sleep 1; done
死循环,先获取系统所有进程,然后打印所有进程中的第一行标题,再获取所有进程,然后筛选出带有myprogress关键字的进程打印,再将获取的所有带有myprogress关键字的进程中带有grep关键字的去除,每一秒循环一次。
用户要获取到进程的标示符,也就是pcb中的信息的时候,必须要调用系统调用,因为pcb在操作系统的内核中,用户不可以越过操作系统直接获取数据。
man2号手册
pid_t getpid(void)
:获取进程标示符pidpid_t getppid(void)
:获取当前进程的父进程标示符ppid
每一次启动一个程序,都会获得一个新的标示符id。
我们在命令行中启动的所有的程序,产生的进程都是bash的子进程。
一般在Linux中,所有普通进程都有其对应的父进程。