关于操作系统中对进程管理的认识

news2025/2/28 15:40:41

文章目录

  • 前言
    • 1.计算机组成简单认识
    • 2.操作系统
      • 1). 操作系统的管理
      • 2). 操作系统的目的
    • 3.操作系统中的进程管理
      • 1). 进程是什么?
      • 2).Linux中的进程

前言

在介绍进程之前,我们需要先了解关于进程的一些边缘的操作系统知识
以及硬件知识,因为操作系统不仅对进程有着管理,也同时管理着
各种软硬件,所以我们先从计算机组成来入手

1.计算机组成简单认识

我们都知道当今世界的计算机基本上都采用冯诺依曼结构体系,那么为什么要选择使用冯诺依曼结构体系而不使用其他体系,它的好处是什么呢?
在这里插入图片描述
我们可以看到冯诺依曼结构体系将一个计算机组成分成了大致五个部分

输入设备:诸如键盘、话筒、摄像头、网卡、磁盘等等。
存储器:就是我们所说的内存,他与磁盘不是一个东西
输出设备:显示器、喇叭、网卡、磁盘等等
cpu:cpu中的运算器和控制器两部分。里面有着寄存器以及各种级别的缓存。

在这里插入图片描述

这是一张存储分级的示意图,我们可以凭经验发现,越往金字塔顶端的硬件,他的内容的IO效率肯定是越高,而且也意味着造价很高。这其中的S2、S3可以理解为内存,那么同等大小的内存肯定是要比磁盘昂贵的。
  所以我们就可以知道cpu的运算不会直接与外设直接进行交互,它是通过各个界别的存储介质来一级一级的运到cpu上,这样可以保证cpu的效率,防止在大量的IO读取上浪费时间。在数据层面上,cpu会优先与内存进行交互。
  这时候可定有人会想,那我们何必要磁盘呢?把存储介质全稿成内存,那岂不是计算机的运行效率更高了,这样的现象当然会使计算机的运行效率更加的高,但是这样的计算机普通人是绝对用不起的。所以基于冯诺依曼体系结构的计算机它的本质是用比较少的钱造出一款效率不错的计算机,让普通人也能够使用到计算机。
  我们目前知道程序=代码+数据,且程序在运行之前都要将程序加载到内存里面,但是程序是什么?我们在linux里可以看到可执行程序他就是一个二进制文件,在Windows下他也只是一个后缀为.exe的二进制文件,既然是文件,那他必然是被存储在磁盘(外设)中,所以当运行一个程序时,需要将程序加载到内存中,cpu不会直接与外设交互。这些现象都是由体系结构决定的。

2.操作系统

  现在我们来认识一下操作系统。
首先操作系统他也是一款管理计算机软硬件的软件,他是计算机开机时第一个启动的程序。
操作系统管理软硬件,目的是为了给用户提供良好的使用环境
在这里插入图片描述

1). 操作系统的管理

那么操作系统是如何管理这些软硬件的呢?
在这里插入图片描述

让我们先来举一个例子:
  假如你是一个校长,你的学校里只有几个或者十几个学生,你会很好管理,你们每天抬头不见低头见,你能够明确知道每个学生的状态,你也了解每个学生的信息,有个什么活动很简单就能把学生管理起来。但是如果学生有几百个呢?这时候你就无法清楚每个学生的状态和信息了,并且有活动的时候,你管理学生就会很费劲,那如果学生是几万人呢?所以这时候就有一个身份:辅导员和班长等等。她负责执行校长的决定,来管理学生,或者辅导员再让班长来执行更进一步的决定,来管理班级。并且对于每个学生他们的信息都会有一个专门的excel表格来存储这些学生的信息,诸如:姓名,学号,紧急联系人电话等等。从此以后,校长就不需要见到你这个人从而对你进行进一步的管理,校长只需要对excel上的数据进行了解/修改,从而达到对某一位学生的管理即可。在这里面,校长充当了一个决策者的身份,而学生充当了一个被管理者,辅导员则是一个执行者。校长管理学生不需要见到这个学生,只需要管理这个学生的数据。所以管理学生的本质不是管理人,而是管理学生的数据。
  那我们作为一个程序员,使用面向对象的思想,将学生用一个结构体将他描述起来,随后存到数据库中,使用学生管理系统就可以更管理好学生,不需要直接管理这个学生。
