Linux—进程学习-01

news2024/11/24 3:58:15

目录

  • Linux—进程学习—1
    • 1.冯诺依曼体系结构
    • 2.操作系统
      • 2.1操作系统的概念
      • 2.2操作系统的目的
      • 2.3如何理解管理
      • 2.4计算机软硬件体系的理解
      • 2.5系统调用和库函数的概念
    • 3.进程
      • 3.1进程是什么
      • 3.2管理进程
        • 3.2.1描述进程-PCB
        • 3.2.2组织进程
        • 3.2.3总结
      • 3.3查看进程
    • 4.与进程有关的系统调用

Linux—进程学习—1

1.冯诺依曼体系结构

冯·诺依曼提出了电子计算机系统制造的三个基本原则,即采用二进制逻辑、程序存储执行以及电子计算机系统由五个部分组成(运算器、控制器、存储器、输入设备、输出设备,其中运算器与控制器又共同组成为中央处理器CPU),这套理论被称为冯·诺依曼体系结构。

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系

image-20241028160848017

截至目前,我们所认识的计算机,都是有一个个的硬件组件组成

输入单元:包括键盘, 鼠标,扫描仪, 写板等

中央处理器(CPU):含有运算器和控制器等

输出单元:显示器,打印机等

关于冯诺依曼,必须注意几点

存储器指的是内存!,一定要注意!

磁盘和硬盘既可以是输入设备也可以是输出设备

不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)

外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。

总结一句话,所有设备都只能直接和内存打交道

**对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上。比如:从你登录上qq开始和某位朋友聊天开始,数据的流动过程。**从你打开窗口,开始给他发消息,到他的到消息之后的数据流动过程。如果是在qq上发送文件呢?

image-20241028154114924

那发文件呢?

其实也是一样的,只不过输入设备不在是键盘,而是磁盘,因为文件是存储在本地的磁盘中的,将文件从磁盘传输到内存,经过cpu处理之后,传输给网卡和显示器等输出设备,网卡通过网络将文件数据传输到另外一个用户的输入设备—网卡上,然后再加载到内存中,经过cpu的处理之后,传输给输出设备显示器。[此时用户一般可以选择下载到本地,即将文件从内存中传输到输出设备—磁盘上]

2.操作系统

2.1操作系统的概念

操作系统的概念:

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

  1. 内核(进程管理,内存管理,文件管理,驱动管理)

  2. 其他程序(例如函数库,shell程序等等)

操作系统的本质就是一个对软硬件资源进行管理的软件

2.2操作系统的目的

其目的就是:

  • 通过对软硬件资源的合理的管理(手段),给用户创造一个良好的(稳定的,高效的,安全的)运行环境(目的)

2.3如何理解管理

操作系统是管理者,那谁是被管理者——其实是软硬件资源,下面是一个图,方便理解。

image-20241029012316169

对于操作系统是如何对软硬件进行管理的理解图,有一个例子可以方便理解:

就像校长就是学生的管理者,校长不需要去接触每个具体的学生,但是仍然能够对学生进行管理,就是通过拿到学生的所有具体的数据,以数据的变化为依据,进行对学生进行管理的重大决策。

经过上图的理解,可以总结出——管理的本质就是对数据继续管理

那管理者是如何不断的拿到被管理者的数据,并根据数据的变化来下达相应的决策,对被管理者进行管理的呢?

这中间就还需要引出一个执行者的概念。

如果是在学校里,执行者可以是辅导员,可以是班长等其他位置,这里就当做辅导员。

如果是在操作系统中,若被管理者是硬件,那么执行者就是驱动

image-20241031104020401

管理者(OS/校长)具体来说是如何管理被管理者的呢?

所有的管理本质的逻辑都是——先描述、再组织【也就是面向对象思维】

将被管理者的数据描述成一个类,然后再将类的对象用数据结构组织起来【将一个个类的对象用某个数据结构存储起来】,通过这个数据结构的一些算法【比如找到增删查改】来对数据进行管理

