【Linux进程】 进程的理解

目录

前言

1. 系统管理

2. 进程

2.1 概念

2.2 进程的调度

2.3 描述进程-PBC

3. 查看进程

 4. 通过系统调用获取进程标示符


前言

      在计算机科学领域,进程是一种重要的概念,在日常学习中也经常遇到进程这个概念,那么进程到底是什么?我们又应该如何去理解,本文将为你详细解释什么是进程,以及如何在Linux环境下如何查看进程。

在这里插入图片描述

1. 系统管理

为什么要有系统管理?

  • 对下管理好硬件资源

操作系统通过对硬件资源的管理,确保了系统的稳定、高效和安全的运行环境

  • 对上提供良好的运行环境

操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用——系统调用接口

系统调用

系统调用接口:由操作系统提供,也叫系统调用函数,这些函数是用C语言编写的函数(Linux环境)

        大多数操作系统中,用户通常不允许直接访问底层硬件。用户要想调用底层硬件必须经过操作系统。

库函数

        用户在使用时,可以直接调用系统调用接口,但系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者对部分系统调用进行了适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

小结

系统调用和库函数的关系:

系统调用由系统提供,库函数由用户层提供,它们是上下层的关系

2. 进程

了解完整个计算机体系结构之后,再来探讨什么是进程

2.1 概念

什么是进程?

在教材当中的定义:加载到内存的程序、正在运行的程序等。进程究竟是什么,我们要如何去理解进程?

        我们在使用电脑时,电脑可以同时启动多个程序(将多个.exe文件加载到内存),程序在运行之前,必须要把程序先加载到内存,系统要对加载到内存的(可执行)程序进行管理,如何管理? ——先描述,再组织

先描述,再组织

        定义一个struct结构体,结构体包含进程几乎所有的属性字段,如:状态、优先级、标识符、内存指针字段、struct xxx *next...

这些结构以链表的形式进行连接,通过对链表的增删查改就可以对进程进行管理。

        可执行程序从磁盘加载到内存当中,没有识别标识的话,计算机就无法识别每个可执行程序,为了方便管理,于是便将每个可执行程序描述起来形成一个结构体,这个结构体也叫做进程控制块(process control block)简称PCB

        计算机将每个可执行程序的PCB以链表的形式连接起来,于是就将进程的管理,转变成了对PCB增删查改。

所以什么是进程?

内核PCB对象(内核数据结构) + 可执行程序 = 进程

2.2 进程的调度

进程通过链表连接,这些进程又是怎么被调度运行的?

        在CPU内部可以有一个运执行队列的数据结构,通过这个队列结构来实现对进程的调度。运行时进程可以被动态的调度,其实就是将可执行程序的PCB放入到执行队列当中。

也就是说:所有对进程的控制以及操作,只和进程的PCB有关,和进程的可执行程序无关。

        PCB可以被放在任何数据结构当中,日常中的数据结构增删查改及练习,其实也就是对进程的管理方法。

2.3 描述进程-PBC

task_struct-PCB的一种

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

task_ struct内容分类

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。

  • 状态: 任务状态,退出代码,退出信号等。

  • 优先级: 相对于其他进程的优先级。

  • 程序计数器: 程序中即将被执行的下一条指令的地址。

  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。

  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

  • 其他信息

         这些task_ struct中的数据全部都属于操作系统内部的数据。要获取这些数据(如pid),必须要调用系统调用。

3. 查看进程

了解完进程,我们在Linux环境下查看一下进程:

ps ajx

验证一下上边的结论:

我们可以在Linux环境下执行以下代码:

#include <stdio.h> 
#include <unistd.h> 
int main()
{ 
    while(1)
    { 
        printf("Hello world!\n");
        sleep(1); 
    } 
return 0;
 }

将代码编译执行:

此时程序就变成了进程,我们可以使用grep筛选查看:

ps ajx | head -1 && ps ajx | grep myprocess

为什么有两个?

我们在筛查时,使用了grep指令,它也是一个程序,在执行搜索myprocess时它也是一个进程,所以第二个是grep的进程。

所以,只要程序一旦被运行运行就会产生进程

