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

【操作系统OS】学习笔记第二章 进程与线程(下)【哈工大李治军老师】


基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记,仅进行交流分享。

特此鸣谢李治军老师,操作系统的神作!

如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡>𖥦<)!!

主页专栏有更多,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

第二章 进程与线程(下)

第二章 进程与线程(上):【操作系统】学习笔记:第二章 进程与线程 (上)【哈工大李治军老师】

更多操作系统笔记:【哈工大李治军老师】操作系统笔记专栏汇总


如果有需要markdown或者PDF可以私信我,可以在此基础上自己添加补充笔记(●’◡’●)

进程与线程(下) 目录

  • 第二章 进程与线程(下)
  • 课程链接:
  • 一、CPU调度策略
    • 1.多进程图像与CPU调度
    • 2.如何设计调度算法
    • 3.先到先服务FCFS
    • 4.短作业优先SJF
    • 5.提高响应速度——时间片轮转法RR
    • 响应时间和周转时间同时存在,怎么办?
  • 二、一个实际的schedule函数
    • 优先级动态调整
    • counter作用总结
  • 三、进程同步与信号量
    • 1.进程合作:多进程共同完成一个任务
    • 2.信号量
    • 3.P V操作
  • 四、信号量临界区保护
    • 1.竞争
    • 2.临界区
    • 3.轮换法
    • 4.标记法
    • 5.Peterson算法
    • 6.面包店算法
    • 关中断
    • 硬件原子指令法
  • 五、信号量的代码实现
    • sleep_on:
  • 六、死锁处理
    • 1.环路等待
    • 2.死锁的4个必要条件
    • 3.死锁处理:
      • 1)死锁预防
      • 2)死锁避免
      • 银行家算法
      • 3)死锁检测+恢复
      • 4)死锁忽略

课程链接:

b站: 【哈工大】操作系统 李治军(全32讲)

大学MOOC:大学慕课—操作系统—主讲:哈工大李治军



一、CPU调度策略

1.多进程图像与CPU调度

当PID:1执行结束/阻塞,切换到其他进程去执行

此时2、3都在就绪队列中,应该选择谁执行?——这就是调度策略

image-20230502215921848

例: 两种进程调度策略

image-20230502220208952

调度策略问题很难穷尽,我们研究的就是对一个实际的系统面对这些任务应该如何设计调度算法

2.如何设计调度算法

面对进程:CPU调度的目标应该是进程满意

核心:时间复杂度小,执行速度尽量快

image-20230502221654417

关键问题:操作系统在CPU调度中,需要折中,需要综合

image-20230502224142312

IO约束型任务:需要大量的输入和输出操作,例如从磁盘读取或写入大量数据、向网络发送请求等。这些操作需要较长时间完成,CPU 的使用率较低,因此这种任务的瓶颈通常在于 IO 操作的速度。解决这种任务的方法通常是使用异步 IO 操作,以便在等待 IO 操作完成时释放 CPU 资源。

CPU约束型任务:这种任务通常需要大量的计算,并且需要快速完成,例如图像处理、视频编码、加密解密等。这些操作需要大量的 CPU 时间,因此 CPU 的使用率较高,而 IO 操作通常只是一个辅助操作。解决这种任务的方法是使用多线程或分布式计算,利用多个 CPU 核心同时进行计算,提高计算速度。

3.先到先服务FCFS

平均周转时间即作业从进入系统到完成的时间,完成时间减去到达时间再除以任务个数

计算公式:平均周转时间 = (作业完成时间 - 作业提交时间)/ 作业数

其中,作业完成时间指作业执行完毕的时刻,作业提交时间指作业进入系统的时刻

周转时间越短,系统的效率就越高

image-20230502233357051

4.短作业优先SJF

image-20230502233637544

5.提高响应速度——时间片轮转法RR

RR算法采用抢占式调度,即每个进程被分配一个时间片,当时间片用完后,该进程会被挂起并放回就绪队列,等待下一次调度。同时,RR算法会按照就绪队列中进程的顺序依次调度每个进程。这样,每个进程都能够在一定程度上得到公平的CPU时间,避免了某些进程长时间占用CPU的情况,提高了系统的响应速度和吞吐量。 注意合理设置时间片大小

