欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux:深入理解进程的概念

程序员文章站 2024-03-15 20:03:54
...


基本概念

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

进程是什么?

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

task_struct(pcb的一种)

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

task_ struct的内容分类

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

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

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

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

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

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

  • 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)

Linux:深入理解进程的概念

进程创建

  • 进程就是一个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;
}

代码运行图
Linux:深入理解进程的概念

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

思考题:

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

Linux:深入理解进程的概念

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

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

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

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

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

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

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

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


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

相关标签: Linux