一、进程
1、什么是进程
进程中的程序 ---正在运行中的程序
进程---程序的一次执行过程
进程是程序的一个实例
2、进程和程序
./a.out
进程是跑起来的程序,一个程序可以对应多个进程
在进程中,资源需求要高得多; 它可能需要处理,内存,I / O资源才能成功执行。相反,程序只需要磁盘来存储。
程序——静态——硬盘
进程——动态——内存
3、进程的作用
操作系统为了管理程序的动态运行过程
4、进程的组成
程序的组成:代码+数据 .c文件是程序的源代码不是程序本身
标准c程序在内存的布局:(由c标准规定)
堆区、栈区、字符串常量区、静态区
代码区
linux下程序在内存中的典型布局
栈、堆、bss data text
进程 = pcb + 进程实体(text | data | bss | 堆栈)
PID :process id 进程的id号
5、进程的生命周期
多个进程共同存在:宏观并行、微观串行
6、进程的状态:
进程组成:pcb + text | data |bss |堆|栈 = 进程
二、进程编程
进程 ---为了实现多任务
创建进程 ---执行进程 --- 结束进程 --- 结束进程后资源回收(僵尸态)
1、进程的创建
fork函数:
通过复制调用进程复制的子进程
返回值:成功:在父进程返回子进程的pid号(pid是一个非负整数)
在子进程返回 0;
失败:-1,子进程不会被创建
2、父子进程:
所谓父子进程,就是在一个进程的基础上创建出另一条完全独立的进程,这个就是子进程,相当于父进程的副本。
两个fork会生成3个进程,n个fork会生成2^(n-1)个进程。
3、进程状态
R:运行状态 :表示进程正在运行或准备运行
S:可中断睡眠状态:进程正在睡眠(被阻塞),当等待资源到来时即可唤醒
D:不可中断睡眠状态:被阻塞)不可被其他进程信号或时钟中断唤醒。
T:暂停状态:进程暂停执行接受某种处理(进程被挂起,不是阻塞态)
t:跟踪状态
Z:僵尸状态:进程已经结束但未释放PCB。编程中应避免这样的情况。
4、kill命令:
命令用于向进程发送信号,常用于终止进程
用法:kill 选项 <pid>
killall 选项 进程名称
5、僵尸进程:
子进程先于父进程退出,子进程就会变成僵尸进程
一个进程在退出的时,会关闭所有的文件描述符,释放在用户空间中分配的内存,但是该进程的 PCB 仍会暂时保留,因为里面还存放着进程的退出状态以及统计信息等,这些PCB的信息均需该进程的父进程接收。
Linux下任何进程都有父进程,即每个进程的PCB都需由其父进程回收
6、孤儿进程:
父进程先于子进程退出,子进程就会变成孤儿进程
父进程先于子进程退出后,回收子进程的父进程就不在了,会使子进程变成孤儿;
随即该孤儿进程会马上被init进程领养;该进程的PCB回收也由init进程完成;
孤儿进程会占用资源,但是会被由系统回收,没有危害;