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

【Linux】Linux2.6内核进程调度队列与调度原理

在这里插入图片描述

目录

  • 一、进程管理中的部分概念
  • 二、寄存器
  • 三、进程切换
  • 四、Linux2.6内核进程调度队列与调度原理
  • 结尾

一、进程管理中的部分概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

上面四个概念中竞争性、独立性和并行都非常好理解,下面对并发进行着重讲解。

在操作系统中,所有的进程都不是占有了CPU就一直运行,而是每隔一段时间,自动就会被CPU剥离下来,这里的一段时间指的是时间片,在后面的文章中会着重讲解,一个时间片通常为几毫秒,假设为1毫秒,如果操作系统中有10个进程要运行,那么在一秒这个期间中,每个进程都能被运行100次,例如这种在一段时间内,让多个进程同时得以推进的情况,我们称之为并发。

Linux内核是基于时间片轮转式抢占式内核,所以Linux内核支持进程之间进行CPU资源的抢占,例如一个优先级为80的进程正在运行,而此时有一个优先级为60的进程要运行,那么CPU会将优先级为80的进程剥离下来,运行优先级为60的进程。


二、寄存器

在CPU中有很多寄存器,例如大家熟知的eax、ebx、ecx、edx、ss、ds、cs、gs、fs、ebp、esp、eip、status_reg、cr0~cr4等寄存器。

我们在学习C语言后知道,临时变量具有临时性,那么在函数内定义的临时变量,函数结束后,临时变量就会被销毁,是如何返回给外部的呢?以下面的代码为例,我们需要将func函数中ret的值返回给外部,实际上是通过了eax寄存器来实现的,函数在返回时,会将变量的内容存放到eax寄存器中,外部的赋值语句,会将eax寄存器中的内容赋值给外部的变量中,那么这里的寄存器就充当了代码的临时空间。

int func()
{int ret = 0;// ...return ret;
}int main()
{int num = func();// ...return 0;
}

在我们写代码的时候,通常使用的是顺序结构,也就是代码从上往下运行,但是代码中通常会有循环、函数的存在,当程序/进程进入循环或是跳转到函数时,我们的进程/程序,都能知道进程/程序运行到了哪里,其实就是因为CPU中的寄存器也就是eip寄存器/pc指针,也被称之为程序计数器,程序计数器能够记录下当前正在运行中程序的指令的下一条指令的地址,所以在我们运行的进程/程序能够知道代码运行到了哪里。

我们的程序在运行的时候,会使用这些寄存器的,进程会产生各种各样的数据,需要在寄存器中临时保持。
这里讲到的是单进程的情况,那如果是多进程的情况下会怎么样呢?当有多个进程的时候,各个进程都会在CPU中的寄存器形成临时数据,我们称之为进程的硬件上下文,每个进程的临时数据都是不一样的,但是在CPU中寄存器硬件只有一套,而进程的硬件上下文则是有几个进程就有几套,所以这里有一个很重要的结论:寄存器 != 寄存器的内容,这个结论非常的重要!!!

这里讲到了一个CPU只有一套寄存器硬件,但是进程的硬件上下文却不止一个,那么如何处理CPU的寄存器与进程的上下文的关系,将会在下面的进程切换中讲到。


三、进程切换

在Linux中,进程切换(Process Switching)是操作系统核心功能之一,它允许操作系统同时运行多个程序,虽然实际上CPU在任何给定时刻都只能执行一个程序的指令。进程切换是操作系统管理CPU时间的一种机制,它确保了每个程序都能获得一定的执行时间,从而实现了多任务处理(Multitasking)的能力。

