1、什么是进程?
是一次程序的运行,是操作系统进行资源分配的最小单位。
2、进程都包含什么?
BSS段:用来存放程序中为初始化的全局变量的。
数据段:用来存放已经初始化的全局变量的一块区域。以及static变量。
代码段:存放执行代码的一块内存区域,也有可能存放一些不可改变的常数变量,例 如:字符串常量。
堆:存放进程在运行过程动态分配的内存。
栈:存放程序的局部变量(临时变量),这里不包括用static修饰的局部变量。函数的参数,返回值等也存放在栈中。
3、PCB又是什么?
系统通过PCB来感知进程,PCB是一个数据结构,它描述了一个进程特征。都描述了什么呢?
(1)进程ID:也就是PID,每个进程都有唯一PID与其对应,相当于人的身份证号码,与每个人对应一样。
(2)文件描述符:
(3)内存指针:
(4)进程优先级、状态
(5)用户进程
4、进程类型
交互进程:shell下启动,既可以在前台运行,也可以在后台运行。
批处理进程:和终端无关,在作业队列中,按照顺序执行。
守护进程:和终端无关,一直在后台运行。
5、进程的状态:
运行态:进程正在运行或者准备运行
等待态:在等待自己所需要的资源
停止态:进程中止,等待运行的信号。
死亡态:已经终止,但是没有释放PCB。
4、应用:
(1)查看进程:
ps :
-e:显示所有进程
-l:长格式显示更加详细信息
-f:全部列出,通常和其他选项联用。
例如:ps -elf|grep a.out 把所有a.out找出来
top:
shif +>翻页
shif+<
top -p PID
/proc: ls /proc/
(2)修改进程优先级
nice:
nice [-n NI值] 命令
ps -elf|grep bash
nice -n 12 /bin/bash
ps -elf|grep bash
renice:改变正在运行的进程的优先级
renice [优先级] PID
(3)jobs:查看后台进程
(4)bg:将挂起的进程在后台运行
bg 作业号
(5)fg:把后台运行的进程放到前台运行
fg 作业号
(6)&:./a.out & 程序在后台运行
(7)ctrl+z:把程序停止运行,并且放到后台。
实践:用程序创建进程。
(1)如何创建进程? man fork
pid_t fork(void);成功,返回子进程的pid,子进程返回0。
父子进程执行先后没有规律。
子进程只执行fork之后的代码。
fork 是将代码复制一份,但是子进程只执行fork下的代码。以下代码会打印两个ID:
pid=6617 (父进程ID)
pid=0 (子进程ID)
#include <stdio.h>
2 #include <unistd.h>
3
4 int main(int argc, char *argv[])
5 {
6 pid_t pid;
7 pid = fork();
8 printf("pid=%d\n", (int)pid);
return 0;
}
(2)进程结束:
父进程先结束,子进程会变成孤儿进程,被Init进程收养,进到后台运行。
子进程先结束,父进程如果不及时回收子进程, 子进程将变成僵尸进程。
exit()与_exit()区别:前者退出的时候,刷新流缓冲区,后者退出的时候,不刷新流缓冲区。
(3)进程回收:wait回收紫金城、僵尸进程
exit(2);
wait(&status);
status保存返回值和结束方式的地址,通过宏判断。
status为NULL,释放PCB
waitpid();

被折叠的 条评论
为什么被折叠?



