Linux进程概念—01
基本概念
进程:就是一个运行起来的程序。
程序:一系列有序的指令集合
描述进程-pcb
操作系统如何实现多个程序的调度运行:将这个运行中的程序描述起来,然后将这些描述组织起来进行管理。通过实现对pcb的调度管理实现对运行中程序的切换调度运行—对于操作系统来说这个描述信息-pcb就是进程
进程就是pcb,是操作系统对一个运行中程序的描述,通过这个描述实现对程序的运行调度。
在Linux中描述进程的结构体叫做struct task_struct{…}。
描述信息:内存指针、程序计数器、上下文数据、进程标示符、进程状态、IO信息、记账信息…
内存指针:用于指向程序指令数据再内存中的位置。
程序计数器:程序中即将被执行的下一条指令的地址。
上下文数据:程序执行时处理器的寄存器中的数据。
进程的创建
ps -ef / ps -aux //进程的查看
kill / kill -9 //强制杀死进程
进程就是pcb,意味着创建一个进程就是创建一个pcb。
pid_t fork(); //通过复制调用进程(父进程)创建一个新的进程(子进程)
创建了一个新的pcb,然后从父进程pcb中复制了很多数据过来。
复制的信息包括内存指针、程序计数器、上下文数据…
内存指针:子进程与父进程运行的代码其实是一样的,指向同一块物理内存中的数据以及指令。
程序计数器/上下文数据:子进程被创建出来后,运行位置与父进程是完全一样的,下一步即将执行的的指令都是从创建子进程成功之后开始的。
函数的返回值对于父子进程是不一样的,在父进程中返回创建的子进程的pid,在子进程中返回的是0。
通常根据fork的返回值进行代码的分流,让父子进程进入不同的判断执行体完成不同的功能。
父子进程代码共享,数据独有。
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("---create child process start---%d\n", getpid());
pid_t pid;
pid = fork();
if(pid == 0)
{
printf("this is child %d---rpid:%d\n", getpid(), pid);
}
else if(pid > 0)
{
printf("this is parents %d---rpid:%d\n", getpid(), pid);
}
else
{
printf("fork error\n");
}
printf("---create child process end---%d--%d\n",getpid(), pid);
return 0;
}
进程状态
windows下进程状态:就绪/运行/阻塞
linux下进程的状态:
运行态R:就绪/运行
可中断休眠态S:当前的阻塞能够被中断唤醒
不可中断休眠态D:当前的阻塞不会被中断唤醒,等待条件满足自己醒来。
停止态T:停止运行,什么都不干
僵死态Z:进程已经退出了但是资源没有完全释放的一种状态
僵尸进程
处于僵死状态的进程,进程已经退出不再运行,但是资源没有完全释放。
僵尸进程的产生:子进程先与父进程退出,但是父进程没有关注子进程的退出状态,因此子进程成为僵尸进程。
资源为什么没有完全释放:因为子进程要保存退出原因。
僵尸进程的危害:资源泄漏。一个用户所能创建的进程数量是有限的,并且资源没有完全回收会占据内存资源。
处理方法:1.进程等待(等待子进程退出)2.退出父进程(父进程退出,子进程保存退出原因就没有意义了,因此也就释放了)
孤儿进程
父进程先于子进程退出,则子进程成为孤儿进程,这个孤儿进程的父进程变成了1号进程,并且这个孤儿进程运行在后台。孤儿进程是不会成为僵尸进程的,因为1号进程随时关注子进程退出。
守护进程:一种特殊的孤儿进程,父进程是1号进程,运行在后台。与终端以及登陆会话脱离关系,不再受影响守护进程通常是一种运行在系统后台的批处理程序。
进程优先级
一个进程对于cpu资源获取的优先权。
优先级的作用:让操作系统运行的更加良好。