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

操作系统笔记、面试八股(一)—— 进程、线程、协程

文章目录

  • 1. 进程、线程、协程
    • 1.1 进程
      • 1.1.1 进程间的通信方式
      • 1.1.2 进程同步方式
      • 1.1.3 进程的调度算法
      • 1.1.4 优先级反转
      • 1.1.5 进程状态
      • 1.1.6 PCB进程控制块
      • 1.1.7 进程的创建和撤销过程
      • 1.1.8 为什么要有进程
    • 1.2 线程
      • 1.2.1 为什么要有线程
      • 1.2.2 线程间的同步方式
    • 1.3 协程
      • 1.3.1 什么是协程
      • 1.3.2 为什么引入协程
      • 1.3.3 协程的特点
      • 1.3.4 协程与线程的区别
    • 1.4 进程和线程的区别

1. 进程、线程、协程

1.1 进程

进程是操作系统进程资源分配的基本单位。

进程控制块(PCB,Process Control Block)描述进程的基本信息和运行状态。创建进程和撤销进程都是对PCB的操作。

1.1.1 进程间的通信方式

进程通信是指进程之间传输信息。

  1. 管道
    • 匿名管道。只能用于具有亲缘关系的父子进程之间或者兄弟进程之间的通信。
    • 有名管道。以磁盘文件的方式存在,可以实现本机任意两个进程之间的通信。
  2. 消息队列。存在拷贝开销的问题
  3. 共享内存。存在多进程竞争内存的问题,需要依靠某种同步操作,如互斥锁和信号量等。
  4. 信号量。PV操作维护一个计数器,主要用于解决与同步相关的问题并避免竞争条件。
  5. 信号
  6. Socket套接字。主要用于在客户端和服务器之间通过网络进行通信。

1.1.2 进程同步方式

进程同步是控制多个进程按照一定的顺序执行。

  1. 临界区
  2. 同步与互斥
  3. 信号量
  4. 管程

1.1.3 进程的调度算法

==进程调度,是为了实现最大CPU利用率。==不同环境下的调度算法目标不同。

  1. 批处理系统

    批处理系统没有太多的用户操作,调度算法应保证吞吐量和周转时间(从提交到终止的时间)。

    1. 先到先服务(FCFS,First-come-first-served)调度算法

      FCFS是非抢占式的调度算法,按照请求的顺序进行调度。

      FCFS有利于长作业,不利于短作业。因为短作业必须一直等待前面的长作业执行完毕后才能执行,而长作业的执行又需要很长时间,造成了短作业等待时间过长。

    2. 短作业优先(SJF,shorted job first)调度算法

      SJF也是非抢占式的调度算法,按照估计运行时间最短的顺序进行调度。

      长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业的到来,长作业则一直无法得到调度。

    3. 最短剩余时间优先(SRTN,shortest remaining time next)

      SRTN是SJF是抢占式版本,按照剩余时间运行时间的顺序进行调度。当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则,新的进程等待。

  2. 交互式系统

    交互式系统有大量的用户交互操作,调度算法的目标是快速地进行响应

    1. 时间片轮转(RR,Round robin)调度算法

      将所有就绪态进程按照FCFS先到先服务原则排成一个队列,每次调度时,把CPU时间片分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把CPU时间片分配给队首的进程。

      时间片轮转的效率和时间片的大小有关。因为进程切换要保存当前进程的信息,并且载入新进程的信息。如果时间片太小,会导致进程切换的很频繁,在进程切换上会花过多时间。而时间片过长,可能实时性无法保证。

    2. 优先级调度算法

      为每个进程分配优先级,按优先级顺序从高到低进行调度。具有相同优先级的进程以FCFS先到先服务的方式进行调度。

      优先级的确定可以依据时间要求、内存要求或任何其他资源要求。

      同时,为了防止低优先级的进程永远得不到调度,可以随着时间的推移增加等待进程的优先级。

    3. 多级反馈队列调度算法

      一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。

      多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。

      每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。

      可以将多级反馈队列调度算法看成是时间片轮转调度算法+优先级调度算法的结合,它既能使高优先级的进程得到响应,又能使短进程迅速完成。是一种被公认认的较好的进程调度算法。UNIX操作系统采取的就是这种。

1.1.4 优先级反转

优先级反转是指在使用信号量进行多线程同步时,有可能会出现的一种不合理的现象,即:

