Linux:进程概念

文章目录

  • 前言
  • 一、冯诺依曼体系
  • 二、操作系统(Operator System)
    • 2.1.操作系统的概念
    • 2.2 系统调⽤和库函数概念
  • 三. 进程
    • 3.1 基本概念
      • 3.1.1 描述进程
      • 3.1.2 task_struct
    • 3.2 查看进程
      • 3.2.1 getpid
      • 3.2.2 proc
      • 3.2.3 getppid
  • 总结


前言

• 课本概念:程序的⼀个执⾏实例,正在执⾏的程序等
• 内核观点:担当分配系统资源(CPU时间,内存)的实体。
但这些观念都是建立在已经理解的基础上描述出来的,对于初学者一头雾水,所以本文将尽可能描述清晰其概念。


一、冯诺依曼体系

截⾄⽬前,我们所认识的计算机,都是由⼀个个的硬件组件组成
• 输⼊单元:包括键盘,⿏标,扫描仪,写板等
• 中央处理器(CPU):含有运算器和控制器等
• 输出单元:显⽰器,打印机等
在这里插入图片描述
注意!!!
• 这⾥的存储器指的是内存(但存储器不单单表示内存,详情参考下面图片)
• 不考虑缓存情况,这⾥的CPU能且只能对内存进⾏读写,不能访问外设(输⼊或输出设备)
• 外设(输⼊或输出设备)要输⼊或者输出数据,也只能写⼊内存或者从内存中读取。
• ⼀句话,所有设备都只能直接和内存打交道。

在这里插入图片描述

来举一个数据流动的例子:我们的设备中存在一个叫网卡的设备,它既是输入设备也是输出设备,当我们在QQ上发软件的时候,我们从键盘输入的信息传入输入设备网卡,写入内存,再传cpu经过某种特定的处理后返回内存,内存再由网卡作为输出设备,输入到另一个人的输入设备中,以类似过程处理,输出信息。本质上就是两台冯诺依曼体系结构的交互结果。

二、操作系统(Operator System)

操作系统是一款“搞管理”的软件
操作系统面对任何“管理”场景都是:先描述,再组织!!!
操作系统在内存中的位置并不是固定的,它通常被加载到计算机的主存储器(RAM)中执行。当计算机启动时,操作系统会从硬盘或其他持久性存储设备中加载到RAM中,因为RAM的访问速度比硬盘快得多,这可以确保操作系统能够高效地运行。

2.1.操作系统的概念

任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

• 内核(进程管理,内存管理,⽂件管理,驱动管理)
• 其他程序(例如函数库,shell程序等等)

--uu

设计OS的目的:

它管理系统资源、控制程序执行、改善人机界面、提供各种服务、合理组织计算机工作流程,并为用户有效使用计算机提供良好的运行环境。

在这里插入图片描述
总结:

计算机管理硬件
1. 描述起来,⽤struct结构体
2. 组织起来,⽤链表或其他⾼效的数据结构

2.2 系统调⽤和库函数概念

• 在开发⻆度,操作系统对外会表现为⼀个整体(防止被修改等原因),但是会暴露⾃⼰的部分接⼝,供上层开发使⽤,
这部分由操作系统提供的接⼝,叫做系统调⽤。
• 系统调⽤在使⽤上,功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有⼼的开发者可以对部分系统调⽤进⾏适度封装,从⽽形成库,有了库,就很有利于更上层⽤⼾或者开发者进⾏⼆次开发。库函数和系统调用是上下层的关系

三. 进程

3.1 基本概念

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

但说人话进程=内核数据结构对象+自己的代码和数据&& 进程=PCB(task_struct)+自己的代码和数据

3.1.1 描述进程

基本概念
• 进程信息被放在⼀个叫做进程控制块的数据结构中,可以理解为进程属性的集合
当一个程序需要被执行时,它就会类似进行类的实例化过程来构造结构对象,这个对象包含各种信息,这些信息是一个进程发生的条件等
• 课本上称之为PCB(process_control_block),Linux操作系统下的PCB是:task_struct
在这里插入图片描述

因为OS必然要对多个加载到内存中的程序进行管理,因此进程的管理会以链表的增删改查来进行。因此这个管理过程是动态的!!!

3.1.2 task_struct

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

组织进程
可以在内核源代码⾥找到它。所有运⾏在系统⾥的进程都以task_struct链表的形式存在内核⾥。
在这里插入图片描述
总结:我们自己写的程序,不会直接由硬件运行,它首先保存在磁盘中,然后当需要运行它的时候,它会被加载(也可以理解成拷贝)到内存中,然后操作系统中的进程管理(也是一个程序)会描述这个程序的各种属性(这些属性由task_struct的成员变量生成),然后组织描述过后的这个进程与其它正在运行的进程形成一个链表

3.2 查看进程

3.2.1 getpid

  • 通过系统调用来获取进程

操作系统提供了一个getpid()函数可以获取,包含在头文件<sys/types.h>中

执行如下命令可以查看详细信息

man getpid

在这里插入图片描述

实验:我们建立一个myprocess.c 的文件并形成可执行文件
其代码为

