一、进程切换(上下文切换)
暂停当前运行的进程,从运行状态变成其它状态
调度另一个进程,从就绪状态变成执行状态
进程切换的要求
进程切换前,保存进程上下文信息
进程切换后,恢复进程上下文信息
快速切换
上下文信息包括:寄存器、CPU状态、内存地址空间
二、进程创建和加载
创建进程的系统调用:fork
加载进程的系统调用:exec
1.fork()
把一个进程复制成两个进程(将整个地址空间进行复制),子进程获得一个新PID
1)fork()创建一个继承的子进程
复制父进程的所有变量和内存
复制父进程的CPU寄存器(有部分没有复制以区别父子进程)
2)fork()的返回值
int pid = fork()
子进程的fork()返回0
父进程的fork()返回子进程的PID
fork()返回值可以方便后续使用,子进程可使用getpid()获取PID
2.exec()
用新进程重写当前进程,PID没有改变
允许加载一个完全不同的程序,并从main开始执行
exec(可执行程序,参数数量,参数1,参数2,...)
三、进程等待
wait()用于父进程等待子进程的结束
exit()用于进程结束时完成进程资源回收
子进程结束时通过exit()向父进程返回一个值
父进程通过wait()接受返回值
1.wait()的功能
1)有子进程存活时,父进程进入阻塞状态,等待子进程的返回结果
2)有僵尸子进程等待时(子进程已调用exit(),等待父进程调用wait()),立即获得其中一个返回值
3)无子进程存活时,wait()直接返回
2.exit()的功能
1)将eixt()的参数作为进程的结果返回
2)关闭所有打开的文件等占用资源
3)释放内存
4)释放大部分进程相关的内核数据结构
5)检查父进程是否存活
- 如果存活,保留返回值直到父进程需要,并进入僵尸状态
- 如果没有存活,则释放所有数据结构,进程结束
四、其它进程控制系统调用
优先级控制:nice()执行进程初始优先级,unix中优先级会随执行时间而衰减
进程调试支持:ptrace()允许一个进程控制另一个进程执行(设置断点,查看寄存器等)
定时:sleep()可以让进程在定时器的等待队列中等待