Linux 进程概念

一.进程的基本概念

  • 课本概念: 进程是程序的一个执行实例, 指的是正在执行的程序。
  • 内核视角: 进程是担当分配系统资源的实体。

1.1 什么是进程PCB?

进程PCB(Process control block)是一个存储进程属性的集合。

1.1.1 Linux系统中的进程PCB

进程PCB在Linux操作系统中为task_struct, 它是Linux内核中的一种数据结构, 在程序启动时, 内核会在内存中开辟一块空间, 用于存储该进程的信息。

1.1.2 Linux系统中进程PCB的内容分类
  • 标识符: 描述进程的唯一标识符, 用于区分不同的进程。
  • 状态: 任务状态, 退出码, 退出信号等。
  • 进程优先级: 相对其他进程的优先级, 决定了执行的顺序。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 存放了程序代码和进程相关数据的指针, 还有其他进程共享的内存块的指针。
  • 上下文数据: 进程执行时处理器的寄存器中的数据。(以便下一次继续运行)
  • I/O状态信息: 包括了I/O请求, 以及分配给I/O设备和进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和, 时间限制, 记账号等。
  • 以及其他信息

二.查看进程

2.1 进程的信息

进程的信息可以通过 /proc 系统文件夹查看:

2.2 进程的查看指令

ps [选项]

-e 或 --select [exp]: 显示所有进程。
-f 或 --forest: 使用树状格式显示进程及其子进程。
-l 或 --long: 显示长格式输出。
-a 或 --all: 显示所有终端上的进程,不包括会话组领导进程。
-x 或 --extended: 显示没有控制终端的进程。
-u 或 --user [user]: 显示指定用户的进程。
-p 或 --pid [pid]: 显示指定PID的进程。
-C 或 --name [command]: 显示指定名称的进程。
-o 或 --format [format]: 自定义输出格式。

2.3 系统调用获取进程标识符

getpid(): 获取当前进程ID
getppid(): 获取父进程ID

#include <iostream>
#include <sys/types.h>
#include <unistd.h>int main(){std::cout << "pid: " << getpid() << std::endl;std::cout << "ppid: " << getppid() << std::endl;return 0;
}

在这里插入图片描述

三.进程的创建

fork(): 创建一个子进程

#include <iostream>
#include <sys/types.h>
#include <unistd.h>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);}else{printf("I am father : %d!, ret: %d\n", getpid(), ret);}return 0;
}

在这里插入图片描述

fork有两个返回值, 父进程返回子进程的ID, 子进程返回0, 父子进程代码共享, 数据各自开辟空间, 私有一份。(采用写时拷贝)

四.进程的状态

进程在运行时有许多种不同的状态, 有的进程可能正在运行, 有的进程可能被阻塞, 有的进程可能已经结束, 所以进程会有许多种不同的状态。

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
  • R 运行状态(running): 并不意味着进程一定在运行中, 它表明进程要么是在运行中要么在运行队列里。
  • S 睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
  • D 磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep), 在这个状态的进程通常会等待IO的结束。
  • T 停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X 死亡状态(dead): 这个状态只是一个返回状态, 你不会在任务列表里看到这个状态。
  • Z 将死状态(zombie): 这个状态是一个比较特殊的状态, 当进程退出并且父进程没有读取到子进程退出的返回代码时就会进入此状态。僵尸进程会以终止状态保持在进程表中, 并且会一直在等待父进程读取退出状态代码。所以, 只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

4.1 僵尸进程的危害

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id > 0){ //parentprintf("parent[%d] is sleeping...\n", getpid());sleep(30);}else{printf("child[%d] is begin Z...\n", getpid());sleep(5);exit(EXIT_SUCCESS);}return 0;
}

在这里插入图片描述
父进程创建了很多子进程,一直不回收,就会造成内存资源的浪费。因为数据结构对象本身就要占用内存!

4.2 孤儿进程

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?

  • 父进程先退出,子进程就称之为“孤儿进程”。
  • 孤儿进程被1号init进程领养,由init进程回收。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){//childprintf("I am child, pid : %d\n", getpid());sleep(10);}else{//parentprintf("I am parent, pid: %d\n", getpid());sleep(3);exit(0);}return 0;
}

在这里插入图片描述

4.3 进程优先级

查看系统进程: ps -l
在这里插入图片描述

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

既然有了PRI, 那么NI值又是什么呢?
其表示进程可被执行的优先级的修正数值: PRI(new)=PRI(old)+nice

