【计算机系统基石与Linux进程管理深度解析】(二)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 【计算机系统基石与Linux进程管理深度解析】

【计算机系统基石与Linux进程管理深度解析】(一):https://developer.aliyun.com/article/1425708


3.进程


3.1.基本概念


  • 课本概念:程序的一个执行实例,正在执行的程序,加载到内存中的程序等
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体。


3.2.描述进程-PCB


  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCB(process control block),PCB通常被实现为一种数据结构,而在C或C++等编程语言中,这个数据结构通常被定义为struct(结构体)或class(类)。
  • Linux操作系统下的PCB是: task_struct


为什么程序加载到内存,变成进程之后,我们要给每一个进程形成一个PCB对象呢?


       因为操作系统不认识这些以.exe的可执行文件,操作系统需要管理(先描述,再组织),PCB(Process Control Block,进程控制块)用于描述和维护进程的各种信息。当程序加载到内存并成为一个进程时,操作系统需要管理和跟踪这些进程。PCB 是操作系统用来管理进程的数据结构,它包含了关于进程的各种重要信息,如进程状态、程序计数器(PC)、内存分配情况、寄存器的值、进程优先级、进程ID等等。


进程的新定义 = 内核PCB对象 (内核数据结构)+ .exe可执行程序


未来,所有对进程的控制和操作,都只和进程的PCB有关,和进程的可执行程序没有关系!!!


PCB相当于节点(Node),可以放到任意数据结构中。


task_struct-PCB的一种


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


task_ struct内容分类 - 操作系统内部的数据 - 系统调用


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


程序计数器:


3.3.组织进程


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


3.4.查看进程


ps axj 是一个用于在Unix/Linux系统上显示当前运行进程信息的命令。


下面是对该命令各部分的解释:


  • ps:显示进程信息的命令。
  • a:选择在终端上运行的所有进程,但不包括其他用户的进程。
  • x:选择没有控制终端的进程,包括后台进程和其他用户启动的进程。
  • j:以BSD风格的进程列表格式显示额外的信息,包括进程组ID、会话ID和控制终端。


运行 ps axj 会以表格形式输出各种列,提供有关正在运行的进程的信息。具体的列可能包括:


  1. PID(进程ID): 进程的唯一标识符。
  2. PGID(进程组ID): 进程所属的进程组的ID。
  3. SID(会话ID): 进程所属的会话的ID。
  4. TTY(控制终端): 与进程关联的终端。
  5. TIME(CPU时间): 进程累积使用的CPU时间。
  6. COMMAND(命令): 启动进程的命令及其参数。


然后我们来写一个代码,这个代码是一个死循环的输出"I am a process!",然后运行我们的程序。


一旦我们将程序运行起来,此时可执行程序立马就变成了进程。怎么证明呢?


我们发现第一个是我们的代码进程,那第二个是什么呢?第二个也是一个进程,grep在过滤的时候,它自己也是一个程序,当它过滤的时候,它的过滤关键字是包含myprocess的,一瞬间grep也变成了进程,因为包含了myprocess,所以也被留下来了。结论:几乎所有的独立的指令,就是程序,它运行起来,也要变成进程。如果我们不想要的话,可以后面加上:grep -v grep


grep -v grep 是在Unix/Linux环境中经常用于过滤命令输出的一种方式,用于排除包含字符串 "grep" 的行。让我们分解一下这个命令的各部分:


  • grep:这是一个用于在文本数据集中搜索匹配正则表达式的命令行实用程序。
  • -v:这个选项反转匹配,也就是说,它选择所有不匹配指定模式的行。
  • grep:第二个 "grep" 是要从输出中排除的模式。在这种情况下,你排除包含单词 "grep" 的行。


因此,当你使用 grep -v grep 时,实际上是在说“显示所有不包含单词 'grep' 的行”。这通常用于在查看进程或服务输出时,排除实际的 grep 命令本身。


我们可以通过循环测试间隔1秒来查看当前进程,进程是有生命的!!!


task_ struct内容分类 - 操作系统内部的数据 - 系统调用



因此我们来修改一下我们的程序


然后我们编译运行一下:


一般在我们的Linux中,普通进程都会有他的父进程!!!怎么获取呢?调用getppid()。


此时我们就可以看到相关父进程的pid。


我们再多次运行我们的程序,我们发现进程的pid一直在变化,而父进程的pid始终没有变化。


当一个程序多次运行时,它的进程PID会不断变化,因为每次运行都会创建一个新的进程。每个进程都有一个唯一的PID,它是操作系统为了标识和管理进程而分配的数字标识符。然而,父进程的PID通常不会改变,因为它是启动新进程的原始进程的标识符。子进程会继承父进程的一些属性,包括父进程的PID。所以,无论我们运行多少次程序,它们的父进程的PID通常会保持不变,因为它们都是由同一个父进程启动的。