使用while循环每隔1秒筛查一次myprocess进程,注意观察筛查变化:

 指令:

 while :; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep; sleep 1; done

 可以根据生成的可执行程序名称进行适当修改。

 可以清晰的看到一个进程的产生与结束。

 4. 通过系统调用获取进程标示符

  • 进程id(PID)
  • 父进程id(PPID)

 在Linux中,一般普通进程都要它的父进程

 在Linux环境下执行下面这个程序:

#include <stdio.h>
#include <unistd.h>
#include<sys/types.h>
 int main()
   {
         pid_t id = getpid();
         pid_t fid = getppid();
         while(1)
         {
             printf("Hello world! pid: %d ppid: %d\n",id,fid);                                                  
             sleep(1);
         }
  
         return 0;
  
  }

 我们还是使用老方法,使用while循环每隔1秒筛查一次myprocess进程,注意观察筛查变化:

通过观察可以发现,每次启动时进程的id(pid)都不一样,这是因为:

每次启动的进程,都是一个新的进程

 虽然pid每次都会变,但是父进程(ppid)没有变化,那这个父进程(ppid)到底是什么?

 筛查指令:

ps ajx | head -1 && ps ajx | grep 4599

我的ppid是4599,可根据自己的ppid进行修改。

 筛查结果是bash,bash是我们的命令行解释器

 所以所有在命令行启动的进程,都是bash的子进程


 总结

         通过深入了解进程的概念和原理,我们可以更好地理解计算机系统的运行方式,以上就是本文全部内容,希望对你有所帮助,感谢阅读!

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

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

相关文章

Keras实现seq2seq

概述 Seq2Seq是一种深度学习模型&#xff0c;主要用于处理序列到序列的转换问题&#xff0c;如机器翻译、对话生成等。该模型主要由两个循环神经网络&#xff08;RNN&#xff09;组成&#xff0c;一个是编码器&#xff08;Encoder&#xff09;&#xff0c;另一个是解码器…

使用mysql查询当天、近一周、近一个月及近一年的数据以及各种报表查询sql

1.mysql查询当天的数据 1 select * from table where to_days(时间字段) to_days(now()); 2.mysql查询昨天的数据 1 select * from table where to_days(now( ) ) - to_days( 时间字段名) < 1 3.mysql查询近一个月的数据 1 SELECT * FROM table WHERE date(时间字段) …

OR-3150:IGBT驱动光耦,可替代HCPL3150

具有MOSFET高输入阻抗和GTR低导通压降特性提供隔离反馈 高隔离电压 1.5A输出电流 工业温度范围&#xff1a;–40C 至 110C 宽工作 VCC 范围 特征 VCM 1500V 时最小共模抑制 &#xff08;CMR&#xff09; 为 35 kV/μs 最大低电平输出电压 &#xff08;VOL&#xff09; 1.0…

杨中科 ASP.NETCore开发效率利器 HOT RELOAD

HOT RELOAD 1、困惑:修改了服务器端的代码&#xff0c;必须重新运行程序。 2、方法1: [启动 (不调试) ] 3、方法2: .NET 6开始的Hot Reload(热重载) 正常修改代码后 不重启&#xff0c;是无法看到新的数据展示在页面 修改 运行结果&#xff1a; 方式一&#xff1a;设置开始…

Android WiFi基础概览

Android WiFi 基础概览 1、WiFi协议2、Android WLAN 架构2.1 应用框架2.2 Wi-Fi 服务2.3 Wi-Fi HAL 3、相关编译 android13-release 1、WiFi协议 Wi-Fi&#xff08;无线通信技术&#xff09;_百度百科 2.4GHz 频段支持以下标准&#xff08;802.11b/g/n/ax&#xff09;&#xff…

