文章目录

  • 1.软硬件支持
    • 1.1 冯诺依曼体系结构(硬件)
    • 1.2 操作系统(软件)
  • 2.进程与进程管理
    • 2.1 进程管理
    • 2.2 PCB进程控制块的内容
      • 2.2.1 标识符
      • 2.2.2 状态
      • 2.2.3 优先级
      • 2.2.4 程序计数器与上下文数据
    • 2.3 简单进程创建
  • 3.进程状态
    • 3.1 R状态
    • 3.2 S状态
    • 3.3 D状态
    • 3.4 T状态
    • 3.5 僵尸进程和孤儿进程
  • 4.进程优先级
    • 4.1 PRI & NI
    • 4.2 更改进程优先级
  • 5.环境变量
    • 5.1 环境变量
    • 5.2 main函数的参数
  • 6.进程地址空间
  • 7.内核进程调度队列

1.软硬件支持

1.1 冯诺依曼体系结构(硬件)

关于冯诺依曼体系结构的若干结论:
1.站在硬件角度和在数据层面上,CPU只和内存打交道,外设只和内存打交道
输入设备:键盘,网卡,硬盘,话筒,摄像头
输出设备:显示器,音响,网卡,硬盘
2.数据要处理,必须预装到内存中,由操作系统根据局部性原理完成
3.程序要运行之前,必须得先加载到内存中,为什么?可执行程序(文件)在硬盘上(外设)
4.各种硬件元件之间链接用的是总线(IO总线、系统总线)

一次聊天硬件层面上的数据交互:

1.2 操作系统(软件)

什么是操作系统:操作系统是一款进行软硬件资源管理的软件,那么如何理解管理?
在管理与被管理之间存在三个角色:管理者,执行者和被管理者,如果要完成一件事情,那么完成事情 = 决策+执行 ,决策由管理者做,执行由执行者做,其实管理者与被管理者是不需要直接进行沟通的。那么管理者做出决策是需要依据的,那么这些依据也一定是关于被管理者的信息与数据,通过执行者去做信息的采集。但是信息量太大,管理者就得对信息进行分类,把各个属性的信息放在一起,进而去描述一个个被管理者,那么这些属性的分类在C语言中可以看成一个结构体,在C++中可以看为面向对象,达到了聚合和高效组织的效果。然后我们将这些被管理者以一种数据结构组织起来,那么这时的管理实际上就是管理者对这个数据结构的每一个结点的管理(增、删、查、改),所以总结以上文字:先描述,再组织(构建数据结构的过程),管理者就是对数据结构的管理。

也就是说,计算机上的所有硬件资源,经过了先描述再组织,组织成一个一个的数据结构交给操作系统去管理。

2.进程与进程管理

2.1 进程管理

进程就是正在执行的程序,系统中可以同时存在大量的进程。
那么既然操作系统可以对进程进行管理,那么是怎么进行管理的呢?其实,这里的进程就相当于被管理者,操作系统相当于管理者,操作系统要对进程进行先描述再组织,用一种数据结构去对进程进行管理。这里进程被描述成一个进程控制块(PCB)(一个结构体),其中包含了进程的各项属性信息,然后再用数据结构将各个PCB链接起来,这样就可以对进程加以管理。所以进程的大小是要大于可执行程序的,因为进程中还包含了内核的数据结构。

如何理解创建进程:创建进程就是将程序的代码和数据加载到内存中,然后在内核中增加相应进程的PCB管理起来。
如何理解退出进程:退出进程就是在内核PCB的数据结构中将相应的PCB结点删除,然后再内存中释放相应的资源。

一些关于进程的其他概念:
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

2.2 PCB进程控制块的内容

Lniux 中描述进程的PCB是一个叫 task_struct 的结构体

2.2.1 标识符

当我们运行起一个进程,在系统中查看该进程

getpid() 函数和 getppid() 函数

在程序中打印 pid 和 ppid

每次执行,该进程的 pid 都是不一样的,但是父进程的 pid 始终不变,通过下图知道 ppid 对应的进程是 bash ,testout 是 bash 的子进程

