程序:由数据和指令组成,是静态的,一般存在于磁盘中,当装载进内存后可被执行。
进程:是正在执行的程序,是动态的,在计算机内存中,包括程序的指令、数据以及程序运行需要的栈、堆、打开的文件等一切资源。
进程的状态:
运行态、可中断睡眠态、不可中断睡眠态、停止态、僵尸态、死亡态。
进程的数据空间:
常量区、静态区、堆区、栈区。
Linux采用虚拟内存机制来管理系统内存,每个进程的地址空间都是虚拟的,通过内存映射表对应物理内存。
段错误是操作系统的一种保护机制,当进程遇到了不可恢复的访存错误时,内核发出信号将该进程杀死。
段错误的原因:
1. 地址非法。
2. 权限非法。
查看进程状态的工具:
ps -ef
ps aux
pstree
top
cat /proc
只有前台进程能够接受终端信号。
同一时刻只能有一组前台进程,但是可以有多组后台进程。
进程控制:
fg 将后台进程变为前台
bg 将暂停的进程变为后台执行。
CTL + z 将前台进程暂停。
CTL + c 将前台进程杀死。
进程标识:
Linux使用一个short型的整数作为进程的ID, 范围是0 ~ 32767。
进程创建之后的执行顺序是随机的,也就意味着父进程在创建完子进程后谁先运行是不一定的。
僵尸进程:
当一个进程终止后,系统为了能够让其父进程获得该进程的返回状态,于是会保留关于该进程的一些信息(例如返回状态等),但是此时进程的大部分资源都已经被收回了(指令、堆、栈、打开的文件等绝大部分资源)。此时的进程已经终止,但是未被完全销毁(依然占有PID、taskstruct结构体等少量信息)称为僵尸进程。
僵尸进程的产生条件:
1.父进程未终止并且没有主动忽略子进程的状态。
2.子进程先于父进程终止。
僵尸进程的危害:
1.占用PID资源
2.占用内存资源。
进程的终止方式
(1) 正常终止
从main函数返回
调用exit(标准C库函数)
调用_exit或_Exit(系统调用)
最后一个线程从其启动例程返回
最后一个线程调用pthread_exit
(2) 异常终止
调用abort
接收到一个信号并且终止
最后一个线程对取消请求做处理响应
(3) 进程返回
通常程序运行成功返回0,否则返回非零值。
在shell中可以使用echo $? 查看进程的返回值