Linux友人帐之进程管理

news2024/11/27 7:30:25

一、基本概念

1、在Liux中,每一个程序都是有自己的一个进程,每一个进程都有一个id号!
2、每一个进程呢,都会有一个父进程!
3、进程可以有两种存在方式:前台!后台运行!
4、一般的话服务都是后台运行的,基本的程序都是前台运行的!

1.1进程概念

对于我们的了解来说,什么是进程呢? 有的资料是这么说:一个运行起来的程序(加载到内存)叫做进程;在内存中的程序叫做进程。也就是说,进程和程序相比具有动态属性。

进程 = 内核数据结构(task_struct) + 进程对应的磁盘代码

 对于之前我们通过C写出的进度条程序来说,其本质就是一个文件并且存放在磁盘中。但是其并没有真正的运行,当我们运行程序的时候,文件就会从磁盘加载到内存,但是磁盘中那么多的文件全部加载到内存中明显是不现实的并且我们也不需要其他文件加载到内存,这时候就需要操作系统对文件进行管理从而只让我们想要执行的程序加载到内存,那操作系统是如何管理的呢?

先描述,再组织

1.2 进程的执行过程

通过上述的概念,我们了解的并不多,那么接下来就来分析一下:如果有很多这样的进程加载到内存中,操作系统要如何进行管理呢? 即利用先描述再组织的思想。

而所谓的先描述,这里引进了一个新的概念:PCB :进程控制块 struct task_struct{}

1. 那么什么是进程控制块呢?

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合,称之为PCB(process control block)在Linux中描述进程的结构体叫做task_struct。

在磁盘中的程序中,并没有进程控制块以及内部属性信息的存在,而是加载到内存之后通过操作系统的一系列的管理才出现的。

//进程控制块
struct task_struct
{
    //该进程的所有属性
    //该进程对应的代码和属性地址
    struct task_struct *next;
};

2. 进程控制块如何对进程进行管理的呢?

  • 磁盘中的可执行程序在将要运行时,所有的进程中的数据(并不是程序本身)加载到内存中,此时操作系统会建立起一个PCB来保存每一个程序的信息

这个时候PCB就会对每一个进程都建立起相应的结构体(即进程控制块)将对应的进程的属性、代码等匹配的传到这个结构体中:(这就是先描述)

 

  • 此时,操作系统就会将每一个进程控制块都连接起来,形成链表结构,并返回头结点。这样便通过数据结构的形式将进程的信息组织起来。

通过这样的先描述再组织的思想,当我们处理优先级高的进程时,我们就可以通过遍历头结点,找到优先级最高的那个节点的信息,并将这个进程的代码执行。

3.为什么要有进程控制块(PCB)呢?

对进程管理的核心是对数据进行管理,因此当我们加载程序到内存之前,我们必须拿到所有程序的数据,由于拿到的数据杂乱无章并且未进行分类,这时候就需要PCB将其归类,将对应的数据放到相应的进程控制块里!

 即加载进程的时候,操作系统为了方便管理会new一个struct task_struct也就是进程控制块的结构体,然后一点点的将上面加载的数据填充到这里的内部属性(状态,标记,追踪等),因此这里再一次强调了:进程不是程序加载到内存,而是在内存中new了task_struct结构体!

二、进程的基本操作

2.1查看进程

ps命令

Linux ps命令是用来显示当前进程的状态的,类似于Windows的任务管理器。ps命令有很多参数,可以用来控制输出的格式和内容。ps命令的基本语法是:

ps [options] [–help]

其中,options可以是以下几种:

  • a:显示所有与终端相关的进程
  • u:显示进程的用户及内存等信息
  • x:显示没有控制终端的进程
  • aux:相当于au+x,显示所有包含其他用户的进程
  • l:显示长格式的信息,包括优先级、父进程ID等
  • e:显示所有进程