//myprocess.c
#include<srdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
  while(1)
  {
    sleep(1);
    printf("我是一个进程,我的id:%d",getpid());
  }
  return 0;
}

在这里插入图片描述
执行结果如下可以验证它是一个正在执行的进程:
在这里插入图片描述
存在一个指令可以查看正在执行的所有进程

ps ajx

ps是指令 后面的ajx是格式可以随意增删达到不同显示效果

打开相同用户的第二个窗口,第一个窗口运行myprocess,输入以下命令行可以查看正在执行的myprocess进程信息

ps ajx | head -1 && ps ajx |grep myprocess
在这里插入图片描述
小知识点: 我们使用上面命令时最后再添加grep -v grep 就可以不显示带grep进程
在这里插入图片描述

同样的我们能够用指令结束一个进程,与ctrl+c结束命令相同原理

kill -9 PID

3.2.2 proc

在Linux的目录结构中有一个/proc目录,它是内存级的文件系统,它能让我们通过文件形式来动态查看正在执行的进程,当一个进程发生时,它就会出现在/proc中,结束或被kill时就会消失。
在这里插入图片描述
我们同样执行上面代码的同时,在/proc下面找到其进程包含的信息
在这里插入图片描述

我们首先需要了解task_struct两个成员变量exe和cwd

  • exe:
    exe 是一个符号链接,指向启动该进程的可执行文件。通过访问这个链接,你可以查看或调试与该进程关联的可执行文件。需要注意的是,如果可执行文件已经被删除或移动,这个链接可能会失效,指向一个不存在的文件。

当我们在一个窗口删除文件的时候可以发现文件在另一个窗口仍在运行!!这是因为我们正在运行的那个文件是从磁盘拷贝(加载)过去的只不过exe会显示deleted
在这里插入图片描述

在这里插入图片描述

  • cwd(current work dir):
    cwd 是一个符号链接,指向该进程的当前工作目录。通过访问这个链接,你可以快速定位到进程正在操作的文件系统位置。这对于理解进程的行为和调试文件系统问题非常有帮助

当我们运行程序的时候,执行fopen这个函数的时候新建一个“hello.txt”的文件,它会在当前目录下创建,所依据的就是cwd的路径
在这里插入图片描述
此时就可以根据此种方式来修改"hello.txt"的创建位置
系统调用chdir:可以修改文件的cwd
在这里插入图片描述
在这里插入图片描述

3.2.3 getppid

在Linux中所有的子进程都是由父进程创建的!
系统调用getppid:返回自己的父进程
在这里插入图片描述
同时我们可以反复执行这个程序,可以发现它自己的进程id一直在变,可是父进程却一直相同
在这里插入图片描述
接着查看这个父进程,它是bash!
在这里插入图片描述
bash:命令行解释器(本质是一个进程)
我们每登录一次云服务器的时候,操作系统会为每一个登录用户分配一个bash

下面图片就是一个命令行解释器,当我们不输入时,bash就会卡在这里,输入指令之后,它就会分析并执行这个bash,所以结合上面的cwd,我们用的每个命令“ls pwd …”(这些子进程的父进程都是bash)都是把这个命令结合其cwd,找到特定的路径文件并执行!!!!
在这里插入图片描述


总结

本文主要介绍了进程的一些基本概念,并展示了一些查看进程的方式,以及bash的概念

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

el-form el-table 前端排序+校验+行编辑

一、页面 <template><div class"bg" v-if"formData.mouldData?.length 0">当前暂无模板&#xff0c;点击<view class"add" click"addMould">立即创建</view></div><div v-else><el-col :x…

jmeter常用配置元件介绍总结之后置处理器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之后置处理器 8.后置处理器8.1.CSS/JQuery提取器8.2.JSON JMESPath Extractor8.3.JSON提取器8.4.正则表达式提取器8.5.边界提取器8.5.Debug PostProcessor8.6.XPath2 Extractor8.7.XPath提取器8.8.结果状态处理器 8.后置处理…

基于Java Springboot旅游信息推荐系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL8.0…

基础网络安全知识

1.ctfhub技能树 1.1 Web-SQL注入 Web-SQL注入-整数型 && 字符型 && MySQL结构 参考&#xff1a;5.9.6MySql注入 Web-SQL注入-报错注入 step1: 查库名 ?id1 and extractvalue(1,concat(0x7e,database(),0x7e))-- step2: 查看表名 ?id1 and extractvalue(1…

01-Ajax入门与axios使用、URL知识

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

iStore OS 插件的手动安装与特殊卸载

有些插件在iStore 中并没有展示,因此需要手动安装,手动安装无法通过前端彻底卸载,本文提供方法和流程。 1.插件手动安装 1.1地址 github 项目地址根据自己需求选择。本人以x86_64 为主。 https://github.com/AUK9527/Are-u-ok/tree/main/x86 点击后下载得到run安装包 1…

neo4j desktop基本入门

