当前位置: 首页 > news >正文

[Python学习日记-83] 操作系统的介绍

[Python学习日记-83] 操作系统的介绍

简介

操作系统介绍

简介

        本篇开始我们要学习网络编程的进阶知识,即并发编程(多进程编程),从字面意思可以看出,进程就是正在执行的一个过程,也就是说进程是对正在运行程序的一个抽象。在前面学习的计算机基础与网络中我们讲过我们所写的程序并不是直接操作硬件的,而是通过操作系统来帮我们操作的,而进程的概念就起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。所以想要真正了解进程,必须事先了解操作系统。

操作系统介绍

一、为什么要有操作系统

        现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成,所以说现代计算机系统是一个复杂的系统。

        我们之所以要使用操作系统主要考虑两问题,一是效率问题,二是设备管理问题。

        效率问题:要知道操作系统是一个复杂的,它可以把复杂的东西抽象成简单的接口,从而屏蔽掉复杂的物理设备,这样程序员可以不必掌握系统的所有细节,而只需掌握简单的接口调用即可编写代码了;而如果每位应用程序员都必须掌握该系统所有的细节,那就不可能有时间去编写代码了(一个操作系统可能会有十几万行的代码,完全读完都不知道到猴年马月),这会严重影响了程序员的开发效率。

        设备管理问题:计算机系统是由多个硬件设备组成的一个系统,管理这些部件并加以优化使用,是一件极富挑战性的工作,于是就专门为计算机安装了一层软件(系统软件),被称为操作系统,它的任务就是为用户程序提供一个更好、更简单、更清晰的计算机模型,并管理刚才提到的所有设备。

        总的来说,程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的,有了它,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件的编写就可以了,应用软件直接使用操作系统提供的功能来间接使用硬件。

二、什么是操作系统

        简单的来说,操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。操作系统所处的位置如下图所示

计算机系统中不同的态与人的关系

注意:操作系统位于计算机硬件与应用软件之间,本质也是一个软件。操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,所以单纯的说操作系统是运行于内核态的,是不准确的。

        展开来说,操作系统分成两部分功能 :

1、隐藏了丑陋的硬件调用接口,为应用程序员提供更好,更简单,更清晰的调用硬件资源模型(系统调用接口)。应用程序员有了这些接口后,就不用再考虑操作硬件的细节,专心开发自己的应用程序即可。

例如,操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件我们无需再去考虑关于磁盘的读写控制(比如控制磁盘转动、移动磁头读写数据等细节)。

2、将应用程序对硬件资源的竞态请求变得有序化。

例如,很多应用软件其实是共享一套计算机硬件,比方说有可能有三个应用程序同时需要申请打印机来输出内容,那么可能 A 程序竞争到了打印机资源配打印,也可能是 B 竞争到打印机资源,也可能是 C,这就导致了无序的资源竞争,打印机可能打印一段 A 的内容然后又去打印 C 的了,操作系统的一个功能就是将这种无序变得有序。

操作系统对计算机硬件的接口抽象封装

三、操作系统与普通软件的区别

1、主要的区别是,操作系统由硬件保护,不能被用户修改。如果你不想用现在的 QQ 了,你可以选择用微信或者干脆自己写一个,但是你无法写一个属于操作系统一部分的程序(例如,时钟中断处理程序)。

2、操作系统与用户程序的差异并不在于二者所处的地位。与其他用户程序相比,操作系统是一个大型、复杂、长寿的软件,即使是与大型的用户程序相比都是如此。

大型:Linux 或 Windows 的源代码都是五百万行数量级。按照每页50行共1000行的书来算,五百万行要有100卷,要用一整个书架子来摆置,这还仅仅是内核部分。再加上其他用户程序,例如,GUI、库以及基本应用软件(如 Windows 的 Explorer 之类的系统服务),很容易就能达到这个数量的10倍或者20倍之多。