无论是否执行完一个进程,每次都执行一个时间片,切换下一个时间片执行其他进程

image-20230502234129559

响应时间和周转时间同时存在,怎么办?

Word很关心响应时间,而gcc更关心周转时间,两类任务同时存在怎么办?

一个调度算法让多种类型的任务同时都满意,怎么办?

image-20230502234405974

如果前台任务绝对优先: 会造成饥饿

image-20230502234523546

因此需要对优先级进行动态调整,而后台任务往往响应时间很长

image-20230502234700498

此时应该后台任务执行一段时间,优先级下降,释放出cpu,让前台任务再次执行

既要以轮转调度为核心,又要在轮转调度的基础上增加一些优先级,前台任务与后台任务协调

image-20230502235114077

二、一个实际的schedule函数

优先级动态调整

counter既作为优先级,又作为时间片,只需要维护一个counter变量

image-20230502235455360

image-20230502235702941

image-20230502235713719

counter作用总结

image-20230503000133286

三、进程同步与信号量

1.进程合作:多进程共同完成一个任务

对多个进程的推进需要有合理有序的约束

司机需要等待售票员发出信号:

image-20230503170554310

实例:生产者–消费者

image-20230503170918010

2.信号量

只发信号还不能解决全部问题,单靠counter代表缓冲区空闲的个数还不够,还需要知道有多少个进程在sleep,使用信号量 记录一些更多的信息

image-20230503171340926

使用信号量来表达更丰富的信息,是一个计数器,可以控制对共享资源的访问量

除了睡眠和唤醒,还需要记录其他信息: 量

image-20230503171620977

记录有多少个进程在sleep:1 -> 2 -> 1 -> 0

image-20230503171823884

还有一个空闲缓冲区:

image-20230503172030018

P和C可以根据信号量可以实现进程同步!

如果信号量为负数,-几代表有几个进程在等待

如果信号量为正数,代表有几个资源可以使用

3.P V操作

image-20230503172717899

P:消费资源 减

V:产生资源 加

当缓冲区为空:

多个生产者和多个消费者共享缓冲区。生产者将数据项写入缓冲区中,而消费者则从缓冲区中读取数据项。

计数器 empty用于表示缓冲区中还有多少空闲,full 表示有多少缓冲区已被占用。使用了一个互斥信号量mutex,保证同时只有一个进程能够修改缓冲区的内容。

当生产者要向缓冲区中写入数据时,首先要尝试获取空闲缓冲区的数量(也就是执行 P(empty) 操作)。如果目前empty为 0,则说明缓冲区已满,生产者需要等待某个消费者释放后才能继续写入数据(也就是进入阻塞状态)。

如果目前有空闲缓冲区,则使用互斥信号量(即执行 P(mutex)),将数据写入缓冲区中,

释放互斥信号量(互斥锁)之后,通知消费者此时缓冲区已经有数据可消费(即执行 V(full) 操作),以便消费者读取缓冲区中的数据


当消费者要从缓冲区中读取数据时,首先尝试获取空闲缓冲区的数量(也就是执行 P(full) 操作)。如果目前已经full为 0,则说明缓冲区为空,消费者需要等待某个生产者写入数据后才能继续读取数据(也就是进入阻塞状态)。

如果有已经被写入数据的单元格,则使用互斥信号量(即执行 P(mutex)),将数据从缓冲区中读取出来

消费者将读取的数据项打印出来之后,释放互斥锁并通知生产者目前缓冲区中有空闲的单元格,以便生产者继续写入数据(即执行 V(empty) 操作)。

image-20230503173231177

四、信号量临界区保护

1.竞争

由于共享数据没有保护,造成数据竞争问题:

image-20230503183046161

解决竞争条件的直观想法:上锁

image-20230503183234330

2.临界区

临界区(Critical Section):一次只允许一个进程进入的该进程的那一段代码

保护共享数据——信号量

image-20230503183346584

临界区代码的保护原则

基本原则:

1.互斥进入:如果一个进程在临界区中执行,则其他进程不允许进入