总结

计算机管理硬件

  1. 描述起来,用struct结构体

  2. 组织起来,用链表或其他高效的数据结构

2.4计算机软硬件体系的理解

此时有一个问题:**操作系统是不相信用户的,它不会将自己底层的进程管理、文件管理等、以及底层管理的数据开放给用户进行访问。**不然用户如果操作错误,就会导致操作系统崩溃。但是操作系统又需要给用户提供各种服务。不然用户怎么知道自己的硬件是什么情况呢?自己的文件什么情况等。

因此操作系统给用户提供了许许多多的接口来给用户使用。比如用户想往磁盘中存储一些数据,用户是不能自己往磁盘输入数据的,只能将这个申请提交给操作系统的接口,经过操作系统的判断之后,才会往磁盘输入数据。

就像我们不能直接拿钱去将钱存到银行的仓库中,只能交由银行的人员来完成这个操作一样

image-20241031130637883

上面提到的这个操作系统的接口一般叫做系统调用

如果是Linux系统的系统调用,其实就是调用c式的接口、因为Linux系统是由C写的,也就是说系统调用其实就是OS提供的一个C语音编写的函数的调用

image-20241031165659676

但是如果让用户直接去使用系统调用的话,也是不太好的,因为这要求用户对操作系统有一定的了解,不然是无法使用的、因此就会有一些上层的软件,比如指令操作(shell)和编程操作(c/c++)、来帮我们使用系统调用

下面是举例:

在shell中,我们输入ls或者touch等指令,其实都是通过调用shell的接口,这个接口和系统调用会有关系,因此最终还是在调用系统接口来完成对硬件的访问。比如ls就是将这个文件的内容全部输入,那不就需要读取磁盘内的空间并输出到显示器吗,touch指令也需要在磁盘中创建一个空间用于存放新建文件。这需要向磁盘空间输入数据,最终也是系统调用完成的工作、

在写c/c++代码的时候,printf和cout是调用库函数,库函数内部会有系统调用。最终仍然是通过系统调用实现的向显示器(硬件)输出

对于上面描述的计算机软硬件体系可以用一个图片来总结:

image-20241031115904795

这里最底层的硬件需要了解冯诺依曼体系结构、

驱动程序是执行者,它执行操作系统的管理决策,并将硬件的数据变动交给操作系统,便于操作系统管理、

操作系统会将驱动程序先描述成一个类,并用如链表的数据结构将其组织起来、方便做出一个个对外界提供服务的系统接口、也就是系统调用

而在我们写代码或者输入指令的时候,涉及对硬件的访问,都是通过库函数来帮助我们使用系统调用,进而访问硬件、

2.5系统调用和库函数的概念

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用

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

3.进程

3.1进程是什么

进程——一个被加载到内存的程序

内核观点:担当分配系统资源(CPU时间,内存)的实体。

3.2管理进程

首先程序是一个文件,因此,程序想要被运行,根据冯诺依曼体系结构,存储程序的文件必须要被加载到内存中。然后再被cpu计算,运行程序。但是很多时候,被加载到内存上的程序非常多、

image-20241102154844313

这个时候被加载到内存上的程序非常多,此时就会有很多问题,先运行那个程序?程序的在内存的位置如何分配?那些程序执行过?那些程序没有执行过?有些执行完的程序要销毁释放,有些程序需要多执行几次等等问题。

因此操作系统为了更好的管理这些被加载到内存的大量程序文件,就将加载到内存的程序称作进程,然后管理这些进程。如何管理呢?

前面说了,管理的逻辑就是先描述、再组织。

因此操作系统对进程的管理自然也需要先描述、再组织

3.2.1描述进程-PCB

要相对进程进行管理,需要先将进程描述起来。如何描述呢?

在描述的时候,需要将进程其描述成一个类或者结构体。这个类和结构体中存放着进程的所有属性。

操作系统会用PCB来描述进程

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

  • 进程控制块称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

其实在Linux下的进程控制块(PCB)就是一个结构体,这个结构体放着进程的所有属性【比如进程的id,进程的优先级,进程的状态,进程的地址、以及各自属性等等】

image-20241102161137358

要注意:这里所说的进程的属性,都是操作系统自己添加的,原本被加载到内存的可执行代码文件是没有这些进程属性的,它只有自己写的代码和数据逻辑

因此每一个可执行程序被加载到内存的时候,操作系统都会将其作为进程并将该进程的所有属性放到PCB中。

image-20241102161828642

将进程描述成PCB之后,就要将PCB组织起来,方便管理

3.2.2组织进程

当内存中有多个进程的时候,就会存在多个进程控制块(PCB),操作系统就会将其用数据结构联系起来,将多个进程控制块用链表之类的数据结构联系起来。这样就实现了组织

image-20241102162049410

这样组织起来了之后,如果cpu需要找到优先级最高的进程来执行,就只需要遍历进程控制块(PCB)的链表,找到优先级最高的进程,并执行就可以了。

如果进程执行完毕需要删除释放,只需要遍历PCB的链表,找到状态为死亡的进程,然后将其代码从内存释放出去,然后删除对应的PCB即可。

3.2.3总结

操作系统对进程管理,不是对进程本身进行管理,而是对进程控制块(PCB)进行管理、

如果是用链表将PCB组织起来,那么对进程管理就转化成了对链表的增删查

内核数据结构 用数据结构将内核结构体(task_struct)组织起来 -> 内核结构体 struct task_struct -> 内核对象 task_struct的对象->将该结构和你的代码和数据关联起来 ->先描述,在组织的工作
进程 = 内核数据结构(task_struct) + 进程对应的磁盘代码

linux内核的部分PCB(task_struct)的源代码:

image-20241104161503611

这个结构体有300多行。比我在linux写的代码都多了

3.3查看进程

  • 大多数进程信息可以使用top和ps这些用户级工具来获取

下面是个例子,当ProCessOn代码正在执行的时候,可以输入ps ajx | grep 'ProCessOn'来抓取这个进程是否存在

image-20241104164244068

如果想让抓取的进程的信息带上标题可以输入ps ajx | head -1 && ps ajx | grep "ProCessOn"

image-20241104165732616

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

输入ls /proc

image-20241104170519413

如果要获取PID为1的进程信息,需要查看 /proc/1 这个文件夹。

image-20241104170636389

注意:

通过/proc来查看进程,这是一个内存级别的目录,可以显示当前正在运行的所有进程的pid,如果一个新的进程被创建,pid号是24641,那么在/proc目录也会出现一个24641的目录,可以进行查看,里面会有该进程的属性信息、

4.与进程有关的系统调用

  • getpid()

这个是c语言自带的接口,可以实现系统调用,拿到当前进程的pid

image-20241106120011898

pid_t其实就是一个整形类型,按照整形使用即可

这里我写了个死循环程序

image-20241106121446607

执行结果如下:

image-20241106120735038

在另外一个窗口抓取进程

image-20241106120804892

如果想要杀死进程,就输入kill -9 进程pid即可

image-20241106120915406

  • getppid()

image-20241106151446504

这个的作用就是获取父进程的pid

image-20241106152550367

当我们运行多几次程序我们就会发现,进程本身是会变的,因为每次被加载到内存,操作系统都会为该进程重新分配pid。

image-20241106153400504

但是父进程是不会变得,我们抓取一下这个父进程pid就知道了

image-20241106153337862

可以看到父进程本身是bash,也就是shell本身

如果将该进程kill掉,那么就会直接退出这个命令行解释器。

  • 在命令行上运行的所有程序,其都是子进程,父进程一般情况下都是bash

这样有个好处,子进程有问题不会影响到父进程,父进程可以安全的运行下去