长寿:操作系统的代码量如此之大是非常难编写的,一旦完成操作系统的所有者便不会轻易放弃,然后再写一个。而是在原有的基础上进行改进。(基本上可以把 Windows95/98/ME 看出一个操作系统,而 Windows NT/2000/XP/Vista 则是两位一个操作系统,对于用户来说它们十分相似。还有 UNIX 以及它的变体和克隆版本也演化了多年,例如,System V 版、Solaris 以及 FreeBSD 等都是 Unix 的原始版,不过尽管 Linux 非常依照 Unix 模式而仿制,并且与 Unix 高度兼容,但是 Linux 具有全新的代码基础)

四、操作系统发展史

操作系统发展历程

1、第一代计算机(1940~1955):真空管和穿孔卡片

第一代计算机的产生背景

        第一代之前人类是想用机械取代人力,第一代计算机的产生是计算机由机械时代进入电子时代的标志,从 Babbage 失败之后一直到第二次世界大战,数字计算机的建造几乎没有什么进展,第二次世界大战的爆发刺激了有关计算机研究的爆炸性进展。

        美国爱荷华州立大学的 John Atanasoff 教授和他的学生 Cliford Bery 建造了据认为是第一台可工作的数字计算机。该机器使用300个真空管,几乎是同一时间 Konrad Zuse 在柏林用继电器构建了 Z3 计算机,英格兰布莱切利园的一个小组在1944年构建了 Colossus,Howard Aiken 在哈佛大学建造了 Mark 1,宾夕法尼亚大学的 William Mauchley 和他的学生 J.Presper Eckert 建造了 ENIAC。这些机,器有的是二进制的,有的使用真空管,有的是可编程的,但都非常原始,需要花费数秒钟时间才能完成最简单的运算。

第一代计算机(1940~1955)

        在这个时期,同一个小组里的工程师们,设计、建造、编程、操作及维护同一台机器,所有的程序设计都是用纯粹的机器语言编写的,甚至更糟糕的有需要通过成千上万根电缆接到插件板上连成电路来控制机器的基本功能。那时候没有程序设计语言(连汇编也没有),操作系统更是从来都没听说过。使用机器的过程更加原始,具体过程见下方的“工作过程”。

特点

  • 没有操作系统的概念
  • 所有的程序设计都是直接操控硬件

工作过程

        当时还没有预约程序之类的东西,会直接在墙上贴一张机时表来进行预约,程序员在墙上的机时表预约一段时间,然后程序员拿着他的插件版到机房里,将自己的插件板接到计算机里,在他预约的这几个小时内他独享整个计算机资源,后面的一批人都得等着(两万多个真空管经常会有被烧坏的情况出现)。

        到后来出现了穿孔卡片,可以将程序写在卡片上,然后读入机而不用插件板。程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕后,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。

老式电脑的穿孔卡片

优点

        程序员在申请的时间段内独享整个资源,可以即时地调试自己的程序(即运行时出现 bug 可以立刻处理)

缺点

        会造成计算机资源的浪费,一台机器同一时间段内只有一个人使用。

注意:同一时刻只有一个程序在内存中,被 CPU 调用执行,例如有10个程序需要执行,而执行它们的方式是串行执行的。

2、第二代计算机(1955~1965):晶体管和批处理系统

第二代计算机的产生背景

        由于当时的计算机非常昂贵,很自然的会想办法减少机时的浪费,来提高使用率。通常采用的方法就是批处理系统。

特点

        设计人员、生产人员、操作人员、程序人员和维护人员直接有了明确的分工,计算机被锁在专用空调房间中,由专业操作人员运行,这便是“大型机”。

        这时便有了操作系统的概念了,也有了程序设计语言:FORTRAN 语言或汇编语言;程序员会先写到纸上,然后穿孔打成卡片,再讲卡片盒带到输入室,交给操作员,然后悠闲地等待输出接口。

工作过程

