进程的含义
进程是一个程序执行的过程会分配内存资源,CPU的调度是资源分配的基本单位。
内存分布
每个进程有3G的进程空间,3G~4G是内核的空间,
MMU(Memory Manager Unit),是内存管理单元,负责将虚拟地址转换成物理地址。除此之外,MMU 实现了内存保护,进程无法直接访问物理内存,防止内存数据被随意篡改。
虚拟地址 * 物理内存和虚拟内存的地址 映射表 1page=4k
名称 | 内容 |
code | 放着二进制可执行程序 |
data | 初始化为0的全局变量和静态变量 |
bss | 初始化为0和未初始化的全局变量和静态变量 |
堆 | 程序员自己管理的空间,需要手动申请和释放 |
栈 | 8M局部空间,函数的返回地址、函数的参数 |
进程的分类
1、交互式进程 2、批处理进程 shell脚本 3、守护进程
进程的作用
并发,同时推进。
进程的状态
有三种状态: 就绪态-----执行态----阻塞态 //基本系统
linux中有四种状态: 运行态-----睡眠态---僵尸态----暂停态 //Linux中
使用方法
1、原语言
pid_t fork();
一次调用返回两次,产生一个子进程,子进程先运行和父进程先运行顺序不确定。
它们之间变量不共享。
子进程复制父进程的0~3G空间和父进程内核中的PCB,但ID号不同。
功能:通过fork可以从当前进程中克隆一个同名的新进程。
克隆的进程被称为子进程,原有的进程被称作父进程。
子进程是父进程的完全拷贝,子进程与父进程有相同的代码逻辑,并且子进程的执行是在fork()执行之后执行的。
返回值:int 类型的数字。
在父进程中:成功 -----》 返回子进程的pid号 > 0
失败 ------》返回-1;
在子进程中:成功 -------》 返回 0;
失败 ------》 无。
函数操作
getpid() //获得自己的ID号
getppid() //获得父进程的ID号
父子进程的关系
子进程是父进程的副本。子进程获得父进程数据段,堆,栈,正文段共享。
进程的终止
8个情况
1)main 中return
2)exit(), c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。已经清理函数(atexit)。
3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。
4) 主线程退出
5)主线程调用pthread_exit
异常终止
6)abort()
7)signal kill pid
8)最后一个线程被pthread_cancle
exit(0 / 1 ) 在使用的时候都是对的写 0
存在错误的时候写 1