Linux:深入理解进程的概念


基本概念

  • 进程就是一个运行起来的程序(程序:一系列有序的指令集合 )

进程是什么?

  • 进程就是pcb,是操作系统对一个运行中程序的描述,通过这些描述信息,完成对一个程序控制运行调度。
  • Linux操作系统下的pcb是一个结构体:struct task_struct {…}

task_struct(pcb的一种)

  • 在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

task_ struct的内容分类

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。

  • 状态: 任务状态,退出代码,退出信号等。

  • 优先级: 决定进程cpu调度优先权的级别— 权级其实就是一个数字

  • 程序计数器: 程序中即将被执行的下一条指令的地址。

  • 内存指针: 用于指向程序指令数据在内存中的位置。

  • 上下文数据: 进程执行时处理器的寄存器中的数据。

    扫描二维码关注公众号,回复: 11338030 查看本文章
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

  • 其他信息、

cpu的分时机制

进程在操作系统中是调度切换运行的,每个进程都有一个cpu时间片(一个进程在cpu上的运行时间段),在cpu上时间片运行完毕后则切换到下一个进程

进程和程序的区别

  • 程序时静态的指令集,存储在文件中
  • 进程是一个程序动态的运行过程,需要被加载在内存当中,需要被cpu处理,切换调度…

查看进程

ps -ef 查看系统下所有进程信息
ps aux 查看系统下所有进程信息(更加详细)

获取进程标示符

pid_t getpid(void) — 返回调用进程的pid — 谁调用就返回谁的pid

  • 进程id(PID)
  • 父进程id(PPID)

在这里插入图片描述

进程创建

  • 进程就是一个pcb,意味着创建一个进程,就是创建一个pcb
  • pid_t fork(void) — 通过复制调用进程(父进程)创建一个新的进程(子进程)
  • 创建了一个新的pcb,然后从父进程pcb中复制了很多数据过来(复制的信息:内存指针,程序计数器,上下文数据…)
    • 内存指针:子进程与父进程运行的代码其实是一样的—指向同一块物理内存中的数据以及指令
    • 程序计数器/上下文数据:自己成被创建出来后,运行位置与父进程是完全一样的,下一步即将执行的指令都是从创建子进程成功之后开始的,创建一个子进程出来,跟父进程干的事情是一样的,因为他们的运行的代码和数据以及当前的运行位置都是一样的。

父子进程都是一个pcb,因此都有可能被cpu调度运行,并且谁先运行不一定

创建进程-fork

  • 运行 man fork 认识fork

  • fork有两个返回值

  • 父子进程代码共享,数据独有(采用写时拷贝)

  • 通常根据fork的返回值进行代码的分流,让父子进程进入不同的执行体完成不同的功能

因为这个函数的返回值对于父子进程是不一样的

  • 错误则返回-1;
  • 在父进程中返回创建的子进程的pid>0
  • 在子进程中返回的是0

示例代码:

#include <stdio.h> 
#include <unistd.h>

int val =100;
int main() {
    int ret = fork();
    if(ret < 0){
        perror("fork");
		return 1; 
	}
    else if(ret == 0){
        printf("I am child : %d!, ret: %d\n", getpid(), ret);
        val = 1;
        printf("child:val = %d, &val = %p\n",val, &val);
    }
    else{
        printf("I am father : %d!, ret: %d\n", getpid(), ret);
		printf("father:val = %d, &val = %p\n", val, &val);

    }
    sleep(1);
    return 0;
}

代码运行图
在这里插入图片描述

由图能看得出来: 代码共享,数据独有!

进程优先级

基本概念

cpu资源分配的先后顺序,就是指进程的优先权(priority)。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

查看系统进程

在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:
在这里插入图片描述

我们很容易注意到其中的几个重要信息,有下:

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice值

PRI and NI

  • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高
  • 那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
  • 所以,调整进程优先级,在Linux下,就是调整进程nice值
  • nice其取值范围是-20至19,一共40个级别。

PRI vs NI

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

修改进程优先级的命令

  1. 一开始执行程序就指定nice值:nice
nice -n -5 /usr/local/mysql/bin/mysqld_safe &

功能说明:设置优先权。

语  法:nice [-n <优先等级>][–help][–version][执行指令]

补充说明:nice指令可以改变程序执行的优先权等级。

参  数

  • -n<优先等级>或-<优先等级>或–adjustment=<优先等级>  设置欲执行的指令的优先权等级。等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。
  • –help  在线帮助。
  • –version  显示版本信息。

范例一: 用root给一个nice值为-5,用于执行vi,并观察该进程。

# nice -n -5 vi &

在这里插入图片描述

  1. 用top命令更改已存在进程的nice:
  • top
  • 进入top后按“r”–>输入进程PID–>输入nice值

其他概念

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

思考题:

  1. 操作系统如何实现多个程序的调度运行?

在这里插入图片描述

将这个运行中的程序描述并组织起来,通过实现对pcb的调度管理实现对运行中程序的切换调度运行—对于操作系统来说这个描述信息 - pcb(就是进程)

  1. 操作系统与cpu,pcb的链接关系?

操作系统认为现在要运行哪个程序了,则找到对应的pcb,把当前的pcb指向的那个程序的程序计数器中的地址(地址对应着保存各种描述信息),加载到cpu寄存器上。

操作系统调度哪个程序在cpu上运行,操作系统中有一系列的调度算法

cpu多核—多个处理核心 — 每个核心都有自己的寄存器,可以调度一个程序的运行

并发:轮询处理执行(单核cpu)
并行:同时运行/执行(多核cpu)

  1. 为什么要有优先级:
  • 交互式程序:直接与用户进行交互的进程 — 要求最好能够更加优先的被cpu处理
  • 批处理程序:在后台默默做循环工作的进程

优先级的作用:让操作系统运行的更加良好


如有不同见解,欢迎留言讨论~~

猜你喜欢

转载自blog.csdn.net/AngelDg/article/details/106665867