ps命令输出的信息包括以下几个字段:

  • USER:进程的所有者
  • PID:进程的ID
  • %CPU:进程占用的CPU百分比
  • %MEM:进程占用的内存百分比
  • VSZ:进程占用的虚拟内存大小(单位KB)
  • RSS:进程占用的物理内存大小(单位KB)
  • TTY:进程运行的终端
  • STAT:进程的状态
  • START:进程开始的时间
  • TIME:进程占用CPU的运行时间
  • COMMAND:产生此进程的命令

其中,STAT字段表示进程的状态,有以下几种可能:

  • D:无法中断的休眠状态(通常是I/O操作)
  • R:正在运行或可运行的状态
  • S:静止状态,可被唤醒
  • T:暂停或被追踪的状态
  • Z:僵尸状态,已终止但未被回收
  • <:高优先级的进程
  • N:低优先级的进程
  • L:有内存分页分配并锁在内存中(实时系统或I/O操作)
  • s:父进程(有子进程存在)
  • l:多线程的进程
  • +:前台运行的进程

 grep命令

Linux grep命令是一个强大的文本搜索工具,它可以使用正则表达式来匹配文件或标准输入中的文本。grep命令的基本语法是:

grep [选项] [模式] [文件]

其中,选项可以控制grep命令的行为,如是否忽略大小写,是否显示行号,是否递归搜索等。模式是要匹配的字符串或正则表达式。文件是要搜索的文件名,可以是多个文件,如果省略文件参数,则默认从标准输入中读取数据。

grep命令有两个变体,分别是egrep和fgrep。egrep命令相当于grep -E,它使用扩展的正则表达式来匹配文本。fgrep命令相当于grep -F,它使用固定的字符串来匹配文本,不解释正则表达式中的特殊字符。

pstree命令

Linux pstree命令是用来显示当前进程的状态的,类似于Windows的资源管理器。pstree命令可以使用ASCII字符或UTF-8字符来显示进程之间的树状结构,清楚地表达进程之间的相互关系。pstree命令的基本语法是:

pstree [选项] [pid|user]

其中,选项可以是以下几种:

  • -p:显示进程的PID
  • -u:显示进程的所属用户
  • -a:显示进程的完整命令和参数
  • -c:不合并相同名称的进程
  • -n:按照PID排序进程
  • -l:使用长格式输出,不截断长名称
  • -A:使用ASCII字符连接进程树
  • -U:使用UTF-8字符连接进程树
  • -h:高亮显示指定的PID或用户的进程树
  • -H:高亮显示指定的PID或用户的进程树,并隐藏其他进程

如果不指定pid或user参数,则默认显示所有进程,以init或systemd为根节点。如果指定pid参数,则只显示该进程及其子进程。如果指定user参数,则只显示该用户拥有的进程。

 2.2 结束进程

结束进程有两种方式,下面就来介绍:

1.通过指令结束进程

Linux的kill,它可以让您控制和管理您的系统上运行的进程。kill命令的基本语法是:

kill [options] pid

其中,options是可选的参数,用于指定要发送给进程的信号,pid是要终止的进程的标识符。您可以使用不同的信号来影响进程的行为,例如:

  • 1 (HUP):重新加载进程。
  • 9 (KILL):强制杀死一个进程。
  • 15 (TERM):正常停止一个进程。

2.通过ctrl + c快捷键

通过快捷键ctrl + c也可以结束进程。

2.3进程的系统调用

getpid函数

Linux的getpid函数是一个系统调用,它用于获取当前进程的进程标识符(PID)。PID是一个非负整数,用于唯一标识一个进程。getpid函数的原型如下:

pid_t getpid(void);

其中,pid_t是一个整型类型,定义在sys/types.h头文件中。getpid函数没有参数,返回值是调用进程的PID。如果发生错误,getpid函数不会失败,也不会设置errno变量。

getpid函数的一个常见用途是生成唯一的临时文件名,例如:

char filename[20]; sprintf(filename, "tmp.%d", getpid());

这样可以保证不同的进程不会产生相同的临时文件名。另一个用途是在调试或日志记录中输出进程的信息,例如:

