计算机是如何工作的(2)

news2024/11/15 15:30:14

文章目录

  • 一. 寄存器和存储器
  • 二. 操作系统
  • 二. 进程
    • PCB
      • 1. pid
      • 2. 内存指针
      • 3. 文件描述符表
      • 4. 属性
        • 1) 状态
        • 2) 优先级
        • 3) 上下文
        • 4) 记账信息

一. 寄存器和存储器

  1. 存储器是内存和硬盘的通称
    内存, 存储空间比硬盘小, 速度比硬盘快, 价格比硬盘高, 掉电后数据流失
  2. 寄存器是CPU上的一个模块
    寄存器, 存储空间比内存还小, 速度比内存快, 价格比内存更贵, 掉电后数据也流失

内存和硬盘之间的速度, 差3-4个数量级
寄存器和内存的速度, 也查了3-4个数量级

由于寄存器和内存的速度差异很大, 现代的CPU往往还提供了缓存

在这里插入图片描述
在我的CPU上, 有三个缓存, 数字越小, 存储空间也越小, 速度就越快

有些数据, 可能CPU要频繁使用, 每次使用的时候从内存读取, 速度就比较慢, 就可以把这样高频使用的数据放在缓存里(数据使用频率特别高, 放在L1缓存; 数据使用频率没那么高, 考虑放在L2L3里)

当读取指令的时候, 先看看缓存中有没有, 没有就读取内存, 有的话就直接读缓存

二. 操作系统

软件, 是一组指令的集合, 操作系统, 就是软件
操作系统, 要能够管理好各种硬件资源, 让他们很好的相互配合; 也需要管理好各种软件资源, 给每个软件都提供稳定的运行环境

操作系统 = 内核 + 配套的应用程序
内核是操作系统最核心的部分, “管理” 都是在内核里完成的
配套的应用程序例如画图板, 记事本, qq音乐等, 这些应用程序往往要靠内核提供一些功能作为支撑

我们所写的代码, 就是一个"应用程序"
操作系统内核, 给应用程序提供一系列api, 例如有的api是操作显示器, 有的api是用来想用鼠标键盘的
操作系统内核通过驱动程序, 来操作硬件

例如:

System.out,println(“hello world”);

  • 上述代码, 是要操作显示器, 显示器是一个硬件设备, 不是程序直接操作的, 而是你的程序告诉操作系统"我要操作显示器", 操作系统给你完成这个任务
  • 这里是调用java内置的标准库函数, 这个函数的内部本质上, 就是调用操作系统内核提供的api, 告诉操作系统我要控制显示器
    这一过程叫做系统调用(system call)
  • 此时就进入操作系统内核了, 内核通过显示器的驱动程序(显卡驱动), 在显示器上绘制出对应的内容(字符串)

应用程序运行的地方----用户态
操作系统内核运行的地方----内核态

二. 进程

一个程序, 运行起来/跑起来, 在操作系统中, 就会出现对应的进程
进程(process), 就是一个跑起来的应用程序
在这里插入图片描述
这里就把当前运行的所有进程都列了出来, 除了自己运行的程序是进程, 还有一些系统自带的/安装的某些程序, 也是进程, 这些程序对你的系统能够稳定的运行有很重要的意义
在这里插入图片描述
还可以查看当前进程都占用了哪些系统资源
要想让一个程序运行, 就必须得给这个进程分配系统资源, 包括不限于: cpu, 内存, 硬盘, 网络带宽, 显卡…
所以, 进程可以视为是操作系统进行资源分配的基本单位

那么操作系统上包含了很多进程, 此时就需要考虑"管理"了
对于管理, 操作系统采用: 先描述, 再组织

先描述: 通过一些结构体/类, 把一个进程的核心信息抽象提取出来吗并进行表示(主流的操作系统都是C语言实现的, 所以用结构体, Windows也包含了一部分C++, C为主)
在操作系统中, 通常使用**PCB(进程控制块)**这样的结构体来描述进程

再组织: 通过一定的数据结构, 把多个这样的结构体/类的对象串起来, 方便进一步进行各种增删改查
操作系统通常会使用链表(其实是多个链表综合在一起构成的)这样的结构, 来把多个PCB串起来

例如:

  1. 任务管理器中查看进程列表
    就是在遍历链表中的每个节点, 并且获取出对应的信息
  2. 创建新的进程(双击某个程序运行)
    就是应用程序感知鼠标双击操作, 调用操作系统提供的api, 在内核里创建进程, 新的进程会创建出一个新的PCB, 并且添加到上述链表中
  3. 销毁某个进程(某个程序退出)
    就是要把链表对应的PCB结点删除

PCB

PCB这个结构体中包含了很多信息, 此处我们只讨论几个重要的

1. pid