高优先级的任务被低优先级任务阻塞(一般是因为共享资源被低优先级任务占用,高优先级任务获取不到),导致高优先级任务迟迟得不到调度。但处于中间优先级的任务却能获得CPU调度。从表面上看,好像是中优先级的任务比高优先级的任务具有更高的优先权。

例如:假定一个进程中有三个线程Thread1(高)、Thread2(中)和Thread3(低),考虑下图的执行情况:

  • T0时刻,Thread3运行,并获得同步资源SYNCH1;
  • T1时刻,Thread2开始运行,由于优先级高于Thread3,Thread3被抢占(未释放同步资源SYNCH1),Thread2被调度执行;
  • T2时刻,Thread1抢占Thread2;
  • T3时刻,Thread1需要同步资源SYNCH1,但SYNCH1被更低优先级的Thread3所拥有,Thread1被挂起等待该资源
  • 而此时线程Thread2和Thread3都处于可运行状态,Thread2的优先级大于Thread3的优先级,Thread2被调度执行。最终的结果是高优先级的Thread1迟迟无法得到调度,而中优先级的Thread2却能抢到CPU资源。

上述现象中,优先级最高的Thread1要得到调度,不仅需要等Thread3释放同步资源(这个很正常),而且还需要等待另外一个毫不相关的中优先级线程Thread2执行完成(这个就不合理了),会导致调度的实时性就很差了。

解决方法:

  • 优先级继承

    • 让低优先级线程在获得同步资源的时候(如果有高优先级的线程也需要使用该同步资源时),临时提升其优先级,以使其能更快的执行并释放同步资源。释放同步资源后再恢复其原来的优先级

      与上图相比,到了T3时刻,Thread1需要Thread3占用的同步资源SYNCH1,操作系统检测到这种情况后,就把Thread3的优先级提高到Thread1的优先级。此时处于可运行状态的线程Thread2和Thread3中,Thread3的优先级大于Thread2的优先级,Thread3被调度执行。

      Thread3执行到T4时刻,释放了同步资源SYNCH1,操作系统恢复了Thread3的优先级,Thread1获得了同步资源SYNCH1,重新进入可执行队列。处于可运行状态的线程Thread1和Thread2中,Thread1的优先级大于Thread2的优先级,所以Thread1被调度执行。

  • 优先级天花板

    • 当线程申请某共享资源时,把该线程的优先级提升到可访问这个资源的所有线程中的最高优先级,这个优先级称为该资源的优先级天花板。
    • 这种方法简单易行,不必进行复杂的判断,不管线程是否阻塞了高优先级线程的运行,只要线程访问共享资源都会提升线程的优先级。

1.1.5 进程状态

进程有五种状态:

  1. 新建(created)
  2. 就绪(ready)。进程处于就绪状态时,等待被调度
  3. 运行(running)
  4. 阻塞(waiting)。进程处于阻塞状态时,等待资源
  5. 终止(terminated)

Note:

  • 只有就绪态和运行态可以相互转换,其它的都是单向转换。
  • 就绪态的进程通过进程调度算法获得CPU时间片,转为运行态。运行态的进程,在分配给它的CPU时间片用完之后就会转为就绪态,等待下一次调度。
  • 阻塞状态是缺少需要的资源从而由运行态转换而来,但是这里的资源不包括CPU时间片,缺少CPU时间片会从运行态转为就绪态。

1.1.6 PCB进程控制块

操作系统管理和控制进程,都需要借助PCB来完成。进程和进程控制块的数量始终是相等的,创建多少个进程就会相应产生多少个PCB。当进程执行结束后,操作系统只需要释放相应进程控制块占用的内存空间,目标进程也随之消亡。

操作系统创建每个进程时,都会额外申请一块内存空间,这块内存空间称为PCB,用来存储、管理和控制该进程所需要的信息,例如:

  • 进程名称或者ID号,作为该进程的标识
  • 当前进程的执行状态,进程在整个执行过程中可能处于新建、就绪、运行、阻塞、终止这5种状态
  • 进程占用的各种资源,例如内存大小、使用的IO设备等
  • 进程已经执行的时间,占用CPU的时间等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qoRjeMUP-1677667947211)(操作系统/image-20220512170807081.png)]

1.1.7 进程的创建和撤销过程

进程允许创建和控制另一个进程,前者称为父进程,后者称为子进程,子进程又可以创建孙进程,如此下去进而形成一个进程的家族树,这样子进程就可以从父进程那里继承所有的资源,当子进程撤销时,便将从父进程处获得的所有资源归还。