2.2.2 状态

我们发现刚才的进程列表中有STAT这一列,这就是进程的状态

从上面操作的总结:
状态后面的 + 代表是不是前后台进程,有 + 说明是前台进程,前台进程只能有一个;没有 + 说明是后台进程,后台进程可以有很多个。
可以在执行可执行程序是在命令后加上 & ,使得生成的程序为后台进程。

2.2.3 优先级

因为CPU资源有限,而进程是有多个的,所以需要进行优先级的设置,和权限不同,权限是能与不能的问题,而优先级是谁先谁后的问题。所以进程就需要根据优先级进程排队。

2.2.4 程序计数器与上下文数据

每个进程都有自己的时间片(操作系统允许单个进程运行的最长时间),多个进程基于时间片进行轮转,轮转时需要从一个进程调度到另一个进程,这时程序计数器就起了作用。程序计数器实际上是一个指令寄存器,里面弄存放了最近正在执行指令的下一条指令的地址。

CPU内只有一套寄存器,计算需要将内存数据移动到CPU内的寄存器中,形成当前进程的上下文数据。进程被切换,可能在任何的时间点(时间片到了,当前进程被抢占)。这时候需要将上下文数据保存到进程控制块内(不太准确)。

2.3 简单进程创建

进程是能够知道自己当前所处的目录的

fork 去创建子进程: fork 用来创建一个新的进程,有两个返回值给子进程返回0,给父进程返回子进程的PID。fork 创建子进程,fork 之前的代码被父进程执行,fork 之后的代码默认情况被父子都可以执行。
那么 fork() 创建子进程操作系统做了什么?系统内存多了一个进程,先描述再组织,子进程执行的数据和代码来源来自于父进程。fork()之后就有了两个进程,这两个进程谁先被调度是不确定的,由调度算法决定。


fork() 将一个程序进行了分流,这一个程序就有了两个执行流

3.进程状态

在操作系统级别的理解中,进程的状态有新建、运行、阻塞、挂起、退出,这些是多数操作系统的共性,想要研究,得用一种具体的操作系统,我们以Linux进程状态为研究。

3.1 R状态

如果只有一个CPU,可不可以存在多个R状态的进程呢?可以,进程是R状态,不代表正在运行,代表可被调度,对应的是就绪或者运行的状态。系统中所有可被调度的进程都在一个调度队列中(run_queue),FIFO。

3.2 S状态

S状态是休眠状态,进程在等某一件事的发生,对应的是阻塞或者挂起的状态。这里的休眠是浅度睡眠状态,随时可以被唤醒,也可以随时被杀掉。

3.3 D状态

深度睡眠状态,表示该进程比会被杀掉,即便是操作系统,我自动唤醒,才可以恢复

3.4 T状态

暂停状态


3.5 僵尸进程和孤儿进程

僵尸状态(Z) :进程退出,在系统层面,曾经申请的资源并不是立即被释放,而是要存一段时间,供父进程或者操作系统进行读取,这种状态叫僵尸状态。
为什么要有僵尸状态?进程被创建的目的是完成某种任务,当任务完成了之后,调用方应该要知道任务完成的怎么样了。在写main函数的时候,程序正常结束了都会 return 0 给系统。
进程退出的信息(退出码)是会暂时被保存起来的(task_struct),如果没有人读取,此时 task_struct 相关数据不应该被释放,这时的状态为僵尸状态,处于该状态下的进程为僵尸进程

僵尸进程的危害:
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
内存泄漏?是的!

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?父进程先退出,子进程就称之为“孤儿进程”,会立即被操作系统领养,也就是被1号init进程领养,然后由1号init进程进行回收。

4.进程优先级

4.1 PRI & NI

PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值。PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值。nice其取值范围是-20至19,一共40个级别。

需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。可以理解nice值是进程优先级的修正数据。

4.2 更改进程优先级

5.环境变量

5.1 环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

常见的环境变量:
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。