如果你在多次运行中看到父进程的 PID 一直没有变化,这表明每次运行的新进程都是由同一个父进程启动的,我们可以看到父进程是bash,是我们的命令行接收器,在命令行执行的指令或者程序都是bash的子进程。这里的bash就是曾经提到的王婆,而子进程就是实习生。


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


LInux会把进程相关的数据以文件的形式显示到系统文件中。


数字进行命名的我们称之为目录,这个数字就是我们进程的PID。如果我们运行我们的程序,那我们是否可以在这个系统/proc目录下查看到我们的此时进程的一个目录。


同时我们还可以看到这个进程的具体信息:ls /proc/19132 -l


我们着重看一下上面标记的两个。


"exe" 是 "可执行文件"(Executable)的缩写它是一种计算机文件格式,通常用于存储程序代码,在LInux下可以通过在磁盘中的绝对路径进行运行,上面exe指向的就是可执行程序在磁盘中的绝对路径。


如果我们将这个可执行程序删掉呢?已经运行的进程还在吗?


删除一个可执行程序文件不会影响已经在运行的进程。当你运行一个可执行程序时,操作系统会将该磁盘中存在的这个程序的拷贝加载到内存中,然后执行。一旦程序开始执行,它与原始的可执行文件就没有直接的关系了。


       删除可执行文件后,文件系统上的相应实体被删除,但已经加载到内存中的程序仍在执行。这是因为在执行过程中,程序已经被加载到系统内存中,而不再依赖于原始文件。程序会一直执行,直到其运行结束或被手动终止。


       如果你删除了一个正在运行的可执行文件,该文件的文件名和路径信息将不再可见,但操作系统仍会保留该程序在内存中的拷贝。只有当该程序运行结束并释放了系统资源,或者被手动终止时,相关的进程才会被终止。


"cwd" 是 "Current Working Directory" 的缩写,表示当前工作目录。在操作系统中,当前工作目录是指在命令行程序中正在进行操作的目录路径。


当你在命令行中运行命令或执行程序时,操作系统会将这些操作基于当前工作目录来进行,比如创建一个文件。


终端或命令行提示通常显示当前工作目录的路径。当我们执行上面的可执行程序后,文件就在当前工作目录显示了,同时还可以通过绝对路径寻找到这个文件。


如果我们想改变不当前工作目录呢?系统调用接口为我们提供了一个函数:chdir


然后我们来修改一下我们的代码


然后执行我们的代码,我们发现当前工作目录发生改变了,同时创立的文件绝对路径也发生变化


【计算机系统基石与Linux进程管理深度解析】(三):https://developer.aliyun.com/article/1425715

相关文章
|
22天前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
28 0
|
1天前
|
人工智能 安全 物联网
Linux操作系统的演变与未来:从开源精神到万物互联的基石###
本文是关于Linux操作系统的演变、现状与未来的深度探索。Linux,这一基于Unix的开源操作系统,自1991年由林纳斯·托瓦兹(Linus Torvalds)学生时代创造以来,已经彻底改变了我们的数字世界。文章首先追溯了Linux的起源,解析其作为开源项目的独特之处;随后,详细阐述了Linux如何从一个小众项目成长为全球最广泛采用的操作系统之一,特别是在服务器、云计算及嵌入式系统领域的主导地位。此外,文章还探讨了Linux在推动技术创新、促进协作开发模式以及保障信息安全方面的作用,最后展望了Linux在未来技术趋势中的角色,包括物联网、人工智能和量子计算等前沿领域的潜在影响。 ###
|
5天前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
8 1
|
17天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
【10月更文挑战第9天】本文将深入浅出地介绍Linux系统中的进程管理机制,包括进程的概念、状态、调度以及如何在Linux环境下进行进程控制。我们将通过直观的语言和生动的比喻,让读者轻松掌握这一核心概念。文章不仅适合初学者构建基础,也能帮助有经验的用户加深对进程管理的理解。
15 1
|
22天前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
20 0
Linux c/c++之IPC进程间通信
|
22天前
|
Linux C++
Linux c/c++进程间通信(1)
这篇文章介绍了Linux下C/C++进程间通信的几种方式,包括普通文件、文件映射虚拟内存、管道通信(FIFO),并提供了示例代码和标准输入输出设备的应用。
17 0
Linux c/c++进程间通信(1)
|
22天前
|
Linux C++
Linux c/c++之进程的创建
这篇文章介绍了在Linux环境下使用C/C++创建进程的三种方式:system函数、fork函数以及exec族函数,并展示了它们的代码示例和运行结果。
23 0
Linux c/c++之进程的创建
|
22天前
|
Linux C++
Linux c/c++进程之僵尸进程和守护进程
这篇文章介绍了Linux系统中僵尸进程和守护进程的概念、产生原因、解决方法以及如何创建守护进程。
15 0
|
4月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
4月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
137 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)

热门文章

最新文章