Nowcoder专项练习:操作系统(二)

2023-11-12

1,动态重定位分区分配算法

虽然动态分区法比固定分区法的内存利用率高,但它还是有零头(碎片)的问题。

  • 动态重定位分区分配算法与动态分区分配算法基本上相同,差别仅在于:在这种分配算法中,添加了紧凑功能
  • 通常,在找不到足够大的空闲分区来满足用户需求时进行紧凑。
  • 在紧凑过程中,因为内存中已经存在的作业需要 “ 移动 ” ,因而其中所有关于地址的项均需得到相应的修改,也就是需要进行地址重定位

2,互斥段与信号量的范围

在有 n 个进程共享一个互斥段,如果最多允许 m 个进程 (m<n) 同时进入互斥段,则信号量的变化范围是什么?

允许m个进程同时进入互斥段,说明初始值为m,当进入m后,剩下n-m个等待进入,因此范围为 -(n-m)~m


3,被抢占时的保存内容

在抢占式多任务处理中,进程被抢占时,哪些运行环境需要被保存下来?

  • 所有CPU寄存器的内容
  • 页表
  • 程序计数器

大多数进程是没有特定时间约束的普通进程,但仍然可以根据重要性来分配优先级,这种方案称之为"抢占式多任务处理(preemptive multitasking)",各个进程都分配到一定的时间段可以执行。

时间段到期后,内核会从进程回收控制权,让"下一个进程(由调度器决定)"。被抢占进程的运行环境,即所有CPU寄存器、页表都会保存起来,因此上一个进程的执行结果不会丢失。在之前被抢占的进程恢复执行时,其进程环境可以完全恢复。

简单来说,只保存自己的东西,公共的东西轮不到某个进程却保存。


4,平均访问磁盘次数

一个文件系统中,FCB 占64B,一个盘块大小为1KB,采用一级目录,假定文件目录中有3200个目录项,则查找一个文件平均需要多少次访问磁盘?

分析:FCB是存储在磁盘盘块的。本题主要还是考察名词辨析:文件目录=FCB的集合文件目录项=FCB,因此由FCB的大小以及目录项的个数可以得到的是文件目录共占用多少磁盘块。3200×64B÷1KB=200,也即共用了200个磁盘块存储文件目录项。
一个磁盘块上存储多个FCB,并不是每个目录项都访问磁盘查找一次,那样太慢了,整个机器都会被拖死。比较好的做法是将一个磁盘块调入内存。实际生活中磁盘的块大小和内存的页是一致的。因此,访存和访盘的次数是不一样的,因为内存可以很快,所以多访问几次没有关系,而磁盘访问一次都是一次长途奔袭,过于辛苦,因此减少访盘次数是需要特别考虑的。这里我们如果明晰:把一个磁盘块调入内存,那么问题就很简单了:平均访问200÷2=100次磁盘。
严格来说是201÷2=100.5次,因为按照公式,平均启动磁盘次数为(N+1)/2次,其中N为盘块个数。
因为是求平均数,因此最好的情况就是一次找到,最坏的情况就是找了200次,所以是(1+200)/2 = 100.5次。

换个角度理解,一个文件目录项对应一个文件控制块,我们查找一个文件通过查找它的目录即可。顺序查找目录表平均需要查找1600次,一个磁盘块大小为1KB,一个文件控制块大小为64B,一个磁盘块中有1KB/64B=16个文件控制块,相当于查找了1600/16=100个磁盘。


5,收回空闲区的变化

可变分区存储管理在收回一个空闲区后,空闲区数目可能会怎样?

  • 当该空闲区上下都没有空闲区时,数目增加一个;
  • 当该空闲区上下都有空闲区时,数目减少一个;
  • 当该空闲区上面或者下面有空闲区时,数目不变;

在分区分配方案中,回收一个分区时有几种不同的邻接情况,在各种情况下应如何处理? 答:有四种:上邻,下邻,上下相邻,上下不相邻。
(1)回收分区的上邻分区是空闲的,需要将两个相邻的空闲区合并成一个更大的空闲区,然后修改空闲区表。
(2)回收分区的下邻分区是空闲的,需要将两个相邻的空闲区合并成一个更大的空闲区,然后修改空闲区表。
(3)回收分区的上、下邻分区都是空闲的(空闲区个数为2),需要将三个空闲区合并成一个更大的空闲区(空闲区个数为1 ),然后修改空闲区表、
(4)回收分区的上、下邻分区都不是空闲的,则直接将空闲区记录在空闲区表中。


