1.进程是程序运行的抽象
我们所写的代码仅是个存储在硬盘的静态文件,当这个文件通过预处理,编译,汇编,链接,变成可执行文件,被存放在内存上,当我们运行这个文件时,这个程序得到CPU的处理,就变成了一个进程
2.进程是资源分配的最小单位
系统为了方便管理,在每创建一个进程时,系统都会给它分配一个0-4G的虚拟内存空间,其中0-3G属于用户空间,3-4属于内核空间(用于进程间通信)
3.进程拥有独立的地址空间
1.每个进程的地址空间都是相互独立的,一个进程的消亡不会影响到其他进程,所以说进程是一种安全的的多任务机制
2.因为每创建一个进程,系统就会分配给进程一个4G的虚拟内存空间,所以说进程在创建的时候开销比较大
3.其次进程在进程切换时的开销比较大,相对于线程而言进程在切换过程中需要保存用户空间的虚拟内存,栈,全局变量,而且要保存内核空间的堆栈,寄存器等所以说进程的切换开销比较大
4.进程的状态
在用户空间进程主要分为三种状态,执行态,就绪态,阻塞态
1.执行态:当一个进程在CPU上正在运行时,成为执行态
2.就绪态:进程所有就绪条件都已经准备好,只差CPU的执行,成为就绪态
3.阻塞态:进程因为等待某一事件的到来,而暂时停止运行,这时及时将CPU分配给进程也 无法运行,该状态称之为阻塞态
5.进程的调度方式
1.先到先服务
2.时间片轮转
3.短进程优先
4.高优先级优先
6.进程的同步和互斥
进程是并发执行的,不同进程之间存在着不同的相互制约关系,所谓进程同步,主要是解决临界资源互斥访问的问题,如多个进程访问同一片共享内存,这片共享内存必须互斥访问
临界资源:一次只允许一个进程访问的资源称之为临界资源
7.进程的创建
1.fork : 当执行到这句指令时,系统会创建一个子进程,并且将父进程的代码,数据,堆栈资源拷贝到子进程,并且子进程和父进程的先后顺序是不确定的
2.vfork : 使用vfork创建的子进程首先是共享父进程的资源,当有一方对数据进行修改,子进程才会开辟新的空间,实现了一种写时复制的效果,并且子进程先执行父进程后执行
3.exec/system: 在一个进程中执行另一个进程
8.进程的退出
1.正常退出:return 0
2.异常退出:exit _exit
exit是库函数对_exit系统调用的封装,exit在退出时会刷新缓冲区,_exit不会刷新
9.僵尸进程与孤儿进程
在进程执行过程中,可能会遇到僵尸进程和孤儿进程
僵尸进程:是指子进程退出之后,父进程还在执行,没有及时回收子进程的资源,这时子进程称为僵尸进程,以为子进程的资源得不到及时释放,会产生危害
我们如何去避免僵尸进程
(1)通过信号机制,在处理函数中调用wait回收资源
(2)通过fork两次将子进程变为孤儿进程,从而使父进程变为init进程,让init进程回收资源
(3)调用wait waitpid,让父进程等待子进程退出,使父进程挂起,没有起到多进程的作用,同时浪费资源
孤儿进程:是指父进程已经退出,子进程还在执行,这时子进程的回收交给init进程处理,默认init进程为父进程