韩源-末日生存手册 - 技术
type: channel
link: https://kerryhan.cn/index.php/tag/技术
items: 磁盘阵列技术
items: 基于过滤拦截技术实现的身份认证方案
items: 【计算机网络原理】电路交换、报文交换、分组交换
items: 专利申请文件结尾那一段套话的英文翻译是什么？
items: Shiro授权功能详解
items: 单点登录原理及实现
items: 《深入理解计算机系统》之计算机系统漫游
items: Aop面向切面编程

磁盘阵列技术
type: item
date: 2023-11-08T03:28:22+00:00
description: 概述磁盘阵列（Redundant Arrays of Independent Drives，RAID），简单地说，就是讲若干块独立磁盘构成具有冗余能力的阵列。 他将很多块磁盘组合到一起构成一个磁盘组，来提升整个磁盘系统的读写性能及安全性。 利用同位检查（Parity Check）的观念，通过数据冗余实现磁盘系统中任何一个磁盘故障时整个磁盘系统仍然可以继续工作。 对于服务器开发和运维人员，RAID 是必须了解和使用的磁盘系统管理方式，随着时代的进步，越来越多的人在家庭、日常工作中使用简单的磁盘阵列来增加磁盘读写性能或提高数据安全性，甚至一些主板都已经提供了支持 RAID 的功能。 然而，RAID 概念很多，有时候会引起混淆，本文我们来详细介绍一下 RAID 技术的概念特征、基本原理、关键技术、各种等级和发展现状等方面的内容。RAIDRAID 是 1988 年美国加州大学伯克利分校的 D. A. Patterson 教授等首次在论文中提出的，起初，RAID 指的是廉价磁盘阵列，主要目的是为了节省购置大容量磁盘的成本，此后，RAID 咨询委员会将 Inexpensive 替换为 Independent 就是我们今日的 RAID，但其实质内容并没有改变。 RAID 主要利用数据条带、镜像和数据校验技术来获取高性能、可靠性、容错能力和扩展性，根据运用或组合运用这三种技术的策略和架构，拥有 RAID0 ~ RAID6 等的等级，近年来，存储厂商不断推出诸如 RAID7 、 RAID10/01 、 RAID50 、 RAID53 、 RAID100 等 RAID 等级，但这些并无统一的标准。 目前业界公认的标准是 RAID0 ~ RAID5 ，除 RAID2 外的四个等级被定为工业标准，而在实际应用领域中使用最多的 RAID 等级是 RAID0 、 RAID1 、 RAID3 、 RAID5 、 RAID6 和 RAID10。 从实现角度看， RAID 主要分为软 RAID、硬 RAID 以及软硬混合 RAID 三种。软 RAID 所有功能均有操作系统和 CPU 来完成，没有独立的 RAID 控制 / 处理芯片和 I/O 处理芯片，效率自然最低。硬 RAID 配备了专门的 RAID 控制 / 处理芯片和 I/O 处理芯片以及阵列缓冲，不占用 CPU 资源，但成本很高。软硬混合 RAID 具备 RAID 控制 / 处理芯片，但缺乏 I/O 处理芯片，需要 CPU 和驱动程序来完成，性能和成本 在软 RAID 和硬 RAID 之间。 目前来看，广泛采用的是以硬 RAID 为主的方式来实现 RAID，但各操作系统也都在不同程度上支持某些级别的软 RAID。关键技术RAID 主要有三个关键技术： 1. 镜像（Mirroring） 2. 数据条带（Data Stripping） 3. 校验（Data Parity） 不同的 RAID 级别会采用上述一到多个技术来获得不同的数据可靠性、可用性或IO性能。镜像镜像技术指的是将数据复制到多个磁盘，这样，在实际的使用中，只要有一个磁盘没有发生故障，都不影响整个磁盘系统的工作。 同时，并发地在多个磁盘上读取也可以提高读取性能，但是，相对的，镜像技术的写性能相对较低，每次写入都必须确保多个磁盘写成功。数据条带将数据分片保存在多个不同的磁盘，多个数据分片共同组成一个完整数据副本。 这与镜像的多个副本是不同的，它通常用于性能考虑。 数据条带具有更高的并发粒度，当访问数据时，可以同时对位于不同磁盘上数据进行读写操作， 从而获得非常可观的 I/O 性能提升。数据校验利用冗余数据进行数据错误检测和修复的技术。 冗余数据通常采用海明码、异或操作等算法来计算获得。 利用校验功能，可以很大程度上提高磁盘阵列的可靠性、鲁棒性和容错能力。 比起镜像 50% 的冗余开销 ，数据校验要小很多，它利用校验冗余信息对数据进行校验和纠错。 不过，数据校验需要从多处读取数据并进行计算和对比，会影响系统性能。优势大容量、高性能、可靠性、可管理性JBODJBOD 即 Just a Bunch Of Disks，他并不是标准的 RAID 等级。 它通常用来表示一个没有控制软件提供协调控制的磁盘集合，将多个物理磁盘串联起来，提供一个巨大的逻辑磁盘。 JBOD 的存放机制是由第一块磁盘开始按顺序往后存储，当前磁盘存储空间用完后，再依次往后面的磁盘存储数据。 它的存储性能完全等同于单块磁盘，而且也不提供数据安全保护，只是简单提供一种扩展存储空间的机制， JBOD 可用存储容量等于所有成员磁盘的存储空间之和。RAID0RAID 是一种简单、无数据冗余的数据带化技术，实际上它并不算是一种真正的 RAID，因为他不提供任何形式的冗余策略。 RAID0 将所在磁盘…