6,线程的状态

  1. 新建(new) :新创建了一个线程对象。
  2. 可运行(runnable) :线程对象创建后,其他线程(比如main线程)调用了该对象的**start()**方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权 。
  3. 运行(running) :可运行状态( runnable) 的线程获得了cpu 时间片(timeslice) ,执行程序代码。
  4. 阻塞(block) :阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入 可运行(runnable) 状态,才有机会再次获得cpu timeslice 转到 运行(running) 状态。阻塞的情况分三种:
    (一). 等待阻塞: 运行(running) 的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
    (二). 同步阻塞: 运行(running) 的线程在获取对象的
    同步锁
    时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
    (三). 其他阻塞: 运行(running) 的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入 可运行(runnable) 状态。
  5. 死亡(dead) :线程run()main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

7,线程的共享

在支持多线程的系统中,进程P创建的若干个线程,其中可以共享的是:

  • 进程P的代码段
  • 进程P中打开的文件
  • 进程P的全局变量

进程P中某线程的栈指针是不能共享的。


8,信号量的表示

若信号量的初始值为2,当前值为-2,则表示等待的进程个数是多少个?

若信号量为正则表示资源数,若为负则其绝对值表示等待的进程数。

因此,此时等待的进程个数为2个。


9,死锁小结

死锁
定义:

在一个进程集合中,所有的进程都在等待只能由该进程集合中的其它进程才能引发的事件,这就是死锁

解释:

由于进程集合中的所有进程都在等待集合中的其它进程引发唤醒该进程的事件,所以所有进程都会阻塞而无法向前推进。
一般大多数的等待事件都是释放进程集合中其它进程所占有的资源,也叫资源死锁

资源死锁的四大必须条件
1,互斥条件:
每个资源要么已经分配给了一个进程,要么是可用的。即就是资源非共享。

2,占有和等待条件:
已经得到资源的进程还能继续请求新的资源。

3,不可抢占条件:
当一个资源分配给了一个进程后,其它需要该资源的进程不能强制性获得该资源,除非该资源的当前占有者显示地释放该资源。

4,环路等待:
死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,环路上的每个进程都在等待下一个进程所占有的资源。

死锁预防:

防止死锁的发生只需破坏死锁产生的四个必要条件之一即可。
1, 破坏互斥条件
如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性。

2,破坏不剥夺条件
当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。
该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。

3, 破坏请求和保持条件
釆用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。
这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。

4,破坏循环等待条件
为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。
这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使用资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。

死锁避免

避免死锁同样是属于事先预防的策略,但并不是事先釆取某种限制措施破坏死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。这种方法所施加的限制条件较弱,可以获得较好的系统性能。
1,系统安全状态
避免死锁的方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程; 否则,让进程等待。

所谓安全状态,是指系统能按某种进程推进顺序( P1, P2, …, Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称 P1, P2, …, Pn 为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。

并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可以避免进入死锁状态。

1,银行家算法
银行家算法是最著名的死锁避免算法。它提出的思想是:把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

死锁检测

前面绍的死锁预防和避免算法,都是在为进程分配资源时施加限制条件或进行检测,若系统为进程分配资源时不釆取任何措施,则应该提供死锁检测和解除的手段。
资源分配图
在这里插入图片描述
系统死锁,可利用资源分配图来描述。如上图所示,用圆圈代表一个进程,用框代表一类资源。由于一种类型的资源可能有多个,用框中的一个点代表一类资源中的一个资源。从进程到资源的有向边叫请求边,表示该进程申请一个单位的该类资源;从资源到进程的边叫分配边,表示该类资源已经有一个资源被分配给了该进程。
在上图所示的资源分配图中,进程P1已经分得了两个R1资源,并又请求一个R2 资源;进程P2分得了一个R1和一个R2资源,并又请求一个R1资源。

可以通过将资源分配图简化的方法来检测系统状态S是否为死锁状态。简化方法如下:

  1. 在资源分配图中,找出既不阻塞又不是孤点的进程Pi( 即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有空闲资源数量。若所有的连接该进程的边均满足上述条件,则这个进程能继续运行直至完成,然后释放它所占有的所有资源) 。消去它所有的请求边和分配边,使之成为孤立的结点。在图(a)中,P1是满足这一条件的进程结点,将P1的所有边消去,便得到图(b)所示的情况。

  2. 进程Pi所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。在上图中,进程P2就满足这样的条件。根据第1) 条中的方法进行一系列简化后,若能消去图中所有的边,则称该图是可完全简化的,如图©所示。
    在这里插入图片描述

