【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的子进程


 总结

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

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

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

相关文章

tkinter实现一个简易窗口

tkinter目录 1. 最简易的窗口2. 加了标签、按钮、输入框&#xff0c;并且按钮连接了函数 1. 最简易的窗口 import tkinter as tkwindow tk.Tk()window.title(我的窗口) # 设置窗口名 window.geometry(500x300) # 设置窗口长宽label tk.Label(window, text文字文字文字, bg…

Vue3中使用动态组件

文章目录 使用方式&#xff1a;使用场景&#xff1a; 在 Vue 3 中&#xff0c;动态组件是一种允许在运行时动态切换组件的机制。Vue 3 提供了 元素以及 is 特性来实现动态组件的切换。 使用方式&#xff1a; 1、使用 元素 在模板中使用 元素&#xff0c;通过 is 特性来动态切换…

CSS基础笔记-01CSS概述

文章目录 前言CSS是什么CSS的作用CSS语法添加CSS的方法 前言 CSS是什么&#xff1f;有什么作用&#xff1f;怎么编写CSS&#xff1f;怎样添加CSS&#xff1f;本文对CSS的四个方面作了学习并形成学习笔记。 CSS是什么 CSS &#xff08;Cascading Style Sheets&#xff0c;层叠…

CentOS 多节点一键免密登录

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

解决2023新版Edge浏览器页面加载不出来问题

2023年推出的新版Edge浏览器为用户带来了更好的性能和用户体验。然而&#xff0c;有一些用户反馈称他们在使用新版Edge浏览器时遭遇了页面加载不出来的问题。本篇博客将详细介绍如何解决这个问题&#xff0c;以确保您能够顺畅地使用新版Edge浏览器浏览网页。 1、清除缓存和Coo…

使用 Python 进行贝叶斯优化

一、介绍 贝叶斯优化是一种先进的技术&#xff0c;用于优化评估成本高昂的函数。该策略为全局优化提供了原则性策略&#xff0c;强调探索&#xff08;尝试新领域&#xff09;和开发&#xff08;尝试看起来有前途的领域&#xff09;之间的平衡。 二、什么是贝叶斯优化&#xff1…

Mysql 分割字符串,一行变多行,@rownum,mysql.help_topic

1 前言 朋友最近遇到一个比较棘手的 sql 问题&#xff0c;让我帮忙看看&#xff1a; 他有两张表 testa 和 testb &#xff0c;一个表存的日期&#xff0c;另一个表存字符串例如 2023-11-01,2023-11-02&#xff0c;如何将这两张表关联起来&#xff0c;只查 testa 表的数据&#…

streamlit 入门demo

一、介绍 Streamlit 是一个用于创建数据应用程序的 Python 库&#xff0c;它致力于简化从数据脚本到可部署应用程序的整个过程。通过 Streamlit&#xff0c;你可以使用熟悉的 Python 语言创建交互式的、美观的数据应用&#xff0c;而无需深入了解前端开发。 二、优势和特点 简…

分布式基础概念

分布式基础概念 1 微服务 微服务架构风格&#xff0c;就像是把一个单独的应用程序开发为一套小服务&#xff0c;每个小服务运行在自己的进程中&#xff0c;并使用轻量级机制通信&#xff0c;通常是HTTP API。这些服务围绕业务能力来构建&#xff0c;并通过完全自动化部署机制…

AUTOSAR从入门到精通-漫谈autosar软件架构(七)

目录 前言 原理 AUTOSAR软件开发现状 Autosar分层架构 基础软件层(BSW)

【Path的使用】Node.js中的使用Path模块操作文件路径

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;Node.js &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续前进的勇…

Jenkins集成部署java项目

文章目录 Jenkins简介安装 Jenkins简介 Jenkins能实时监控集成中存在的错误&#xff0c;提供详细的日志文件和提醒功能&#xff0c;还能用图表的形式形象的展示项目构建的趋势和稳定性。 官网 安装 在官网下载windows版本的Jenkins 但是我点击这里浏览器没有反应&#xff0…

Vue3-38-路由-路由的懒加载

什么是路由的懒加载 一句话概括 &#xff1a; 懒加载&#xff0c;就是在初次用到的时候才执行加载&#xff1b;而非一上来就全部加载完毕。优点 &#xff1a; 可以提高项目的访问效率。因为一上来不用加载所有的资源。建议 &#xff1a; 项目中的所有路由配置都配置为 懒加载…

使用 KubeSphere 与极狐GitLab 打造云原生持续交付系统

极狐GitLab 简介 极狐GitLab 是一个一体化的 DevOps 平台&#xff0c;可以简单理解为 GitLab 在国内的“发行版”。是由极狐(GitLab)公司推出的产品&#xff08;极狐(GitLab)公司是以“中外合资3.0”模式成立的公司&#xff0c;在国内独立运营&#xff0c;为国内用户提供适合本…

test mutation-00-变异测试概览

拓展阅读 test 系统学习-04-test converate 测试覆盖率 jacoco 原理介绍 test 系统学习-05-test jacoco 测试覆盖率与 idea 插件 test 系统学习-06-test jacoco SonarQube Docker learn-29-docker 安装 sonarQube with mysql Ubuntu Sonar 突变测试是什么&#xff1f; …

2024你好!

在刚刚过去的一年里&#xff0c;科技行业犹如璀璨的星辰照亮了全球的进步之路。特别是在人工智能的疆域中&#xff0c;大模型技术犹如破晓的曙光&#xff0c;以其数十亿乃至千亿级别的参数力量&#xff0c;掀起了前所未有的变革浪潮。 2023年&#xff0c;大模型技术无疑成为了人…

谷歌浏览器启用实时字幕功能

在 Chrome 中使用“实时字幕”功能 - Google Chrome帮助 在 Chrome 中使用“实时字幕”功能 从计算机上的 Chrome 浏览器中&#xff0c;您可以使用“实时字幕”功能自动为视频、播客、游戏、直播、视频通话或其他音频媒体生成字幕。音频和字幕均在本地处理&#xff0c;并会保…

K8S学习指南(64)-K8S源代码走读之Kubelet

文章目录 前言Kubelet 的代码结构Kubelet 的核心逻辑1. Pod 生命周期管理1.1 Pod 启动逻辑1.2 Pod 状态管理1.3 Pod 事件处理 2. 容器启动和监控2.1 容器启动逻辑2.2 容器监控 3. 容器网络和存储3.1 容器网络3.2 容器存储 4. 资源管理4.1 资源分配 5. 启动和注册 Kubelet5.1 启…

【动态规划】【字符串】132.分割回文串 II

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 动态规划 字符串 LeetCode132. 分割回文串 II 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1&#xff1a; 输入&#x…

基于R语言(SEM)结构方程模型教程

详情点击链接&#xff1a;基于R语言&#xff08;SEM&#xff09;结构方程模型教程 01、R/Rstudio (2)R语言基本操作&#xff0c;包括向量、矩阵、数据框及数据列表等生成和数据提取等 (3)R语言数据文件读取、整理&#xff08;清洗&#xff09;、结果存储等&#xff08;含tidve…