五.环境变量

5.1 环境变量的基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

常见的环境变量:

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

5.2 查看环境变量的方法

echo $NAME //NAME:你的环境变量名称

在这里插入图片描述

  • 每个程序都会收到一张环境变量表,环境变量表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
    在这里插入图片描述
    通过代码如何获取环境变量:
  1. 命令行第三个参数
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{for(int i = 0; env[i]; i++){printf("%s\n", env[i]);}return 0;
}
  1. 通过第三方变量environ获取
#include <stdio.h>
int main(int argc, char *argv[])
{extern char **environ;for(int i = 0; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}

在这里插入图片描述
3. 通过系统调用获取或设置环境变量

#include <cstdio>
#include <cstdlib>
int main()
{printf("%s\n", getenv("PATH"));return 0;
}

在这里插入图片描述
————————————————————
感谢大家观看,不妨点赞支持一下吧喵~
如有错误,随时纠正喵~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/447001.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32CubeMX开发】-2.1-TIM_生成一个定时器中断

目录 1 Tim定时器的时钟源 2 Tim定时器的配置 2.1 中断配置 3 生成代码 4 测试结果 结尾 1 Tim定时器的时钟源 TIM1的时钟来源自APB1 Timer clocks&#xff0c;时钟树上所有总线频率均设置为了STM32F0能达到的最高频率&#xff0c;此时APB1 Timer clocks 48MHz。 2 Tim…

SparkSQL介绍及使用

文章目录 1. SparkSQL介绍及使用1.1 SparkSQL介绍1.2 数据结构的形式1.3 Spark SQL 特点1.4 Spark SQL 和 Hive SQL关系 1. SparkSQL介绍及使用 1.1 SparkSQL介绍 Spark SQL是Apache Spark 用于处理结构化数据&#xff08;DataFrame和Datasets&#xff09;的模块。 在Spark1.0…

【C++】map和set使用

前言 有了前面搜索二叉树的基础&#xff0c;那么这篇博客对于map和set两个容器就很好理解使用&#xff0c;让我们来看看map和set到底有什么特性吧 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;C 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎…

图文深入理解java对象从创建到回收都经历了什么

1. 前言&#xff1a; 每个java对象都是有生命周期的&#xff0c;就像一个人的生命一样&#xff0c;从孕育到出生到成长变老最后由归于自然。笔者认为&#xff0c;Java对象的整个生命周期可以分为两个大的阶段&#xff1a;即创建阶段和运行阶段&#xff08;包含对象的回收和消亡…

LSTM时序预测 | Python实现LSTM长短期记忆神经网络时间序列预测

本文内容&#xff1a;Python实现LSTM长短期记忆神经网络时间序列预测&#xff0c;使用的数据集为AirPassengers 目录 数据集简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 数据集简介 AirPassengers 数据集的来源可以追溯到经典的统计和时间序列分析文献。原始数据集由 Box,…

一个好的维权小程序应该是什么样的?

小程序如今为大家提供了很多的便利服务&#xff0c;且小程序的种类、功能是很多样的&#xff0c;那么对于一个好的维权小程序来说&#xff0c;其功能和设计应该紧紧围绕着用户的需求。 设计页面应该直观简单&#xff0c;功能布局让人一目了然&#xff1b;操作简单&#xff0c;…

外包干了30天,技术明显退步:一段自我觉醒与转变的旅程

在人生的长河中&#xff0c;每个人都会遇到属于自己的转折点。我也不例外。作为一个本科生&#xff0c;我于2019年通过校招踏入了南京某软件公司的大门&#xff0c;成为了一名功能测试工程师。在那个相对安逸的环境中&#xff0c;我度过了将近两年的时光。然而&#xff0c;随着…

当下的时代?

我这两天刚接触一个人,错误之皇,每做一件小事的时候他都像救命稻草一样抓着,有一天我一看,嚯,好家伙,他抱着的是已经让我仰望的参天大树了! 这个时代需要我们从无限思维的视角和做法去努力&#xff1b;它不取决于我们现在有多少&#xff0c;而取决于我们未来的成长幅度是多少&a…

Dev-C++萌新学习福利3

朝鲜球作品原创https://blog.csdn.net/2401_86502594?spm1011.2124.3001.5343 清北互联地址https://www.17ac.cn/#/ 萌新福利 作品成本6999元&#xff01;&#xff01;&#xff01; 清北互联团队编写课程&#xff0c;本人不收费。亏本买卖&#xff0c;良心服务&#xff0c;同嫂…

IP地址类型选择指南:动态IP、静态IP还是数据中心IP?

你是否曾经困惑于如何选择最适合业务需求的IP地址类型&#xff1f;面对动态IP、静态IP和数据中心IP这三种选择&#xff0c;你是否了解它们各自对你的跨境在线业务可能产生的深远影响&#xff1f; 在跨境电商领域&#xff0c;选择合适的IP类型对于业务的成功至关重要。动态IP、…

技术分享 —— JMeter接口与性能测试实战!

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

JavaSE--全盘拿下数组的关键要领

嗨嗨大家~我来啦&#xff01;今天我们来进入数组的学习吧。 目录 一 数组的定义 1 创建数组 2 初始化数组 二 数组的使用 1 数组的访问 2 数组的遍历 2.1 for 循环打印 2.2 for-each 打印数组 三 数组是引用类型 3.1 JVM内存分布 3.2 区分基本类型与引用类型变…

Taro 中 echarts 图表使用

1 下载 echarts4taro3 yarn add echarts4taro3 或 pnpm add echarts4taro3 或 npm i echarts4taro3 --save2 图表初始化需要先加载echarts模块 import * as echarts from "echarts4taro3/lib/assets/echarts"; // 这里用了内置的&#xff0c;也可以用自定义的 echa…

TCP与UDP协议(三次握手四次挥手)

TCP与UDP 简介TCP和UDP一、TCP1.1 TCP的三次握手问题来了&#xff1a;为啥是三次握手而不是两次呢&#xff1f; 1.2建立连接后的通信过程&#xff08;丢包与乱序问题&#xff09;1.3四次挥手问题来了&#xff1a;为什么要四次挥手&#xff1f; 二、UDP 简介TCP和UDP TCP、UDP都…

SQL第16课——更新和删除数据

介绍如何利用update和delete语句进一步操作表数据。 16.1 更新数据 使用update语句。两种使用方式&#xff1a; 1. 更新表中的特定行&#xff1b; 2. 更新表中的所有行。 &#xff01;&#xff01;&#xff01;&#xff08;使用update时不要省略where子句&#xff0c;因为…

链接伪类(:hover)CSS背景图片有闪动BUG的解决方法 vue3

现象&#xff1a; hover时候&#xff0c;图片还没加载出来&#xff0c;导致边框闪烁 在Vue 3中&#xff0c;如果你遇到了使用伪类(:hover)时背景图片出现闪烁的问题&#xff0c;可能是由于浏览器的渲染机制导致的。解决这个问题的方法可能包括&#xff1a; 使用background-pos…

spark:数据的关联与合并、缓存和checkpoint

文章目录 1. 数据的关联与合并1.1 join关联1.1.1 内关联1.1.2 左关联1.1.3 右关联 1.2 Union合并 2. 缓存和checkpoint 1. 数据的关联与合并 1.1 join关联 students表数据&#xff1a; 1.1.1 内关联 内关联只返回两个 DataFrame 中在连接键上匹配的行。 # join 关联 from…

【Linux】【Jenkins】后端项目打包教程-Linux版

本次安装版本&#xff1a;2.4 1、安装git环境2、安装mavne环境2.1 下载依赖2.2、解压、赋权2.2、配置环境变量2.3、验证安装 3、jenkins-插件下载3.1、进入jenkins-->系统管理3.2、进入系统管理-->插件管理3.3、下载两个插件&#xff08;如果之前下载了&#xff0c;这里是…

Docker 的使用-01

一、Docker 设置和镜像源 1.1、设置 #查看 Docker 信息 docker version docker info#守护线程启动&#xff1a; systemctl daemon-reload 重启Docker服务&#xff1a; systemctl restart docker#关闭Docker服务 sudo systemctl stop docker#启动Docker服务 systemctl start d…

【安装JDK和Android SDK】

安装JDK和Android SDK 1 前言2 下载2.1 下载途径2.2 JDK下载和安装2.2.1 下载2.2.2 安装并配置环境变量2.2.3 验证 2.3 SDK下载和安装2.3.1 下载2.3.2 安装2.3.3 环境变量配置2.3.4 验证 1 前言 在软件开发中&#xff0c;Android应用开发通常使用Android Studio&#xff0c;但…