查看环境变量的方法:
echo $NAME (NAME是环境变量的名称)
env : 查看所有的环境变量

PATH
当我们执行自己生成的可执行程序时需要加上 ./ ,而我们的 ls 指令不需要指定目录就可以执行,这跟PATH有关,它指定了系统应该去哪个目录下去查找该命令。如果我们将我们的可执行程序拷贝到PATH对应的目录下,那么我们也可以不加 ./ 就可以执行可执行程序(不推荐,会污染工具集);我们还可以将当前可执行程序所处的路径导入到PATH列表中(推荐):export PATH=$PATH:路径。PATH即使被更改,重新登陆后又会重新生成。

HOME
当前用户所处的目录

SHELL
当前系统的shell

TTY
用户端口

本地变量
只在本进程(bash)内有效
1.echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量

5.2 main函数的参数

argc 命令行参数个数,argv[ ] 命令行参数列表,envp[ ] 环境变量信息(系统提供的),可以通过传不同的命令行参数得到不同行为,就像 ls -a , ls -l 一样。

环境变量的组织方式:
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

通过代码获取环境变量
方法一:

方法二:

通过系统调用获取或设置环境变量
getenv ( )

6.进程地址空间

观察以下代码的输出:子进程先把g_val的值进行了更改,但是最后打印出来的值是不一样的,但是它们的地址又相同,所以这个地址绝对不可能是物理地址,在Linux地址下,这种地址叫做虚拟地址,我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理,因此,OS必须负责将虚拟地址转化为物理地址。

进程地址空间本质是内存中的一种内核数据结构 mm_struct,在划分区域之前,必须得有“大的区域”,32位机器中,有2^32个由比特位表示成的数,相当于4GB,这和物理内存本身是没有直接关系的。

创建进程,系统多了进程,需要管理进程,先描述再组织,struct task_struct , struct mm_struct (进程地址空间),页表。
虚拟内存中的堆和栈分别是向上增长和向下增长的,这里的增长就是在调整mm_struct里面的 end 的大小。
我们在磁盘上的可执行程序文件是被划分好区域的(可执行程序时分段的).code, readonly ,init ,uninit……

为什么要有地址空间?
1.从此以后,不会有任何系统级别的越界问题了,因为任何地址都要通过页表转化为物理地址,取决于页表的映射,保护了内存。
2.每个进程都认为看到的是相同的空间范围(构成、顺序)。
3.每个进程都认为自己在独占内存,更好的完成进程独立性以及合理使用空间,将进程调度与内存管理进行解耦或者分离。

7.内核进程调度队列

一个CPU拥有一个runqueue

活动队列:
时间片还没有结束的所有进程都按照优先级放在该队列。
nr_active : 总共有多少个运行状态的进程。
queue[140] : 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!
从该结构中,如何选择一个最合适的进程?
1.从0下表开始遍历queue[140]
2. 找到第一个非空队列,该队列必定为优先级最高的队列
3. 拿到选中队列的第一个进程,开始运行,调度完成
4. 遍历queue[140]时间复杂度是常数,但还是太低效了

bitmap[5] : 一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率。

过期队列:
过期队列和活动队列结构一模一样。
过期队列上放置的进程,都是时间片耗尽的进程。
当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算。

active指针和expired指针:
active指针永远指向活动队列。
expired指针永远指向过期队列。
可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。
没关系,在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程。
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法。