单道批处理示意图

        在收集了大约一个小时的批量作业之后,这些卡片被读进磁带,然后磁带被送到机房里并装到磁带机上。随后,操作员装入一个特殊的程序(现代操作系统的前身),它从磁带上读入第一个作业并运行,其输出写到第二盘磁带上,而不打印。每个作业结束后,操作系统自动地从磁带上读入下一个作业并运行。当一批作业完全结束后,操作员取下输入和输出磁带,将输入磁带换成下一批作业,并把输出磁带拿到一台1401机器上进行脱机(不与主计算机联机)打印。

第二代计算机如何解决第一代计算机的缺点

  1. 把一堆人的输入攒成一大波输入
  2. 然后顺序计算(即串行执行,这是有问题的,但是第二代计算也没有解决)
  3. 把一堆人的输出攒成一大波输出

优点

        第二代计算机使用了批处理,让 CPU 时刻处在运行计算的状况下,大大提高了机时利用率,从而节省了机时。

缺点

  1. 整个流程需要人参与控制,将磁带搬来搬去(单道批处理示意图中的 c 和 e 两个小人)
  2. 计算的过程仍然是顺序计算(串行)
  3. 程序员原来独享一段时间的计算机,现在必须被统一规划到一批作业中,等待结果和重新调试的过程都需要等同批次的其他程序都运作完才可以(这极大的影响了程序的开发效率,无法及时调试程序)

3、第三代计算机(1965~1980):集成电路芯片和多道程序设计

第三代计算机的产生背景

        第二代计算机相比起第一代有了一定的进步,但是一个计算机系统内有多台不同的机器,这导致在20世纪60年代初期,大多数计算机厂商都有两条完全不兼容的生产线。一条是面向字的:大型的科学计算机,例如 IBM 7094,见上图,主要用于科学计算和工程计算;另外一条是面向字符的:商用计算机,例如 IBM 1401,见上图,主要用于银行和保险公司从事磁带归档和打印服务开发和维护完全不同的产品是十分昂贵的,同时不同的用户对计算机的用途也不同。

        IBM 公司试图通过引入 system/360 系列来同时满足科学计算和商业计算,360系列低档机与1401相当,高档机比7094功能强很多,不同的性能卖不同的价格。

        360是第一个采用了(小规模)芯片(集成电路)的主流机型,与采用晶体管的第二代计算机相比,性价比有了很大的提高。这些计算机的后代仍在大型的计算机中心里使用,此乃现在服务器的前身,这些服务器每秒处理不小于千次的请求。

第三代计算机如何解决第二代计算机的缺点1

        卡片被拿到机房后能够很快的将作业从卡片读入磁盘,于是任何时刻当一个作业结束时,操作系统就能将一个作业从磁带读出,装进空出来的内存区域运行,这种技术叫做同时的外部设备联机操作(SPOOLING),该技术同时用于输出。当采用了这种技术后,就不再需要 IBM 1401 机了,也不必用人将磁带搬来搬去了。

第三代计算机如何解决第二代计算机的缺点2

        第三代计算机的操作系统广泛应用了第二代计算机的操作系统没有的关键技术:多道技术。

        CPU 在执行一个任务的过程中,若需要操作硬盘,则发送操作硬盘的指令,指令一旦发出,硬盘上的机械手臂滑动读取数据到内存中,这一段时间,CPU 需要等待很短的时间(大概几毫秒),但对于 CPU 来说已经很长很长了,长到可以让 CPU 做很多其他的任务,如果我们让 CPU 在这段时间内切换到去做其他的任务,这样 CPU 不就充分利用了吗。这正是多道技术产生的技术背景。

多道技术:多道技术中的多道指的是多个程序,多道技术的实现是为了解决多个程序竞争或者说共享同一个资源(例如 CPU 资源)的有序调度问题,解决方式即多路复用,多路复用分为时间上的复用和空间上的复用。

时间上的复用:当一个程序在等待 I/O 时,另一个程序可以使用 CPU,如果内存中可以同时存放足够多的作业,则 CPU 的利用率可以接近100%,类似于我们小学数学所学的统筹方法。(操作系统采用了多道技术后,可以控制进程的切换,或者说进程之间去争抢 CPU 的执行权限。这种切换不仅会在一个进程遇到 I/O 时进行,一个进程占用 CPU 时间过长也会切换,或者说被操作系统夺走 CPU 的执行权限)

