C++ 进阶 day9 多进程编程
5.8
多进程理论基础
引入目的
- 实现任务并执行的一种途径
- 可实现数据在多个进程之间通信,共同处理整个程序的相关数据提高效率
多进程的概念
- 进程是程序的一次执行过程,有一定的生命周期
- 进程是计算机资源分配的基本单位
- 每个进程分配0-4G虚拟内存,其中0-3G是用户空间,3-4G是内核空间
- 用户空间相互独立,内核空间相互共享
- 用户空间细分为:栈区,堆区,静态区
- 进程调度机制

- 并发与并行的区别
- 针对于单核CPU而言,使用相关调度机制,实现多个任务进行细化时间片轮询时,在宏观上感觉是多个任务同时执行的操作,同一时刻,只有一个任务在被CPU处理
- 针对于多核CPU而言,处理多个任务时,同一时间,每个CPU处理的任务之间是并行的,实现的是真正意义上多个任务同时执行的
进程的内存管理(重点)
- 物理内存:内存条上(硬件上)真正存在的存储空间
- 虚拟空间:程序运行后,通过内存映射单元,物理到虚拟

进程与程序的区别
- 进程:动态的,进程是程序的一次执行过程,有生命周期
- 程序:静态的,没有生命周期,存储在磁盘设备上的二进制文件
进程的种类
- 交互进程:sell
- 批处理进程:内部队列处理
- 守护进程:系统伴随进程
进程PID
- PID(Process ID):进程号,进程号是一个大于等于0的整数,唯一标识,不可重复
- PPID:父进程号,都有父进程号,都是从其拷贝过来的
- 在linux的/proc目录下的数字都是进程
特殊进程
- 0号进程
- 1号进程
- 2号进程
- 孤儿进程
- 僵尸进程
有关进程相关指令
- ps
- 功能:查看当前运行的进程相关属性
- ps -ef:进程之间的关系
- ps -ajx:能够显示当前进程的状态
- ps -aux:可以查看当前进程对CPU和内存的占用率
- top
*功能:动态查看进程属性 - kill
- 语法:kill -信号号
- kill -l查看发送的信号信息
- pidof:查看进程的进程号
进程状态切换
- man ps查看进程的状态
- 进程主要状态的转换

多进程的创建:fork
fork
#include <unistd.h>
pid_t fork(void);
功能:通过拷贝父进程得到一个子进程
参数:无
返回值:成功在父进程中得到子进程的pid,在子进程中的到0,失败返回-1并置位错误码
- 不关注返回值案例:
点击查看代码
#include<myhead.h>
int main(int argc, const char *argv[])
{
printf("ni hao xingqiu\n");
fork(); //创建一个子进程
printf("hello world\n");
while(1); //防止进程结束
return 0;
}
- 多个fork

*并发执行案例
点击查看代码
#include <myhead.h>
using namespace std;
int main(){
pid_t pid = -1;
pid = fork();
if(pid>0){
while(1){
//父进程要执行的代码
printf("我是父进程111\n");
sleep(1);
}
}
else if(pid==0){
while(1){
//子进程要执行的代码
printf("我是子进程\n");
sleep(1);
}
}
else{
perror("fork error");
return -1;
}
return 0;
}
- 返回值样例
点击查看代码
#include<myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid = -1;
pid = fork(); //创建一个子进程,父进程会将返回值赋值给父进程中的pid变量
//子进程会将返回值赋值给子进程中的pid变量
printf("pid = %d\n", pid); //对于父进程而言会得到大于0的数字,对于子进程而言会
得到0
//对pid进程判断
if(pid > 0)
{
//父进程要做执行的代码
printf("我是父进程\n");
}else if(pid == 0)
{
//子进程要执行的代码
printf("我是子进程\n");
}else
{
perror("fork error");
return -1;
}
while(1); //防止进程结束
return 0;
}
父子进程号的获取
#include <sys/types.h>
#include <unistd.h>
getpid
pid_t getpid(void);
功能:获取当前进程的进程号
参数:无
返回值:当前进程的进程号
getppid
pid_t getppid(void);
功能:获取当前进程的父进程pid号
参数:无
返回值:当前进程的父进程pid

浙公网安备 33010602011771号