linux环境下进程相关概念解释

简介: 进程概念进程:程序的一个执行实例,正在执行的程序等。内核观点:担当分配系统资源(CPU时间,内存)的实体。程序员观点:进程 = 对应的代码和数据 + 进程对应的PCB结构体

进程概念

进程:程序的一个执行实例,正在执行的程序等。

内核观点:担当分配系统资源(CPU时间,内存)的实体。

程序员观点:进程 = 对应的代码和数据 + 进程对应的PCB结构体

PCB(Process control block)

进程信息被放在一个叫做进程控制块(PCB)的数据结构中,即进程属性的集合。

在OS中,通过对PCB进行操作,从而达到控制程序运行的目的。

linux下的PCB结构体具体内容为:PCB具体内容。

进程组织

进程被组织进程管理,是以双链表的形式将PCB存在内核里。

查看进程

在linux里,查看正在运行的进程并不难。进程的运行状态信息,在根目录下的proc系统文件里。

如下:数字代表每个进程的ID号(PID)

5d9a2e7ea46248e8b2cfc5b55f6fa314.png

proc里面存着所有进程的运行信息。

下面我们使用一个例子查看自己正在运行的进程:

e82b6c64fce34e608fa8fa3a230d6737.png

持续运行该代码。

运行ps命令,可以查看当前运行的进程,PID号。

8ed2f60991b248a29ce8d7e9d00de93e.png

根据该PID即可查找到该文件,相关信息就存在里面。

2fc4f547b46c4ff8bd2de9730c9f024a.png

其中cwd目录中,存储的就是当前程序运行的路径。

24bd5586a6d54956a00ad17201d4fd95.png

ps 命令

查看当前运行的进程,并显示运行进程的PPID,PID号等等。

用法: ps [选项]

选项:

a:显示所有用户的所有进程(包括其他用户)

j:用任务格式来显示进程

x:显示无控制终端的进程(后台运行)。

u:按用户名和启动时间顺序来显示进程。

显示结果的各个含义:

cce68480c6724548a082ae0f97c6caa3.png

getpid()/getppid()

包含头文件<unistd.h>和<sys/types.h>

getpid()

获取当前进程的pid

getppid()

获取当前进程的父进程的ppid

4b7459f43c904bfd85a60d11aeab4da7.png

kill -9 pid/ppid

使用该命令可以杀死进程。

fork()

创建一个子进程。

使用man fork时出现这个,提示:

7ac3fb9b6c2b45f3b9495527dff4b722.png

缺少相关手册,输入以下命令即可解决。

yum install -y man-pages

为什么fork会有两个返回值?

根据man手册的介绍,创建成功后,会返回两个值。将子进程的PID号返回给父进程;将0返回给子进程。

852e40ade4584c5cb3a86217ebba133a.png

#include<stdio.h>
#include<unistd.h>
int main ()
{
  pid_t id  = fork();
  if(id == 0)
  {
    //child
    while(1)
    {
      sleep(1);
      printf("I am a child,my pid:%d, ppid:%d\n",getpid(),getppid());
    }
  }
  else{
    //parent
    while(1)
    {
      sleep(1);
      printf("I am a parent,my pid:%d, ppid:%d\n",getpid(),getppid());
    }
  }
  //printf("hello world!\n");
  return 0;
}

运行结果:

b7c6e0ce357b4114b1185a5de38604f5.png

ps命令查询父子进程ID号:

1c2ae77995624cd4b0e9f13885becc69.png

从该程序来看,该函数确实创建了一个子进程,并且if的两种情况都执行了。父进程执行else,子进程执行if。

原因:

原因:

因为子进程被创建后,fork后面的代码是父子进程都看的见的,而在fork函数return id前,子进程就已经被创建好了,父子进程都会执行return id语句因此看起来像一个变量两个值,本质上,是两个不同的进程,执行了同一段代码。

为什么父进程返回子进程的PID,而子进程返回0?

因为父进程可以创建多个子进程,返回子进程的PID方便父进程知道,我创建的孩子是谁,不至于变成野孩子;而子进程它自己知道自己是谁,当然也知道它的父亲是谁,因此子进程我们只需知道它创建成功即可,返回0就行。