此外,撤销父进程,则必须撤销所有的子进程。(撤销的过程实际上就是对这棵家族树进行后序遍历的过程)

在应用中创建一个子进程的过程如下:

  • 申请空白的PCB
  • 初始化进程描述信息
  • 为进程分配资源以及地址空间
  • 将其插入就绪队列中

当进程完成后,系统会回收占用的资源,撤销进程。

而引发进程撤销的情况有:进程正常结束或者异常结束,外界的干预(比如我们在任务管理器中强制停止某个进程的运行)。撤销进程的过程如下:

  • 查找需要撤销的进程的PCB
  • 如果进程处于运行状态,终止进程并进行调度
  • 终止子孙进程 - 归还资源
  • 将它从所在的队列中移除

1.1.8 为什么要有进程

操作系统之所以要支持多进程,是为了提高CPU的利用率。

为了切换进程,需要进程支持挂起恢复,不同进程间需要的资源不同,所以这也是为什么进程间资源需要隔离,这也是进程是资源分配的最小单位的原因

切换,细分为两种状态:

  • 挂起:保存程序的当前状态,暂停当前程序
  • 激活(恢复):恢复程序状态,继续执行程序

1.2 线程

线程,由 线程ID程序计数器寄存器组合堆栈 共同组成,是CPU执行和调度的基本单位。

线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。

1.2.1 为什么要有线程

进程存在以下问题:

  1. 单个进程只能干一件事,进程中的代码依旧是串行执行
  2. 执行过程如果阻塞,整个进程都会挂起
  3. 多个进程间的内存无法共享,进程间通信比较麻烦

线程的出现就是为了:

  1. 降低上下文切换的资源消耗
  2. 提高系统的并发性
  3. 突破一个进程只能干一件事的缺陷

1.2.2 线程间的同步方式

线程同步,是指多个共享关键资源的线程的并发执行,一般主要有三种同步方式:

  1. 互斥量

    采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如Java中的synchronized关键字以及Lock锁都是这种机制。

  2. 信号量

    允许同一时刻多个线程访问同一资源,但是需要控制同时访问资源的最大线程数量

  3. 事件

    通过通知的方式来保持多线程的同步,如wait和notify

1.3 协程

1.3.1 什么是协程

协程,是一种非抢占式(协作式)的任务调度模式,程序可以主动挂起或者恢复执行。协程可以理解为由程序员自己写程序来管理的轻量级线程,对内核不可见。

1.3.2 为什么引入协程

引入进程与线程是为了异步并发地执行任务,提高系统效率及资源利用率。

引入协程的原因:简化异步并发任务

协程出现的目的:当出现长时间的I/O操作时,通过让出目前的协程调度,执行下一个任务的方式,来消除ContextSwitch上的开销。

1.3.3 协程的特点

  1. 线程的切换由操作系统负责调度,而协程的切换由用户自己进行调度,因此减少了上下文切换,提高了效率

  2. 线程的默认Stack大小为1M,而协程更轻量,为1K,因此可以在相同的内存中开启更多的协程

  3. 避免竞争关系而导致的使用锁

    由于在同一线程上,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

  4. 协程的使用

    协程适用于被阻塞的(如I/O操作)、且需要大量并发的场景,当IO操作结束后再自动回调,那么就会大大节省资源并提高性能,从而实现异步编程。但不适用于大量计算的多线程,利用协程来回切换执行计算型的操作,没有任何意义,来回切换并保存状态,反倒会降低性能。

1.3.4 协程与线程的区别

协程是基于线程的,相比于线程轻量很多,可以理解为用户层模拟线程操作。

每创建一个协程,都有一个内核态线程动态绑定,用户态下实现调度、切换,真正执行任务的还是内核线程。

线程的上下文切换都需要内核参与,而协程的上下文切换,完全由用户去控制,避免了大量的中断参与,减少了线程上下文切换与调度消耗的资源。

简单来说,线程是操作系统层面的概念,协程是语言层面的概念。

线程与协程最大的区别在于:线程是被动挂起恢复,协程是主动挂起恢复