空间上的复用:将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序,但在第三代计算机的阶段空间上的复用是存在问题的。

空间上的复用最大的问题是:要做到空间上的复用,程序之间的内存必须分割,这种分割需要在硬件层面实现,由操作系统控制。如果内存彼此不分割,则一个程序可以访问另外一个程序的内存,这样首先丧失的是安全性,例如你的 QQ 程序可以访问操作系统的内存,这意味着你的 QQ 可以拿到操作系统的所有权限;其次丧失的是稳定性,某个程序崩溃时有可能把别的程序的内存也给回收了,例如把操作系统的内存给回收了,则导致操作系统崩溃。

        总体来说,第三代计算机的操作系统仍然是批处理,许多程序员怀念第一代独享的计算机,可以即时调试自己的程序。

第三代计算机如何解决第二代计算机的缺点3

        为了满足程序员们很快可以得到响应,出现了分时操作系统。

分时操作系统:多个联机终端 + 多道技术。例如20个客户端同时加载到内存,有17在思考,3个在运行,CPU 就采用多道的方式处理内存中的这3个程序,由于客户提交的一般都是简短的指令而且很少有耗时长的,索引计算机能够为许多用户提供快速的交互式服务,所有的用户都以为自己独享了计算机资源。

        但是分时操作系统并没有第一时间推广开来,主要的限制是因为物理原因导致内存无法彼此隔离开来,后来麻省理工(MIT)在一台改装过的7094机上开发成功的 CTSS,其兼容分时系统,这时第三代计算机才彻底成型,第三代计算机广泛采用了必须的保护硬件(程序之间的内存彼此隔离)之后,分时系统才开始流行。

        后来 麻省理工(MIT)的贝尔实验室和通用电气在 CTTS 成功研制后决定开发能够同时支持上百终端的 MULTICS(其设计者着眼于建造满足波士顿地区所有用户计算需求的一台机器),从后来者的视角来看,这个想法太激进了,最后项目流产了。

        后来一位参加过 MULTICS 研制的贝尔实验室计算机科学家 Ken Thompson 开发了一个简易的,单用户版本的 MULTICS,这就是后来的 UNIX 系统。基于它衍生了很多其他的 Unix 版本,为了使程序能在任何版本的 Unix 上运行,IEEE 提出了一个 Unix 标准,即 posix(可移植的操作系统接口,Portable Operating System Interface)

        在1987年,出现了一个 Unix 的小型克隆,即 minix,用于教学使用。是由芬兰学生 Linus Torvalds 基于它编写了 Linux。

4、第四代计算机(1980~至今):大规模集成电路芯片和现代操作系统

        进入20世纪80年代,大规模集成电路工艺技术的飞跃发展,微处理机的出现和发展,掀起了计算机大发展大普及的浪潮。一方面迎来了个人计算机的时代,同时又向计算机网络、分布式处理、巨型计算机和智能化方向发展。于是,现代操作系统如 Windows、Mac OS 和 Linux 等也在这一时期逐渐成为主流,为计算机用户提供了更加友好、稳定和高效的操作环境。现代操作系统也出现了更多的类别,例如,个人计算机操作系统、网络操作系统、分布式操作系统等

个人计算机操作系统:常见的个人计算机操作系统包括 Windows、macOS、Linux 和 Chrome OS 等,每种操作系统都有其特点和适用场景,用户可以根据需求选择合适的操作系统来满足个人计算机使用的需求。

网络操作系统:网络操作系统是一种针对网络设备和网络管理的操作系统,其主要功能是管理和控制网络设备,提供网络服务和安全保护。网络操作系统通常用于路由器、交换机、防火墙等网络设备上,可以实现网络配置、路由、数据包转发、访问控制、故障排除等功能。网络操作系统还可以支持远程管理和监控,帮助网络管理员更好地管理网络设备和保障网络安全。