我们可能会在这个结构体里有学生的姓名、年龄、学号等等数据,这是一个对学生进行描述的过程,然后我们再用数据结构诸如链表,将每个学生链接起来,从而达到组织的目的,当有一个学生加入到我们学校,我们只需要把这个学生描述好,再将这个对象加入到我们的链表中。所以,从此往后我们对学生的管理,就转化成了对这个链表的增删查改。
那我们可以得出:对大量对象的管理我们可以像上述那样,先把这个对象描述好,形成一个结构体,再把这些结构体用数据结构组织起来。就可以实现对对象的管理。所以我们得到了一个观点:先描述,再组织。任何的管理工作就可以使用这样的方法进行计算机建模。
  而操作系统的管理主要核心分为四种管理:进程管理、驱动管理、文件IO管理、内存管理。
而计算机中有着大量的软硬件,那么操作系统也是使用上面的先描述(结构体)再组织(数据结构),将进程、驱动等等管理起来。

2). 操作系统的目的

  上述我们把操作系统管理软硬件的方法讲述好,但是操作系统的目的是为了给用户良好的使用环境,那么它又是如何给用户良好的使用环境的呢?这里我们的用户暂且从开发者的角度来看他。
在这里插入图片描述

  我们作为一个开发者,当我们想知道计算机中的内存使用多少了,文件打开了多少个,我们可以直接访问对内存文件管理的结构体中的成员来获取,这种方式在技术层面上是可行的,但是这种方式在安全层面来说是不可行的,因为不乏有些开发人员他是专门窃取/修改操作系统的被管理对象的数据,从而对操作系统产生不好的影响。操作系统又无法分辨用户是哪种人,所以操作系统选择不相信任何用户。那既然操作系统不相信任何用户,但是他还得给用户提供服务,那他又是怎么做到的呢?
这里我们再再举个例子:
  在现实生活中,不相信人们,又要给人们提供服务的地方很多,比如银行。
  在银行中有着各种办公设备,办公场地,休息的地方等等,而这些东西和地方又有专门的人来维护和各自的管理人员。在此基础上又会滋生出很多的服务,比如存取钱,贷款等等,而存取钱,贷款,是有人来存取钱,存取钱也不会直接对钱进行操作(进入金库),而是先在银行的的电脑的对业务系统中进行数据的操作,对数据进行管理,从而达到业务的办理。在这个业务的办理过程中,会让办理业务的人(存钱的人)直接在电脑上进行数据的修改吗?显然不是的,这个过程有工作人员来进行操作,银行不相信你,假如你要存钱,但是你只把存钱的数据修改了,没存进钱怎么办?所以你会发现,银行有着厚厚的一层防护的玻璃防止办理业务的人直接访问到金库,或者是电脑中的业务办理中的数据。但是他们又开着小孔依然给你提供这些服务。那么类比一下,银行中的各种办公设备、场地休息场所就是计算机中的硬件,对这些进行维护管理的人员就是这些硬件的驱动。而由银行业务的出现导致出现需要对各种办公用品、场地、设施以及业务办理时对各种数据的管理就是类似于操作系统的四种核心管理,那么厚厚的墙就是用户和操作系统之间出现的新的东西,叫做系统调用接口,也可以理解为系统调用函数。所以当我们使用操作系统时,是不会直接与操作系统的软硬件管理的结构体直接打交道,而是写操作系统人们会写一批系统调用接口来供人们使用,这样就防止了坏人肆意的修改结构体中的东西。而用户在使用计算机的时候,也不会是直接使用系统调用,因为系统调用的使用还是有些麻烦。所以在系统调用的上层还有着shell外壳(图形化界面),各种库,Linux中的各种指令等等,这些一起实现了用户的良好的使用环境。比如我们使用的printf函数,它会将内容输出到显示器上,那么它使用了硬件,那他也肯定在函数内部封装着系统调用,它属于C语言的标准库。shell外壳、图形化界面,也是对系统调用接口的封装方便普通人使用,指令比如Linux中的ls。所以很多功能,不需要开发者自己再去写了,只需要使用库函数就可以。提高了开发者的开发效率,降低开发成本。

3.操作系统中的进程管理

  在以前我们可能接触过进程这个名词,也大概了解进程好像是什么,有人说进程是运行起来的程序,有人说进程是加载到内存里的程序,也有人说进程是动态的,程序是静态的…所以现在我们来了解什么是进程。

