进程
基本概念
课本概念:程序的一个执行实例,正在执行的程序等。
内核概念:担当分配系统资源(CPU时间,内存)的实体。
描述进程—PCB(进程属性的集合)
task_struct
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构,他会被装载到RAM(内存)里并包含进程的信息。
task_strct内容分类
- 标示符:描述本进程的唯一标示符,用来区别其他的进程。
- 状态:任务状态,退出代码,退出信号等。
- 优先级:相对于其他进程的优先级等。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的的进程块的指针。
- 上下文数据:进程执行时处理器的寄存器中的数据。
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息:可能包括处理器时间总和,使用的时钟总数,时间限制,记账号等。
- 其他信息
组织进程
可以在内核源码里找到它,所有运行在系统里的进程都以task_struct链表的形式存在内核里。
查看进程
进程的信息可以通过/proc系统文件查看
查看进程信息可以进去对应PID的文件,查看进程信息。
进程标示符—PID
- 进程id (PID)
- 父进程id (PPID)
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
printf("pid:%d\n",getpid());
printf("ppid:%d\n",getppid());
return 0;
}
进程创建—fork()
- fork之后通常要用if()进行分流
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
int ret = fork();
if(ret<0)
{
perror("fork");
return 1;
}
else if(ret == 0)
//child
printf("I am chaild:%d!,ret:%d\n",getpid(),ret);
else
//father
printf("I am father:%d!,ret:%d\n",getppid(),ret);
sleep(1);
return 0;
}
进程状态
一个进程可能有几个状态。
- R运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
- S睡眠状态(sleeping):意味着进程在等待事件完成(也可叫做可中断睡眠(interruptible sleep))。
- D磁盘休眠状态(Disk sleep):也叫做不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
- T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程。这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。
- X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
Z(zombie)-僵尸进程
- 当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。
- 僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
僵尸进程的危害
进程处于僵尸状态,一直存在task_struct中被系统维护,需要消耗系统资源,造成内存资源的浪费。
孤儿进程
- 父进程如果提前退出,子进程退出后就会进入僵尸状态
- 父进程先退出,子进程就称之为“孤儿进程”
- 孤儿进程被1号init进程领养,就要由init进程回收。
进程优先级
- CPU分配资源的先后顺序。
- 优先级高的进程有优先执行权力。
- 把进程运行到指定的cpu上,可以改善系统整体性能。
查看系统进程
在Linux上,ps -l命令可以进行查看:
UID:执行者的身份
PID:进程代号
PPID:父进程代号
PRI:进程可被执行的优先级,其值越小越早执行
NI:nice值,对优先级进行修正