进程切换的基本步骤

  1. 保存当前进程状态
    当一个进程的时间片用完或者因为其他原因(如等待I/O操作完成)而需要被挂起时,操作系统会保存该进程的当前状态,包括程序计数器(PC指针,指向下一条要执行的指令的地址)、CPU寄存器的内容(如通用寄存器、状态寄存器、指令寄存器等)、堆栈信息等。在老版本的Linux的内核中,这些状态信息被保存在该进程的进程控制块(PCB)中,而在新版本的Linux内核中,这些状态并不是直接保存到PCB中,但还是与PCB相关,因为直接保存这些信息会导致PCB变大,而现在内核也对PCB的大小做出了限制,所以这些信息不是在PCB中直接保存,这就涉及到了PCB中的tss任务数据段,理解起来比较复杂,会在后面的文章中讲到,目前大家可以认为这些信息是保存在PCB中的。
    在这里插入图片描述

  2. 选择下一个进程
    操作系统会基于某种调度算法(如轮转调度、优先级调度、最短作业优先等)来选择一个进程来执行。调度算法的选择和设计直接影响到系统的性能和公平性。

  3. 恢复新进程的状态
    一旦选定了下一个要执行的进程,操作系统就会从该进程的PCB中恢复其之前保存的状态信息,包括程序计数器、CPU寄存器的内容等。这样,CPU就可以从该进程上次停止的地方继续执行了。

  4. 更新PCB和系统状态
    进程切换后,操作系统会更新相关PCB和系统状态,如修改进程状态、更新调度队列等,以便下次调度时使用。

值得注意的是将进程的上下文保存在PCB后,寄存器中的信息并不是被清除,而是被下一个进程的上下文中的信息直接覆盖,若进程没有上下文是一个新进程,那么会将进程跑起来,慢慢的将寄存器中原来的信息覆盖掉。

四、Linux2.6内核进程调度队列与调度原理

每一个CPU会维护一个自己的运行队列,下图是Linux2.6内核中进程队列的数据结构。

在这里插入图片描述

在图中我们可以看到,运行队列中有数组queue[140],全称为task_struct* queue[140],它是一个指针数组,用来管理进程的优先级,在操作系统中,优先级被分为了两种:

  1. 实时优先级:对应数组的0 ~ 99,共100个优先级。(目前来说不是很重要,不过多做讲解)
  2. 普通优先级:对应数组的100 ~ 139,共40个优先级。(细心一点能够看出,其实这里的普通优先级,就是上一篇文章讲到的进程优先级,使用映射的方法,将优先级60 ~ 99映射到了数组的100 ~ 139中)

在图中还可以发现,运行队列中维护两个queue[140],两个queue[140]分别用来维护活跃进程和过期进程,维护两个queue[140]的原因是因为运行队列中如果只维护一个queue[140]的话,一直启动优先级较高的进程会导致优先级较低的进程无法被CPU被调度,不符合Linux内核的较为公平的调度。

运行队列中还维护了两个指针 void* active 和 void* expired 分别用来指向两个数组queue[140],指针active指向的活跃队列,指针expired指向的是过期队列,CPU调度进程的时候会在活跃队列中优先级高的进程,当进程在一个时间片的时间内运行完后会出现两种情况,一是进程运行完毕,进程退出,二是进程未运行完毕,将该进程交给过期队列进行维护。若正常启动新的进程,是交给过期队列维护而不是活跃队列,以防出现上述不公平的调度,若启动的新进程需要进程抢占,则将新进程交给活跃队列进行维护。活跃队列中的进程会逐渐减少,过期队列中的进程会逐渐增多,当活跃队列中已经没有进程时,将指针active与指针expired指向的内容进行交换,那么活跃队列变为过期队列,过期队列变为活跃队列,重复这样的操作,可以保证Linux内核较为公平的调度每一个进程。

那么如何知道活跃队列中是否有进程呢?CPU应该调度哪个进程?如果每次调度进程都需要遍历一次数组,那么会导致效率低下,我们仔细再看看上图,对应的还有数组int bitmap[5],也就是位图,一个int类型的变量是32位,那么这个数组就160位,一个位能对应一个优先级,那么160位比特位完全能够对应140个优先级。在这个bitmap中,每个bit位代表一个优先级队列,如果该位为1,则表示对应的优先级队列中有进程存在;如果为0,则表示队列为空。通过读取几个或几十个比特位即可判断队列中是否含有进程。运行队列中还维护了一个变量br_active,用来存储队列有有多少个进程。

总结

