Linux C/C++编程之(十六)进程及进程控制

这篇博客详细介绍了Linux中的进程概念,包括程序与进程的区别、并发与并行、多道程序设计、CPU和MMU、进程控制块PCB等。此外,还讲解了环境变量、相关函数如fork、getpid、getppid、getuid等的使用,并探讨了进程的状态转换、回收子进程的方法,如wait和waitpid。最后,通过实例展示了如何在实践中创建和管理进程。
摘要由CSDN通过智能技术生成

一、概述

在这里插入图片描述

二、基础知识

1. 进程相关概念

1)程序和进程

程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁…)

进程,是一个抽象的概念,与操作系统原理联系紧密。进程是活跃(运行起来的)的程序,占用系统资源,在内存中执行。(程序运行起来,产生一个进程)。

程序 → 剧本(纸) ,进程 → 戏(舞台、演员、灯光、道具…),同一个剧本可以在多个舞台同时上演。同样,同一个程序也可以加载为不同的进程(彼此之间互不影响)

如:同时开两个终端。各自都有一个bash,但彼此ID不同。

进程和线程的区别:
在这里插入图片描述
阮一峰大佬的文章

  • CPU是工厂、
  • CPU时间片是电力资源、
  • 进程是车间、
  • 线程是车间工人~

2)并发

并发,在操作系统中,一个时间段中有多个进程都处于已启动运行到运行完毕之间的状态。但,任一个时刻点上仍只有一个进程在运行。理论依据:时钟中断

例如,当下,我们使用计算机时可以边听音乐边聊天边上网。 若笼统的将他们均看做一个进程的话,为什么可以同时运行呢,因为并发。
在这里插入图片描述

并发和并行的区别:
在这里插入图片描述
Erlang 之父 Joe Armstrong 用一张5岁小孩都能看懂的图解释了并发与并行的区别

  • 并发是两个队列交替使用一台咖啡机,
  • 并行是两个队列同时使用两台咖啡机,
  • 串行是一个队列使用一台咖啡机,

3)单道程序设计

所有进程一个一个排队执行。若A阻塞,B只能等待,即使CPU处于空闲状态。而在人机交互时阻塞的出现时必然的。所有这种模型在系统资源利用上及其不合理,在计算机发展历史上存在不久,大部分便被淘汰了。

4)多道程序设计

在计算机内存中同时存放几道相互独立的程序,它们在管理程序控制之下,相互穿插的运行。多道程序设计必须有硬件基础作为保证。

时钟中断 即为多道程序设计模型的理论基础。 并发时,任意进程在执行期间都不希望放弃cpu。因此系统需要一种强制让进程让出cpu资源的手段。时钟中断有硬件基础作为保障,对进程而言不可抗拒。 操作系统中的中断处理函数,来负责调度程序执行。

在多道程序设计模型中,多个进程轮流使用CPU (分时复用CPU资源)。而当下常见CPU为纳秒级,1秒可以执行大约10亿条指令(1s = 1000ms, 1ms = 1000us, 1us = 1000ns)。由于人眼的反应速度是毫秒级,所以看似同时在运行。

实质上,并发是宏观并行,微观串行(伪并行)!推动了计算机蓬勃发展,将人类引入了多媒体时代。

5)CPU和MMU
在这里插入图片描述程序中用到的所有的内存都是虚拟内存,但是虚拟内存在计算机中是不实际存在的,存储的数据都是存储在物理内存中。
在这里插入图片描述6)进程控制块PCB

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。

  • 进程id。系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
  • 进程的状态,有初始化、就绪、运行、挂起、停止等状态。
  • 进程切换时需要保存和恢复的一些CPU寄存器的值。
  • 描述虚拟地址空间的信息。
  • 描述控制终端的信息。
  • 当前工作目录(Current Working Directory)。
  • umask掩码。
  • 文件描述符表,包含很多指向已经打开的文件的file结构体的指针的一个数组。 (注:pcb中有一根指针,指针存储的是文件描述符表的首地址)
  • 和信号相关的信息。
  • 用户id和组id。
  • 会话(Session)和进程组。
  • 进程可以使用的资源上限(Resource Limit)。

在这里插入图片描述
ulimit -a 列出所有当前资源极限

7)进程状态

进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。细分可以分成七种状态:
在这里插入图片描述

2. 环境变量

(1)定义:

环境变量,是指在操作系统中用来指定操作系统运行环境的一些参数。

  • 通常具备以下特征:
    • ① 字符串(本质)
    • ② 有统一的格式:名=值[:值]
    • ③ 值用来描述进程环境信息。
  • 存储形式:与命令行参数类似。char *[]数组,数组名environ,内部存储字符串,NULL作为哨兵结尾。
  • 使用形式:与命令行参数类似。
  • 加载位置:与命令行参数类似。位于用户区,高于stack的起始位置。
  • 引入环境变量表:须声明环境变量。extern char ** environ;

(2)常见环境变量:

按照惯例,环境变量字符串都是name=value这样的形式,大多数name由大写字母加下划线组成,一般把name的部分叫

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是管小亮

一口吃掉你的打赏,嗝~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值