1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

Compare commits

...

3 Commits

Author SHA1 Message Date
Guide
7c6e03dd21 [docs update]typo 2025-03-07 23:18:46 +08:00
Guide
7710241da5
Merge pull request #2633 from DOTime/Ars-patch_operating-system-basic-questions-02
Update operating-system-basic-questions-02.md
2025-03-07 23:15:13 +08:00
DOTime
25d0dcf455
Update operating-system-basic-questions-02.md
原文对段页机制的描述有误
2025-03-07 20:18:12 +08:00
3 changed files with 9 additions and 5 deletions

View File

@ -317,12 +317,16 @@ LRU 算法是实际使用中应用的比较多,也被认为是最接近 OPT
### 段页机制 ### 段页机制
结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。 结合了段式管理和页式管理的一种内存管理机制。程序视角中,内存被划分为多个逻辑段,每个逻辑段进一步被划分为固定大小的页。
在段页式机制下,地址翻译的过程分为两个步骤: 在段页式机制下,地址翻译的过程分为两个步骤:
1. 段式地址映射。 1. **段式地址映射(虚拟地址 → 线性地址):**
2. 页式地址映射。 - 虚拟地址 = 段选择符(段号)+ 段内偏移。
- 根据段号查段表,找到段基址,加上段内偏移得到线性地址。
2. **页式地址映射(线性地址 → 物理地址):**
- 线性地址 = 页号 + 页内偏移。
- 根据页号查页表,找到物理页框号,加上页内偏移得到物理地址。
### 局部性原理 ### 局部性原理

View File

@ -779,7 +779,7 @@ Cache Aside Pattern 中遇到写请求是这样的:更新数据库,然后直
1. 使用连接池:避免频繁创建关闭客户端连接。 1. 使用连接池:避免频繁创建关闭客户端连接。
2. 尽量不使用 O(n) 指令,使用 O(n) 命令时要关注 n 的数量:像 `KEYS *``HGETALL``LRANGE``SMEMBERS``SINTER`/`SUNION`/`SDIFF` 等 O(n) 命令并非不能使用,但是需要明确 n 的值。另外,有遍历的需求可以使用 `HSCAN``SSCAN``ZSCAN` 代替。 2. 尽量不使用 O(n) 指令,使用 O(n) 命令时要关注 n 的数量:像 `KEYS *``HGETALL``LRANGE``SMEMBERS``SINTER`/`SUNION`/`SDIFF` 等 O(n) 命令并非不能使用,但是需要明确 n 的值。另外,有遍历的需求可以使用 `HSCAN``SSCAN``ZSCAN` 代替。
3. 使用批量操作减少网络传输:原生批量操作命令(比如 `MGET``MSET` 等等、pipeline、Lua 脚本。 3. 使用批量操作减少网络传输:原生批量操作命令(比如 `MGET``MSET` 等等、pipeline、Lua 脚本。
4. 尽量不用 Redis 事务Redis 事务实现的功能比较鸡肋,可以使用 Lua 脚本代替。 4. 尽量不使用 Redis 事务Redis 事务实现的功能比较鸡肋,可以使用 Lua 脚本代替。
5. 禁止长时间开启 monitor对性能影响比较大。 5. 禁止长时间开启 monitor对性能影响比较大。
6. 控制 key 的生命周期:避免 Redis 中存放了太多不经常被访问的数据。 6. 控制 key 的生命周期:避免 Redis 中存放了太多不经常被访问的数据。
7. …… 7. ……

View File

@ -11,7 +11,7 @@ tag:
Java 阻塞队列的历史可以追溯到 JDK1.5 版本,当时 Java 平台增加了 `java.util.concurrent`,即我们常说的 JUC 包,其中包含了各种并发流程控制工具、并发容器、原子类等。这其中自然也包含了我们这篇文章所讨论的阻塞队列。 Java 阻塞队列的历史可以追溯到 JDK1.5 版本,当时 Java 平台增加了 `java.util.concurrent`,即我们常说的 JUC 包,其中包含了各种并发流程控制工具、并发容器、原子类等。这其中自然也包含了我们这篇文章所讨论的阻塞队列。
为了解决高并发场景下多线程之间数据共享的问题JDK1.5 版本中出现了 `ArrayBlockingQueue``LinkedBlockingQueue`,它们是带有生产者-消费者模式实现的并发容器。其中,`ArrayBlockingQueue` 是有界队列,即添加的元素达到上限之后,再次添加就会被阻塞或者抛出异常。而 `LinkedBlockingQueue` 则由链表构成的队列,正是因为链表的特性,所以 `LinkedBlockingQueue` 在添加元素上并不会向 `ArrayBlockingQueue` 那样有着较多的约束,所以 `LinkedBlockingQueue` 设置队列是否有界是可选的(注意这里的无界并不是指可以添加任数量的元素,而是说队列的大小默认为 `Integer.MAX_VALUE`,近乎于无限大)。 为了解决高并发场景下多线程之间数据共享的问题JDK1.5 版本中出现了 `ArrayBlockingQueue``LinkedBlockingQueue`,它们是带有生产者-消费者模式实现的并发容器。其中,`ArrayBlockingQueue` 是有界队列,即添加的元素达到上限之后,再次添加就会被阻塞或者抛出异常。而 `LinkedBlockingQueue` 则由链表构成的队列,正是因为链表的特性,所以 `LinkedBlockingQueue` 在添加元素上并不会向 `ArrayBlockingQueue` 那样有着较多的约束,所以 `LinkedBlockingQueue` 设置队列是否有界是可选的(注意这里的无界并不是指可以添加任数量的元素,而是说队列的大小默认为 `Integer.MAX_VALUE`,近乎于无限大)。
随着 Java 的不断发展JDK 后续的几个版本又对阻塞队列进行了不少的更新和完善: 随着 Java 的不断发展JDK 后续的几个版本又对阻塞队列进行了不少的更新和完善: