Linux—进程学习-01

目录

  • 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

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

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

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

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

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

相关文章

初始JavaEE篇——多线程(5):生产者-消费者模型、阻塞队列

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势:生产者—消费者模型的劣势: Java标准库中的阻…

Redis常见面试题(二)

Redis性能优化 Redis性能测试 阿里Redis性能优化 使用批量操作减少网络传输 Redis命令执行步骤:1、发送命令;2、命令排队;3、命令执行;4、返回结果。其中 1 与 4 消耗时间 --> Round Trip Time(RTT,…

Scala学习记录,List

List是一个不可变(immutable)的序列。特点:数据是有序的 前面学习的Set,Map数据是无序的;Array是有序的,Array数组物理空间上是连续的 List可变不可变: list中不可变的列表是不能修改的 list…

【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目

给你字符串 s 和整数 k 。 请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。 英文中的 元音字母 为(a, e, i, o, u)。 示例 1: 输入:s "abciiidef", k 3 输出:3 解释&#xff1a…

0-基于图的组合优化算法学习(NeurIPS 2017)(未完)

文章目录 Abstract1 Introduction2 图上的贪婪算法的通用表述3 表示:图嵌入3.1 Structure2Vec3.2 参数化 Q ^ ( h ( S ) , v ; Θ ) \widehat{Q}(h(S), v; \Theta) Q ​(h(S),v;Θ)4 Training: Q-learningAbstract 为NP-hard组合优化问题设计好的启发式或近似算法通常需要大…

RK3568平台开发系列讲解(设备树篇)设备树(device Tree)的由来

🚀返回专栏总目录 文章目录 一、设备树的由来二、设备树的组成沉淀、分享、成长,让自己和他人都能有所收获!😄 一、设备树的由来 首先不得不提到Linus的一封重要的邮件:(硬件解耦)(可以复用的代码) Gaah. Guys, this whole ARM thing is a f*cking pain in the ass.…

基于C++深度优先遍历迷宫

c实现的深度优先遍历迷宫,迷宫大小为20*20,代码简练清楚,内涵关键注释。代码与网上都不一样。 深度优先遍历迷宫,核心思想是借助一个栈,站在一个节点上时,将它附近可以走的节点存在栈中,再按顺…

QML项目实战:自定义CheckBox

目录 一.添加模块 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.4 import QtGraphicalEffects 1.15 二.自定义CheckBox 1.CheckBox设置 2.勾选框设置 3.标签部分 4. 状态变化处理 5.文本设置 三.效果 1.当enabled为true 2.当enabled为true 3.当…

天命人开店日记之门店经营调研(下)

在调研前拟定了一些想要去了解的信息,包括:月销量、净利润、用户购买的主要担忧、与电商平台的竞争差异等关键内容,然而当自己去实地考察线下门店时,确发现实际情况与自己的预期相差非常大。大大出乎预料的包括三方面:…

【昇腾】Linux系统常见命令

文章目录 查看操作系统信息查看EulerOS内核版本 查看root下的内容查看/etc目录下的内容sh: yum: command not foundValueError: zero-size array to reduction operation minimum which has no identityAttributeError: torch_npu._C._NPUDeviceProperties object has no attri…

立体视觉的核心技术:视差计算与图像校正详解

立体视觉的核心技术:视差计算与图像校正详解 在立体视觉中,通过双目相机(即左右两台相机)的不同视角捕获的图像,结合几何关系,我们可以推算出场景中物体的深度。本文将深入讲解如何基于视差(di…

11.6-11.7重大专业能力测试(换皮c++考试)全攻略(两天速通版)

relations的vector存储的就是Relation类型的数据,并不是指针,所以relations[i]访问Relation的成员就是直接用., 但是joins的JoinSql里面存的是指针,并不是实际的数据,所以应当用->来访问其中的成员 结构体当中的Sq…

Go语言结构体、方法与接口

文章目录 一、结构体构造函数Go语言中的构造函数语法 二、结构体方法和接收器无参数和返回值值类型接收者指针类型接收者方法继承方法重写 三、结构体比较结构体比较要求结构体比较符号 四、接口声明接口定义接口特点接口格式标准格式接口的实现:空接口error接口 五…

用Puppeteer点击与数据爬取:实现动态网页交互

用Puppeteer与代理IP抓取51job招聘信息:动态网页交互与数据分析 引言 在数据采集领域,传统的静态网页爬虫方式难以应对动态加载的网页内容。动态网页通常依赖JavaScript加载数据,用户需要与页面交互才能触发内容显示。因此,我们…

Sophos | 网络安全

在 SophosLabs 和 SophosAI 的威胁情报、人工智能和机器学习的支持下,Sophos 提供广泛的高级产品和服务组合,以保护用户、网络和端点免受勒索软件、恶意软件、漏洞利用、网络钓鱼和各种其他网络攻击。Sophos 提供单一的集成式基于云的管理控制台 Sophos …

盘点RPA在政务领域落地应用

数字政府是数字经济的中坚力量,以强有力的“抓手”带动着各行各业的数字化转型以及新技术的应用与普及。近两年,以RPA为代表的数字技术在政务实践中的表现受到了很高的关注,RPA数字员工在各地相关政务部门悄然上岗,有效助力政府信…

mysql5.7安装SSL报错解决(2),总结

Caused by: java.io.EOFException: SSL peer shut down incorrectly 在java里面连接mysql5.7.17数据库,报以上错误, 将数据库升级到mysql5.7.44就可以了。 这两天处理java连接mysql的问题,报了各种错误,总结一下就是openssl和mysq…

前端基础-html-注册界面

&#xff08;200粉啦&#xff0c;感谢大家的关注~ 一起加油吧~&#xff09; 浅浅分享下作业&#xff0c;大佬轻喷~ 网页最终效果&#xff1a; 详细代码&#xff1a; ​ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

论文 | Teaching Algorithmic Reasoning via In-context Learning

这篇论文《通过上下文学习教授算法推理》探讨了如何通过上下文学习&#xff08;In-context Learning, ICL&#xff09;有效训练大型语言模型&#xff08;LLMs&#xff09;以进行算法推理。以下是从多个角度对这项工作的详细解读&#xff1a; 1. 问题陈述与研究动机 算法推理的…

Json 类型与多值索引 — OceanBase 4.3.2 AP 功能体验

本文来自 2024年OceanBase技术征文大赛——“让技术被看见 | OceanBase 布道师计划”的用户征文。也欢迎更多的技术爱好者参与征文&#xff0c;赢取万元大奖。和我们一起&#xff0c;用文字让代码跳动起来&#xff01; 参与2024年OceanBase技术征文大赛>> MySQL在5.7.8…