基于过滤拦截技术实现的身份认证方案
type: item
date: 2022-03-20T04:58:00+00:00
description: 基于过滤拦截技术实现的身份认证方案系统基本流程用户发送请求过滤器过滤掉，访问需要保持登录状态的资源但是又没有携带token的请求拦截器拦截掉，访问需要具备相应权限的资源但是又没有对应权限的请求进入业务逻辑代码层级configMyFilterConfig：自定义过滤器的基础配置，对所有资源都进行过滤MyInterceptorConfig：自定义拦截器的基础配置，设置所需拦截的放行的URLcontrollerUserController：接口层entityUser：用户的实体对象。目前为了简化操作，不必新建权限表，所以在用户的实体对象里存放了list<String>集合，即用户的属性里就带着用户的所有权限信息filter：MyFilter：自定义过滤器，这块主要是判断用户请求有没有携带token，如果没有携带token，而且还访问的是需要携带token(即保持登录)的接口，那么就过滤掉用户的这次请求。但是，有的资源是属于开放资源，即不需要用户保持登录状态，因此，在这个模块，做了白名单列表，过滤器不对白名单列表进行过滤。interceptorMyInterceptor：自定义拦截器，这块主要是拦截需要权限的接口，获取用户的token，并且解析出用户权限信息，拿用户权限信息和接口所需权限进行比对，失败则拒绝，成功则让请求进行接口层。serviceUserService：接口所对应的具体业务逻辑，这块目前主要是有判断用户名密码，进而生成token，返回前端。utilJWTUtil：JWT工具类，可以用于生成JWT，解密JWT