​ 这些进程间的约束关系称为互斥(mutual exclusion)

​ 这保证了是临界区

好的临界区保护原则

2.有空让进:若干进程要求进入空闲临界区时,应尽快使一进程进入临界区

3.有限等待::从进程发出进入请求到允许进入不能无限等待

3.轮换法

每个进程被赋予一个次序号(也称时间片)

所有进程按照次序号依次排队。执行上下文切换时,当前进程将释放 CPU 时间,并将接下来 CPU 时间分配给下一个进程

当某个进程需要访问共享资源(也就是进入临界区)时,它首先要等待一定长度的时间,直到轮到它使用该资源为止

这样,即使多个进程尝试同时进入共享资源,也能够以轮流使用的方式完成。

image-20230503183744235

4.标记法

标记法的flag是 boolean 类型,初始值为 false。当一个进程想要进入临界区时,它首先要获取这个标记变量,并将其设置为 true,表示自己已经进入了临界区。此时,如果有其他进程想要进入临界区,就必须等待当前进程退出临界区并释放这个标记变量。

进程在退出临界区之后,需要将这个标记变量重新设置为 false,以便其他进程可以使用它。如果同时有多个进程试图获取这个标记变量并将其设置为 true,就会出现数据竞争的问题,因此标记法通常要和其它同步机制(如信号量、互斥锁)一起使用。

标记法过度使用可能会导致系统性能下降,因为每个进程都必须轮流尝试获取临界区标志,而这种轮流获取的过程可能导致等待时间过长

image-20230503183830229

可能会导致缓冲区空闲但进程AB都不会执行,因此需要规定名字

image-20230503184009590

image-20230503184241570

5.Peterson算法

Peterson算法通过在临界区的代码中让两个进程轮流执行,保证了不会同时进入临界区的情况。

当其中一个进程想要进入临界区时,另一个进程必须等待,直到当前进程完成临界区的操作并释放它的资源后才能进入,从而避免了死锁和数据竞争问题

Peterson算法维护了两个bool型的变量 turn 和 flag,分别表示当前轮到哪个进程进入临界区,和每个进程是否想要进入临界区:

image-20230503184429975

image-20230503184435914

i的flag为true,表示它想要进入临界区。然后进入 while 循环中进行判断,检查另一个进程 j是否也想要进入临界区,如果 flag[j] 为 true 并且轮到 j 进入临界区(即 turn==j),进程 i 就需要等待。一旦它获得了进入临界区的机会,就可以执行相应操作,并将自己的标志设置为 false,这样进程 j 就可以进入临界区。

6.面包店算法

仍然是标记和轮转的结合

如何轮转: 每个进程都获得一个序号,序号最小的进入

如何标记: 进程离开时序号为0,不为0的序号即标记

面包店: 每个进入商店的客户都获得一个号码,号码最小的先得到服务;号码相同时,名字靠前的先服务

image-20230503184710875

互斥进入: P在临界区内,P试图进入,一定有(num[i],i)<(num[k],k),P循环等待。

有空让进: 如果没有进程在临界区中,最小序号的进程一定能够进入。

有限等待: 离开临界区的进程再次进入一定排在最后(FIFO),所以任一个想进入进程至多等n个进程

关中断

关中断是指在处理器上禁止中断响应,以防止其他进程或线程干扰当前正在执行的进程或线程。

当一个进程或线程需要获取共享资源时,它可以通过关闭中断来确保自己在操作期间不会被中断。

在操作完成之后,它再重新打开中断,使其他进程或线程可以获取和使用共享资源。该机制是基于硬件实现的,并且只能在处理器级别上操作

但是当多个处理器时,关中断无法影响其他处理器中的进程,一个处理器关闭了中断,其他处理器还可以继续运行他们的进程或线程。

image-20230503184955799

硬件原子指令法

硬件原子指令法提供了一组原子性的操作指令,可以在一个确保操作不会被中断的环境下,原子地执行某个操作,避免数据竞争和死锁等问题

image-20230503185305907

五、信号量的代码实现