S为死锁的条件是当且仅当S状态的资源分配图是不可完全简化的,该条件为死锁定理

死锁解除

一旦检测出死锁,就应立即釆取相应的措施,以解除死锁。死锁解除的主要方法有:

1,资源剥夺法。挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。
2,撤销进程法。强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
3,进程回退法。让一个或多个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。


10,进程间通信

UNIX中有如下的通信方式:

  1. 文件和记录锁定
    为避免两个进程间同时要求访问同一共享资源而引起访问和操作的混乱,在进程对共享资源进行访问前必须对其进行锁定,该进程访问完后再释放。这是UNIX为共享资源提供的互斥性保障。
  2. 管道
    管道一般用于两个不同进程之间的通信。当一个进程创建一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。
  3. FIFO
    FIFO是一种先进先出的队列。它类似于一个管道,只允许数据的单向流动。每个FIFO都有一个名字,允许不相关的进程访问同一个FIFO。因此也成为命名管。
  4. 消息队列
    UNIX下不同进程之间可实现共享资源的一种机制;UNIX允许不同进程将格式化的数据流以消息形式发送给任意进程。对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制。通过使用消息类型,进程可以按任何顺序读消息,或为消息安排优先级顺序。
  5. 信号灯
    作为进程间通讯的一种方法,它不是用于交换大批数据,而用于多进程之间的同步(协调对共享存储段的存取)。
  6. 共享内存
    通过信号灯实现存储共享(类似“红灯停、绿灯行”)

在这里插入图片描述


10,i++与双线程

i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?

i++只需要执行一条指令,并不能保证多个线程i++,操作同一个i,可以得到正确的结果。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,这需要至少3步。从这个意义上讲,i++不能算做是原子操作。

当CPU是多核时,最小值为2,最大值为200
如此,假设两个线程的执行步骤如下:

  1. 线程A执行第一次i++,取出内存中的i,值为0,存放到寄存器后执行加1,此时CPU1的寄存器中值为1,内存中为0;
  2. 线程B执行第一次i++,取出内存中的i,值为0,存放到寄存器后执行加1,此时CPU2的寄存器中值为1,内存中为0;
  3. 线程A继续执行完成第99次i++,并把值放回内存,此时CPU1中寄存器的值为99,内存中为99;
  4. 线程B继续执行第一次i++,将其值放回内存,此时CPU2中的寄存器值为1,内存中为1;
  5. 线程A执行第100次i++,将内存中的值取回CPU1的寄存器,并执行加1,此时CPU1的寄存器中的值为2,内存中为1;
  6. 线程B执行完所有操作,并将其放回内存,此时CPU2的寄存器值为100,内存中为100;
  7. 线程A执行100次操作的最后一部分,将CPU1中的寄存器值放回内存,内存中值为2;
  8. 结束!

当CPU单核时,最小值是100,最大值为200
两个线程分别记为线程1和线程2,i++相当于取出i的值,加1,再放回去
第一种极端情况:每次线程一取出i的值后CPU时间切换到线程二,线程二也取出i的值,取到的值和线程一相等,线程二给i加一后放回去,线程一也将i加一后放回去,放回去的值也相等,相当于两个线程都执行一次i++操作,i的值只增加1,这样操作100次i的值为100。
第二种极端情况:线程一和线程二间隔操作,即线程一对i++操作完成,把已经加一的数据放回去之后线程二再操作,轮流进行,最后每个线程都对i加了100次,i的值为200。


11,设备分配策略

与设备分配策略有关的因素有:

  • 设备固有属性
  • 设备分配算法
  • 设备分配的安全性
  • 设备额独立性

12,页面置换算法的缺页率

  • FIFO:先进先出算法,这种调度算法最简单,缺页率最高。
  • OPT:理想型淘汰算法(optimal replacement algorithm),该算法淘汰在访问串中将来再也不出现的或者在离当前最远的位置上出现的页,遗憾的是,这种算法无法实现,因为它要求必须预先知道每一个进程的访问串。
  • LRU:最近最久未使用算法(least recently used),当需要淘汰某一页时,选择离当前时间最近的一段时间内最久没有使用过的页先淘汰。