pid, 进程的id / 标识符
在这里插入图片描述

2. 内存指针

进程运行时, 需要消耗一定的硬件资源, 内存就是一个关键的资源
一个程序, 在运行的时候, 就会被从硬盘(xxx.exe)加载到内存中, 同时也加载了这个程序的 指令 / 依赖的数据
PCB中的内存指针, 就存放着该进程要运行的指令和依赖的数据的地址
这一组指针就告诉操作系统, 该进程要运行的指针在内存的哪个房间, 也告诉系统, 该进程依赖的数据, 又在哪个房间里

3. 文件描述符表

一个进程运行时, 会操作一些文件
文件描述符表就通过一个顺序表这样的顺序结构, 记录下当前的进程, 都打开了哪些文件

4. 属性

我们知道, 进程的数量是远远多于CPU的数量的, 假设逻辑内核有16个

并行执行:
一个核心, 同一时刻, 只能运行一个进程
那么有16个核心, 同一个时刻, 能运行16个进程
并发执行:
但是, 一个核心, 不同时刻, 可以运行多个进程
这一刻执行进程1, 下一刻, 执行进程2, 再下一刻, 执行进程3
CPU将总的执行时间, 切分成若干个小片段, 每个片段执行一个进程, 每个片段称为"时间片"
由于时间片比较短, CPU切换进程的速度极快, 人类感知不到, 那么站在人的角度, 就是这若干个进程在"同时执行", 这种执行方式叫分时复用
并行执行, 微观上, 是同时执行
并发执行, 微观上, 是串行执行, 宏观上是同时执行
往往, 我们把并行执行和并发执行统称为并发执行
把编写解决并发问题的程序, 称为"并发编程"

1) 状态

(简单介绍, 线程篇细讲)
如果一个进程随时都可以执行, 则处于**“就绪状态”**
如果一个进程由于某种原因不能执行, 则处于**“阻塞状态”**
(往往进程在等待IO时会处于阻塞状态, 如scanner.next())

2) 优先级

每个进程都有优先级, 优先级高的先上cpu运行

3) 上下文

进程在CPU执行过程中, 会产生很多的"中间结果", 在进程进程切换出CPU之前, 就需要把这些中间结果(CPU各种寄存器中的值)保存到PCB的上下文里(寄存器->内存, 这个过程称为存档)
下次进程回到CPU上执行的时候, 就需要先把之前的存档恢复回来(内存->寄存器, 这个过程叫读档)

4) 记账信息

延续刚才的优先级, 哪个进程分配的资源多和少, 需要通过表格来统计, 毕淼有哪些进程一直没有吃到CPU的资源

上述的属性, 支持着进程调度

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

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

相关文章

ORACLE EBS R12系统的安装及维护案例

引言: Oracle E-Business Suite (EBS) R12 是企业中广泛应用的一体化管理解决方案,涵盖了财务、人力资源、供应链等多个业务领域。以下将详细介绍如何在 Windows 系统上安装 Oracle EBS R12,并分享一些日常维护的技巧和最佳实践。 点击下载…

基于imx6ull平台opencv的图像采集、ffmpeg推流和Windows端拉流(多线程)

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 验证功能一、概述 本文档是针对imx6ull平台opencv的图像采集、ffmpeg推流和Windows端拉流。首先创建一个线程opencv通过摄像头采集视频图像,接着再创建两个线程,其中一个线程获取采集的视频图…

Python编码系列—Python中的HTTPS与加密技术:构建安全的网络通信

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

驾驭高效编程:一探C++ STL的奥秘