printf("Process %d started.\n", getpid());

这样可以方便地追踪进程的运行状态。

getppid函数

除了getpid函数,还有一个相关的函数是getppid函数,它用于获取当前进程的父进程的PID。父进程是指创建当前进程的进程,通常通过fork或vfork函数来创建子进程。getppid函数的原型如下:

pid_t getppid(void);

它和getpid函数类似,没有参数,返回值是父进程的PID。如果当前进程没有父进程,或者父进程已经终止,那么返回值是1,表示init进程。init进程是系统中第一个启动的进程,它负责初始化系统和启动其他服务。

getppid函数的一个常见用途是在子进程中判断父进程是否还存活,例如:

if (getppid() == 1) { printf("Parent process is dead.\n"); exit(1); }

这样可以避免子进程成为孤儿进程,或者处理一些异常情况。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业AI工程化之路:如何实现高效、低成本、高质量的落地?

MLOps工程实践 概述面临挑战目的内容简介读者对象专家推荐目录 写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 概述 作为计算机科学的一个重要领域&#xff0c;机器学习也是目前人工智能领域非常活跃的分支之一。机器学习通过分析海量数据、总结规律&#x…

【数据结构】二叉树--顺序结构及实现 (堆)

目录 一 二叉树的顺序结构 二 堆的概念及结构 三 堆的实现 1 包含所有接口 (Heap.h) 2 初始化,销毁和交换&#xff08;Heap.c) 3 向上调整&#xff08;Heap.c) 4 插入&#xff08;Heap.c) ​5 向下调整&#xff08;Heap.c) 6 删除&#xff08;Heap.c) ​7 打印&#…

从零开始:sshd配置与远程登录的快速入门

1.sshd服务介绍 在服务端安装openssh服务 /etc/ssh/sshd_conf # sshd服务的配置文件 端口22 本服务启动后自动生成密钥存储文件 2.ssh参数 2.1.远程登陆 #常用参数 -l #指定登陆用户 -i #指定私钥 -X #开启图形 -f #后台运行 -o #指定连接参数 -t #指定连接跳板ssh userre…

比 N 小的最大质数

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

【进阶C语言】数组笔试题解析

本节内容以刷题为主&#xff0c;大致目录&#xff1a; 1.一维数组 2.字符数组 3.二维数组 学完后&#xff0c;你将对数组有了更全面的认识 在刷关于数组的题目前&#xff0c;我们先认识一下数组名&#xff1a; 数组名的意义&#xff1a;表示数组首元素的地址 但是有两个例外…

Kafka 简介之(学习之路)

正文 一、简介 1.1 概述 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于zookeeper协调的分布式日志系统&#xff08;也可以当做MQ系统&#xff09;&#xff0c;常见可以用于web/nginx日志、访问日志&#xff0c;消息服务…

挑选适合您的优秀项目管理软件

哪个项目管理软件好用&#xff0c;这全得看用户需求。有的企业项目组比较多&#xff0c;项目比较大&#xff0c;就需要重一些的软件。有的企业就是简单管理一下项目进展&#xff0c;看看工时&#xff0c;那轻量级项目管理软件就挺好用&#xff0c;因为上手很快。还有的初创小团…

《软件方法》第1章2023版连载(04)不了解ABCD工作流的危害

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.2 建模工作流 1.2.4 不了解ABCD的危害 1.2.4.1 思维颠倒 如果软件开发人员对以上的“A-业务建模”、“B-需求”、“C-分析”、“D-设计”工作流没有概念&#xff0c;就会把软件开…

vulnhub_Empire_LupinOne靶机渗透测试

Empire_LupinOne靶机 靶机地址&#xff1a;Empire: LupinOne ~ VulnHub 文章目录 Empire_LupinOne靶机信息收集web渗透获取权限横向移动权限提升靶机总结 信息收集 通过nmap扫描得到靶机开放22和80端口&#xff0c;进行全扫描得到了一些服务版本信息等&#xff0c;web端有ro…

GitHub基础

