进程的定义
进程最经典的定义:进程是一个正在执行的程序的实例。
系统中的每一个程序运行在进程的上下文中,上下文由程序正在运行的各种状态组成。
进程实体包含几个元素:程序代码 + 程序数据 + 描述进程的数据集合
。
【注意】进程是动态的,而进程实体是静态的。
这个描述进程的数据集合,使用结构体封装起来,这些结构体被称为PCB(进程控制块,是process control block的缩写),PCB在进程形成的时候由系统自动创建的,里面存放着进程的各种属性信息,每个进程都拥有自己的PCB,它是进程存在的唯一标识,会被装载到内存里。
struct PCB
{
//该进程的各种属性信息
};
Linux系统下的PCB是叫做task_struct
.
struct task_struct
{
//描述进程的各种属性信息
};
操作系统管理进程的实质是对PCB进行管理,一个系统中可能会存在大量的PCB,为了更好地管理且有效地利用CPU的资源,系统会把将这些PCB组织起来,就像链表中的节点那样,不同的系统会以不同的方式组织。
PCB里包含的内容
关于进程的标识符,每个进程都有唯一的标识符,用于区分其他进程。
在大学里,对于老师点名大部分都采用学号ID,这是因为其他的单个信息不足以标识你,就比如说名字有可能重名,年龄有可能相同……而ID是唯一标识你的。而在系统中可能存在大量进程,为了精准的找到某进程,就需要一个能够唯一标识某个进程的标识符,那就是进程ID,简称PID(process ID)。而创建该进程的进程称为父进程,父进程的ID称为PPID。
获得PID、PPID的系统调用有:
注明:
1】要使用这两个函数需要包含头文件<sys/types.h>和<unistd.h>
2】getpid
函数返回的是该进程的PID,getppid
:返回的是其父进程的PID
3】pid_t
实际上是typedef出来的无符号整型
4】这两个函数总是执行成功的。
//例如
1 # include <stdio.h>
2 # include <sys/types.h>
3 # include <unistd.h>
4 int main(void)
5 {
6 printf("hello,PID: %d \n", getpid());
7 printf("hello PPID: %d\n", getppid());
8 return 0;
9 }
而用户标识符,则是判断当前是哪个用户拥有该进程。
这里还要谈及一些事情
每个进程在使用CPU资源的时候,都会有一个时间限制,能占据CPU的最大时间限度被称为时间片,进程单次时间片到了,如果还没有执行完,那么就继续排队,等待进程的调度(调度,平常指的是调动的意思,所以这里的调度是指调动进程),如果已经结束了那么就直接退出。
我们需要考虑进程单次时间片没有执行完的情况,
我用黄色标识的PCB,现在正在使用CPU……
然而它还未执行完,但是时间已经到了
所以黄色PCB继续排队,等待着被调度,以便继续完成执行。
现在CPU的各种寄存器里面保存了黄色PCB执行的部分信息
如果直接调度绿色的PCB,那么刚才黄色PCB执行的部分信息,就被覆盖了。
当黄色PCB再次被调度的时候,上次执行的信息都没有了,那么是不是又该重新来呢?
所以需要把刚才CPU里的所有寄存器信息,拷贝一份到刚才被调度的进程里。然后才调度另一进程。CPU里的所有寄存器信息,可以理解为就是进程上下文,而切换一个进程,则可以理解为上下文切换。所以进程需要把它的上下文信息保存在PCB里面。
查看进程
在Linux系统中如何查看一个进程?
当一个程序运行起来的时候,会形成进程,
查看进程的命令:pa axj
如果你仅仅使用这个样子则会出现很多个你认识或者不认识的进程信息。
所以可以过滤:
ps axj | grep 文件名
查看的时候就可以过滤掉其他的进程信息了
运行以下程序
//文件mycode.c
1 # include <stdio.h>
2 # include <unistd.h>
3 # include <sys/types.h>
4
5 int main(void)
6 {
7 while(1)
8 {
9 printf(" hello, pid:%d ,ppid:%d\n", getpid(), getppid());
10 sleep(2);
11
12 }
13 return 0;
14 }
可以另开一个窗口,使用如下命令查看
[YDY@VM-0-2-centos day2]$ ps axj | grep "mycode"
27686 30624 30624 27686 pts/0 30624 S+ 1000 0:00 ./mycode
30138 30660 30659 30138 pts/1 30659 R+ 1000 0:00 grep --color=auto mycode
但是各种没有提示,是因为提示在第一行,而我们把它过滤掉了
[YDY@VM-0-2-centos day2]$ ps axj | head -1 && ps axj | grep "mycode"
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
27686 32082 32082 27686 pts/0 32082 S+ 1000 0:00 ./mycode
30138 32194 32193 30138 pts/1 32193 R+ 1000 0:00 grep --color=auto mycode