13,PCB中的信息

存放进程的管理和控制信息的数据结构称为进程控制块(PCB)

它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。

在不同的操作系统中对进程的控制和管理机制不同,PCB中的信息多少也不一样,通常PCB应包含如下一些信息:

1、进程标识符 name:
每个进程都必须有一个唯一的标识符,可以是字符串,也可以是一个数字。UNIX系统中就是一个整型数。在进程创建时由系统赋予。

2、进程当前状态 status:
说明进程当前所处的状态。为了管理的方便,系统设计时会将相同的状态的进程组成一个队列,如就绪进程队列,等待进程则要根据等待的事件组成多个等待队列,如等待打印机队列、等待磁盘I/O完成队列等等。

3、进程相应的程序和数据地址:
以便把PCB与其程序和数据联系起来。

4、进程资源清单:
列出所拥有的除CPU外的资源记录,如拥有的I/O设备,打开的文件列表等。

5、进程优先级 priority:
进程的优先级反映进程的紧迫程序,通常由用户指定和系统设置。UNIX系统采用用户设置和系统计算相结合的方式确定进程的优先级 。

6、CPU现场保护区 cpustatus:
当进程因某种原因不能继续占用CPU时(等待打印机),释放CPU,这时就要将CPU的各种状态信息保护起来,为将来再次得到处理机恢复CPU的各种状态,继续运行。

7、进程同步与通信机制:
用于实现进程间互斥、同步和通信所需的信号量等。

8、进程所在队列PCB的链接字:
根据进程所处的现行状态,进程相应的PCB参加到不同队列中。PCB链接字指出该进程所在队列中下一个进程PCB的首地址。

9、与进程有关的其他信息。:
如进程记账信息,进程占用CPU的时间等


14,进程优先级

确定进程优先级的三个方面:

  1. 进程类型,系统进程(如接受进程,对换进程,磁盘I/o进程)的优先权高于一般用户进程的优先权。
  2. 进程对资源的需求,进程估计执行时间及内存需要量少的进程应赋予较高优先权。
  3. 用户要求

一般来说,计算进程会占用大量的cpu时间,而i/o大的会占用较少的cpu资源,相当于短作业,所以应该优先权更高。


15,寄存器、页号与分块

某页式存储管理系统中,地址寄存器长度为24位,其中页号占14位,则主存的分块大小是多少字节?

地址寄存器长度为24位,其中页号占14位,则页内地址占10位,分页大小与主存块大小相同,因此, 主存的分块大小是210字节。


16,线程相关

对于线程而言:

  • 线程不拥有系统资源,但是可以拥有一点运行时必不可少的资源(比如线程栈),但它可以使用所属进程的资源。
  • 由于同一进程中的多个线程共享该进程的地址空间,所以它们间的同步和通信也易于实现。
  • 进程创建与线程创建以及进程切换与线程切换的时空开销并不相同。

17,信号量

信号量是表示资源的物理量,它只能供P操作和V操作使用,利用信号量S的取值表示共享资源的使用情况,或用它来指示进程之间交换的信息。在具体使用中,把信号量S放在进程运行的环境中,赋予其不同的初值,并在其上实施P操作和V操作,以实现进程间的同步和互斥。P、V操作是定义在信号量S上的两个操作原语:
P(S):
(1) S←S-1;
(2) 若S≥0,则调用P(S)的这个进程继续被执行;
(3) 若S<0,则调用P(S)的这个进程被阻塞,并将其插入到等待信号量S的阻塞队列中。
V(S):
(1) S←S+1;
(2) 若S>0,则调用P(S)的这个进程继续被执行;
(3) 若S≤0,则先从等待信号量S的阻塞队列中唤醒队首进程,然后调用V(S)的这个进程继续执行。
信号量S>0时的数值表示某类资源的可用数量,执行P操作意味着申请分配一个单位的资源,故执行S减l操作,若减1后S<0,则表示无资源可用,这时S的绝对值表示信号量S对应的阻塞队列中进程个数。执行一次V操作则意味着释放一个单元的资源,故执行S增1操作,若增1后S≤0,则表示信号量S的阻塞队列中仍有被阻塞的进程,故应唤醒该队列上的第一个阻塞进程。