现在又有了一个新的问题,子进程是如何创建出来的,又是如何运行起来的呢?

等到学习进程控制就会明白了。

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

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

相关文章

【电子通识】白皮书、应用手册、用户指南、快速入门指南一般的定义是什么?

一般大厂家的器件或模块,除了给数据表以外,还提供应用手册、技术说明、白皮书等各种文档资料。 如下图所示为ST25 NFC/RFID标签和读卡器的文件资料:其中就有技术说明、白皮书、应用手册等。 如下所示为TI INA228技术文档相关资料: 也有应用手册、用户指南、技术文章…

python opencv灰度变换

灰度变换 灰度变换和二值化的区别: 灰度变换是调整调整图像的灰度动态范围或图像对比度二值化是将图像的每个像素点调至0或255,只呈现白色或黑色 1.灰度化处理 图片的灰度化:将一个像素点的三个颜色变量相等,RGB,此…

toolkit二次开发学习之程序集(ProAsmcomp)和装配体组件路径对象(ProAsmcomppath)

程序集ProAsmcomp可以理解为装配体组件对象。 对象ProAssembly是ProSolid的一个实例,并共享相同的声明。因此,ProAssembly对象可以作为适用于装配体的任何ProSolid和ProMdl函数的输入。特别是,因为你可以使用函数ProSolidFeatVisit()来遍历特…

WPF中如何简单的使用CommunityToolkit.Mvvm创建一个项目并进行 增删改查

目录 开始前准备的数据库dbblog如下: 第一步:创建项目后下载四个NuGet程序包 第二步:删除原本的MainWindow.XAML文件 并创建如下的目录结构 然后在View文件夹下面创建Login.XAML和Main.XAML 并且在App.XAML中将启动项改为Login.X…

【51蛋骗鸡一共八个灯 按顺序依次12。34。56。78。两个灯同时亮灭的代码】2022-1-19

缘由proteus流水灯-嵌入式-CSDN问答 仿真51单片机流水灯代码-编程语言-CSDN问答 protues仿真单片机控制led流水灯-嵌入式-CSDN问答 #include<reg52.h>//头文件 void main() //主函数 {unsigned char y23;unsigned int ys0;while(1){if(!ys){P0y2;if(!(y2*4))y23…

数据结构:跳表实现(C++)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言跳表跳表的优化思路skiplist&#xff0c;平衡搜索树&#xff0c;哈希表的对比 实现思路SkiplistNodesearch 搜索add 增加earse 删除 整体…

ssm基于Web的汽车客运订票系统的设计与实现+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

SSM中maven

一&#xff1a;maven的分模块开发 maven分模块就是在多人操作一个项目时将maven模块导入依赖&#xff0c;注意仓库里面没有资源坐标&#xff0c;需要使用install操作下载。 二&#xff1a;maven的依赖管理 pom文件中直接写的依赖叫做直接依赖&#xff0c;直接依赖中用到的依…

如何找到养生生活视频素材?推荐几个优秀网站

今天&#xff0c;我们来聊一个实用的话题&#xff0c;那就是如何找到优质的养生视频素材。作为自媒体创作者&#xff0c;高质量的视频素材对内容制作至关重要。不论你是刚入行的新手&#xff0c;还是已经积累了一定粉丝的大V&#xff0c;找到合适的养生视频素材都能帮助你更好地…

vscode的一些使用心得

问题1&#xff1a;/home目录空间有限 连接wsl或者remote的时候&#xff0c;会在另一端下载一个.vscode-server&#xff0c;vscode的插件都会安装进去&#xff0c;导致空间增加很多&#xff0c;可以选择更换这个文件的位置 参考&#xff1a;https://blog.csdn.net/weixin_4389…

画动态爱心(Python-matplotlib)

介绍 氵而已 由于用的是 AI&#xff0c;注释得非常清楚&#xff0c;自己改改也可以用 代码 # -*- coding: utf-8 -*- # Environment PyCharm # File_name 尝试1 |User Pfolg # 2024/11/05 22:45 import numpy as np import matplotlib.pyplot as plt import matplot…