CommonJS 和 ES6 Module:一场模块规范的对决(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

质量管控之Bug管理 5大注意事项

Bug管理对于提高软件质量、用户满意度、开发效率等都具有重要的意义。它是确保软件质量和用户体验的关键环节。而Bug管理不善&#xff0c;可能会导致软件质量下降、项目进度延误、用户满意度降低、等不良影响。 因此&#xff0c;正确有效地进行Bug管理非常重要&#xff0c;而进…

Maven各版本的官方下载地址

2023年1月3日&#xff0c;周三上午 官方下载地址&#xff1a; https://dlcdn.apache.org/maven/

oracle语法学习

oracle语法学习 1.备份表 create table bd_psndoc_temp as select * from bd_psndoc2.还原表 drop table bd_psndoc; create table bd_psndoc as select * from bd_psndoc_temp3.查询表的前5条记录 select * from bd_psndoc_temp where rownum<54.从一个表中复制所有的列…

为什么有人说PMP是水证,它的含金量到底怎么样?

在我国大陆&#xff0c;有好多证书被商业化得太重了&#xff0c;甚至演变成了个人或一些公司摇钱的工具。所以有些证书受人吹捧它崛起的快&#xff0c;但是活不长&#xff0c;甚至“夭折”&#xff0c;比如以前微软系列的证书&#xff1b; 而PMP认证从国外引进大陆这么多年了&…

为什么原生广告成为APP广告变现的重要选择?

APP广告变现可以采用的广告形式有多种选择&#xff1a;激励视屏、插屏广告、原生广告。开发者可以在不影响用户体验的情况下制定合适的变现策略。 一、什么是原生广告&#xff1f; 原生广告不同于以往传统广告的效果&#xff0c;用户在观看时就像内容里的某个吸睛片段&#x…

onxxruntime使用cuda以及tensorrt进行加速

1、版本匹配 版本需要匹配&#xff0c;不然运行会报错 2、onnxruntime之tensorrt加速 方式一&#xff1a; OrtTensorRTProviderOptions trt_options{}; trt_options.trt_max_workspace_size 2147483648; trt_options.trt_max_partition_iterations 10; trt_options.trt_m…

学习使用layPage, 多功能JS分页组件/插件的方法

学习使用layPage, 多功能JS分页组件/插件的方法 效果图分页代码 效果图 点击查看链接 分页代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>Layui</title><meta name"renderer" content"we…

YOLOv8改进:IoU系列篇 | Shape-IoU结合基于辅助边框的Inner-IoU损失,实现再次创新

🚀🚀🚀本文改进: Shape-IoU结合基于辅助边框的Inner-IoU损失,小目标检测实现涨点,基于辅助边框的优化前提下,更加关注边界框本身的形状和尺度来计算损失 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研…

[UUCTF 2022 新生赛]ez_rce

[UUCTF 2022 新生赛]ez_rce wp 在做这道题时&#xff0c;我参考了这篇博客&#xff1a; https://www.cnblogs.com/bkofyZ/p/17594549.html 认识到了自己的一些不足。 题目代码如下&#xff1a; <?php ## 放弃把&#xff0c;小伙子&#xff0c;你真的不会RCE,何必在此纠…

Unity真机Log工具 SRDebugger使用记录,GM布局管理

SRDebugger 官方文档安装及初始化常用设置选项布局选项快捷键选项高级设置 使用GM工具案例常用特性GM分组排序GM固定页签 官方文档 文档&#xff1a; https://www.stompyrobot.uk/tools/srdebugger/documentation/ 插件地址&#xff1a; https://assetstore.unity.com/package…

NGUI基础-Widget

目录 Widget是什么 Widget组件包含的属性 Pivot Depth Size snap Aspect Free Based on Width Based on Height Widget是什么 在Unity UI系统中&#xff0c;"Widget"是指UI元素的基类&#xff0c;它为UI元素提供了位置、大小和锚点等基本属性。通过使用&qu…

【AI视野·今日Robot 机器人论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 31 Oct 2023 Totally 39 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers DEFT: Dexterous Fine-Tuning for Real-World Hand Policies Authors Aditya Kannan, Kenneth Shaw, Shikhar Bahl, Pragna Ma…

STM32F4 IAP升级 Bootloader程序+上位机下载程序源码

目录 一、硬件设计 二、软件设计 三、上位机设计 四、IAP说明 五、下载验证 资料下载地址&#xff1a;STM32F4 IAP升级 Bootloader程序上位机下载程序源码 一、硬件设计 升级下载程序采用外部硬件触发的方式。 PB-20M4硬件板 预留一个IO口处理代码下载及更新的功能。 功…

vue-cli配置自定义打包命令

vue-cli配置自定义打包命令 一、目录结构二、.env.development三、.env.production四、 对应打包命令 一、目录结构 在vue项目中&#xff0c;env是全局配置文件&#xff0c;可以存储不同环境下的变量。 使用vue-cli搭建项目&#xff0c;默认会在根目录创建一个.env文件 如果需…