- 博客(465)
- 资源 (8)
- 收藏
- 关注
原创 操作系统3:进程同步和经典的进程同步问题
系统中的各种硬件资源和软件资源均可用数据结构抽象地描述其资源特性,即用少量信息和对该资源所执行的操作来表示该资源,而忽略它们的内部结构和实现细节。// 资源可以被抽象因此,可以利用共享数据结构抽象地表示系统中的共享资源,并且将对该共享数据结构实施的特定操作定义为一组过程。进程对共享资源的申请、释放和其它操作必须通过这组过程,间接地对共享数据结构实现操作。
2023-06-28 18:02:04 2160
原创 操作系统6:处理机的任务调度和进程调度
在多道程序系统中,调度的实质是一种资源分配,处理机调度是对处理机资源进行分配。处理机调度算法是指根据处理机分配策略所规定的处理机分配算法。// 资源分配。
2023-06-25 10:02:37 688
原创 操作系统2:进程的描述与控制
前趋图(Precedence Graph),是指一个有向无循环图,可记为DAG(DirectedAcyclic Graph),它用于描述进程之间执行的先后顺序。// 描述工具注意,前趋图中是不允许有循环的,否则必然会产生不可能实现的前趋关系。如图 2-1(b) 所示的前趋关系中就存在着循环。它一方面要求在 S3 开始执行之前 S2 必须完成,另一方面又要求在 S2 开始执行之前,S3 必须完成。显然,这种关系是不可能实现的。// 前驱图不允许循环程序顺序执行。
2023-06-17 17:08:45 744
原创 操作系统1:操作系统的基本特征和主要功能
操作系统是一组能有效地组织和管理计算机硬件和软件资源,合理地对各类作业进行调度,以及方便用户使用的程序的集合。
2023-06-08 10:42:19 3755
原创 数据结构之二叉树(Binary Tree)详解
二叉树(Binary Tree)是一种常见的树状数据结构,它由一组节点组成,这些节点通过边连接起来。每个节点最多可以有两个子节点,分别称为左子节点和右子节点。二叉树的特点包括:每个节点最多有两个子节点。这两个子节点可以为空(null),也可以存在一个或两个子节点。左子节点和右子节点的顺序是有意义的,即左子节点在右子节点之前或之后。每个节点通常包含一个值(或称为关键字)以及其他辅助信息。
2023-06-06 12:19:00 1388
原创 NIO编程
NIO(New I/O)是Java中一种提供了非阻塞式I/O操作的编程模型。它引入了一组新的Java类,用于取代传统的Java I/O类(如InputStream和OutputStream),以提供更高效、更灵活的I/O操作。// 部分NIO API实际上是阻塞的,例如File APIJava NIO允许执行非阻塞的IO。例如,线程可以请求通道将数据读入缓冲区。当通道将数据读入缓冲区时,线程可以做其他事情。一旦数据被读入缓冲区,线程就可以继续处理它。将数据写入通道也是如此。
2023-06-02 16:17:19 884
原创 排序算法之归并排序
数据移动次数要求较高的场合:相比于快速排序和堆排序,归并排序需要移动的数据元素的次数较少,因此在数据移动次数要求较高的场合中,归并排序是更加适合的算法。数据移动次数较少:相比于快速排序和堆排序,归并排序需要移动的数据元素的次数较少,因此在数据移动次数要求较高的场合中,归并排序是更加适合的算法。大规模数据的排序:归并排序的时间复杂度为 O(nlogn),相比于其他排序算法,它更适合对于大规模数据的排序,如对于海量数据的外部排序。稳定性:归并排序是一种稳定排序算法,不会改变相等元素之间的相对顺序。
2023-06-01 16:02:46 346
原创 六种基本网络拓扑结构详解
常见的网络拓扑结构有以下6种:1.总线型网络拓扑结构;2.星型网络拓扑结构;3.环形网络拓扑结构;4.树型网络拓扑结构;5.网状网络拓扑结构;6.混合网络型拓扑结构。
2023-05-26 16:31:48 9092
原创 排序算法之快速排序
快速排序的排序错误主要是因为在选取枢轴元素时的不合理选择导致的,例如选择的枢轴元素恰好是当前待排序数组中的最大或最小元素,或者枢轴元素与其他元素相同且在排序过程中没有特殊处理。它的基本思想是通过一趟排序将待排数据分割成独立的两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再分别对这两部分继续进行排序,重复这个过程,直到所有的数据都排好序。需要注意的是,在实际应用中,由于快速排序是一种原地排序算法,因此它对于内存的消耗相对较小,同时由于它的时间复杂度较低,因此它广泛应用于各种场合。
2023-05-24 16:03:42 913 1
原创 Java 内存泄露问题详解
内存泄露指的是程序运行时未能正确释放不再使用的内存资源,导致这些内存资源无法被垃圾回收器回收和重新利用。内存泄露会导致程序占用越来越多的内存,最终可能导致内存耗尽和程序崩溃。在Java中,当一个对象不再被引用时,Java的垃圾回收器会自动将其标记为可回收,并在合适的时机释放其占用的内存。然而,如果存在内存泄露的情况,这些不再使用的对象仍然被保留在内存中,无法被垃圾回收器回收。内存泄露可能是由于编程错误、资源管理不当或设计问题引起的。
2023-05-22 15:01:54 3587 1
原创 排序算法之希尔排序
在每个gap值下,我们对数组进行插入排序,具体实现是使用一个内部的循环,从gap位置开始,逐个和前面的元素进行比较和交换。循环的条件是j >= gap && arr[j - gap] > temp,即当前元素前面还有元素,且前面的元素比当前元素大,我们就将前面的元素向后移动一位,同时j向前移动gap个位置。由于希尔排序先将数据进行分组,每组再使用插入排序,因此在排序前期能够快速消除大量的逆序对,减少后续的排序工作量。不过希尔排序的实现相对于插入排序要复杂一些,需要对增量序列的选择进行一定的优化。
2023-05-22 09:58:58 425
原创 Fork/Join 框架详解
Fork/Join 是一种并行计算模式,用于解决可以被分解成更小的可并行任务的问题。该模式包含两个关键操作:Fork(分解)和Join(合并)。在 Fork/Join 模式中,原始问题被递归地分解为更小的子问题,直到达到可以并行解决的最小单位。这个过程被称为 Fork。每个子问题可以独立地在不同的处理器上执行,并行地求解部分问题。一旦所有的子问题都被解决,就会进行 Join 操作。Join 操作将所有子问题的结果合并为最终的解决方案。
2023-05-16 11:30:10 1562
原创 Java 线程池(Thread Pools)详解
线程池是一种重用线程的机制,用于提高线程的利用率和管理线程的生命周期,常用于多线程编程和异步编程。Java提供了多种线程池实现,其中最常用的是ThreadPoolExecutor类和Executors类提供的静态工厂方法。线程池由一个线程队列和一个任务队列组成,线程队列中保存着空闲线程,任务队列中保存着等待执行的任务。线程池启动后,线程池中的线程从任务队列中获取任务并执行,执行完毕后返回线程队列中等待下一次任务的到来。如果任务队列为空,线程池中的线程将等待新的任务到来或被关闭。
2023-05-15 15:02:07 3486 2
原创 排序算法之选择排序
虽然其时间复杂度较高,但是选择排序的空间复杂度比较低,仅为O(1),且其实现较为简单,因此在数据量较小时,选择排序仍然是一个可行的排序算法。然而,选择排序的缺点也很明显。它的时间复杂度为O(n^2),其中n为序列长度,因此在数据规模较大的情况下,它的效率比较低,甚至可能无法承受。重复上述步骤,直到未排序序列中的所有元素都被放置到已排序序列的末尾,即排序完成。然后,从未排序序列中剩余的元素中找到最小的元素,将其放在已排序序列的末尾。首先,找到未排序序列中最小的元素,将其放在已排序序列的末尾。
2023-05-08 18:13:56 418
原创 Java Executor接口详解
Executor是Java中的一个接口,用于执行Runnable任务。该接口只定义了一个方法execute(Runnable command),用于将任务提交到执行器中执行。Executor接口没有定义线程池的概念,因此使用Executor只能创建一个新的线程执行任务,而不能重用线程。
2023-05-08 17:07:40 959
原创 Java 中的不可变对象(Immutable Objects)详解
不可变对象指的是在创建之后,它们的值无法被修改的对象。这意味着如果想改变一个不可变对象的值,就需要创建一个新的对象。在许多编程语言中,字符串和数字都是不可变的对象。这个新字符串就是一个全新的字符串对象,和原来的字符串对象没有关系。不可变对象的一个好处是它们更容易被并发程序安全地使用。因为不可变对象是无法修改的,所以不需要担心在多线程环境下出现竞态条件的问题。此外,不可变对象也更容易进行缓存和复用。
2023-05-06 16:39:06 1692
原创 Java JDBC 详解
Java JDBC (Java Database Connectivity)是Java语言中用于访问数据库的API。JDBC API提供了一组标准的接口,允许Java应用程序通过使用标准SQL查询语言访问和操作关系型数据库。使用JDBC API,开发人员可以编写可以在各种关系数据库上运行的Java应用程序。JDBC API的核心是java.sql包,它包含了一组接口和类,(1)允许开发人员连接到数据库、(2)执行SQL查询和更新、(3)检索结果并管理数据库连接。
2023-04-27 10:33:35 1200
原创 Java 设计模式之观察者模式
观察者模式是一种行为设计模式,它定义了对象之间的一种一对多的关系,以便当一个对象的状态发生改变时,其所有依赖对象都会被自动通知和更新。观察者模式的核心是两个角色:Subject和Observer。Subject是被观察的对象,它包含一个观察者列表,并提供添加和删除观察者的方法。Observer是观察者对象,它定义了一个更新方法,当Subject的状态发生变化时,Observer会接收到通知,并调用更新方法进行相应的操作。观察者模式的流程如下:// 观察模式的实现步骤,很重要。
2023-04-26 13:30:37 609
原创 Java Servlet 概述
Servlet 是 Java Web 应用程序的核心组件,主要用于处理 HTTP 请求和响应。Servlet API 中有 4 个 Java 包,包括:。包含定义 Servlet 与 Servlet 容器之间契约的类和接口。。包含定义 HTTP Servlet 与 Servlet 容器之间契约的类和接口。。包含对 Servlet、Filter 和 Listener 进行标注的注解。它还为标注元件指定元数据。。包含为 Web 应用程序的配置信息提供编程式访问的类型。
2023-04-18 09:10:54 696
原创 Java EE 和 Java EE 规范的简要描述
JavaEE和JavaEE规范的区别是,JavaEE是一种技术平台和运行环境,而JavaEE规范则是一系列的标准和规范文档,它定义了JavaEE平台的各种API和服务的具体实现方式和标准。JavaEE规范定义了这些API和工具的标准,供不同厂商实现。,JavaEE规范定义了JavaEE平台所需的各种API和服务,这些API和服务是JavaEE开发中的基础,如Servlet API、JDBC API、EJB API等,开发者在使用JavaEE平台进行应用程序开发时需要遵守JavaEE规范。
2023-04-17 22:55:26 338
原创 JVM 工作原理和即时编译(JIT)
虚拟机是一种运行在操作系统之上的软件程序,它模拟了一台计算机的硬件环境和操作系统功能,从而可以在其上运行应用程序。虚拟机的本质是在硬件层面和操作系统层面之上添加了一个抽象层,通过这个抽象层,应用程序可以直接在虚拟机上运行,而不需要关心底层硬件和操作系统的细节。操作系统级虚拟化:通过虚拟化技术将一台物理计算机分割成多个虚拟的计算机,每个虚拟计算机都运行着自己的操作系统和应用程序,互不干扰。
2023-04-17 14:15:09 791
原创 SSL/TLS协议详解以及配置实战
SSL/TLS协议是一种安全通信协议,用于在计算机网络上保护数据传输的机密性、完整性和身份验证。SSL代表安全套接字层(Secure Socket Layer)TLS代表传输层安全性(Transport Layer Security),它是SSL的继任者。// 实际上还是非对称加密的算法客户端发送一个SSL/TLS连接请求到服务器。服务器发送一个数字证书给客户端。数字证书包含服务器的公钥和其他信息。客户端验证数字证书,以确保证书来自可信的证书颁发机构,没有被篡改。
2023-04-17 10:39:39 7115
原创 数字签名和数字证书使用详解
需要注意的是,这个例子中使用的密钥库文件和密码都是保存在代码中的,实际使用中应该使用更安全的方式来保存密钥库和密码。需要注意的是,这个例子中使用的密钥库文件和密码都是保存在代码中的,实际使用中应该使用更安全的方式来保存密钥库和密码。以下是使用Java进行数字签名的实例,该实例使用了Java标准库中的java.security包和java.util.Base64包,签名过程包括:生成密钥对、使用私钥签名数据,验证过程包括:使用公钥验证签名。然后,它将数字签名添加到请求头中,并发送 HTTP POST 请求。
2023-04-16 11:59:02 5455
原创 对称加密、非对称加密以及哈希算法详解
需要注意的是,在实际使用中,加密算法的实现可能会涉及到更多的细节和安全性考虑,因此建议使用经过专业审核和测试的安全库和算法,避免自己实现可能存在的安全漏洞和错误。ECC:是一种基于椭圆曲线的非对称加密算法,相比RSA等算法,ECC使用更短的密钥长度就能提供相同的安全强度,因此越来越受到关注和应用。RC4:是一种流密码,使用变长的密钥进行加密和解密操作,速度快,但由于其加密弱点被发现,现已很少使用。DES:使用56位的密钥进行加密和解密操作,由于密钥长度过短,安全性较差,因此现在很少使用。
2023-04-16 08:48:01 1633
原创 Java Base64 编码和URL编码详解
UTF-8 编码使用 1 到 4 个字节表示一个字符,对于 ASCII 字符,使用 1 个字节表示,对于其他字符,使用 2 到 4 个字节表示。在一些场景中,需要将敏感数据进行加密,而加密后的数据可能会包含非 ASCII 字符,这时需要将加密后的二进制数据进行 Base64 编码,以方便传输和存储。URL 编码只会对 URL 中的特殊字符进行转换,而不会对 URL 中的已经编码过的字符再次进行编码,因此在进行 URL 解码时,需要先将已编码的字符解码成原来的字符,再进行 URL 解码。
2023-04-16 00:08:23 2149
原创 HTTP响应报文体和长连接详解
HTTP的长连接(Keep-Alive Connection)是指在一次TCP连接中可以发送多个HTTP请求,而不是每次请求都建立一个TCP连接。长连接能够减少TCP连接的建立和断开次数,从而减少网络延迟和连接建立时间,提高HTTP请求的效率。客户端在请求头中设置"Connection: keep-alive",表示请求结束后保持连接。服务器在响应头中设置"Connection: keep-alive",表示服务器同意保持连接。
2023-04-15 22:52:00 1575
原创 Java设计模式之桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式,用于将一个类或一组类的抽象与实现分离,以便它们可以独立变化。桥接模式通过将抽象部分与实现部分分离开来,使得它们可以独立地变化,从而提高了系统的灵活性和可扩展性。在Java中,桥接模式的实现通常涉及到一个抽象类或接口,它定义了一组抽象方法,代表着某些操作或行为,但没有具体实现。这个抽象类或接口会被一个或多个具体实现类所实现,这些具体实现类负责实现抽象方法,从而为客户端提供具体的功能。
2023-04-13 14:23:54 546
原创 Java 设计模式之组合模式
在 Java 组合模式中,抽象构件角色定义了所有叶子节点和容器节点共有的方法和属性,其中包括添加、移除子节点、获取子节点等方法。容器节点角色表示树形结构中的非叶子节点,它包含了其他的组合对象或叶子对象,可以用于组织和管理它所包含的子节点。定义容器构件(Composite)类,它是组合中的容器节点对象,它可以包含子节点,也可以有自己的方法和属性。在该类中通常包含一个用于存储子节点的容器。在客户端代码中使用组合模式构建对象树,通过调用容器节点的方法来增加、删除子节点,通过调用叶子节点的方法来访问节点数据。
2023-04-13 14:18:16 1708
原创 Java设计模式之责任链模式
这里,我们创建了两个具体的处理器对象,将它们链接起来形成一个处理器链,并使用第一个处理器来处理一个请求。在责任链模式中,每个处理器都有一个处理方法,当请求到达时,它首先判断自己能否处理该请求,如果可以处理就处理请求,否则将请求传递给下一个处理器,直到请求被处理为止。在处理异常的过程中,我们可以使用多个catch块来捕获不同类型的异常,这就是责任链模式的一种应用。可以看到,在实现中,每个处理器都有一个处理方法handle(),它判断是否能够处理当前请求,如果可以处理就处理请求,否则将请求传递给下一个处理器。
2023-04-13 13:27:57 578
原创 Java设计模式之建造者模式(精髓版)
另外,在一些框架和项目中也经常使用建造者模式来构建复杂的对象,例如,在 Spring 框架中,我们可以使用建造者模式来创建 ApplicationContext 对象。这个示例代码中使用了建造者模式来创建不同类型的汽车对象,通过将创建过程分离到不同的建造者对象中,从而简化了创建过程,并且可以通过不同的建造者对象来创建不同类型的对象。提高代码的可扩展性:使用建造者模式可以方便地扩展对象的创建过程,可以在不影响其他代码的情况下添加新的建造者对象和创建步骤。然后,我们定义了一个抽象建造者类。
2023-04-13 11:38:20 698
原创 Java设计模式之策略模式
Spring AOP 提供了不同的切面(aspect)实现类,而调用者可以通过配置来指定不同的切面策略,例如通过切面实现类实现事务管理、日志记录等功能。总之,策略模式是一种常用的设计模式,在 Java 中有很多使用策略模式的代码。这些代码的共同点是它们将不同的算法或者行为封装到不同的策略类中,并且允许调用者根据需要选择不同的策略实现类来实现不同的行为。在Java中,策略模式经常被用于解决业务中的问题,例如根据不同的用户类型提供不同的价格计算策略,或者根据不同的排序方式对一组数据进行排序等。
2023-04-13 10:42:47 904
原创 Java设计模式之适配器模式
Java 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换为客户端所期望的另一个接口。这种模式可以让原本不兼容的接口能够一起工作。在 Java 中,适配器模式通常涉及到三个角色:目标接口(Target Interface):客户端所期望的接口,也就是客户端真正需要的接口。适配器类(Adapter Class):将不兼容的接口转换为客户端所期望的接口的类。适配者类(Adaptee Class):需要被适配的原始接口。
2023-04-13 09:45:34 1619
原创 设计模式之装饰者模式
装饰者模式是一种结构型设计模式,它允许在不修改现有对象结构的情况下,动态地添加功能或行为。在装饰者模式中,我们定义了一个装饰者类来包装原始对象,从而扩展其功能或行为。以下是一个使用Java代码描述装饰者模式的示例:首先,我们定义一个接口Component,它表示一个抽象组件,可以是一个具体对象或者是一个抽象对象,它定义了一个操作方法operation。然后,我们定义一个具体组件ConcreteComponent,实现Component接口,它是我们需要被装饰的原始对象。
2023-04-12 16:33:22 815
原创 钩子方法和回调函数详解
回调函数(callback function)允许一个函数将另一个函数作为参数传递,并在需要的时候调用该函数。在Java中,可以使用接口或Lambda表达式实现回调函数。以下是一个简单的回调函数示例:(1)首先,我们需要定义一个接口,该接口定义了回调函数的规范。在这个例子中,我们定义了一个名为Callback的接口,它有一个方法onResult,该方法接受一个整数参数。(2)然后,我们创建一个类,该类中包含了我们需要执行的业务逻辑代码。在这个例子中,我们假设这段代码是计算两个整数的和。
2023-04-12 14:47:30 2790
原创 Spring mvc 核心 DispatcherServlet 详解
与许多其他的 web 框架一样,Spring MVC 也是围绕前端控制器模式设计的,核心的 Servlet DispatcherServlet 为请求处理提供了共享算法,但是实际工作由可配置的委托组件执行的。这种设计非常灵活,可以支持不同的工作流。// 核心Servlet,其他组件可配置DispatcherServlet 和其他 Servlet 一样,也需要通过一些配置去发现它的委托组件(请求映射、视图解析、异常处理等组件),这些配置可以是 Java 代码,也可以是 web.xml 文件。
2023-03-23 13:57:17 1069
原创 Java 基于 TCP 的 Socket 编程
服务器端会主动监听某个指定的端口,客户端必须主动连接服务器的 IP 地址和指定端口,如果连接成功,服务器端和客户端就成功地建立了一个 TCP 连接,双方后续就可以随时发送和接收数据。TCP 协议,指传输控制协议(TCP,Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。注意:服务端需要先于客户端启动,否则客户端因连接不到指定的进程而报错。实际场景中,一个服务端往往可以支持多个客户端的连接,为多个客户端提供服务。
2023-03-12 12:24:56 2069
原创 Java 基于 UDP 的 Socket 编程
UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。Java 主要提供了两个类来实现基于 UDP 的 Socket 编程。
2023-03-11 23:17:38 1508
原创 Java 原生代码实现分页
分页的重点在于计算数据截取的起始位置和结束位置,不过通过Java 代码实现的分页,只是代码层次的分页,一般情况下分页都会通过数据库去实现,减少一次性查找的数据量。最后,在开发中使用的一般是封装好的分页工具,下边是 PageHelper 工具,具体使用请参考以下官方文档。至此,有关分页的介绍到此结束,后续如果有需要再进行补充。
2023-03-08 11:43:53 1478
原创 Redis 主从库如何实现数据一致?
Redis 的主从库同步的基本原理,总结来说,有三种模式:全量复制、基于长连接的命令传播,以及增量复制。全量复制虽然耗时,但是对于从库来说,如果是第一次同步,全量复制是无法避免的,所以,我给你一个小建议:一个 Redis 实例的数据库不要太大,一个实例大小在几 GB 级别比较合适,这样可以减少 RDB 文件生成、传输和重新加载的开销。另外,为了避免多个从库同时和主库进行全量复制,给主库过大的同步压力,我们也可以采用“主 - 从 - 从”这一级联模式,来缓解主库的压力。
2023-02-27 21:11:05 1708
原创 Docker 快速上手学习入门教程
官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。
2023-02-18 08:44:34 24865
护眼插件-浏览器夜间模式
2022-09-08
apache-jmeter-3.1.rar
2020-04-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人