【计算机系统基石与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

相关文章
|
12天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
46 4
|
13天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
17天前
|
人工智能 安全 物联网
Linux操作系统的演变与未来:从开源精神到万物互联的基石###
本文是关于Linux操作系统的演变、现状与未来的深度探索。Linux,这一基于Unix的开源操作系统,自1991年由林纳斯·托瓦兹(Linus Torvalds)学生时代创造以来,已经彻底改变了我们的数字世界。文章首先追溯了Linux的起源,解析其作为开源项目的独特之处;随后,详细阐述了Linux如何从一个小众项目成长为全球最广泛采用的操作系统之一,特别是在服务器、云计算及嵌入式系统领域的主导地位。此外,文章还探讨了Linux在推动技术创新、促进协作开发模式以及保障信息安全方面的作用,最后展望了Linux在未来技术趋势中的角色,包括物联网、人工智能和量子计算等前沿领域的潜在影响。 ###
|
1月前
|
存储 SQL 分布式计算
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
【10月更文挑战第7天】湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
64 1
|
1月前
|
弹性计算 网络协议 Ubuntu
如何在阿里云国际版Linux云服务器中自定义配置DNS
如何在阿里云国际版Linux云服务器中自定义配置DNS
|
1月前
|
算法 调度 UED
探索操作系统的心脏:进程调度策略解析
在数字世界的每一次跳动背后,是操作系统中进程调度策略默默支撑着整个计算生态的有序运行。本文将深入剖析进程调度的奥秘,从理论到实践,揭示其对计算性能和系统稳定性的决定性影响。通过深入浅出的讲解和实例分析,我们不仅能理解不同调度策略的工作原理,还能学会如何根据实际应用场景选择或设计合适的调度算法。让我们跟随这篇文章的脚步,一起走进操作系统的核心,解锁进程调度的秘密。
|
2月前
|
算法 调度
操作系统的心脏:深入解析进程调度算法
本文旨在深入探讨现代操作系统中的核心功能之一——进程调度。进程调度算法是操作系统用于分配CPU时间片给各个进程的机制,以确保系统资源的高效利用和公平分配。本文将详细介绍几种主要的进程调度算法,包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)以及优先级调度(PS)。我们将分析每种算法的基本原理、优缺点及其适用场景。同时,本文还将讨论多级反馈队列(MFQ)调度算法,并探讨这些算法在实际应用中的表现及未来发展趋势。通过深入解析这些内容,希望能够为读者提供对操作系统进程调度机制的全面理解。
|
2月前
|
存储 缓存 自然语言处理
深度解析ElasticSearch:构建高效搜索与分析的基石
【9月更文挑战第8天】在数据爆炸的时代,如何快速、准确地从海量数据中检索出有价值的信息成为了企业面临的重要挑战。ElasticSearch,作为一款基于Lucene的开源分布式搜索和分析引擎,凭借其强大的实时搜索、分析和扩展能力,成为了众多企业的首选。本文将深入解析ElasticSearch的核心原理、架构设计及优化实践,帮助读者全面理解这一强大的工具。
176 7
|
2月前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
4月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能