详解Linux进程概念

本文详细介绍了Linux进程的相关知识,包括冯诺依曼体系结构、操作系统的概念,重点讲解了进程的定义、PCB(进程控制块)、task_struct的内容,以及进程的创建、查看、状态和优先级。同时,还探讨了环境变量的基本概念、常见环境变量以及如何查看和设置。通过对进程地址空间的分析,揭示了虚拟地址和物理地址的区别以及写时拷贝的原理。
摘要由CSDN通过智能技术生成

目录

1.基本常识及概念

1.1冯诺依曼体系结构

1.2操作系统

2.进程

2.1什么是进程

2.2描述进程--PCB

2.3 task_struct中的内容

3.进程的相关操作

3.1查看进程

3.2通过系统调用获取进程标识符(PID)

3.3通过函数调用创建进程  --- fork函数初始

3.4 命令行上启动的进程

4. 进程状态

4.1进程状态

4.2 进程状态的查看

4.3僵尸进程

4.4孤儿进程

5.进程优先级

5.1基本概念

5.2查看系统进程

5.2.1 PRI and NI

5.2.2 PRI vs NI

5.3 修改进程的优先级

5.4 进程的其他概念

6.环境变量

6.1 基本概念 

6.2 常见环境变量

6.3查看环境变量的方法

6.4 测试PATH

6.4.1 创建 hello.c文件

6.5 环境变量的相关变量

6.6 通过代码如何获取环境变量

6.7 环境变量通常具有全局性

7. 进程地址空间


1.基本常识及概念

1.1冯诺依曼体系结构

我们常见的计算机,如笔记本;不常见的计算机,如服务器;大部分都遵守冯诺依曼体系结构。如下图所示:

  •  输入设备:磁盘,网卡,键盘,话筒,摄像头;
  • 输出设备:磁盘,网卡,显示器,显卡,音响;
  • 存储器:主要指内存,磁盘不属于存储器;
  • 控制器&运算器:CPU;

1.2操作系统

任何计算机系统都包含了一个基本的程序集合,称为操作系统(OS);笼统的理解:OS包含了

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(库函数,shell程序)

2.进程

2.1什么是进程

进程=程序+操作系统维护进程的相关的数据结构。 

在学校的教材中,进程被理解成是一个正在执行的程序,这种说法是错误的,程序只是进程中的一部分,他还包含了操作系统维护的进程的数据结构。

2.2描述进程--PCB

操作系统管理进程,把进程的信息放到进程控制快(PCB)的数据结构中,也就是说,PCB中存放的是进程属性的集合。

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

2.3 task_struct中的内容

  • 标识符:描述本进程的唯一标识符,用来区别其他的进程
  • 状态:任务状态,退出代码,退出信号灯。
  • 优先级:相对于其他的进程的优先级
  • 程序计数器:程序中即将被执行的下一条指令的程序
  • 内存指针:包括程序代码和进程相关数据的指针,还有其他的进程共享 的内存块的指针
  • 上下文数据:进程执行时处理器的寄存器中的数据
  • I/O状态信息:包括显示I/O请求,分配给进程的I/O设备和进程使用的文件列表
  • 记账信息:可能包括处理器的时间总和,使用的时钟总和,时间限制
  • 其他信息

可以在内核源代码里找到它,所有运行在系统里面的进程都以task_struct链表的形式存在内核中。

3.进程的相关操作

3.1查看进程

进程的相关信息可以通过在命令行输入 ls  /proc 获取,比如要查看进程为的PID为 1 的进程的信息就输入 ls /proc/1,但是一般都是没有权限的,可以加上 sudo

3.2通过系统调用获取进程标识符(PID)

PID:当前进程的ID;

PPID:当前进程的父进程的ID

可以看出,通过函数getpid() 和 getppid() 可以得到子进程和父进程的标识符。 他们的头文件是sys/types 和 unistd;但是在虚拟机中,只需要一个stdio.h就可以调用这两个代码。

3.3通过函数调用创建进程  --- fork函数初始

通过调用 fork 函数,可以发现,原本只有一行输出,确在显示界面输出了两行,而这的根本原因就是 fork 创建了一个子进程。

通过 if 分流,代码和结果如下所示:  通过 if 的分流,可以清楚的说明:fork()  函数返回的是0 给子进程,返回给父进程的的值就是子进程的 PID。如果返回的值是小于 0 就是创建子进程失败了。

所以,创建子进程可以通过 if 分流进行分流,从而实现子进程和父进程实现不同的功能。要不然子进程和父进程只会执行一样的代码,因为父进程和子进程的代码是共享的,所以不进行分流就会导致子进程和父进程执行一样的代码。既让这样,

那么为什么子进程和父进程的返回值为什么不同?

父进程中,fork函数返回的是子进程的PID,而子进程中,fork返回的是0;虽然子进程和父进程共享数据和代码,但是这是在默认的情况下;一旦子进程或者父进程要写入数据,就会发什么“写时拷贝”,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

年轻人江老Der

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值