分布式操作系统:分布式操作系统是一种设计用于多个计算机节点之间协同工作的操作系统。它通过将计算和存储资源分布在多台计算机上,实现了更高的性能、可靠性和灵活性。分布式操作系统可以管理多台计算机上的任务调度、资源管理、通信协议等,使得不同计算机节点能够协同工作,完成复杂的任务和应用程序。常见的分布式操作系统包括 Google 的 GFS、HDFS 和 MapReduce,以及 Apache 的 Hadoop 等。

相关文章:

[Python学习日记-83] 操作系统的介绍

[Python学习日记-83] 操作系统的介绍 简介 操作系统介绍 简介 本篇开始我们要学习网络编程的进阶知识,即并发编程(多进程编程),从字面意思可以看出,进程就是正在执行的一个过程,也就是说进程是对正在运行…...

软考——WWW与HTTP

1.万维网(world wide web) 是一个规模巨大的、可以资源互联的资料空间。由URL进行定位,通过HTTP协议传送给使用者,又由HTML来进行文件的展现。 它的主要组成部分是:URL、HTTP、HTML。 (1)URL…...

算法-数据结构-图-邻接表构建

邻接表的基本概念 顶点(Vertex): 图中的每个顶点用一个节点表示。 每个顶点存储一个链表或数组,用于记录与该顶点直接相连的其他顶点。 边(Edge): 如果顶点 A 和顶点 B 之间有一条边&#xf…...

Docker(Nginx)部署Vue

简介:目标使用docker将vue生成的dist文件,结合nginx生成镜像,然后运行; 1、首选确保vue项目正确运行,并能正确打包dist文件; 2、查看已经生成的dist文件 3、将dist文件打包为rar文件或者zip文件&#xf…...

ubuntu22.04的docker容器中安装ssh服务

ubuntu22.04的docker容器中安装ssh服务,以便外部可以连接到容器中操作。 rootnode15:~# cat /etc/issue Ubuntu 22.04.5 LTS \n \l rootnode15:~# docker ps|grep qwen 7d3c36c37d36 vllm/vllm-openai:v0.7.3 "python3 -m …...

卷积这个词在卷积神经网络中应该怎么理解

卷积的定义 数学概念: 在数学上,卷积是一种操作,通常用于两个函数之间的运算。对于图像处理而言,这些函数通常是输入图像和一个称为“卷积核”或“滤波器”的小矩阵。 在CNN中的应用: 卷积操作是通过滑动窗口&#xf…...

设计模式教程:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是设计模式中的一种行为型模式,它允许顺序访问一个集合对象中的元素,而无需暴露集合对象的内部结构。换句话说,迭代器模式提供了一个方法,能让你遍历集合中的元素,…...

C语言学习【1】C语言关于寄存器的封装

目录 1.封装寄存的C语言的语法volatile:unsigned int:*pGpiobOdrvolatile unsigned int * 2.进一步C语言的封装 在嵌入式中,底层一定是操作寄存器,我有一个理念,凡事一定要想清楚,把任何知识点融入自己的理解之中&…...

鸿蒙app 开发中的 == 和 === 的区别

在鸿蒙 App 开发中,如果你使用 JavaScript 或 TypeScript 进行编码, 和 是用于比较值的运算符,它们的主要区别在于比较的严格程度,下面为你详细介绍: 1. (宽松相等运算符) 比较规则&#xff1…...

【算法】冒泡排序