【计算机网络原理】电路交换、报文交换、分组交换
type: item
date: 2021-09-11T00:30:00+00:00
description: 试简述分组交换的要点分组交换又称为报文分组交换，它是基于报文交换，将报文划分为更小的数据单位，分组交换实质上是在存储转发基础上发展起来的，它兼有电路交换和报文交换的优点。分组交换在线路上采用动态复用技术。其主要流程是如果一个源站有一个长的报文要进行发送，该报文就会被分割成一系列的分组，每一分组包含用户数据的一部分加上一些控制信息，控制信息至少要包括网络为了把分组送到目的地做路由选择所需要的信息，在路径上的每个节点，分组被接受，短时间存储然后传递给下一结点。试从多个方面比较电路交换、报文交换和分组交换的主要优缺点电路交换定义：电路交换在通信之前要在通信双方之间建立一条被双方独占的物理通路（由通信双方之间的交换设备和链路逐段连接而成）优点： ①由于通信线路为通信双方用户专用，数据直达，所以传输数据的时延非常小。②通信双方之间的物理通路一旦建立，双方可以随时通信，实时性强。③双方通信时按发送顺序传送数据，不存在失序问题。④电路交换既适用于传输模拟信号，也适用于传输数字信号。⑤电路交换的交换设备（交换机等）及控制均较简单。缺点： ①电路交换的平均连接建立时间对计算机通信来说嫌长。②电路交换连接建立后，物理通路被通信双方独占，即使通信线路空闲，也不能供其他用户使用，因而信道利用低。③电路交换时，数据直达，不同类型、不同规格、不同速率的终端很难相互进行通信，也难以在通信过程中进行差错控制。这种通信方式非常适合语音（如打电话）这种对实时性要求高的业务。但不适合数据通信业务，对于两台计算机进行数据通信来说，大多数时间线路是空闲的，由于物理通路被通信是独占的，不能供其他用户使用，因而信道利用低。报文交换定义：报文交换是以报文为数据交换的单位，报文携带有目标地址、源地址等信息，在交换结点采用存储转发的传输方式优点：①报文交换不需要为通信双方预先建立一条专用的通信线路，不存在连接建立时延，用户可随时发送报文。②通信双方不是固定占有一条通信线路，而是在不同的时间一段一段地部分占有这条物理通路，因而大大提高了通信线路的利用率。③由于采用存储转发的传输方式，使之具有下列优点：在报文交换中便于设置代码检验和数据重发设施，加之交换结点还具有路径选择，就可以做到某条传输路径发生故障时，重新选择另一条路径传输数据，提高了传输的可靠性；在存储转发中容易实现代码转换和速率匹配，甚至收发双方可以不同时处于可用状态。这样就便于类型、规格和速度不同的计算机之间进行通信；提供多目标服务，即一个报文可以同时发送到多个目的地址，这在电路交换中是很难实现的；允许建立数据传输的优先级，使优先级高的报文优先转换。缺点：①于数据进入交换结点后要经历存储、转发这一过程，从而引起转发时延（包括接收报文、检验正确性、排队、发送时间等），而且网络的通信量愈大，造成的时延就愈大，因此报文交换的实时性差，不适合传送实时或交互式业务的数据。②报文交换只适用于数字信号。③由于报文长度没有限制，而每个中间结点都要完整地接收传来的整个报文，当输出线路不空闲时，还可能要存储几个完整报文等待转发，要求网络中每个结点有较大的缓冲区。为了降低成本，减少结点的缓冲存储器的容量，有时要把等待转发的报文存在磁盘上，进一步增加了传送时延。分组交换定义：又称为报文分组交换，基于报文交换，将报文划分为更小的数据单位：报文分组（也称为段、包、分组）优点： ①加速了数据在网络中的传输。因为分组是逐个传输，可以使后一个分组的存储操作与前一个分组的转发操作并行，这种流水线式传输方式减少了报文的传输时间。此外，传输一个分组所需的缓冲区比传输一份报文所需的缓冲区小得多，这样因缓冲区不足而等待发送的机率及等待的时间也必然少得多。②简化了存储管理。因为分组的长度固定，相应的缓冲区的大小也固定，在交换结点中存储器的管理通常被简化为对缓冲区的管理，相对比较容易。③减少了出错机率和重发数据量。因为分组较短，其出错机率必然减少，每次重发的数据量也就大大减少，这样不仅提高了可靠性，也减少了传输时延。④由于分组短小，更适用于采用优先级策略，便于及时传送一些紧急数据，因此对于计算机之间的突发式的数据通信，分组交换显然更为合适些。缺点： ①尽管分组交换比报文交换的传输时延少，但仍存在存储转发时延，而且其结点交换机必须具有更强的处理能力。②分组交换与报文交换一样，每个分组都要加上源、目的地址和分组编号等信息，使传送的信息量大约增大5%～10%，一定程度上降低了通信效率，增加了处理的时间，使控制复杂，时延增加。③当分组交换采用数据报服务时，可能出现失序、丢失或重复分组，分组到达目的结点时，要对分组按编号进行排序等工作，增加了麻烦。若采用虚电路服务，虽无失序问题，但有呼叫建立、数据传输和虚电路释放三个过程。小写和大写开头的英文名字internet和Interna…