linux.4 进程概念相关推荐

  1. <Linux>进程概念

    文章目录 一.什么是进程 1.进程概念 2.进程描述 – PCB 3.task_struct内容分类 二.进程的基本操作 1.查看进程 2.结束进程 3.通过系统调用获取进程标示符 4.通过系统调用创 ...

  2. 【Linux】进程概念与进程状态

    文章目录 一.什么是进程 1.进程概念 2.进程描述 -- PCB 二.进程的一些基本操作 1.查看进程 2.结束进程 2.通过系统调用获取进程标示符 3.通过系统调用创建子进程 三.进程状态 1.普 ...

  3. 【Linux】进程概念--操作系统与进程

    进程概念(一) 一.冯诺依曼体系结构 二.操作系统(Operator System) 1.概念 2.设计OS的目的 3.定位--负责管理的软件 如何理解"管理" 小结 4.系统调用 ...

  4. 【Linux】进程概念——父子进程、僵尸进程和孤儿进程

    目录 父子进程 什么是父子进程? ==父子进程特性== 为什么有父子进程? 僵尸进程(defunct进程) 什么是僵尸进程? 僵尸进程的底层原因 僵尸进程的危害与解决方法 孤儿进程 什么是孤儿进程? ...

  5. 【Linux】进程概念——进程本质与PCB(进程控制块)

    目录 进程是什么? 1. 冯诺依曼体系结构 2. 操作系统OS 操作系统是什么? 操作系统做什么? 操作系统的管理方式 tip:系统调用函数&库函数 3. 进程 进程组成 ==进程与程序的区别 ...

  6. Linux(进程概念详解)

    进程是如今编程领域非常重要的一个概念,进程是比较抽象的,不容易直接理解.因为进程与操作系统息息相关,因此在介绍进程之前,笔者打算先简易讲一下操作系统的工作流程,理解操作系统是如何管理软件和硬件的,然后 ...

  7. 【Linux】进程概念 —— PCB

    目录 一.基本概念 二.系统如何管理进程 三.PCB 1.PCB的概念 2.task_struct概念 3.task_struct内容分类 四.查看进程 五.系统调用获取进程标识符 一.基本概念 启动 ...

  8. Linux之进程概念

    目录 一.冯诺依曼操作系统 二.操作系统(Operator System) 前言 概念 操作系统是什么? OS为什么存在? OS是怎么实现的呢? 什么叫做管理? 操作系统如何管理进程呢? 如何为程序员 ...

  9. 【Linux】进程概念 —— 进程状态

    目录 一.操作系统理论中的进程状态 二.Linux系统中的进程状态 0.前台进程与后台进程 1.R - 运行状态(Running) 2.S - 睡眠状态(Sleeping) 3.D - 磁盘睡眠(Di ...

最新文章

  1. linux下 为自己编写的程序 添加tab自动补全 功能
  2. 174. Dungeon Game
  3. python reduce()函数
  4. java 字符串 移位_使用位运算、值交换等方式反转java字符串-共四种方法
  5. 数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )
  6. 百度SEO emlog虚拟源码商城模板
  7. 妈蛋:kinMaxShow旋转木马异常,WebUploader图片上传坑爹,图像被压缩
  8. 面试不慌,看完保证让你写HashMap跟玩一样
  9. 《DB 查询分析器》使用技巧之(七)
  10. [转]asp.net中利用ashx实现图片防盗链
  11. xlsx的python处理
  12. 期货权益可用资金(期货的权益和可用资金)
  13. html语言单词背不下来,单词背不下来
  14. 1周上线系统,效率提升100%,宜搭助力阿里巴巴法务数字化升级
  15. 综合电商高保真移动端Axure原型模板
  16. python动态监控日志内容
  17. 通用产品 云OA SaaS三管齐下
  18. android官方自带下拉刷新功能
  19. 麻省理工大学计算机博士后收入,申请MIT博后回复及后续 - 海外博后 - 小木虫 - 学术 科研 互动社区...
  20. PyCharm 安装 订制模板

热门文章

  1. 彼得•德鲁克给中层经理人上的一课
  2. 板邓:PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件(转)
  3. 2022年3月A-level数学M1真题解析(1)
  4. 西部广播电视杂志西部广播电视杂志社西部广播电视编辑部2022年第22期目录
  5. 【数学模型】模型整合
  6. dede仿站标签替换工具_dede仿站工具包_DEDE标签大全下载
  7. 航天航空火了,可是你知道航天器中的宇航级芯片设计有什么特别之处?
  8. 汽车常识之动力系统简介
  9. win10 1803 频繁死机,卡死不动
  10. 自己动手做QQ木马--文件绑定篇(转)