1.什么是STL 2.:STL的版本 2.1:原始版本 2.2:P.J版本 2.3:RW版本 2.4:SGI版本 3:STL的六大组件 4:如何学习STL 5:STL的缺陷 1.什么是STL STL(standdard template library-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包含数据结构与算法软…

MJJ 必备自建 IDC 系统 WHMCS 开心版 圆你一个老板梦

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 WHMCS 是我们买 VPS 的最常见到的 IDC 系统,最近为了写 VPS 库存监控脚本,自己搭了一个 WHMCS 用来测试,顺便分享一下如何搭建属于自己的 WHMCS,圆你一个老板梦。WHMCS 开心版仅限学习、开发使用,商业用途请前往…

Linux内核学习之中断处理

Linux内核学习之中断处理 0 前言1 中断处理程序的嵌套执行1 Linux对x86异常的处理Linux中向量用途1 Linux中的中断门描述符Linux中的中断描述符硬中断软中断和tasklet软中断tasklet[^2]ksoftirqd内核线程kworker内核线程 0 前言 文本基于x86架构讲解Linux中对中断的处理&#…

Telink泰凌微如何添加Lib库

基于TLSR8258 SDK:b85m_ble_single_connection_sdk 1.首先把lib文件放在sdk的proj_lib文件夹中 2. properties - c/c build - Settings - TC32 C Linker - Libraries,把文件添加到编译设置中。注意添加的库文件名需要删除“lib前缀”。例如&#xff1…

外贸管理软件一般都有哪些功能

外贸管理软件通常被设计来帮助国际贸易企业高效管理其业务流程。这类软件的功能多样,这里以神卓外贸管理软件为例, 以下是一些常见的核心功能模块: 客户关系管理 (CRM) 客户信息管理询盘与报价管理销售机会跟踪 订单管理 订单生成与处理发货…

Codeforces Round 916 (Div. 3) E1. Game with Marbles(博弈论*1400)

感觉很难想。 如果你直接想的话,你就会发现有很多做法可以选择,而你根本不知道应该选哪个。 这时候可以先假设鲍勃已经取走了爱丽丝的所有的颜色的弹珠,(并且以每个颜色一个弹珠的代价)。 这时候每一项得分就是 S i …

Linux简单介绍(2)

四、软件管理机制 4.1 Linux软件管理介绍 有一个很好的软件生态圈支持,才是一个优秀、值得广泛使用的操作系统平台。比如PC端的window操作系统、mac操作系统,手机端的IOS系统,Android系统等。在这些操作系统上安装软件,方便的不能…

思特威-秋招正式批-笔试

1.在全局数据区中分配空间的变量类型有哪些 2.new和malloc的区别 3. class CData{unsigned short m_uilndex, m_uilndexFlag 9; int m_iData[10]; int m_iType;int iGetDataType() {return m_iType;} public: CData(); }CData::CData(), m_iType(5) {string strTxt "…

自修C++Primer----3.4迭代器(iterator)的介绍

目录 1.迭代器的使用 1.1迭代器运算符 1.2从一个元素指向下一个元素 1.3迭代器的类型 1.4begin和end操作符 1.5解引用操作符和成员访问 1.6引入迭代器失效 1.7全部改成大写的一个练习 2.使用迭代器运算 我们可以使用下标运算符访问string里面的字符或者是这个vector里面…

浅谈二分算法

浅谈二分算法 二分 首先知道一下二分是什么。 二分,是一种快速处理大型数据的方法。基本逻辑是折半查找。 设有一个共有 n n n 个数字的数组,要从中查询某个元素,就可以用二分查找。 注:这里的数组默认其成员数值具有单调性…

C++类和对象(总篇)

文章目录 C类和对象1、类的定义1.1类定义格式1.2访问限定符1.3类域 2、实例化2.1实例化概念 3、this指针4、类的默认成员函数5、构造函数5.1构造函数的特点5.2实例分析 6、析构函数6.1析构函数的特点6.2实例分析 7、拷贝构造函数7.1 拷贝构造函数的特点7.2实例分析7.3浅拷贝和深…

Linux中断管理

Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。 1.Linux中断简介 中断号 每个中断都有一个中断号,通过中断号即可区分不同的中断,有的资料也把中断号叫做中断线。在 Linux 内核中使用一个 int 变…

神经网络—卷积层

1.讲解 Conv2d out_channels 参数为2时,会生成两个卷积核,分别与输入进行卷积。得到的两个输出为输出 新生成的卷积核和原来的卷积核不一定相同 in_channels (int) – Number of channels in the input image out_channels (int) – Number of channels…

Marching Cubes 算法再探

Marching Cubes 算法再探 基础过程代码mian.cppMarchingCubes.hMarchingCubes.cpp 之前做NeRF相关工作时简单看过,但没有深究其实现,知其然不知其所以然的程度,算是初探。 基础 为了对MC有大致了解,可以先根据Marching Cubes 算法…

两个实用的Python编程技巧

一、变量类型声明技巧 虽然在Python中可以不用声明变量的类型,但是为了加快程序的运算速度,减少不必要的bug,我们可以在定义变量之初就把它的类型确定,这样可以更好地传输变量值。如下面的例子。 我们定义了两个变量&#xff0c…

IO进程线程 240826作业

作业 创建3个进程,子进程1拷贝文件的前一半,子进程2拷贝后一半文件,父进程回收两个子进程资源。 将1.txt内容拷贝到2.txt中 #include <myhead.h> int main(int argc, const char *argv[]) {pid_t pid1;pid1 fork();int fd1 open("./1.txt",O_RDWR);if(fd1…

JavaWeb JavaScript ④ JS的对象和JSON

只要你的风格是适应客观规律的&#xff0c;那你以后会越来越好&#xff0c;做事情会越来越顺利 —— 24.8.26 一、JS创建对象 语法 方式1 new Object() 方式2 {属性名&#xff1a;属性值&#xff0c;… …&#xff0c;函数名&#xff1a;function(){}} 方式…