Linux——什么是进程,多进程,进程间如何通信,一文详解,10分钟掌握

基本概念

  •  程序执行过程中所有资源的总称

  • 进程是一个独立的可调度的任务

  • 分为系统进程和用户进程

  • 进程是一个抽象实体,当系统在执行某个程序时,分配和释放的各种资源

  • 进程:动态的概念,是程序执行的过程,包括创建、调度和消亡

  • 程序:静态的是保存在磁盘上的指令的有序集合,没有执行的概念

  • 程序的一次执行的过程

  • 进程是程序执行和资源管理的最小单位

  • 进程号PID,唯一标识一个进程

  • 父进程号PPID

分类

按特点分类:

  • 交互进程:由shell控制和运行,既可以在前台运行,也可以在后台运行
  • 批处理进程:该类进程不属于某个终端,被提交到一个队列中以便顺序执行,负责按顺序启动其他进程
  • 守护进程:
    1. 执行特定功能或者执行系统相关任务的后台进程。守护进程只是一个特殊的进程,不是内核的组成部分。许多守护进程在系统启动时启动,直到系统关闭时才停止运行。而某些守护进程只是在需要时才会启动,比如FTP或者Apache服务等,可以在需要的时候才启动该服务。
    2. 所有守护进程都可以超级用户(用户ID为0)的优先权运行;守护进程没有控制终端;守护进程的父进程都是init进程(即1号进程)。

按运行状态分类:

  • 守护进程
  • 孤儿进程:一个父进程退出后,它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。
  • 僵尸进程:
    1. 一个子进程结束但是没有完全释放内存(在内核中的 task_struct没有释放),该进程就成为僵尸进程。
    2. 当僵尸进程的父进程结束后该僵尸进程就会被init进程所收养,最终被回收。
    3. 僵尸进程会导致资源的浪费,而孤儿进程不会。

Linux中进程的分段

  • BSS段:
    1. BSS段通常是指用来存放程序中未初始化的全局变量的一块内存区域。因为未进行初始化,所以不分配空间,只记录大小
  • 数据段:
    1. 存放全局变量常数以及动态数据分配的数据空间
  • 正文段:

    1. 程序中的代码
  • 堆栈段:
    1. 存放的函数的返回地址,函数的参数以及程序中的局部变量

常见进程调度指令

  • ps :查看系统中的进程
  • top:动态显示系统中的进程 (类似任务管理器)
  • nice:按用户指定的优先级运行进程
  • renice:改变正在运行的进程的优先级
  • kill:向进程发送信号(kill -l 查看信号大全
  • bg:将进程放在后台执行
  • fg:将后台运行的进程放在前台执行

exec函数族

        exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了

函数原型

#include <unistd.h>
extern char **environ;

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg,..., char * const envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execvpe(const char *file, char *const argv[],char *const envp[]);
  • execl, execlp, execle, execv, execvp, execvpe
  • exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。

多进程的系统调用  fork

    pid_t fork(void)

/*

创建一个子进程

返回-1表示创建失败、0表示是子进程、>0表示是父进程,此时的返回值为子进程的PID
由于之前版本的fork完整地拷贝了父进程的整个地址空间,执行速度是比较慢的。                                                       为了提高效率,Unix系统设计者创建了现版fork。fork也创建新进程,但不产生父进程的副本。它通过允许父子进程可访问相同物理内存从而伪装了对进程地址空间的真实拷贝,当子进程需要改变内存中数据时才拷贝父进程。这就是著名的“写操作时拷贝”(copy-on-write)技术。

*/
  • 多进程:计算机同时执行多个程序
    1. 单进程单线程:一个人在一个桌子上吃菜。
    2. 单进程多线程:多个人在同一个桌子上一起吃菜。
    3. 多进程单线程:多个人每个人在自己的桌子上吃菜
  • windows开进程时间开销很大,而linux则开销很小
  • 并行:多个CPU实例或多台机器同时执行一段处理逻辑,是真正的同时
  • 并发:通过CPU调度算法,让用户看上去同时执行,实际上CPU操作层面不是真正的同时

进程间通信的几种方式

传统通信方式

  • 无名管道(pipe)
    • 半双工通信,数据只能单向流动,而且只能在具有亲缘关系的进程间使用
  • 有名管道(fifo)
    • 半双工通信,但允许无亲缘关系间的进程通信
  • 信号
    • 信号是一种事件通知机制,当接收到该信号的进程会执行相应的操作

System V IPC对象

  • 共享内存
    1. 多个进程在磁盘中开辟共享一个给定的存储区,这一段存储区可以被这些进程映射到自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取读出,从而实现了进程间的通信
    2. 效率高,减少了共享数据的拷贝次数,不需要四次,只需要2次
  • 消息队列
    1. 链表,一系列保存在内核中的消息的链表,用户进程可进行添加和读取
    2. 相比于管道,可以根据条件自定义读取特定消息,不需要按照队列次序
  • 信号量
    1. 计数器,用于实现进程间的互斥和同步,而不是用于存储进程间通信的数据
    2. 传递数据需要结合共享内存
    3. 信号量是基于操作系统的PV操作,程序对信号量的操作都是原子操作

BSD

  • 套接字socket

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值