信号量大于0 表示该资源的可用数目
信号量小于0 表示等待该资源的进程数为绝对值的s
信号量等于0 表示该时刻系统中既没有剩余该资源可以利用也没有等待该资源的进程

  • 对于记录型信号量,当 s<0 的时候,请求进程会阻塞;s=0,表示资源全部用完,没有进程阻塞。
  • 对于整型信号量,当s<=0的时候,请求进程不会阻塞,而是进入盲等状态。

18,信息表

操作系统为了管理进程和资源,需要构造和维护的信息表有:

  • I/O表
  • 文件表
  • 内存表
  • 进程表

19,临界区

临界区:每个进程中访问临界资源的那段程序叫做临界区。

进程对临界区的访问必须互斥,每次只允许一个进程进去临界区,其他进程等待


20,内部碎片与外部碎片

在内存管理中:

  • 内部碎片是已经被分配出去的的内存空间大于请求所需的内存空间。
  • 外部碎片是指还没有分配出去,但是由于大小太小而无法分配给申请空间的新进程的内存空间空闲块。
存在内部碎片 存在外部碎片
固定分区 可变式分区
页式虚拟存储系统 段式虚拟存储系统

为了有效的利用内存,使内存产生更少的碎片,要对内存分页,内存以页为单位来使用,最后一页往往装不满,于是形成了内部碎片。 为了共享要分段,在段的换入换出时形成外部碎片,比如5K的段换出后,有一个4k的段进来放到原来5k的地方,于是形成1k的外部碎片。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nowcoder专项练习:操作系统(二) 的相关文章