1.4 进程和线程的区别

  1. 拥有资源

    进程是资源分配的基本单位,线程不拥有资源,线程可以访问所在进程中的资源。

  2. CPU调度

    线程是CPU执行和调度的基本单位。同一进程中,线程的切换不会引起进程的切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程的切换。

  3. 系统开销

    在创建或撤销进程时,系统都要为其分配或回收资源,如内存空间、IO设备等,需要的系统开销远远大于创建或撤销线程时的开销。

  4. 通信

    线程间可以通过直接读写同一进程的数据进行通信,但是进程通信需要借助一些复杂的方法。

相关文章:

操作系统笔记、面试八股(一)—— 进程、线程、协程

文章目录1. 进程、线程、协程1.1 进程1.1.1 进程间的通信方式1.1.2 进程同步方式1.1.3 进程的调度算法1.1.4 优先级反转1.1.5 进程状态1.1.6 PCB进程控制块1.1.7 进程的创建和撤销过程1.1.8 为什么要有进程1.2 线程1.2.1 为什么要有线程1.2.2 线程间的同步方式1.3 协程1.3.1 什…...

Python每日一练(20230302)

目录 1. 字符串统计 2. 合并两个有序链表 3. 下一个排列 附录 Python字典内置方法 增 删 改 查 其它 1. 字符串统计 从键盘输入一个包含有英文字母、数字、空格和其它字符的字符串,并分别实现下面的功能:统计字符串中出现2次的英文字母&#…...

Numpy课后练习

Numpy课后练习 文章目录 Numpy课后练习一、前言二、题目及答案一、前言 答案仅供参考,谢谢大家! 二、题目及答案 导入Numpy包并设置随机数种子为666 import numpy as np np.random.seed(666)创建并输出一个包含12个元素的随机整数数组r1,元素的取值范围在[30,100)之间 r1 …...

动态规划dp中的子序列、子数组问题总结

目录 定义dp数组 初始化dp数组 状态转移方程 最终结果 题目 定义dp数组 这类问题的共性是会提供两个数组,寻找他们共同的子序列、子数组。设第一个数组为s,第二个数组为t。则可以设二维dp数组,其大小为len(s + 1)*len(t + 1) dp[i][j]表示 s 前 i 个长度,...

Zookeeper3.5.7版本——Zookeeper的概述、工作机制、特点、数据结构及应用场景

目录一、Zookeeper的概述二、Zookeeper的工作机制三、Zookeeper的特点四、Zookeeper的数据结构五、Zookeeper的应用场景5.1、统一命名服务5.2、统一配置管理5.3、统一集群管理5.4、服务器动态上下线5.5、软负载均衡一、Zookeeper的概述 Zookeeper 是一个开源的分布式的&#x…...

安卓逆向学习及APK抓包(二)--Google Pixel一代手机的ROOT刷入面具

注意:本文仅作参考勿跟操作,root需谨慎,本次测试用的N手Pixel,因参考本文将真机刷成板砖造成的损失与本人无关 1 Google Pixel介绍 1.1手机 google Pixel 在手机选择上,优先选择谷歌系列手机,Nexus和Pixel系列&…...

线程池的基本认识与使用

线程池的基本认识与使用线程池线程池工作原理:优点:传统的创建线程方式线程池创建线程使用线程池 池化思想:线程池、字符串常量池、数据库连接池可以提高资源的利用率 线程池工作原理: 预先创建多个线程对象 放入线程池种&#…...

小家电品牌私域增长解决方案来了

小家电品牌的私域优势 01、行业线上化发展程度高 相对于大家电动辄上千上万元的价格,小家电的客单价较低。而且与大家电偏刚需属性不同的是,小家电的消费需求侧重场景化,用户希望通过购买小家电来提高自身的生活品质。这就决定了用户的决策…...

什么是让ChatGPT爆火的大语言模型(LLM)

什么是让ChatGPT爆火的大语言模型(LLM) 更多精彩内容: https://www.nvidia.cn/gtc-global/?ncidref-dev-876561 文章目录什么是让ChatGPT爆火的大语言模型(LLM)大型语言模型有什么用?大型语言模型如何工作?大型语言模型的热门应用在哪里可以找到大型语言…...

【监控】Linux部署postgres_exporter及PG配置(非Docker)

目录一、下载及部署二、postgres_exporter配置1. 停止脚本stop.sh2. 启动脚本start.sh3. queries.yaml三、PostgreSQL数据库配置1. 修改postgresql.conf配置文件2. 创建用户、表、扩展等四、参考一、下载及部署 下载地址 选一个amd64下载 上传至服务器,解压 tax…...

基于Java+SpringBoot+Vue+Uniapp(有教程)前后端分离健身预约系统设计与实现

