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

posted @ 2025-05-08 22:46  北燃  阅读(128)  评论(0)    收藏  举报