1). 进程是什么?

  当我们启动电脑后,内存中一定会被加载许多程序,而这些程序又会形成进程,那这些进程需不需要管理?答案一定是需要的,那么如何管理?答案就是先描述,再组织怎么描述?操作系统主要是C语言写的,那肯定是用C语言描述啊,所以对于将一个进程描述成一个结构体,这个结构里面包含了对于进程的描述。那么对于这么一个结构体,操作系统中有一个名词叫做PCB(process control block)。进程控制块。那么这个结构体里大概会有些什么呢?他会有:id,状态,优先级,代码地址&&数据地址…。最后将这些进程用数据结构组织起来。

struct PCB{
	//id
	//状态
	//优先级
	//代码地址
	//代码数据地址
	//......
};

  所以进程严格来说进程是:进程 = 代码 + 进程结构体(pcb)

2).Linux中的进程

  而Linux操作系统具体的做法是:如果要运行一个可执行程序,就会先将他加载到内存中,同时操作系统会形成对应程序的pcb,然后将pcb链入到像链表一样的数据结构中,等轮到它运行的时候再将它调度到运行队列中,Linux中的进程结构体叫做task_struct。所以现在对进程的管理,就变成了对进程链表的增删查改。
  而且在Linux系统中的进程他是存储在双链表中,并且他不只存储在一张链表中。对于一张普通链表节点:

struct listnode{
	DateType val;
	//各种属性...
	listnode* prev;
	listnode* next;
};

Linux中进程链表节点:

struct task_struct{
	//进程的各种属性...
	struct dlist list;(有多个)
	//进程的各种属性....
};

//其中:
struct dilst{
	listnode* prev;
	listnode* next;
};

所以它可以同时在多个数据结构中,并且他的位置我们可以发现与普通链表有些不同。
在这里插入图片描述
它指向的是下一个节点的对应的list字段,那么我们就会有一个疑问,他该怎么访问结构体的数据呢?
其实我们这里就用到一个知识点,有一个函数offsetof(),他是一个计算一个结构体成员偏移量的函数。它的原理也很简单,应用到进程这里就大致是:
#define cur(list) (task_struct*)((int)(&list)- (int)(&((task_struct*)0)->list))

使用起来就是cur(list)->pid(成员)。
他就是将0强转成进程节点类型的指针然后访问list,取地址就可以得到相对于0地址的list的偏移量,再用一个进程结构体list的地址减去这个偏移量,那么就会得到指向这个结构体的地址了。
在这里插入图片描述
所以我们现在要有一个观点:我们运行的所有指令,软件,自己写的程序,最终都是进程
今天我们认识了进程是什么,之后我们在谈论,进程中的成员。

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

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

相关文章

leetCode 1143.最长公共子序列 动态规划 + 图解