专利申请文件结尾那一段套话的英文翻译是什么？
type: item
date: 2021-09-10T14:27:16+00:00
description: 在很多专利申请文件中，结尾处常有这样一段话：虽然本申请以较佳实施例公开如上，但并不用于限定权利要求，任何本领域技术人员在不脱离本申请实质和精神的前提下，可以做出若干可能的变型、改变、替换……。这些变型、改变或替换均属于本发明的保护范围。中文申请文件中的这些套话，其实是从国外的申请文件（尤其是美国专利申请）中翻译和借鉴（抄）过来的。国外专利申请文件末尾的套话示例如下：示例（1）While the invention has been particularly shown anddescribed with respect to the illustrated and preferred embodiments thereof, itwill be understood by those skilled in the art that the foregoing and otherchanges in form and details may be made therein without departing from thespirit and scope of the invention.示例（2）Modifications, additions, or omissions may be made to the systems,apparatuses, and methods described herein without departing from the scope ofthe disclosure. For example, the components of the systems and apparatuses maybe integrated or separated. Moreover, the operations of the systems andapparatuses disclosed herein may be performed by more, fewer, or othercomponents and the methods described may include more, fewer, or other steps.Additionally, steps may be performed in any suitable order. As used in thisdocument, “each” refers to each member of a set or each member of a subset of a set.这段套话，根据其字面描述，貌似囊括了一切可能的变型，感觉可以堵死他人对本发明作出改进的路。这段套话，有的专利申请中有，有的没有。先不管这段套话在专利申请文件是否有必要，是否有用，我们这里来说一下“套话”这个词对应的英文是什么？“套话”的英文是什么？Legalese？Template sentences？在专利申请中，这种套话对应的英文是：boilerplate、boilerplatesentences或 boilerplatelanguage。Boilerplate的英文含义：Boilerplate, also known as standard, miscellaneous, orgeneral clauses, is located at the end of most corporate legal documents. Theyprovide instructions on how to act in a variety of situations and clarify therelationship between the parties. 套话，亦称为标准、附加或通用的条款，位于大多数企业法律文件的末尾。这些条款提供了在各种情况下进行操作的说明并明晰各方之间的关系。Boilerplate与Broadening statements二者的区别？Boierplate是格式化的文本，在实务中，这种套可有可无，只是有时候让申请文件看起来高大上。实际上对专利的保护范围并没有起到实质的作用。专利的保护范围以权利要求界定的范围为准，不会因为套话的这种“漫无边际的声明”而影响权利要求保护范围。个人不建议在专利申请文件中写入过多的这种套话。在实务中，对于申请文件末尾的那一段套话，其一个作用是表明申请文件已经写完了，并没有丢失必要的文本。也就是说，这段套话，可以起到标示申请文件已经完结的作用，对撰写人员起到心理安定的作用。当然，如果能够像美国专利申请文件那样，在申请文件末尾加上“*”这样的文本结束标识，则是更好的。最好的是，在申请文件末尾加一个“（完）”字就好了。不…