13-鸿蒙开发中的综合实战:华为登录界面

大家好&#xff0c;欢迎来到鸿蒙开发系列教程&#xff01;今天&#xff0c;我们将通过一个综合实战项目来实现一个华为登录界面。这个项目将涵盖输入框组件、按钮组件、文本组件和布局容器的使用&#xff0c;帮助你更好地理解和应用这些组件。无论你是初学者还是有一定经验的开…

LCL三相并网逆变器simulink仿真+说明文档

背景描述&#xff1a; 详细解析了LCL三相并网逆变器的工作原理&#xff0c;强调了准PR比例谐振控制的重要性&#xff0c;讨论了电感、电容参数选择及保护电路设计。通过仿真结果展示了逆变器性能优化的方法&#xff0c;以提升系统效率和稳定性。 模型介绍&#xff1a; 整体模…

突破1200°C高温性能极限!北京科技大学用机器学习合成24种耐火高熵合金,室温延展性极佳

在工程应用中&#xff0c;如燃气轮机、核反应堆和航空推进系统&#xff0c;对具备优异高温机械性能的金属合金需求十分旺盛。由于材料熔点的固有限制&#xff0c;传统镍基 (Ni) 高温合金的耐温能力已接近极限。为满足开发高温结构材料的需求&#xff0c;耐火高熵合金 (RHEAs) 于…

使用GPT-SoVITS训练语音模型

1.项目演示 阅读单句话 1725352713141 读古诗 1725353700203 2.项目环境 开发环境&#xff1a;linux 机器配置如下&#xff1a;实际使用率百分之二十几&#xff0c; 3.开发步骤 1.首先是准备数据集&#xff0c;要求是wav格式&#xff0c;一到两个小时即可&#xff0c; 2.…

react18中redux-promise搭配redux-thunk完美简化异步数据操作

用过redux-thunk的应该知道&#xff0c;操作相对繁琐一点&#xff0c;dispatch本只可以出发plain object。redux-thunk让dispatch可以返回一个函数。而redux-promise在此基础上大大简化了操作。 实现效果 关键逻辑代码 store/index.js import { createStore, applyMiddlewar…

【JS学习】10. web API-BOM

文章目录 Web APIs - 第5天笔记js组成window对象定时器-延迟函数location对象navigator对象histroy对象本地存储&#xff08;今日重点&#xff09;localStorage&#xff08;重点&#xff09;sessionStorage&#xff08;了解&#xff09;localStorage 存储复杂数据类型 综合案例…

The First项目报告:MANTRA如何实现世界金融区块链化?

RWA&#xff08;现实世界资产&#xff09;代币化被视为加密领域的下一个财富增长点&#xff0c;它作为桥梁连接传统金融与加密世界&#xff0c;潜力覆盖数十万亿美元资产市场。尽管面临技术、监管及市场挑战&#xff0c;RWA项目正逐步获得广泛关注。MANTRA是一个Cosmos SDK基L1…

DAY21|二叉树Part08|LeetCode: 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 LeetCode: 669. 修剪二叉搜索树 基本思路 C代码 LeetCode: 108.将有序数组转换为二叉搜索树 基本思路 C代码 LeetCode: 538.把二叉搜索树转换为累加树 基本思路 C代码 LeetCode: 669. 修剪二叉搜索树 力扣代码链接 文字讲解&#xff1a;LeetCode: 669. 修剪二叉搜…

大模型LLama3!!!Ollama下载、部署和应用(保姆级详细教程)

首先呢&#xff0c;大家在网站先下载ollama软件 这就和anaconda和python是一样的 废话不多说 直接上链接&#xff1a;Download Ollama on Windows 三个系统都支持 注意&#xff1a; 这里的Models&#xff0c;就是在上面&#xff0c;大家点开之后&#xff0c;里面有很多模型…