Semaphore值是否大于0,如果不是,则将自身设为阻塞状态并加入相应的等待队列中,最后调用schedule()函数切换到其他进程或线程来运行。而在sti()指令中断后,Semaphore已经被占用,防止了其他进程或线程的访问。

image-20230503185347238

启动磁盘读以后睡眠,等待磁盘读完由磁盘中断将其唤醒,也是一种同步

image-20230503185430573

sleep_on:

image-20230503185450696

sleep_on形成的队列

image-20230503185535455

六、死锁处理

1.环路等待

如果将信号量顺序交换,生产者和消费者都会阻塞:

image-20230504075129594

我们将这种多个进程由于互相等待对方持有的资源而造成的谁都无法执行的情况叫死锁

image-20230504075714717

2.死锁的4个必要条件

image-20230504075757778

3.死锁处理:

死锁预防

破坏死锁出现的条件

死锁避免

检测每个资源请求,如果造成死锁就拒绝

死锁检测+恢复

检测到死锁出现时,让一些进程回滚,让出资源

死锁忽略

在太阳上可以对火灾全然不顾 就好像没有出现死锁一样

1)死锁预防

在进程执行前,一次性申请所有需要的资源,不会占有资源再去
请其它资源

缺点1: 需要预知未来,编程困难
缺点2: 许多资源分配后很长时间后才使用,资源利用率低

对资源类型进行排序,资源申请必须按序进行,不会出现环路等待

缺点: 仍然造成资源浪费

2)死锁避免

判断此次请求是否引起死锁?

银行家算法

都能执行完成当然就不死锁

如果系统中的所有进程存在一个可完成的执行序列P1,则称系统处于安全状态

image-20230504080653645

image-20230504080806510

请求出现时,首先假装分配,然后调用银行家算法:

image-20230504080858546

3)死锁检测+恢复

发现问题再处理

基本原因: 每次申请都执行O(mn^2),效率低

image-20230504080948544

4)死锁忽略

image-20230504081105037



更多操作系统笔记:【哈工大李治军老师】操作系统笔记专栏汇总



大家的点赞、收藏、关注将是我更新的最大动力!
欢迎留言或私信建议或问题。 大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!

相关文章:

【操作系统OS】学习笔记第二章 进程与线程(下)【哈工大李治军老师】

基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记&#xff0c;仅进行交流分享。 特此鸣谢李治军老师&#xff0c;操作系统的神作&#xff01; 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0…...

Linux命令集(Linux文件管理命令--rmdir指令篇)

Linux命令集&#xff08;Linux文件管理命令--rmdir指令篇&#xff09; Linux文件管理命令集&#xff08;rmdir指令篇&#xff09;5. rmdir(remove directory)1. 删除空的目录 folder12. 强制删除目录 folder1&#xff08;包括非空目录&#xff09;3. 递归删除目录及其目录下所有…...

在技术圈超卷的当下,学历到底是敲门砖还是枷锁?

前言 最近&#xff0c;突然之间被“孔乙己文学”刷屏了&#xff0c;短时间内“孔乙己文学”迅速走红&#xff0c;孔乙己是中国文学中的一位经典人物&#xff0c;他的长衫被认为是他的象征之一&#xff0c;孔乙己的长衫折射出很多现象&#xff0c;既有社会的&#xff0c;也有教育…...

Linux cgroup

前言 Cgroup和namespace类似&#xff0c;也是将进程进程分组&#xff0c;但是目的与namespace不一样&#xff0c;namespace是为了隔离进程组之前的资源&#xff0c;而Cgroup是为了对一组进程进行统一的资源监控和限制。 Cgroup的组成 subsystem 一个subsystem就是一个内核模…...

PID整定二:基于Ziegler-Nichols的频域响应

PID整定二&#xff1a;基于Ziegler-Nichols的频域响应 1参考2连续Ziegler-Nichols方法的PID整定2.1整定方法2.2仿真示例 1参考 1.1根轨迹图的绘制及分析 1.2计算机控制技术01-3.4离散系统的根轨迹分析法 1.3PID控制算法学习笔记 2连续Ziegler-Nichols方法的PID整定 2.1整定…...

【tkinter 专栏】专栏前言