关于fork的写时拷贝技术

fork之后,os按道理来说,需要给自己成也拷贝一份数据,供子进程使用。但是如果子进程只读数据的话,那么其实读父进程的也可以,这样就造成数据冗余了!因此写时拷贝技术产生了!

  1. 代码段父子进程是一模一样的,不需要拷贝一份,父子共享即可。(根据页表映射到同一物理地址)。
  2. 数据段(起初也通过页表映射到同一物理地址),只有子进程想要改变数据时,此时拷贝一份新的给子进程

6a3977ee421d422a9577e4d95d43a21f.png

优点:

写时拷贝是一种延时申请技术,可以提高整机内存的使用率。

fork调用失败的原因

fork调用失败会返回-1。

  • 系统中有太多进程。
  • 实际用户的进程数超过了限制。

linux下的进程状态

R(running): 运行状态,表明PCB要么在运行中,要么在运行队列。

S(sleeping):睡眠状态(阻塞状态),等待非CPU资源就绪,可中断睡眠。

D(Disk sleep):比如IO磁盘的时候的状态,不可中断睡眠。

T(stopped):暂停或调试状态

t(tracing stop):暂停或调试状态

X(dead):终止态,瞬时性非常强(OS释放资源很快)。

Z(zombie):僵尸状态,终止或异常状态,需要被CPU或父进程检查,检查完即可变到X。

可以在linux使用以下脚本命令,监控进程的状态:

 while :; do ps axj | head -1 && ps axj | grep ./my_test | grep -v grep; sleep 1; echo "-----------------------------------"; done

Z进程

僵尸进程是一个比较特殊的状态,当进程退出,并且父进程没有读取到子进程的返回代码时,就会产生僵死进程。僵死进程会一直以终止状态保持在进程表中,并且会一直等待父进程读取退出状态码。

僵尸进程危害:

  1. 进程的退出状态会一直被维持下去,因为它要等待父进程读取。
  2. 维护退出状态就是维护(PCB),也就是僵尸进程的PCB会一直在内存中。
  3. 父进程创建很多子进程,就是会不回收,就会造成内存资源浪费。

孤儿进程

和Z进程产生情况相反,如果父进程先退出,子进程就会变成孤儿进程。因为父进程都没有了,没人释放它了,就变成孤儿了。

为了解决这种问题,孤儿进程会被领养,被1号进程领养(init),就是被系统本身领养。以后1号进程会自动回收子进程。


进程优先级

CPU分配资源是有先后顺序的,就是指进程的优先权。优先权高的进程先分配资源,优先权低的后分配资源。

进程能否上CPU执行,是受进程调度器调度的,而优先级是进程调度器的主要参考依据。


查看优先级命令

ps -al

958da5ba12b341b68df0d3d47e52f44a.png

优先级参考值

PRI(priority):代表这个进程被执行的优先级,值越小越早被执行。

NI(nice):代表这个进程的nice值(可以被修改)。

优先级(PRI) = 默认优先级的值(PRI) + nice值(NI)

注意:


nice值不是进程的优先级,但是nice值的改变会影响进程的优先级。

默认的PRI为80。

nice的取值范围是:-20~19,一共40个级别。

修改优先级

使用top命令可以修改进程的优先级。


top -> r -> 输入PID -> 输入nice值。

以上就是进程相关概念,后续还会继续补充。

目录
相关文章
|
27天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
63 1
|
13天前
|
Ubuntu Linux Shell
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
(已成功解决)Linux环境报错—bash: wget: command not found;常见Linux发行版本,Linux中yum、rpm、apt-get、wget的区别;Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
170 68
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
|
9天前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
16天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
79 13
|
23天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
1月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
56 4
|
1月前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
2月前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
2月前
|
缓存 Ubuntu Linux
Linux环境下测试服务器的DDR5内存性能
通过使用 `memtester`和 `sysbench`等工具,可以有效地测试Linux环境下服务器的DDR5内存性能。这些工具不仅可以评估内存的读写速度,还可以检测内存中的潜在问题,帮助确保系统的稳定性和性能。通过合理配置和使用这些工具,系统管理员可以深入了解服务器内存的性能状况,为系统优化提供数据支持。
42 4
|
2月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
90 8