目录 一、算法概述 二、算法原理 1. 核心思想 2. 排序过程演示 三、标准实现代码 四、时间复杂度分析 五、优化策略 1. 提前终止优化 2. 记录最后交换位置 六、算法特性 七、实际应用 八、扩展思考 九、总结 一、算法概述 冒泡排序(Bubble Sort&#xff0…...

R Excel 文件:高效数据处理的利器

R Excel 文件:高效数据处理的利器 在数据分析领域,R语言因其强大的统计分析和可视化功能而备受推崇。而R Excel文件,作为R语言与Excel的桥梁,使得数据在R和Excel之间的高效转换成为可能。本文将详细介绍R Excel文件的概念、应用场景以及操作方法。 一、R Excel文件的概念…...

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 :“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令 命令解释 SHOW DATABASES; 展示所有的数据库 CREATE DATABASE 数据…...

电力通信物联网应用,国密网关守护电力数据安全

电力国密网关是用于保护电力调度数据网路由器和电力系统的局域网之间通信安全的电力专用网关机,主要为上下级控制系统之间的广域网通信提供认证与加密服务,实现数据传输的机密性、完整性。 国密算法网关功能特点 身份认证:对接入的设备和用户…...

vue:vite 代理服务器 proxy 配置

Vite 代理服务器(Proxy)的配置通常用于开发环境,以解决跨域请求等问题。以下是一个详细的配置步骤: 通过以上步骤,你就可以在 Vite 项目中配置代理服务器,以便在开发过程中方便地访问后端服务。 ‌找到 Vi…...

Java【网络原理】(2)初识网络续与网络编程

目录 1.前言 2.正文 2.1TCP协议与UDP协议 2.2socket API进行网络编程 2.2.1DatagramPacket类 2.2.1.1发送数据报 2.2.1.2接收数据报 2.2.1.3获取数据报内容 2.2.1.4设置数据报内容 2.2.2DatagramSocket类 2.2.2.1构造方法 2.2.2.2常用方法 2.2.3具体代码与解释 3…...

AI+集装箱号码识别技术,主要发展方向和应用潜力

集装箱号码识别技术作为物流数字化的重要工具,其应用前景随着全球供应链的智能化升级和绿色转型需求不断扩大。结合当前技术发展和行业实践,以下是其未来的主要发展方向和应用潜力: 1.物流与港口智能化管理 自动化识别与效率提升&#xff1…...

安装可视化jar包部署平台JarManage

一、下载 下载地址:JarManage 发行版 - Gitee.com 🚒 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器,解压进入目录 🚚 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...

后端之JPA(EntityGraph+JsonView)

不同表之间的级联操作或者说关联查询是很多业务场景都会用到的。 对于这种需求最朴素的方法自然是手动写关联表,然后对被关联的表也是手动插入数据。但是手写容易最后写成一堆shit代码,而且修改起来也是非常麻烦的。 学会使用现成的工具还是非常有利的…...

Java数据结构第十三期:走进二叉树的奇妙世界(二)

专栏:数据结构(Java版) 个人主页:手握风云 目录 一、二叉树的遍历 1.1. 前序遍历 1.2. 中序遍历 1.3. 后序遍历 1.4. 完整代码 二、二叉树的基本操作 2.1. 获取树中结点个数 2.1. 获取叶子结点个数 2.3. 获取第k层结点的个数 2.4. 获取二叉树的…...

JavaScript系列(86)--现代构建工具详解

JavaScript 现代构建工具详解 🔨 现代前端开发离不开构建工具,它们帮助我们处理模块打包、代码转换、资源优化等任务。让我们深入了解主流的构建工具及其应用。 构建工具概述 🌟 💡 小知识:构建工具主要解决代码转换…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

codeforces C. Cool Partition

目录 题目简述&#xff1a; 思路&#xff1a; 总代码&#xff1a; https://codeforces.com/contest/2117/problem/C 题目简述&#xff1a; 给定一个整数数组&#xff0c;现要求你对数组进行分割&#xff0c;但需满足条件&#xff1a;前一个子数组中的值必须在后一个子数组中…...

【Linux应用】Linux系统日志上报服务,以及thttpd的配置、发送函数

【Linux应用】Linux系统日志上报服务&#xff0c;以及thttpd的配置、发送函数 文章目录 thttpd服务安装thttpd配置thttpd服务thttpd函数日志效果和文件附录&#xff1a;开发板快速上手&#xff1a;镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互&#xff08;RADX…...