文章目录 前言本章内容导图1. tkinter 工具及特点2. 为什么使用 Python 进行 GUI 设计?2.1 Python 可以做什么2.2 使用 tkinter 可以干什么?3. 如何学习使用 tkinter 进行 GUI 设计?4. 开发环境搭建4.1 Python 的版本4.2 安装 Python4.2.1 下载 Python 安装包4.2.2 安装 Pyt…...

解决Linux中文字体模糊的4种方法

在Linux中&#xff0c;字体是非常重要的一部分&#xff0c;因为它们直接影响到用户的视觉体验。如果Linux字体模糊不清&#xff0c;那么用户将很难阅读文本&#xff0c;这将极大地降低用户的工作效率。本文将介绍Linux Mint中文字体模糊的问题&#xff0c;并提供一些解决方案。…...

【Android入门到项目实战-- 7.3】—— 如何调用手机摄像头和相册

目录 一、调用摄像头拍照 二、打开相册选择照片 学完本篇文章可以收获如何调用手机的摄像头和打开手机相册选择图片功能。 一、调用摄像头拍照 先新建一个CameraAlbumTest项目。 修改activity_main.xml,代码如下&#xff1a; 按钮打开摄像头&#xff0c;ImageView将拍到的…...

浅聊AIOT

引言 IoT是(Internet of Things)的简称&#xff0c;也就是人们常说的物联网&#xff1b;随着智能硬件的发展和推广&#xff0c;制造成本也随之下降&#xff0c;很多的厂家也慢慢地拥抱网络互联&#xff0c;逐步实现设备互联&#xff0c;也就进入了人们常说的万物互联时代。虽然…...

Python之模块和包(九)

1、模块 1、模块概述 模块是一个包含了定义的函数和变量等的文件。模块可以被程序引入&#xff0c;以使用该模块中的函数等功能。通俗讲&#xff1a;模块就好比是工具包&#xff0c;要想使用这个工具包中的工具(就好比函数)&#xff0c;就需要导入这个模块。 2、import 在P…...

C++-----动态规划

目录 一、动态规划的基本思想 二、设计动态规划法的步骤 三、动态规划问题的特征 4.1 矩阵连乘积问题 4.1.1 分析最优解的结构 4.1.2 建立递归关系 4.1.3 计算最优值 4.1.3 计算最优值 4.1.3 构造最优解 4.2 动态规划算法的基本要素 4.2.1 最优子结构 4.2.2 重叠子问题 …...

2.2 Linux控制台访问CLI

系列文章目录 第1章 Linux Shell简介 第2章 Shell基础 <本章所在位置> 第3章 Bash Shell基础命令 第4章 Bash Shell命令进阶 第5章 Linux Shell深度理解 第6章 Linux环境变量 第7章 Linux文件权限 第8章 Linux文件系统的管理 第9章 Linux软件安装 第10章 Linux文本编辑器…...

代码随想录补打卡 509 斐波那契数列

代码如下 //斐波那契数列的第0项是0 第一项是1 func fib(n int) int { if n < 1 { return n } dp : make([]int,n1) dp[0] 0 dp[1] 1 for i : 2 ; i < n ; i { dp[i] dp[i-1] dp[i-2] } return dp[n] } 70 爬楼梯 代码如下 func climbStairs(n int) int …...

【每日一题Day195】LC1003检查替换后的词是否有效 | 栈

检查替换后的词是否有效【LC1003】 给你一个字符串 s &#xff0c;请你判断它是否 有效 。 字符串 s 有效 需要满足&#xff1a;假设开始有一个空字符串 t "" &#xff0c;你可以执行 任意次 下述操作将 t 转换为 s &#xff1a; 将字符串 "abc" 插入到 t…...

简单理解什么是序列化

为什么要序列化 序列化的目的就是为了对象可以在网络层进行传输&#xff0c; 比如通过后端传给前端数据。 什么是序列化 我们以Java为例。 序列化就是把对象转化为可传输的字节序列过程&#xff0c;这个字节序列可以是字符串&#xff0c;比如JSON格式的字符串&#xff0c;把…...

Django初识