下载安装不在赘述&#xff0c;本文只记述一些neo4j的基本入门操作 连接本地neo4j数据库 1. 点击ADD添加连接 端口一般是7687 账户名和密码忘记了&#xff0c;可以通过neo4j web&#xff08;默认为neo4jneo4j://localhost:7687/neo4j - Neo4j Browser&#xff09;重置密码 AL…

ElasticSearch的Python Client测试

一、Python环境准备 1、下载Python安装包并安装 https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe 2、安装 SDK 参考ES官方文档: https://www.elastic.co/guide/en/elasticsearch/client/index.html python -m pip install elasticsearch一、Client 代…

强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习&#xff0c;本科时已经学习过了&#xff0c;但是感觉还是有些概念和算法没有学懂学透&#xff0c;所以想重新系统性的学习一下&#xff0c;记录了整个学习过程&#xff0c;而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…

redis 原理篇 26 网络模型 Redis是单线程的吗?为什么使用单线程

都是学cs的&#xff0c;有人月薪几万&#xff0c;有人月薪几千&#xff0c;哎&#xff0c; 相信 边际效用&#xff0c; 也就是说&#xff0c; 随着技术提升的越来越多&#xff0c;薪资的提升比例会更大 一个月几万&#xff0c;那肯定是高级开发了&#xff0c; 一个月几千&…

UE4 Cook 从UAT传递参数给UE4Editor

需求 一句Cook的命令如下&#xff1a; ${EnginePath}/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun -project${ClientPath}/${ProjectName}.uproject -noP4 -platformIOS -cooksinglepackage -client -clientconfig${CookConfig} -iterate -skipbuild -nocompile -NoMutex…

jmeter基础05_第1个http请求

本节课使用网站“httpbin.org”进行基础的http请求全流程。 请求获取httpbin.org的首页&#xff1a; 请求方法&#xff1a;GET URL&#xff1a;http://httpbin.org 参数&#xff1a;无 1、操作步骤 ① 打开jmeter&#xff1a;命令行窗口输入“jmeter”并回车。 ② 添加线程组…

【Ubuntu24.04】从双系统到虚拟机再到单系统的故事

故事 在大学前期&#xff0c;我使用Ubuntu系统都是为了学习一些命令或者其它Linux的东西&#xff0c;对性能的要求不高&#xff0c;所以选择了虚拟机&#xff0c;后来为了做毕设&#xff0c;选择安装了Ubuntu20.04双系统&#xff0c;因为虚拟机实在带不动&#xff0c;那时我的主…

力扣 LeetCode 18. 四数之和(Day3:哈希表)

解题思路&#xff1a; 需要先弄懂三数之和&#xff0c;思路类似 三数之和&#xff1a;指针 i &#xff0c;left &#xff0c;right 四数之和&#xff1a;指针 k &#xff0c;i &#xff0c;left &#xff0c;right&#xff08;相当于多了一个 k &#xff0c;多了一个外层 fo…

30 秒!用通义灵码画 SpaceX 星链发射流程图

不想读前人“骨灰级”代码&#xff0c; 不想当“牛马”程序员&#xff0c; 想像看图片一样快速读复杂代码和架构&#xff1f; 来了&#xff0c;灵码又加新 buff&#xff01;&#xff01; 通义灵码支持代码逻辑可视化&#xff0c; 可以把你的每段代码画成流程图。 你可以把…

sql注入之二次注入(sqlilabs-less24)

二阶注入&#xff08;Second-Order Injection&#xff09;是一种特殊的 SQL 注入攻击&#xff0c;通常发生在用户输入的数据首先被存储在数据库中&#xff0c;然后在后续的操作中被使用时&#xff0c;触发了注入漏洞。与传统的 SQL 注入&#xff08;直接注入&#xff09;不同&a…

Warped Universe游戏即将在Sui上推出,为玩家提供多样化的游戏体验

Warped Games选择Sui作为其即将推出的创新多类型游戏Warped Universe的首选Web3技术。Warped Universe让玩家可以体验第三视角实时动作、回合制策略和基地建设等玩法。该游戏使用Unreal Engine 5开发&#xff0c;将借助Sui的技术使玩家能够拥有、交易和变现其游戏内资产。 War…

显示微服务间feign调用的日志

第一步 package com.niuniu.common.config;import com.niuniu.common.CommonConstant; import com.niuniu.common.utils.UserContext; import feign.Logger; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.…

nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。

在项目中会碰见需要在nginx代理多个项目&#xff0c;如果在加上uniapp开发的H5端的项目&#xff0c;你还要在nginx中区分PC端和手机H5端&#xff0c;这就会让人很头大&#xff01;网上大部分的资料都是采用在nginx的conf配置文件中添加区分pc和手机端的变量例如&#xff1a;set…

redis 原理篇 31 redis内存回收 内存淘汰策略

哦哦&#xff0c; 内存满了咋搞 就算过期key 删除&#xff0c;还是不够用&#xff0c; 这种问题没办法&#xff0c;只能了解一下啥解决方案了&#xff0c; 内存是有限的&#xff0c;一直存&#xff0c;肯定会满&#xff0c;这时&#xff0c;咋处理&#xff1f; 首先&#xff…