在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!这种算法通过优先级队列和位图等数据结构,实现了高效的进程调度。


结尾

如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。
希望大家以后也能和我一起进步!!🌹🌹
如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹

在这里插入图片描述

相关文章:

【Linux】Linux2.6内核进程调度队列与调度原理

目录 一、进程管理中的部分概念二、寄存器三、进程切换四、Linux2.6内核进程调度队列与调度原理结尾 一、进程管理中的部分概念 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务&#…...

MacOS使用VSCode编写C++程序如何配置clang编译环境

前言 这段时间在练习写C和Python,用vscode这个开发工具,调试的时候遇到一些麻烦,浪费了很多时间,因此整理了这个文档。将详细的细节描述清楚,避免与我遇到同样问题的人踩坑。 1.开发环境的配置 vscode的开发环境配置…...

【Spark源码分析】规则框架- `analysis`分析阶段使用的规则

analysis分析阶段使用的规则 规则批策略规则说明SubstitutionfixedPointOptimizeUpdateFields该规则优化了 UpdateFields 表达式链,因此看起来更像优化规则。但是,在处理深嵌套模式时,UpdateFields 表达式树可能会非常复杂,导致分…...

Windows和Ubuntu系统下cmake和opencv的安装和使用

以下是在Windows和Ubuntu系统下分别安装CMake并使用C配置OpenCV实现读取图片并显示功能的详细步骤: Windows系统 1. 安装CMake 访问CMake官方网站(https://cmake.org/download/)。根据你的Windows系统版本(32位或64位&#xff…...

详解 Qt QtPDF之QPdfPageNavigator 页面跳转

文章目录 前言头文件: 自 Qt 6.4 起继承自: 属性backAvailable : const boolcurrentLocation : const QPointFcurrentPage : const intcurrentZoom : const qrealforwardAvailable : const bool 公共函数QPdfPageNavigator(QObject *parent)virtual ~QPd…...

设计模式之单例

单例可以说是设计模式中最简单的一种模式。但任何一种设计模式都是普遍经验的总结,都有值得思考的地方。所以单例也并不简单,下面让我们慢慢了解它。 单例顾名思义这个类只有一个实例。要做到这点,需要做到以下几点: (…...

笔记软件:我来、思源笔记、Obsidian、OneNote

最近wolai的会员到期了,促使我更新了一下笔记软件。 首先,wolai作为一个笔记软件,我觉得有很多做得不错的方面(否则我也不会为它付费2年了),各种功能集成得很全(公式识别这个功能我写论文的时候…...

前端入门指南:前端模块有哪些格式?分别什么情况使用

前言 在当今的前端开发中,模块化是提升代码组织性和可维护性的关键手段。随着前端技术的发展,出现了多种模块化方案,每种方案都有其独特的优势和适用场景。本文将详细探讨常见的前端模块格式,包括全局变量、IIFE、CommonJS、AMD、…...

Vue3 常用指令解析:v-bind、v-if、v-for、v-show、v-model

Vue 是一个非常强大的前端框架,提供了许多常用指令来简化模板的使用。Vue 指令以 v- 开头,用于对 DOM 元素和组件的行为进行控制。本文将介绍 Vue 中常见的五个指令:v-bind、v-if、v-for、v-show 和 v-model,并通过实例代码来演示…...

如何查看ubuntu服务器的ssh服务是否可用

你可以通过以下几种方法检查 Ubuntu 服务器上的 SSH 服务是否可用: 1. 使用 systemctl 检查 SSH 服务状态 首先,检查 SSH 服务是否正在运行: sudo systemctl status ssh如果 SSH 服务正在运行,你会看到类似以下的输出&#xff…...

redis面试复习

1.redis是单线程还是多线程 无论什么版本工作线程就是是一个,6.x高版本出现了IO多线程 单线程满足redis的串行原子,只不过IO多线程后,把输入/输出放到更多的线程里区并行,好处: 1.执行的时间更短,更快&a…...

【人工智能基础04】线性模型

文章目录 一. 基本知识1. 线性回归1.1. 基本形式1.2. 线性回归 2. 优化方法:梯度下降法2.1. 梯度下降法的直观意义2.2. 随机梯度下降法 3. 分类问题3.1. 二分类:逻辑回归-sigmoid函数3.2. 多分类问题--softmax函数 4. 岭回归与套索回归4.1. 基础概念什么…...

使用YOLO系列txt目标检测标签的滑窗切割:批量处理图像和标签的实用工具

使用YOLO系列txt目标检测标签的滑窗切割:批量处理图像和标签的实用工具 使用YOLO的TXT目标检测标签的滑窗切割:批量处理图像和标签的实用工具背景1. 代码概述2. 滑窗切割算法原理滑窗切割步骤:示例: 3. **代码实现**1. **加载标签…...

《装甲车内气体检测“神器”:上海松柏 K-5S 电化学传感器模组详解》

《装甲车内气体检测“神器”:上海松柏 K-5S 电化学传感器模组详解》 一、引言二、K-5S 电化学传感器模组概述(一)产品简介(二)产品特点(三)产品适用场景 三、电化学传感器原理及优点(一&#xf…...

【笔记】文明、现代化与价值投资

文章目录 价值投资与理性思考资管行业特点及对从业人员的道德底线要求价值投资长期来看,各项资产的走势投资与投机 对文明的认知对文明的计量方式狩猎文明或1.0文明农业畜牧文明或2.0文明农业文明的天花板及三次冲顶农业文明中的思想革命和制度创新 科技文明或3.0文…...

排序学习整理(1)

1.排序的概念及运用 1.1概念 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…...

提升分布式系统响应速度:分布式系统远程调用性能提升之道

目录 一、远程调用直接案例分析 二、并行调用 (一)核心思想 (二)并行调用的实现方式 1. 基本思路 2. 代码示例 3. 关键点说明 4.线程池配置建议 三、数据异构 (一)场景重提 (二&…...

通过MinIO+h2non/imaginary 搭建自己的阿里云OSS

安装MinIO Docker部署MinIO对象存储服务 图片访问地址:http://192.168.153.138:9000/public/su7_1.jpg 安装h2non/imaginary Docker部署h2non/imaginary 处理图片地址:http://192.168.153.138:7000/resize?urlhttp://192.168.153.138:9000/public/su…...

.NET 9 AOT的突破 - 支持老旧Win7与XP环境

引言 随着技术的不断进步,微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中,一个特别引人注目的亮点是 AOT( Ahead-of-Time)支持,它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…...

iOS与Windows间传文件

想用数据线从 windows 手提电脑传文件入 iPhone,有点迂回。 参考 [1],要在 windows 装 Apple Devices。装完、打开、插线之后会检测到手机,界面: 点左侧栏「文件」,不是就直接可以传,而是要通过某个应用传…...

ospf协议(动态路由协议)

ospf基本概念 定义 OSPF 是典型的链路状态路由协议,是目前业内使用非常广泛的 IGP 协议之一。 目前针对 IPv4 协议使用的是 OSPF Version 2 ( RFC2328 );针对 IPv6 协议使用 OSPF Version 3 ( RFC2740 )。…...

直击高频编程考点:聚焦新版综合编程能力考查汇总

目录 一、业务性编程和广度能力考查 (一)基本定义 (二)必要性分析 二、高频考查样题(编程扩展问法) 考题1: 用java 代码实现一个死锁用例,说说怎么解决死锁问题?(高…...

爬虫框架快速入门——Scrapy

适用人群:零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy? Scrapy 是一个基于 Python 的网络爬虫框架,它能帮助你快速爬取网站上的数据,并将数据保存到文件或数据库中。 特点: 高效:支…...

Springfox、Swagger 和 Springdoc

Springfox、Swagger 和 Springdoc 是用于在 Spring Boot 项目中生成 API 文档的工具,但它们之间有显著的区别和演进关系: 1. Swagger 简介 Swagger 是一个开源项目,旨在为 RESTful APIs 提供交互式文档。最早由 SmartBear 开发,…...

Css、less和Sass(SCSS)的区别详解

文章目录 Css、less和Sass(SCSS)的区别详解一、引言二、CSS 简介1.1、CSS 示例 三、Less 简介2.1、Less 特性2.2、Less 示例 四、Sass(SCSS)简介3.1、Sass 特性3.2、SCSS 示例 五、总结 Css、less和Sass(SCSS&#xff…...

新能源汽车充电基础设施短板问题多,如何实现高效、综合、智能化管理?

随着城市经济的发展,人民生活水平的提升,新能源汽车保有量快速增长,而日益增长的新能源汽车需求与充电基础设施建设不平衡的矛盾日益突出。由于停车泊位充电基础设施总量不足、布局待优化、利用效率低、建设运营存在短板问题等原因&#xff0…...

DBA面试题-1

面临失业,整理一下面试题,找下家继续搬砖 主要参考:https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1, 整形 tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节…...

LAN,WAN,VLAN,WLAN,VPN了解笔记

局域网LAN---公司的内部网络就是局域网LAN。 提供有线连接的接口允许局域网内的设备(如台式电脑、网络打印机、网络存储设备等)通过以太网线连接到路由器并与其他局域网设备进行通信实现设备之间的数据传输和资源共享一种私有的网络相对其他网络传输速度…...

1.2 算法和算法评价

1.2.1 算法的基本概念 算法:对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。 算法的五个重要特性 “好”的算法的五个目标 1.2.2 算法效率的度量 一、时间复杂度 算法的时间复杂度是指一个算法每行…...

各大常见编程语言应用领域

不同编程语言因其特性和设计目标而适用于不同的应用领域。以下是一些常见编程语言及其主要应用领域: 1. Python 数据科学与人工智能:Python 在数据分析、机器学习、深度学习等领域广泛使用,因其丰富的库(如 NumPy、Pandas、Tens…...

【FFT】数据点数是否一定为2的n次方?不补零会如何处理?

一般来说,FFT的数据点个数为以2为基数的整数次方(采用以2为基的FFT算法,可以提升运算性能),但是并没有要求FFT的数据点个数一定为2的n次方。 因此针对数据点数不是以2为基数的整数次方,有两种处理方法&…...

shell脚本小练习#003:查找并拷贝目录

实例1: # 从当前执行脚本的路径位置开始向上搜索一个名为sourceProject目录名 # 并将这个文件目录的路径名称打印出来#!/bin/bashfunction find_dir() {local current_dir$PWDwhile [[ $current_dir ! "/" ]]; doif [[ -d "${current_dir}/sourcePr…...

frp内网穿透

目录 1,准备公网服务器 2,下载安装frp服务端 3,服务端安装 2)编辑服务端配置文件fprs.toml 3)配置启动服务 4)启动服务 5 )设置开机启动服务 6)查看服务启动状态 3&#xff0c…...

Android电视项目焦点跨层级流转

1. 背景 在智家电视项目中,主要操作方式不是触摸,而是遥控器,通过Focus进行移动,确定点击进行的交互,所以在电视项目中焦点、选中、确定、返回这几个交互比较重要。由于电视屏比较大,在一些复杂页面中会存…...

时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x =...

转载 为nautilus安装rabbitvcs

# 添加 rabbitvcs 的 ppa 源 sudo add-apt-repository ppa:rabbitvcs/ppa sudo apt update # 安装 rabbitvcs sudo apt install rabbitvcs-cli rabbitvcs-core rabbitvcs-gedit rabbitvcs-nautilus # 注销后重新登录,右键即可使用 # 解决 RabbitVCS 无法自动保存…...

OpenCV 模板匹配全解析:从单模板到多模板的实战指南

简介:本文深入探讨 OpenCV 中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤,包括读取、截取、滤波与存储等操作。剖析 cv2.matchTemplate 语法及其参数含义,阐述不同匹配方法下结果值的意义。同时讲解 cv2.minMaxLoc 语法&#xff0…...

手机控制载货汽车一键启动无钥匙进入广泛应用

移动管家载货汽车一键启动无钥匙进入手机控车系统‌, 该系统广泛应用于物流运输、工程作业等货车场景,为车主提供了高效、便捷的启动和熄火解决方案,体现了科技进步对物流行业的积极影响‌ 核心功能‌:简化启动流程,提…...

Springboot——SseEmitter流式输出

文章目录 前言SseEmitter 简介测试demo注意点异常一 ResponseBodyEmitter is already set complete 前言 最近做AI类的开发,看到各大AI模型的输出方式都是采取的一种EventStream的方式实现。 不是通常的等接口处理完成后,一次性返回。 而是片段式的处理…...

【人工智能数学基础篇】线性代数基础学习:深入解读矩阵及其运算

矩阵及其运算:人工智能入门数学基础的深入解读 引言 线性代数是人工智能(AI)和机器学习的数学基础,而矩阵作为其核心概念之一,承担着数据表示、变换和运算的重任。矩阵不仅在数据科学中广泛应用,更是神经…...

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置,可以按下图所示寻找位置,也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly:自动帮我们优化导入的包Optimize imports on the fly:自动去掉一些没有用到的包 禁止导…...

奇怪的编码2

1.当铺密码 当铺密码的标志是“田由中人工大王夫井羊” 口 0 田 0 由 1 中 2 人 3 工 4 大 5 王 6 夫 7 井 8 羊 9 解密脚本: s 田由中人工大王夫井羊 codeinput("请输入当铺密码:") code code.split(" ") w for i in code:k…...

AI服务器从HBM到CXL的技术变革

AI服务器从HBM到CXL变革 本文探讨了AI产业的新范式,特别是服务器变革。传统服务器价格通常在1万美金以内,而搭载8张H100算力卡的DGX H100AI服务器价值高达40万美金(约300万人民币)。这一变化将对AI产业产生深远影响。 自然语言和图形处理依赖大量存储器…...

将自定义 AWS S3 快照存储库连接到 Elastic Cloud

作者:来自 Elastic Annie Hansen, Stef Nestor 在本博客中,我们将介绍如何通过 Elasticsearch 的快照将我们已提交的集群数据备份到 AWS S3 存储桶中。在 Elastic Cloud(企业版)中,Elastic 在其 found-snapshots 存储…...

Java 多线程编程核心要点全解析:深度探秘关键方法与同步机制

1.Thread 类中的start() 和 run() 方法有什么区别? 在Java编程语言中,Thread 类的 start() 和 run() 方法有重要的区别: start() 方法: 当你调用 start() 方法时,它会启动一个新的线程,并且这个新线程会…...

个人博客接入github issue风格的评论,utteranc,gitment

在做个人博客的时候,如果你需要评论功能,但是又不想构建用户体系和评论模块,那么可以直接使用github的issue提供的接口,对应的开源项目有utteranc和gitment,尤其是前者。 它们的原理是一样的:在博客文章下…...

搞个项目之-esp32-cam ov2640模组搭建图像视频项目

开发版的介绍: 1、开发板使用的是:ESP32-CAM 2、摄像头模组:OV2640 3、烧录底座:ESP32-CAM开发板烧录座 4、mirco usb线,四线30cm 5、开发版的原理图像 项目前期的准备工作 一、安装arduino arduino官网地址地址…...

【FPGA开发】Vivado自定义封装IP核,绑定总线

支持单个文件的封装、整个工程的封装,这里用单个文件举例。 在文件工程目录下,自建一个文件夹,里面放上需要封装的verilog文件。 选择第三个,指定路径封装,找到文件所在目录 取个名,选择封装IP的路径 会…...

Leetcode51:N 皇后

题目描述: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问…...

C#面向对象之访问限制,类基础,继承

文章目录 1 访问限制1.1 简介 2 类基础讲解2.1 类定义2.2 构造函数2.2.1 构造函数2.2.2 静态构造函数2.2.3 初始化顺序2.2.4 对象初始化器 2.3 析构函数2.4 类的静态成员2.5 匿名对象2.5.1 定义2.5.2 匿名对象的创建 3 继承3.1 基类和派生类3.2 基类初始化3.3 Partial类3.3.1 定…...