1、仓库是什么意思&#xff1f;仓库拥有者是谁&#xff1f; 在软件开发或版本控制系统中&#xff0c;"仓库"&#xff08;Repository&#xff09;是指存储项目代码、配置文件、文档等相关文件的地方。它可以看作是一个中央存储库&#xff0c;用于管理和跟踪项目的各个…

v-bind绑定

一、标签属性动态绑定 方式一&#xff1a; v-bind:属性名"data声明的变量名" 方式二&#xff1a;&#xff08;简写&#xff09; 将v-bind省略&#xff0c;直接 :属性名"data声明的变量" v-bind.属性名[.修饰符]"变量名、计算属性。。 对应还提供了修饰…

【Docker】简易版harbor部署

文章目录 依赖于docker-compose下载添加执行权限测试 安装harbor下载解压修改配置文件部署配置开机自启动登录验证 使用harbor登录打标签上传下载 常见问题 依赖于docker-compose 下载 curl -L “https://github.com/docker/compose/releases/download/2.22.0/docker-compose-…

第八章 排序 十三、置换-选择排序

目录 一、概括 二、例子 ​三、考点 一、概括 置换-选择排序是一种排序算法&#xff0c;它通过在未排序的元素中选择最小的元素并将其放置在已排序的部分的末尾来逐步将列表排序。具体过程如下&#xff1a; 从列表中选择最小的元素&#xff0c;并将其与列表中第一个元素交…

一文看懂光模块的工作原理

你们好&#xff0c;我的网工朋友 光模块有很多类别&#xff0c;是我们经常要用到的PHY层器件。虽然封装&#xff0c;速率&#xff0c;传输距离有所不同&#xff0c;但是其内部组成基本是一致的。 以太网交换机常用的光模块有SFP&#xff0c;GBIC&#xff0c;XFP&#xff0c;X…

【周末闲谈】“PHP是最好的语言”这个梗是怎么来的?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录 系列目录前言最早的出处关于PHP语言优点缺点网络评价 总结 前言 …

kafka日志文件详解及生产常见问题总结

一、kafka的log日志梳理 日志文件是kafka根目录下的config/server.properties文件&#xff0c;配置log.dirs/usr/local/kafka/kafka-logs&#xff0c;kafka一部分数据包含当前Broker节点的消息数据(在Kafka中称为Log日志)&#xff0c;称为无状态数据&#xff0c;另外一部分存在…

Vue中如何进行网页截图与截屏

在Vue中实现网页截图与截屏功能 网页截图与截屏功能在许多Web应用程序中都非常有用。Vue.js作为一个流行的JavaScript框架&#xff0c;提供了许多工具和库来简化网页截图和截屏的实现。本文将介绍如何使用Vue来实现一个网页截图和截屏功能的示例&#xff0c;包括使用html2canv…

锁向环到底是什么?是怎么进行倍频的?

你们有没有这样一个疑问&#xff0c;就是CPU的主频怎么做到几个GHz呢&#xff1f; 每一秒要给处理器几亿个脉冲&#xff0c;就拿11代I7处理器来说&#xff0c;它的基本频率就可达2.5GHz&#xff0c;但在我们常规的认知中&#xff0c;频率的大小取决于晶振的频率&#xff0c;比…

黑马JVM总结(二十八)

&#xff08;1&#xff09;语法糖-foreach &#xff08;2&#xff09;语法糖-switch-string &#xff08;3&#xff09;语法糖-switch-enum &#xff08;4&#xff09;语法糖-枚举类 枚举类 &#xff08;5&#xff09;语法糖-twr1

云表|都有生产管理模块,MES和ERP有什么不同,该如何选择

MES和ERP是生产制造领域的两大知名系统&#xff0c;虽然早已声名鹊起&#xff0c;但仍有不少人难以明确区分两者的差异。下面将详细阐述这两个系统的不同之处。首先&#xff0c;要了解MES和ERP的定义。 MES系统&#xff1a;全称制造执行系统&#xff08;Manufacturing Executio…