Shiro授权功能详解
type: item
date: 2021-04-10T06:57:00+00:00
description: 授权，也叫访问控制，即在应用中控制谁能访问哪些资源（如访问页面/编辑数据/页面操作等）。在授权中需了解的几个关键对象：主体（Subject）、资源（Resource）、权限（Permission）、角色（Role） 主体主体，即访问应用的用户，在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源。资源在应用中用户可以访问的任何东西，比如访问JSP页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问。权限安全策略中的原子授权单位，通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源，如：访问用户列表页面查看/新增/修改/删除用户数据（即很多时候都是CRUD（增查改删）式权限控制）打印文档等等。。。如上可以看出，权限代表了用户有没有操作某个资源的权利，即反映在某个资源上的操作允不允许，不反映谁去执行这个操作。所以后续还需要把权限赋予给用户，即定义哪个用户允许在某个资源上做什么操作（权限），Shiro不会去做这件事情，而是由实现人员提供。Shiro支持粗粒度权限（如用户模块的所有权限）和细粒度权限（操作某个用户的权限，即实例级别的），后续部分介绍。角色角色代表了操作集合，可以理解为权限的集合，一般情况下我们会赋予用户角色而不是权限，即这样用户可以拥有一组权限，赋予权限时比较方便。典型的如：项目经理、技术总监、CTO、开发工程师等都是角色，不同的角色拥有一组不同的权限。隐式角色：即直接通过角色来验证用户有没有操作权限，如在应用中CTO、技术总监、开发工程师可以使用打印机，假设某天不允许开发工程师使用打印机，此时需要从应用中删除相应代码；再如在应用中CTO、技术总监可以查看用户、查看权限；突然有一天不允许技术总监查看用户、查看权限了，需要在相关代码中把技术总监角色从判断逻辑中删除掉；即粒度是以角色为单位进行访问控制的，粒度较粗；如果进行修改可能造成多处代码修改。显示角色：在程序中通过权限控制谁能访问某个资源，角色聚合一组权限集合；这样假设哪个角色不能访问某个资源，只需要从角色代表的权限集合中移除即可；无须修改多处代码；即粒度是以资源/实例为单位的；粒度较细。请google搜索“RBAC”和“RBAC新解”分别了解“基于角色的访问控制”“基于资源的访问控制(Resource-Based Access Control)”。授权方式Shiro支持三种方式的授权：编程式：通过写if/else授权代码块完成：Subject subject = SecurityUtils.getSubject(); if(subject.hasRole(“admin”)) { //有权限 } else { //无权限 }注解式：通过在执行的Java方法上放置相应的注解完成：@RequiresRoles("admin") public void hello() { //有权限 } 没有权限将抛出相应的异常；JSP/GSP标签：在JSP/GSP页面通过相应的标签完成：<shiro:hasRole name="admin"> <!— 有权限 —></shiro:hasRole> 后续部分将详细介绍如何使用。 授权基于角色的访问控制（隐式角色）1、在ini配置文件配置用户拥有的角色（shiro-role.ini）[users] zhang=123,role1,role2 wang=123,role1规则即：“用户名=密码,角色1，角色2”，如果需要在应用中判断用户是否有相应角色，就需要在相应的Realm中返回角色信息，也就是说Shiro不负责维护用户-角色信息，需要应用提供，Shiro只是提供相应的接口方便验证，后续会介绍如何动态的获取用户角色。2、测试用例（com.github.zhangkaitao.shiro.chapter3.RoleTest）@Test public void testHasRole() { login("classpath:shiro-role.ini", "zhang", "123"); //判断拥有角色：role1 Assert.assertTrue(subject().hasRole("role1")); //判断拥有角色：role1 and role2 Assert.assertTrue(subject().hasAllRoles(Arrays.asList("role1", "role2"))); //判断拥有角色：role1 and role2 and !role3 boolean[] result = subject().hasRoles(Arrays.asList("role1", "role2", "role3")); …

单点登录原理及实现
type: item
date: 2021-03-17T07:13:00+00:00
description: 一、单系统登录机制1、http无状态协议 web应用采用browser/server架构，http作为通信协议。http是无状态协议，浏览器的每一次请求，服务器会独立处理，不与之前或之后的请求产生关联，这个过程用下图说明，三次请求/响应对之间没有任何联系3c91a3bf-25d8-4b1f-8e4a-68535c51aaa8 但这也同时意味着，任何用户都能通过浏览器访问服务器资源，如果想保护服务器的某些资源，必须限制浏览器请求；要限制浏览器请求，必须鉴别浏览器请求，响应合法请求，忽略非法请求；要鉴别浏览器请求，必须清楚浏览器请求状态。既然http协议无状态，那就让服务器和浏览器共同维护一个状态吧！这就是会话机制2、会话机制 浏览器第一次请求服务器，服务器创建一个会话，并将会话的id作为响应的一部分发送给浏览器，浏览器存储会话id，并在后续第二次和第三次请求中带上会话id，服务器取得请求中的会话id就知道是不是同一个用户了，这个过程用下图说明，后续请求与第一次请求产生了关联8a9fb230-d506-4b19-b821-4001c68c4588 服务器在内存中保存会话对象，浏览器怎么保存会话id呢？你可能会想到两种方式请求参数cookie 将会话id作为每一个请求的参数，服务器接收请求自然能解析参数获得会话id，并借此判断是否来自同一会话，很明显，这种方式不靠谱。那就浏览器自己来维护这个会话id吧，每次发送http请求时浏览器自动发送会话id，cookie机制正好用来做这件事。cookie是浏览器用来存储少量数据的一种机制，数据以”key/value“形式存储，浏览器发送http请求时自动附带cookie信息 tomcat会话机制当然也实现了cookie，访问tomcat服务器时，浏览器中可以看到一个名为“JSESSIONID”的cookie，这就是tomcat会话机制维护的会话id，使用了cookie的请求响应过程如下图518293d9-64b2-459c-9d45-9f353c757d1f3、登录状态 有了会话机制，登录状态就好明白了，我们假设浏览器第一次请求服务器需要输入用户名与密码验证身份，服务器拿到用户名密码去数据库比对，正确的话说明当前持有这个会话的用户是合法用户，应该将这个会话标记为“已授权”或者“已登录”等等之类的状态，既然是会话的状态，自然要保存在会话对象中，tomcat在会话对象中设置登录状态如下用户再次访问时，tomcat在会话对象中查看登录状态HttpSession session = request.getSession();session.setAttribute("isLogin", true);HttpSession session = request.getSession();session.getAttribute("isLogin"); 实现了登录状态的浏览器请求服务器模型如下图描述 每次请求受保护资源时都会检查会话对象中的登录状态，只有 isLogin=true 的会话才能访问，登录机制因此而实现。二、多系统的复杂性 web系统早已从久远的单系统发展成为如今由多系统组成的应用群，面对如此众多的系统，用户难道要一个一个登录、然后一个一个注销吗？就像下图描述的这样6dfbb0b1-46c0-4945-a3bf-5f060fa80710 web系统由单系统发展成多系统组成的应用群，复杂性应该由系统内部承担，而不是用户。无论web系统内部多么复杂，对用户而言，都是一个统一的整体，也就是说，用户访问web系统的整个应用群与访问单个系统一样，登录/注销只要一次就够了9fe14ab3-4254-447b-b850-0436e628c254 虽然单系统的登录解决方案很完美，但对于多系统应用群已经不再适用了，为什么呢？ 单系统登录解决方案的核心是cookie，cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的，这个限制就是cookie的域（通常对应网站的域名），浏览器发送http请求时会自动携带与该域匹配的cookie，而不是所有cookie4d58ccfa-0114-486d-bec2-c28f2f9eb513 既然这样，为什么不将web应用群中所有子系统的域名统一在一个顶级域名下，例如“*.baidu.com”，然后将它们的cookie域设置为“baidu.com”，这种做法理论上是可以的，甚至早期很多多系统登录就采用这种同域名共享cookie的方式。 然而，可行并不代表好，共享cookie的方式存在众多局限。首先，应用群域名得统一；其次，应用群各系统使用的技术（至少是web服务器）要相同，不然cookie的key值（tomcat为JSESSIONID）不同，无法维持会话…

《深入理解计算机系统》之计算机系统漫游
type: item
date: 2021-01-31T14:42:00+00:00
description: 计算机系统漫游信息就是位+上下文源程序设计上就是一个由值0和1组成的位（又称比特）序列，8个位被组织成一组，称为字节。每个字节表示程序中的某些文本字符。大部分的现代计算机系统都实用ASCII来表示每个文本字符，这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符。基本思想：系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据，都是由一串比特进行表示的。区分不同的数据对象的唯一方法是我们读到这些数据对象时的上下文。比如，在不同的上下文中，一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。源文件到目标文件的转化从源文件到目标文件的转化是由编译器驱动程序完成的从源文件到目标文件的翻译一共需要分为四个阶段，执行这四个阶段的程序（预处理器、编译器、汇编器和链接器）一起构成了编译系统预处理阶段预处理器（cpp）根据以字符#开头的命令，修改原始的C语言程序。（相当于完成所有宏命令的引入）编译阶段将C语言编译成为汇编语言汇编阶段汇编器将汇编语言翻译成为机器语言指令链接阶段链接阶段时将系统函数库进行引入，链接器就负责处理这种合并。结果将生成一个可执行部目标文件，可以被加载到内存中，由系统进行执行。知道编译系统工作有哪些好处优化程序性能理解链接时出现的错误避免安全漏洞系统的硬件组成总线贯穿整个系统的是一组电子管道，称作总线，它携带信息字节并负责在各个部件间进行传递。通常总线被设计成传送定长的字节块，也就是字。字中的字节数（即字长）是一个基本的系统参数，各个系统中都不尽相同。现在大多数机器字长要么是4个字节（32位），要么是8个字节（64位）I/O设备I/O（输入/输出）设备是系统和外部世界的联系通道。每个I/O设备都通过一个控制器或/适配器与I/O总线相连。控制器和适配器之间的区别主要是在于它们的封装方式。控制器是I/O设备本身或者系统的主印制电路板（通常称作主板）上的芯片组。而适配器则是一块插在主板插槽上的卡。无论如何，它们的功能都是在I/O总线和I/O设备之间进行传递信息。主存主存是一个临时存储设备，在处理器执行程序时，用来存放程序和程序处理的数据。从物理上来说，主存是由一组动态随机存取存储器（DRAM）芯片组成的。从逻辑上来说，存储器是一个相信的字节数组，每个字节都有其唯一的地址（数组索引），这些地址都是从零开始的。处理器中央处理器单元（CPU），简称处理器，是解释（或执行）存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备（或寄存器），成为程序计数器（PC）。在任何时候，PC都指向主存中的某条机器语言指令（即含有该指令的地址）。高速缓存针对处理器和主存在速度方面的差异，系统设计者采用了更小更快的存储设备，称为高速缓存存储器，作为暂时的集结区域，存放处理器近期可能会需要的信息。L1和L2高速缓存是用一种叫做静态随机访问存储器的硬件技术实现的。比较新的、处理能力更强大的系统甚至用三级高速缓存：L1、L2、L3。系统可以获得一个很大存储器，同时访问速度也很快，原因是利用了高速缓存的局部性原理，即程序具有访问局部区域里的数据和代码的趋势。通过让高速缓存里存放可能经常访问的数据，大部分内存操作都能在快速的高速缓存中完成。存储器的层次结构寄存器L1高速缓存（SRAM）L2高速缓存（SRAM）L3高速缓存（SRAM）主存（DRAM）本地二级存储（本地磁盘）远程二级存储（分布式文件系统，Web服务器）操作系统管理硬件文件是对I/O设备的抽象表示虚拟内存是对主存和磁盘I/O设别的抽象表示进程是对处理器、主存和I/O设备的抽象表示进程上下文：操作系统保持跟踪进程运行所需的所有状态信息。这种状态，也就是上下文，包括许多信息，比如PC和寄存器文件的当前值，以及主存的内容。上下文切换：在任何一个时刻，单处理器的系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到某个新进程时，就会进行上下文切换，即保存当前进程的上下文、恢复新进程的上下文，然后将控制权传递到新进程。新进程就会从它上次停止的地方继续开始。从一个进程到另一个进程的转换是由操作系统内核管理的，内核是操作系统代码常驻内存的部分。注意：内核并不是一个独立的进程，相反，它是系统管理全部进程所用代码和数据结构的集合。线程一个进程实际上可以由多个成为线程的执行单元组成，每个线程都运行在进程的上下文中，并共享同样的代码和全局数据。虚拟内存虚拟内存是一个抽象概念，它为每一个进程提供了一个假象，即每个进程都在独占地使用主存。每个进程看到的内存都是一致的，称为虚拟地址空间。（此处暂不赘述）文件文件就是字节序列，仅此而已。每一I/O设备，包括磁盘、键盘、显示器，甚至网络，都可以看成是文件。Amdahl定律主要思想：当我们对系统的某个部…

Aop面向切面编程
type: item
date: 2020-04-06T16:48:00+00:00
description: 什么是面向切面编程官方：在软件业，AOP为Aspect Oriented Programming的缩写，意为：面向切面编程，通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续，是软件开发中的一个热点，也是Spring框架中的一个重要内容，是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离，从而使得业务逻辑各部分之间的耦合度降低，提高程序的可重用性，同时提高了开发的效率个人理解：面向切面编程旨在较少冗余代码，使用的是一种代码横向抽取（举例：不同的方法拥有三句同样的代码，那这个代码就可以抽取出来，但使用父类、接口、继承、实现会极大的提高代码的耦合度，因此我们采用面向切面编程，把这三句代码全部抽取到一个方法当中）xml配置版实例代码接口：public interface Hello { void sayHello(); } 实现类public class HelloImpl implements Hello { @Override public void sayHello() { System.out.println("hello"); } }增强（相当于抽取出来的部分代码）public class BuildHello { void beforeBuilder(){ System.out.println("start..."); } void afterBuilder(){ System.out.println("ending..."); } } xml中bean实例的配置 <bean id="hello" class="com.soft1851.spring.aop.hello.HelloImpl"/> <bean id="beforeAdvice" class="com.soft1851.spring.aop.hello.BuildHello"/> <aop:config > <aop:aspect id="before" ref="beforeAdvice"> <aop:pointcut id="beforeCut" expression="execution(* com.soft1851.spring.aop.hello..*.*(..))"/> <aop:before method="beforeBuilder" pointcut-ref="beforeCut"/> </aop:aspect> <aop:aspect id="after" ref="beforeAdvice"> <aop:pointcut id="afterCut" expression="execution(* com.soft1851.spring.aop.hello..*.*(..))"/> <aop:after-returning method="afterBuilder" pointcut-ref="afterCut"/> </aop:aspect> </aop:config>注意要点：aop-config是配置整体的切面编程，而aop-aspect是设置切点和增强的容器，aop-pointcun用于设置切点，aop:before用于设置前置增强，aop:after-returning用于设置后置增强注解版实例代码dao底层代码@Repository public class ForumDaoImpl implements ForumDao { private JdbcTemplate jdbcTemplate; public ForumDaoImpl(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public List<Forum> selectAll() { String sql = "SELECT * FROM t_forum "; System.out.println(jdbcTemplate); return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Forum.class)); } @Override public int insert(Forum forum) { System.out.println("开始插入数据"); String sql = "INSERT INTO t_forum VALUES (Null,?)"; Object[] args = {forum.getForumName()}; return jdbcTemplate.update(sql, args); } @Override publ…