博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及…...

【2023】DevOps、SRE、运维开发面试宝典之Redis相关面试题

文章目录 1、redis主从复制原理2、redis哨兵模式的原理3、reids集群原理4、Redis 哈希表进行的触发时机是什么?5、Redis 的 RDB 和 AOF 机制各自的优缺点是什么?这两种机制是否可以混合使用?6、Redis 经常被称为单线程的系统,你如何理解 Redis 的单线程模型7、redis 的事务…...

十五、MyBatis使用PageHelper

1.limit分页 limit分页原理 mysql的limit后面两个数字: 第一个数字:startIndex(起始下标。下标从0开始。) 第二个数字:pageSize(每页显示的记录条数) 假设已知页码pageNum,还有每页…...

【MySQL】B+ 树索引

一、索引是什么 ? 为什么需要索引 ? 索引就是目录,目录就是索引。 索引从 InnoDB 存储引擎数据存储结构上来看,就是为各个页建立的目录。保证我们在查询时,可以通过二分法快速定位到页,再在页内通过二分法…...

Android Gradle Plugin Version 和 Gradle Version 的对应关系

官网参考 以下是插件版本和Gradle 版本对应关系: 插件版本所需的最低 Gradle 版本Android Gradle Plugin VersionGradle Version1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.1.3 - 2.2.32.14.1 - 3.52.3.03.33.0…...

更多单词/词组/短语补充和总结(二)

auto 美 /[ˈɔːtoʊ] n.汽车adj.与汽车有关的,汽车的。不要记成“自动的” mobile 美 /[ˈmoʊbl] adj.可移动的;流动的;不要记成“手机”,手机是mobile phone automobile 美 /[ˈɔːtəməbiːl] n.汽车adj.自动的 automatic 美 /[ˌɔːtəˈmtɪk]…...

HEC-HMS和HEC-RAS快速入门、防洪评价报告编制及洪水建模、洪水危险性评价等应用

目录 ①HEC-RAS一维、二维建模方法及实践技术应用 ②HEC-HMS水文模型实践技术应用 ③新导则下的防洪评价报告编制方法及洪水建模实践技术应用 ④基于ArcGIS水文分析、HEC-RAS模拟技术在洪水危险性及风险评估 ⑤山洪径流过程模拟及洪水危险性评价 ①HEC-RAS一维、二维建模方…...

全面了解 B 端产品设计 — 基础扫盲篇

在今天,互联网的影响力与作用与日俱增,除了我们日常生活领域的改变以外,对于商业领域的渗透也见效颇丰。 越来越多的企业开始使用数字化的解决方案来助力企业发展,包括日常管理、运营、统计等等。或者通过互联网的方式开发出新的业务形态,进行产业升级,如这几年风头正劲的…...

顺序表(增删查改)

目录一、什么是顺序表二、顺序表的增删查改2.1 结构体的声明2.2 顺序表的初始化2.3 顺序表检查容量2.4 顺序表尾部插入数据2.5 顺序表头部插入数据2.6 顺序表尾部删除数据2.7 顺序表头部删除数据2.8 顺序表查找数据2.9 顺序表任意位置插入数据2.10 顺序表任意位置删除数据2.11 …...

一款优秀的低代码开发平台是什么样的?

目录 一、一款优秀的低代码平台应该是什么样的? 二、低代码核心能力 01、全栈可视化编程: 02、全生命周期管理: 03、低代码扩展能力: 三、小结 一、一款优秀的低代码平台应该是什么样的? 从企业角度来说&#x…...

ElasticSearch 学习笔记总结(四)

文章目录一、ES继承 Spring Data 框架二、SpringData 功能集成三、ES SpringData 文档搜索四、ES 优化 硬件选择五、ES 优化 分片策略六、ES 优化 路由选择七、ES 优化 写入速度优化七、ES 优化 内存设置八、ES 优化 重要配置一、ES继承 Spring Data 框架 Spring Data 是一个用…...

HDFS文件块大小

HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadooop2X版本中是128M,老版本中是64M。 思考:为什么块的大小不能设置太小&…...

C++——优先级队列(priority_queue)的使用及实现

目录 一.priority_queue的使用 1.1、基本介绍 1.2、优先级队列的定义 1.3、基本操作(常见接口的使用) 1.4、重写仿函数支持自定义数据类型 二.priority_queue的模拟实现 2.1、构造&&重要的调整算法 2.2、常见接口的实现 push() pop() top() empt…...