1、简介 Django&#xff0c;是用python语言写的开源web开发框架&#xff0c;并遵循MVC设计。劳伦斯出版集团为了开发以新闻内容为主的网站&#xff0c;而开发出来了这个框架&#xff0c;于2005年7月在BSD许可证下发布。这个名称来源于比利时的爵士音乐家DjangoReinhardt&#…...

ARM嵌入式编译器-volatile关键字对编译器优化的影响

volatile限定符告知计算机&#xff0c;其他agent&#xff08;而不是变量所在的程序&#xff09;可以改变该变量的值。通常它被用于硬件地址以及在其他程序或同时运行的线程中共享数据。要求编译器不要对其描述的对象作优化处理&#xff0c;对它的读写都需要从内存中访问。 使用…...

销售数据分析怎么做?这篇文章说清楚了

如何分析销售数据&#xff1f;分析销售数据有哪些指标&#xff1f;销售数据分析有什么作用&#xff1f; 销售数据是不是得通过数据分析软件啊&#xff1f; 本文将为您解答疑惑—— 一、分析销售数据的指标 从两个层面上来讲&#xff0c;一个是对销售情况的整体把控&#xf…...

二十六、ISIS技术总结

文章目录 ISIS 概述一、路由协议总结1、路由优先级2、分类 二、ISIS 协议特点1、特点2、ISIS 路由器的种类 三、ISIS 配置1、基础配置2、network-entity含义3、router id 和系统id转换规则 四、ISIS 开销计算1、Narrow 模式2、Wide 模式 五、 ISIS 和 OSPF 的区别 ISIS 概述 I…...

三菱m70 m80系统解密 三菱m80机床到期解锁

我们从操作系统的发展讲起&#xff0c;为什么要有线程这个概念出现。《Java多线程学习笔记(一) 初遇篇》讲Java平台下的线程&#xff0c;如何使用和创建&#xff0c;以及引入线程后所面临的问题&#xff0c;为了解决线程安全问题&#xff0c;Java引入的机制&#xff0c;这也是《…...

InnoDB 磁盘结构之数据字典和双写缓冲区

数据字典&#xff08;InnoDB Data Dictionary&#xff09; MySQL中&#xff0c;数据字典包括了: 表结构、数据库名或表名、字段的数据类型、视图、索引、表字段信息、MySQL版本信息、存储过程、触发器等内容 InnoDB数据字典由内部系统表组成&#xff0c;这些表包含用于查找表…...

Django模型层part two - 多表关系创建和多表操作

前言 继续上面一篇文章的内容&#xff0c;本文介绍多表操作。使用django ORM可以创建多表关系&#xff0c;并且也支持多张表之间的操作&#xff0c;以创建表关系和查询两部分说明django ORM的多表操作。以作者、图书、出版社和作者信息几张表作为案例进行说明。 创建表关系 …...

智能优化算法:浣熊优化算法-附代码

智能优化算法&#xff1a;浣熊优化算法 文章目录 智能优化算法&#xff1a;浣熊优化算法1.浣熊优化算法1.1 初始化1.2 阶段一&#xff1a;狩猎和攻击&#xff08;探索阶段&#xff09; 2.实验结果3.参考文献4. Matlab 摘要&#xff1a;浣熊优化算法&#xff08;Coati Optimizat…...

【51单片机】数码管显示(样例展示以及异常分析)

🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 ⭐数码管 比如要显示“6”,那么下面图片中,AFEDCG=1,B=0 对应到数码管上,就是 ⭐原理 🎊P22~P24控制LED1~...

Android InputChannel事件发送接收系统分析

本文基于Android12。 InputChannel表示其他进程通过文件描述符传递输入事件到View的通道&#xff0c;因为需要跨进程传输&#xff0c;实现了Parcelable序列化接口&#xff0c;所以也能够理解Java层的InputChannel后面为什么使用copyTo()方法初始化。 输入事件的接收方是View&…...

Java时间类(五)-- LocalDate()类

目录 引言: 1. LocalDate的概述: 2. LocalDate的常用方法: 引言: (1)Date存在的缺陷: 如果不格式化,打印出的日期可读性差://获取当前时间Date date = new Date();System.out.println("date = " + date); //date = Wed May 03 22:30:24 CST...

