linux:进程
计算机硬件体系结构:冯诺依曼体系机构
五大硬件单元:输入,输出,存储器,运算器,控制器
硬件结构决定软件行为:数据流向
所有的设备围绕存储器工作
操作系统:内核+应用
一个搞管理的软件,为了让计算机更加方便使用
库函数和系统调用接口是上下级的调用关系,库函数封装了系统调用接口
进程概念:运行中的程序
程序:存储在硬盘中的可执行文件
进程就是操作系统对描述,pcb(struct task_struct)
描述信息:标识符pid,状态,优先级,程序计数器,内存指针,上下文数据,i/o状态信息,记账信息
进程查看:/proc ps -ef aux gitpid top(查看资源使用情况)
进程创建:fork()
通过复制调用进程(父进程)创建一个新进程(子进程)
复制:复制父进程的pcb
代码共享,数据独有,运行位置一样(创建成功的下一步指令)
返回值:判断是否创建成功+分流父子进程
父进程中:返回子进程pid>0
子进程中:pid等于0
vfork()
与父进程共用一块虚拟地址空间,在fork()实现写时拷贝技术后就淘汰了
可以快速创建子进程
进程状态:
三种基础状态:运行,就绪,阻塞
linux下进程状态:
运行态(R)
可中断睡眠态(S)
不可中断睡眠态(D)
停止态(T)
追踪态(T)
死亡态(X)
僵死态(Z)
僵尸进程:处于僵死态的进程
产生原因:子进程先于父进程退出,退出原因保存在pcb中,操作系统检测到进程退出后,通知父进程,但父进程并未 关注子进程的退出,这时候操作系统不能随意释放子进程资源,因此,子进程处于退出但资源没有完全释放 状态
危害:内存泄漏,僵尸进程过多,导致新进程无法创建
解决:退出父进程(退出原因的保存已毫无意义)
避免:进程等待
孤儿进程:
父进程先于子进程退出,子进程成为孤儿进程,被init进程收养,到后台运行
守护进程/精灵进程:特殊的孤儿进程
进程优先级:一个层级划分,决定进程cpu资源的分配权,让系统运行的更加合理
查看:ps -l
PRI NI
PRI=PRI+NI PRI越高,优先级越低。
优先级无法直接更改,但是可以通过设置NI的值来实际优先级。
NI值范围:-20~19 设置方式: renice -n NI_val -p pid
nice -n NI_val ./main(运行时设置)
竞争性:进程间具有竞争性,竞争资源
独立性:进程之间应该具有独立性,保证资源稳定运行
并发:进程在cpu上切换调度运行
并行:cpu资源足够,进程同时运行
进程终止:
终止方式
main函数中return
exit() 库函数,退出时刷新缓冲区,做退出的收尾工作
_exit() 系统调用接口,直接退出,释放资源
终止场景:进程退出返回值的作用
正常退出,结果符合预期
正常退出,结果不符合预期
异常退出
返回值:
查看进程返回通过echo$?
错误编号:每个系统调用执行完毕都会重置进程中errno这个全局变量,这个变量存储的是当此系统调用接口的错误编号,当 系统调用接口出错时,用户可以通过这个errno来获取系统调用的错误原因
进程等待:等待子进程退出,避免产生僵尸进程
父进程一直关注子进程,等待子进程退出,释放资源
pid_t wait(int* status) //阻塞函数;等待任意子进程退出
status:用来获取退出原因,返回原因一个字节
返回值:退出子进程pid
阻塞:为完成功能发起调用,如果当前不具备条件,则一直等待,直到完成后返回
非阻塞:为完成功能发起调用,如果当前不具备条件,则立即报错返回
pid_t waitpid(int pid ,int *status,int opt) //可以等待任意一个子进程退出或等待指定子进程退出
waitpid可以通过opt将操作设置为非阻塞
pid:-1:等待任意子进程退出
>0:等待指定子进程退出
options: WNOHANG将waitpid设置成非阻塞
返回值:-1:错误
0:没有子进程退出
>0:没有子进程退出
程序替换:替换进程所运行的程序----为了让进程执行其他任务
替换的是程序所运行的代码;将另一段程序加载到内存,通过页表将原来进程的映射关系重新建立到新程序的地址,相当于替换了进程所运行的程序以及要处理的数据。
也就是:替换了代码段,重新初始化数据段;谁调用就对谁进行替换
利用exec函数族来进行程序替换
execl execp execle
execv execvp execve(系统调用接口)
execl(ls,ls,-a,-l,-i,null); //参数平铺赋予
execv(ls,argv);
有没有p的区别:是否自动到PATH所指定的路径下查找程序文件
有没有e的区别:是否自定义环境变量