此题我的往期文章推荐: leetCode 1143.最长公共子序列 动态规划 滚动数组-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/133689692?spm1001.2014.3001.5501leetCode 1143.最长公共子序列 一步步思考动态规划 优化空间复杂度_呵呵哒(&#xf…

Lua 调试库( debug )

一、调试库作用 使用调试库可以获取 Lua 环境运行过程中的变量和跟踪代码执行。 调试库主要分为两类函数:自省函数和钩子函数 自省函数:允许检查一个正在运行中的程序,例如活动函数的栈、当前正在执行的代码行、局部变量的名称和值。钩子函…

Java多线程悲观锁和乐观锁

悲观锁: 一上来就加锁,没有安全感,每次只能一个线程进入访问完毕后,再解锁。 线程安全,性能较差 乐观锁: 一开始不上锁,认为是没有问题的,大家一起跑,等要出现线程安全问…

SpringBoot--手写组件动态更新@Value的值

原文网址:SpringBoot--手写组件动态更新Value的值_IT利刃出鞘的博客-CSDN博客 简介 本文手写组件,动态更新SpringBoot里Value的值(无需重启服务)。 不是可以用RefreshScope吗?为什么要手写组件? 动态更…

docker数据卷+挂载(命令讲解+示例)

在容器中管理数据主要有两种方式: 数据卷(Volumes) 、挂载主机目录 (Bind mounts)。 一、数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,可以在容器之间共享和重用。 特点: 对 数据卷 的修改会立马生效对 …

动态规划简述;斐波那契数列自顶向下和自底向上

概述 动态规划就是把一个问题分解为若干子问题,把子问题的解累加起来,就是当前问题的值。 斐波那契数列(自顶向下) 一个很好的演示demo, 在进行运算时,要用上备忘录(缓存)&#x…

从硬件结构到软件

先说说体系冯诺依曼的体系结构,有利于我们后面理解操作系统,软件再怎么发展,也必须遵守硬件的规则。 一 五大硬件理解 如下图: 1 为什么要有输入输出设备 很久以前,我们都是把指令打成孔,有孔无孔表示0,1&#xff0c…

柯桥日常口语学习|生活英语|实用口语口语天天练

1. How far is it from here? 离这儿有多远? 2. Can you give me a hand? 能帮帮我吗? 3. I cant lift my right arm. 我无法举起我的右手臂。 4. This bridge was built two years ago. 这座桥是在两年前建造的。 5. You should eat more. 你应该…

Go语言入门心法(一): 基础语法

Go语言入门心法(一) Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 一: go语言中变量认知 go语言中变量的定义: (要想飞|先会走)||(翻身仗|抹遗憾 ) |(二八定律)(先量变)|(再质变)||&#xf…

vue3实现刻度尺

期望实现效果如下: 一、基本使用 安装slide-ruler,根据文档实现内容 https://github.com/wusb/slide-ruler/blob/master/README-zh_CN.md 二、进一步处理 1、直接复制slide-ruler核心文件,在此基础上进一步处理 处理1:刻度朝向…

思维模型 秩序

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。秩序是事物正常运行的基石。有序的安排是成功的先决条件。 1 秩序的应用 1.1 秩序在不同科学领域中的应用 物理学和天文学: 物理学家通过研究原子和分子的有序排列来理解物质的…

思维模型 正/反 木桶理论

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。 1 正/反 木桶理论的应用 1.1 木桶理论的应用 1.1.1 正木桶理论在考试中的应用 小明是一名理科高中生,他在学习过程中发现自己在数理化方面表现较好,但在语文和英…

基于Vue+webpack之H5打包资源优化

前言 基于公司的业务以及今年接触到的项目大部分都是APP混合开发,即原生Android/ios H 5页面开发APP。项目从产品需求的评审到方案的评审再到开发提测...这一套流程下来让我收货颇多。总想找个时间好好记录一番,大概还是自己懒惰了,一直拖到…

【Vue面试题二十二】、什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:什么是虚拟DOM&#xff…

vim、gcc/g++、make/Makefile、yum、gdb

vim、gcc/g、make/Makefile、yum、gdb 一、Linux编辑器vim1、简介2、三种模式的概念(1)正常/普通/命令模式(Normal mode)(2)插入模式(Insert mode)(3)末行/底行模式(last line mode) 3、三种模式的切换4、正…

langchain 加载各种格式文件读取方法

参考:https://python.langchain.com/docs/modules/data_connection/document_loaders/ https://github.com/thomas-yanxin/LangChain-ChatGLM-Webui/blob/master/app.py 代码 可以支持pdf、md、doc、txt等格式 from langchain.document_loaders import Unstruct…

数据库管理-第109期 19c OCM考后感(20231015)

数据库管理-第109期 19c OCM考后感(202301015) 距离上一篇又过了两周多,为啥又卡了这么久,主要是后面几个问题:1. 9月1日的19c OCM upgrade考试木有过,因为有一次免费补考机会就又预约了10月8日的考试&…

IoT知识点补充

MySQL vs NoSQL数据库(MongoDB) 这里举的例子使用MySQL存储用户信息和博客文章的关系数据,同时使用MongoDB存储博客文章的评论,因为评论可以是不同结构的半结构化数据。 MySQL部分如下 import java.sql.Connection; import jav…

普冉PY32系列(九) GPIO模拟和硬件SPI方式驱动无线收发芯片XL2400

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志普冉PY32…

初出茅庐的小李博客之SPI工作模式

SPI的工作模式 SPI(Serial Peripheral Interface)是一种同步串行通信协议,常用于连接微控制器和外围设备。SPI有四种模式,分别是0、1、2、3模式。 0模式:时钟空闲时为低电平,数据在时钟的下降沿采样&#…