用手机号码归属地 API 开发的应用推荐

引言 手机号码归属地 API是一种提供手机号码归属地信息的接口&#xff0c;通过该接口&#xff0c;可以获取手机号码所属的省份、城市、运营商等信息。它可以帮助企业更好地了解客户&#xff0c;为个性化推荐和精准广告投放提供数据支持。作为一种数据服务&#xff0c;手机号码…...

测试从业第 3 年,我看到了终点......

先说明&#xff0c;今天的内容&#xff0c;是写给想成为高级测试开发、自动化测试专家的人看的&#xff0c;因为&#xff0c;它可能颠覆你的认知。 众所周知&#xff0c;如今无论是大厂还是中小厂&#xff0c;自动化测试基本是标配了&#xff0c;毕竟像双11、618 这种活动中庞…...

结巴分词原理分析

结巴分词器工作原理 结巴分词是一款python写成的开源中文分词器&#xff0c;分词过程大致如下&#xff1a; 首先&#xff0c;结巴使用正则表达式将输入文本切割成若干中文块&#xff0c;接着对每个中文块B做处理&#xff0c;将B转成有向无环图(DAG)。DAG是以{key:list[i,j...…...

JavaEE 第三-四周

计算机Z20-第3-4周作业 总分&#xff1a;100分 得分&#xff1a;74.2分 1 . 填空题 简单 5分 在web.xml文件中&#xff0c;<url-pattern>/xxxxServlet</url-pattern>中的第一个‘/’表示__________。 学生答案 当前web应用程序的根目录 2 . 填空题 简…...

网站建设推广文案/百度浏览器app下载

前言 在深入之前先了解下下ReentrantLock 和 Condition: 重入锁ReentrantLock: ReentrantLock锁在同一个时间点只能被一个线程锁持有&#xff1b;而可重入的意思是&#xff0c;ReentrantLock锁&#xff0c;可以被单个线程多次获取。 ReentrantLock分为“公平锁”和“非公平锁”…...

网站突然消失了/域名怎么注册

构造思路&#xff1a; 1.socket 连接获取 Banner --> 2.与存在漏洞的 Banner 集合进行对比 中间细节&#xff1a; 1.需要判断用户所给参数是否存在且是否有读权限 2.需要判断 Banner 是否存在&#xff0c;处理异常 学习 os sys socket 各个模块的基本使用 直接上代码&…...

国外网站建设软件有哪些/东莞网络推广托管

在进行Linux 操作的时候&#xff0c;我们常常需要反选操作&#xff0c;下面以删除文件的场景&#xff0c;去示例如何在Linux 命令中使用反选操作反选操作的几种思路1.利用 grep -v 反选操作 (推荐&#xff0c;支持正则表达式)2.shopt -s extglob (打开extglob模式)&#…...

网站改版iis301跳转如何做/seo关键词优化要多少钱

2020考研复试备考第9周总结 又一个星期过去了。复试的消息仍然没有传出来。感觉这个星期挺累的&#xff0c;但好像也没做多少事情。今天参加了优秀毕业生的答辩&#xff0c;自己的确没有什么突出的点&#xff0c;老师连提问都省了&#xff0c;就直接讲了1分多钟&#xff0c;结…...

公司做网站怎么样/网站seo批量查询工具

智慧 毅力 无所不能 正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性... Lua和C交互详细总结 转自&#xff1a;http://cn.cocos2d-x.org/tutorial/show?id1474 一、Lua堆栈 要理解Lua和C交互&#xff0c;首先要理解Lua堆栈。 简单来说&#xff0…...

女教师网课入侵录屏 /seo教程之关键词是什么

第三章 日子过得就像那些不眠的晚上&#xff0c;她嚼着口香糖对墙满谈着理想。——————赵雷《成都》 NOIP过后我认识到了自己有多么菜&#xff0c;我换了座&#xff0c;到了靠窗户那排。 大王开始给我们介绍一些高端算法&#xff0c;那些日子都是在luogu试炼场刷动态规划&a…...