进程相关知识点

基本概念

进程对于操作系统来说进程就是PCB--进程控制块, 在Linux下是一个task_struct结构体, 是操作系统对于运行中的程序的一个动态描述, 通过这个描述实现对于程序运行的调度和管理
   描述: 内存指针, 上下文数据, 程序计数器, 标识符, IO信息.....

进程状态: Linux下的状态–运行, 可中断休眠, 不可中断休眠, 死亡, 僵尸,
僵尸态: 进程退出,但是资源没有完全被释放的状态
僵尸进程: 子进程先于父进程退出,父进程没有关注子进程退出状态,则子进程进入僵尸态,成为僵尸进程 (资源没有完全被释放)
危害: 资源泄露 (进程数量有限制, 内存资源)
解决: 退出父进程
避免: 进程等待
孤儿进程: 父进程先于子进程退出,子进程成为孤儿进程,运行在后台,父进程成为一号进程

程序地址空间

程序地址空间----进程的虚拟地址空间
概念: 系统给进程描述的一个虚拟的地址空间 (mm_struct)
为什么:
1. 让进程访问虚拟地址,使进程拥有一个连续的,完成的地址使用,并且系统为进程创建了一个页表,
2. 用于映射虚拟地址与物理地址关系,进而实现数据在物理内存上离散式存储,提高内存利用率,并且进行内存访问控制

页表是如何进行虚拟地址与物理地址的映射的:

内存管理方式: 分段式, 分页式, 段页式
分段式: 虚拟地址组成: 段号+段内偏移量; 段表: 段号+物理端地址
对内存进行分段, 便于编译器进行地址管理
分页式: 虚拟地址组成: 页号+页内偏移量; 页表: 页号+物理端地址
对内存进行分块, 进行数据离散式存储, 提高内存利用率, 以及内存访问控制
段页式: 先对内存进行分段, 在每个段内进行分页

缺页中断: 缺页中断表示当前地址要访问的数据不在物理内存中
交换内存: 当物理内存不够使用的时候,则将物理内存中不活跃的数据,保存到磁盘的交换分区中,腾出的物理内存可以给新的程序数据使用

什么样的数据是不活跃的数据,或者说应该把哪些数据放到交换分区上: 最久未使用-LRU, 最少未使用, … OPT FIFO

多级调度反馈算法 : O(1)

进程控制: 创建, 退出, 等待, 替换
进程创建: pid_t fork(void); ------通过复制父进程创建一个子进程------父子进程代码共享,数据独有
返回值: 错误返回 -1, 成功对于父进程返回值 >0, 对于子进程返回 0

写实拷贝技术: 创建子进程后, 子进程与父进程各自有自己的虚拟地址空间, 但是数据映射的实际上时同一块物理内存, 等到内存发生改变的时候为子进程重新开始一块独立的空间, 保存子进程的数据 (保持进程独立性)
提高fork创建子进程的效率:
pid_t vfork(void)------通过复制父进程创建一个子进程------父子进程公用虚拟地址空间
创建子进程后,父进程会阻塞直到子进程退出 (exit) 或者程序替换之后才会运行. 共用同一个虚拟地址空间,同时运行会造成栈混乱, vfork创建的子进程不能在main函数中return退出

进程退出: 退出一个进程
main 函数中调用 return;
使用库函数 void exit (int ststus) ; -----在任意位置调用都可以退出进程, 退出之前刷新文件缓冲区
使用系统调用接口 void _exit (int status) ; -----在任意位置调用都可以退出进程
三种方式各有不同,以后再合适的场景使用合适方式即可
进程的退出返回值:
正常退出: 通过三种退出方式退出的进程
异常退出: 程序因为某些错误异常崩溃退出
进程的返回值,实际上只使用了一个自己进行保存 (0-255)
查看上一次系统调用接口使用错误原因: perror strerror

进程等待: 父进程等待子进程的退出, 获取子进程的退出原因, 释放退出子进程的资源, 为了避免产生僵尸进程
操作: pid_t wait(int *status ) — 阻塞函数
status: 整形空间的地址, 用于获取退出子进程返回值
返回值: 成功返回推出子进程的pid, 失败返回 -1
等待任意一个子进程的退出 (一次只等待一个), 如果当前没有子进程退出, 则一直阻塞等待, 只要有退出的子进程, 这个接口就会进行处理后返回
阻塞 : 为了完成一个功能, 发起一个调用, 若当前不具备完成条件, 则一直等待
非阻塞 : 为了完成一个功能, 发起一个调用, 若当前不具备完成条件, 则立即返回 ( 通常必须进行循环操作 )
pid_t waitpid(pid_t childpid, int *status, int options)
可以等待任意一个子进程退出, 也可以等待指定的子进程退出
可以阻塞等待子进程退出, 也可以非阻塞子进程退出
child: -1 表示等待子进程; 大于0 表示等待指定的子进程
options: 0 默认阻塞等待 ; WNOHANG 设置非阻塞等待
返回值: 错误返回 -1 ; 没有子进程退出 0 ; 有子进程退出返回子进程 pid
一个程序在运行中,如果产生了某种错误 (比如内存访问错误) , 系统就会给进程发送一个指定的信号表示进程出现了
某个错误事件, 收到这个信号后, 进程 (崩溃) 退出
异常信号退出值为0 , 表示进程正常退出, 非0 表示异常退出
代码转换: 1. 判断进程是否正常退出
( status & 0x7f ) == 0 ( status > > 8 ) & 0xff
WIFE
2. 获取退出的实际返回值

程序替换: 替换一个进程正在调度运行的程序 ( 只是替换了运行的程序, 而pcb中只是冲新初始化了一些信息 [ 虚拟地址空间, 页表 ] )
在一个进程中执行程序替换接口, 就能实现改变当前调用进程运行的程序
为什么要进行程序替换: 希望创建的子进程能够完成一个新的任务. 多进程更加稳定,
exec函数族: 一个系统调用接口+五个库函数 ( 库函数封装了系统调用接口 )
exexl / execlp / execle / execv / execvp / execve
l 和 v 的区别: 参数的赋予方式不同
带 p 和不带 p 的区别: 程序文件若是命令程序可以不用带路径. 带 p 的函数, 常用于执行替换 命令程序 时使用 ( 默认去 path 环境变量指定的路径下找程序)
带 e 和不带 e 的区别: 表示由自己设定环境变量, 否则默认使用原有环境变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值