随机推荐

  • 识别视频声音内容添加字幕

    最近有看到这个需求 想着怎么实现一下 做到这个功能主体上也就几步 声音识别生成字幕 识别视频内的声音内容转成字幕文件 这一步有可能需要先将音频从视频中剥离出来 可以用ffmpeg来实现 声音转化成字幕的方法 网上查到可用的方法有以下几种 百
  • vue-架构与思想-MVVM模式和MVC模式的区别

    今天又重新捡起Vue 想用vue做个自己的应用 作为一个后台服务的se 对前台一直是很苦恼的 然后按着这个思路就干起来了 当然就遇到了这个问题 MVVM到底是什么 MVC当然是清楚的 那么找了些资料 学习以记之 与君共享 1 MVVM模式和
  • (二十七)admin-boot项目之集成websocket实时推送消息

    文章目录 二十七 集成websocket实时推送消息 一 rabbitmq推送方案 二 websocket方案 mica mqtt core 三 mica mqtt方案测试 二十七 集成websocket实时推送消息 基础项目地址 http
  • 使用Settings Sync扩展同步VSCode配置

    声明 本文全部内容为原创内容 禁止在未经授权的情况下进行任何二次创作和修改 转载请注明出处 摘要 VSCode是一个广泛使用的开源代码编辑器 因为支持Windows Mac OS X和Linux的多平台的特性而广受欢迎 由于大量扩展的支持
  • 一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)

    索引 一 总览 1 1 简介 1 2 LCD1602主要参数 二 管脚介绍 三 时序图 3 1 写操作时序 3 2 读操作时序 3 3 时序时间参数 四 命令与数据 以使用4位数据模式为例 4 1 前期准备 4 2 写入命令 命令表 4 3
  • 蓝牙Mesh LPN节点

    选择LPN模式的原因 能有效的降低产品功耗 比如 一个温湿度传感器产品 需要超过设定阈值才会从上送数据 这样就没有长时间唤醒时间 就无法接收到网关下发的设置数据 这时候就需要LPN模式 LPN的节点正常还是超过阈值才会上报数据 然后会过一段
  • react 精华之react-router .HashRouter 还是 BrowserRouter . 动态路由是根据变量决定这个路由是否需要进行

    随着 AJAX 技术的成熟 现在单页应用 Single Page Applicatio 已经是前端网页界的标配 名为 单页 其实在设计概念上依然是多页的界面 只不过从技术层面上页之间的切换是没有整体网页刷新的 只需要做局部更新 要实现 单页
  • LLVM SSA 介绍

    最近做研究碰到了一个难题 需要对程序变量按生命期进行重命名 考虑到 SSA 中一个变量在不同的程序分支中赋值时会进行重命名 因此打算以此作为参考 看看能否采取同样的方法达到目的 由于之前看到的文档中都说 LLVM IR 是 SSA 形式的
  • 如何管理软件开发项目中,需求频繁的变更。

    在开发项目过程中 用户随时会提出一些新的需求 要求开发人员解决 这些需求的提出 有时在开发阶段中有时在开发阶段后 这种在需求分析的两个相邻子阶段中 或者在迭代周期的需求分析中 后一段或周期的需求分析结果与前一次不一致 我们把这种不一致称为需
  • 【项目经验】:项目中下拉框数据太多造成页面卡顿(二)

    一 项目需求 下拉框下拉列表数据是由后端返回的 而且他会变化 所以数据不是写死的而且数据量大 上一篇博客http t csdn cn sSNTa我们是用的数据懒加载的方式 这次我们使用远程搜索的方式解决这个问题 二 用到的组件方法介绍 fi
  • 思维导图使用技巧:手把手教你怎么画思维导图 #CSDN博文精选# #系统化学习# #IT技术# #知识图谱#

    大家好 我是小C 又见面啦 文章过滤器 精选大咖干货 助力学习之路 5天20篇CSDN精选博文带你掌握系统化学习方法 专栏将挑选有关 系统化学习方法 的20篇优质文章 帮助大家掌握更加科学的学习方法 在这里 你将收获 快速掌握系统化学习的理
  • C++打印日期

    题目描述 给出年分m和一年中的第n天 算出第n天是几月几号 输入描述 输入包括两个整数y 1 lt y lt 3000 n 1 lt n lt 366 输出描述 可能有多组测试数据 对于每组数据 按 yyyy mm dd的格式将输入中对应的
  • 【数据结构】二叉搜索树

    二叉搜索树的概念 二叉搜索树又称为二叉排序树 它或者是一棵空树 或者是具有以下性质的二叉树 若它的左子树不为空 则左子树上所有结点的值都小于根结点的值 若它的右子树不为空 则右子树上所有结点的值都大于根结点的值 它的左右子树也分别是二叉搜索
  • windows-cmd下添加、删除和修改静态路由

    1 添加一条路由表 route add 192 168 20 0 mask 255 255 255 0 192 168 4 1 metric 2 if 2 命令说明 添加一条路由记录 所有到192 168 20 0 24网段的数据包 都通过
  • 【计算机网络系列】数据链路层①:数据链路层的三个基本问题(封装成帧、透明传输和差错检测)

    数据链路层最重要的内容是 数据链路层的点对点信道和广播信道的特点 以及这两种信道所使用的协议 PPP协议以及CSMA CD协议 的特点 数据链路层的三个基本问题 封装成帧 透明传输和差错检测 以太网MAC层的硬件地址 适配器 转发器 集线器
  • oracle无法减小列长度,中国港湾扩展表单分配时调整字段后保存时报错,无法正常维护表单定义...

    版本号 7 0 4 业务场景 如下 中国港湾扩展表单分配时调整字段后保存时报错 无法正常维护表单定义 异常提示 异常信息 添加业务实体的时候出错 导致错误的应用程序或对象的名称 Genersoft Platform RuntimeADP C
  • NodeJS使用JWT

    JWT jsonwebtoken 目前最流行的跨域身份验证解决方案 在nodejs中使用 安装 npm install jsonwebtoken save 使用 1 在路由中引入 var jwt require jsonwebtoken 2
  • UML 类图

    参考地址 UML类图 简书 一 类图的属性 1 写法格式 属性 方法名 类型 2 权限符号 表示private 表示protected 表示default 也就是包权限 下划线表示static 斜体表示抽象 二 类的关系 1 泛化 Gene
  • 华为OD机试真题- 喊7的次数重排-2023年OD统一考试(B卷)

    题目描述 喊7是一个传统的聚会游戏 N个人围成一圈 按顺时针从1到N编号 编号为1的人从1开始喊数 下一个人喊的数字为上一个人的数字加1 但是当将要喊出来的数字是7的倍数或者数字本身含有7的话 不能把这个数字直接喊出来 而是要喊 过 假定玩
  • Nowcoder专项练习:操作系统(二)

    1 动态重定位分区分配算法 虽然动态分区法比固定分区法的内存利用率高 但它还是有零头 碎片 的问题 动态重定位分区分配算法与动态分区分配算法基本上相同 差别仅在于 在这种分配算法中 添加了紧凑功能 通常 在找不到足够大的空闲分区来满足用户需