Linux学习记录——십일 环境变量

文章目录1、认识2、通过代码获取环境变量1、手动获取2、函数获取3、重新认识环境变量1、认识 在云服务器上写程序时,最终的执行需要./文件名,点表示当前目录,/是文件分隔符,之后就会打印程序,这是用户的操作&#xff…...

【人工智能 Open AI 】我们程序员真的要下岗了- 全能写Go / C / Java / C++ / Python / JS 人工智能机器人

文章目录[toc]人工智能 AI Code 写代码测试用golang实现冒泡排序用golang实现计算环比函数goroutine and channel用golang实现二叉树遍历代码用golang实现线程安全的HashMap操作代码using C programming language write a tiny Operation Systemuse C language write a tiny co…...

STM32 EXTI外部中断

本文代码使用 HAL 库。 文章目录前言一、什么是外部中断?二、外部中断中断线三、STM32F103的引脚复用四、相关函数:总结前言 一、什么是外部中断? 外部中断 是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片…...

Mapper代理开发——书接MaBatis的简单使用

在这个mybatis的普通使用中依旧存在硬编码问题,虽然静态语句比原生jdbc都写更少了但是还是要写,Mapper就是用来解决原生方式中的硬编码还有简化后期执行SQL UserMapper是一个接口,里面有很多方法,都是一一和配置文件里面的sql语句的id名称所对…...

实体对象说明

1.工具类层Utilutil 工具顾明思义,util层就是存放工具类的地方,对于一些独立性很高的小功能,或重复性很高的代码片段,可以提取出来放到Util层中。2.数据层POJO对象(概念比较大) 包含了以下POJO plain ord…...

JAVA中加密与解密

BASE64加密/解密 Base64 编码会将字符串编码得到一个含有 A-Za-z0-9/ 的字符串。标准的 Base64 并不适合直接放在URL里传输,因为URL编码器会把标准 Base64 中的“/”和“”字符变为形如 “%XX” 的形式,而这些 “%” 号在存入数据库时还需要再进行转换&…...

改进YOLO系列 | ICLR2022 | OMNI-DIMENSIONAL DYNAMIC CONVOLUTION: 全维动态卷积

单个静态卷积核是现代卷积神经网络(CNNs)的常见训练范式。然而,最近的动态卷积研究表明,学习加权为其输入依赖注意力的n个卷积核的线性组合可以显著提高轻量级CNNs的准确性,同时保持高效的推理。然而,我们观察到现有的作品通过卷积核空间的一个维度(关于卷积核数量)赋予…...

青岛知名网站建设公司/百度推广登录平台网址

导读:一直以来,众多学校教学以及公司开发环境所使用Visual Studio .NET Framework版本多不相同,本文作者比较了.NET Framework多个版本之间的区别,方便各位选择和切换.NET Framework。 版本号发布日期Visual Studio的版本Windows上…...

开发公司采购招聘/seo关键词分析

最近有个概念吵得很火,网络爬虫,但是基本都是用什么python或者JAVA写,貌似很少看到用c写的,我在网上找了一个,看到其实还是很简单的算法。 算法讲解:1.遍历资源网站 2.获取html信息 3.然后解析网址和图片…...

深圳罗湖网站建设公司/湛江百度网站快速排名

1)count(1)与count(*)比较: 1、如果你的数据表没有主键,那么count(1)比count(*)快2、如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快3、如果你的表只有一个字段的话那count(*)就是最快的…...

做策划的网站推广/网站排名掉了怎么恢复

地图图像服务(ImageryService)提供了根据地理位置(经度和纬度)坐标和地图的缩放级别解析出对应于地图图片系统的完整地图数据元数据,包括图片映射地址、图片大小等一系列详细参数。通过该服务的服务接口也可以反向实现…...

怎么在百度建设网站/免费web服务器网站

准备篇: 1、配置防火墙,开启80端口、3306端口 vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #允许80端口通过防火墙 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT #允许3306端…...

爱站网长尾关键词搜索/企业网站设计要求

1、Symbol es6新增的数据类型 1)概念 提供一个独一无二的值 let aSymbol() let bSymbol() 或 let cSymbol.for(c) let dSymbol.for(c) c是一个key,标识着这个独一无二的变量 2、数据结构 1)set Set中的元素不可重复 其长度用.size表征 添加重复元素&…...