Skip to content

Commit 8b95e8b

Browse files
committed
docs: optimize java and os articles
1 parent 0d6d4e0 commit 8b95e8b

11 files changed

Lines changed: 669 additions & 266 deletions

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
**[English](./README_EN.md)** | **[日本語](./README_JA.md)** | **简体中文**
2+
13
- 推荐在线阅读(体验更好,速度更快):[javaguide.cn](https://javaguide.cn/)
24
- 面试突击版本(只保留重点,附带精美 PDF 下载):[interview.javaguide.cn](https://interview.javaguide.cn/)
35

README_EN.md

Lines changed: 43 additions & 48 deletions
Large diffs are not rendered by default.

README_JA.md

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,6 @@
1-
より快適でスピーディーな体験のため、オンライン閲覧プラットフォームでの閲覧をおすすめします!リンク: [javaguide.cn](https://javaguide.cn/)
2-
3-
<div align="center">
4-
5-
[![logo](https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png)](https://github.com/Snailclimb/JavaGuide)
6-
7-
[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)
8-
9-
<a href="https://trendshift.io/repositories/1319" target="_blank"><img src="https://trendshift.io/api/badge/repositories/1319" alt="Snailclimb%2FJavaGuide | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
1+
**[English](./README_EN.md)** | **日本語** | **[简体中文](./README.md)**
102

11-
</div>
12-
13-
> - **面接版**: Java の面接対策をしている方は、**[《Java 面接ガイド》](./docs/zhuanlan/java-mian-shi-zhi-bei.md)**(高品質で、面接向けに特化して設計されており、JavaGuide と併用するのがおすすめです)を検討してみてください。
14-
> - **知識惑星(Knowledge Planet)**: 限定の面接ミニ書籍/1 対 1 のコミュニケーション/履歴書の添削/限定の就職活動ガイドなど、**[JavaGuide 知識惑星](./docs/about-the-author/zhishixingqiu-two-years.md)** への参加を歓迎します(リンクをクリックすると惑星の詳しい紹介を確認できます。本当に必要かどうかを見極めてから参加してください)。
15-
> - **使い方の提案**: 経験豊富な面接官は、プロジェクト経験に沿って技術的な問題を深掘りしてくるものです。技術記事を丸暗記するのは絶対にやめましょう!詳しい学習の提案については [JavaGuide 使い方の提案](./docs/javaguide/use-suggestion.md) を参照してください。
16-
> - **Star のお願い**: JavaGuide の内容が役に立ったと感じたら、ぜひ無料の Star をお願いします。それが私にとって最大の励みになります。共に歩み、共に努力してくれる皆さん、ありがとうございます!Github リンク: [https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide)
17-
> - **転載に関する注意**: 以下のすべての記事は、冒頭に特に断りがない限り、JavaGuide のオリジナル作品です。転載の際は出典を明記してください。悪質な盗用・コピーが発見された場合は、法的手段を用いて権利を守ります。皆で良質な技術創作環境を維持していきましょう!
18-
19-
<div align="center">
20-
<img src="https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" />
21-
</div>
22-
23-
<!-- #region home -->
3+
より快適でスピーディーな体験のため、オンライン閲覧プラットフォームでの閲覧をおすすめします!リンク: [javaguide.cn](https://javaguide.cn/)
244

255
## プロジェクト関連
266

docs/cs-basics/operating-system/linux-intro.md

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,15 @@ Linux 的发行版本可以大体分为两类:
4848
- **商业公司维护的发行版本**:比如 Red Hat 公司维护支持的 Red Hat Enterprise Linux (RHEL)。
4949
- **社区组织维护的发行版本**:比如基于 Red Hat Enterprise Linux(RHEL)的 CentOS、基于 Debian 的 Ubuntu。
5050

51-
对于初学者学习 Linux,推荐选择 CentOS,原因如下:
51+
对于初学者学习 Linux,不建议再无条件选择 CentOS。CentOS Linux 8 已在 2021 年底停止维护,CentOS Linux 7 也已在 2024 年 6 月结束生命周期;现在的 CentOS Stream 是 RHEL 的上游持续交付分支,定位和过去“稳定的 RHEL 兼容重构版”不一样。
5252

53-
- CentOS 免费且开放源代码。
54-
- CentOS 基于 RHEL,功能与 RHEL 高度一致,安全稳定、性能优秀。
53+
更稳妥的选择是:
54+
55+
- 想学习企业服务器环境、RHEL 生态:优先选择 Rocky Linux 或 AlmaLinux。
56+
- 想快速上手、资料多、桌面和服务器都常见:选择 Ubuntu LTS。
57+
- 想要稳定、轻量、贴近社区发行版:选择 Debian。
58+
59+
如果你的公司环境仍在使用 CentOS,可以按实际环境学习对应版本;但新装学习环境时,更推荐选择仍在维护的发行版。
5560

5661
## Linux 文件系统
5762

@@ -69,7 +74,7 @@ inode 是 Linux/Unix 文件系统的基础。那 inode 到底是什么?有什
6974

7075
通过以下五点可以概括 inode 到底是什么:
7176

72-
1. 硬盘以扇区(Sector)为最小物理存储单位,而操作系统和文件系统以块(Block)为单位进行读写,块由多个扇区组成。文件数据存储在这些块中。现代硬盘扇区通常为 4KB,与一些常见块大小相同,但操作系统也支持更大的块大小,以提升大文件读写性能。文件元信息(例如权限、大小、修改时间以及数据块位置)存储在 inode(索引节点)中。每个文件都有唯一的 inode。inode 本身不存储文件数据,而是存储指向数据块的指针,操作系统通过这些指针找到并读取文件数据。固态硬盘(SSD)虽然没有物理扇区,但使用逻辑块,其概念与传统硬盘的块类似
77+
1. 硬盘以扇区(Sector)为最小物理存储单位,而操作系统和文件系统通常以块(Block)为单位进行读写,块由多个扇区组成。传统磁盘扇区常见大小是 512 字节,现代磁盘也常见 4 KB 物理扇区(例如 512e/4Kn 设备);文件系统块大小也常见 4 KB,但两者不是一个概念。文件数据存储在这些块中,文件元信息(例如权限、大小、修改时间以及数据块位置)存储在 inode(索引节点)中。每个文件都有唯一的 inode。inode 本身不存储文件数据,而是存储指向数据块的指针,操作系统通过这些指针找到并读取文件数据。固态硬盘(SSD)虽然没有传统机械磁盘意义上的物理扇区,但仍然对外暴露逻辑块接口
7378
2. inode 是一种固定大小的数据结构,其大小在文件系统创建时就确定了,并且在文件的生命周期内保持不变。
7479
3. inode 的访问速度非常快,因为系统可以直接通过 inode 号码定位到文件的元数据信息,无需遍历整个文件系统。
7580
4. inode 的数量是有限的,每个文件系统只能包含固定数量的 inode。这意味着当文件系统中的 inode 用完时,无法再创建新的文件或目录,即使磁盘上还有可用空间。因此,在创建文件系统时,需要根据文件和目录的预期数量来合理分配 inode 的数量。
@@ -82,7 +87,7 @@ inode 是 Linux/Unix 文件系统的基础。那 inode 到底是什么?有什
8287
- **inode**:记录文件的属性信息,可以使用 `stat` 命令查看 inode 信息。
8388
- **block**:实际文件的内容,如果一个文件大于一个块时候,那么将占用多个 block,但是一个块只能存放一个文件。(因为数据是由 inode 指向的,如果有两个文件的数据存放在同一个块中,就会乱套了)
8489

85-
![文件inode信息](./images/文件inode信息.png)
90+
![stat 命令查看文件 inode 信息](./images/文件inode信息.png)
8691

8792
可以看出,Linux/Unix 操作系统使用 inode 区分不同的文件。这样做的好处是,即使文件名被修改或删除,文件的 inode 号码不会改变,从而可以避免一些因文件重命名、移动或删除导致的错误。同时,inode 也可以提供更高的文件系统性能,因为 inode 的访问速度非常快,可以直接通过 inode 号码定位到文件的元数据信息,无需遍历整个文件系统。
8893

@@ -187,7 +192,7 @@ Linux 使用一种称为目录树的层次结构来组织文件和目录。目
187192
- `ls`:显示目录中的文件和子目录的列表。例如:`ls /home`,显示 `/home` 目录下的文件和子目录列表。
188193
- `ll``ll``ls -l` 的别名,ll 命令可以看到该目录下的所有目录和文件的详细信息。
189194
- `mkdir [选项] 目录名`:创建新目录(增)。例如:`mkdir -m 755 my_directory`,创建一个名为 `my_directory` 的新目录,并将其权限设置为 755,其中所有者拥有读、写、执行权限,所属组和其他用户只有读、执行权限,无法修改目录内容(如创建或删除文件)。如果希望所有用户(包括所属组和其他用户)对目录都拥有读、写、执行权限,则应设置权限为 `777`,即:`mkdir -m 777 my_directory`
190-
- `find [路径] [表达式]`:在指定目录及其子目录中搜索文件或目录(查),非常强大灵活。例如:① 列出当前目录及子目录下所有文件和文件夹:`find .`;② 在 `/home` 目录下查找以 `.txt` 结尾的文件名:`find /home -name "*.txt"`,忽略大小写:`find /home -i name "*.txt"`;③ 当前目录及子目录下查找所有以 `.txt``.pdf` 结尾的文件:`find . \( -name "*.txt" -o -name "*.pdf" \)``find . -name "*.txt" -o -name "*.pdf"`
195+
- `find [路径] [表达式]`:在指定目录及其子目录中搜索文件或目录(查),非常强大灵活。例如:① 列出当前目录及子目录下所有文件和文件夹:`find .`;② 在 `/home` 目录下查找以 `.txt` 结尾的文件名:`find /home -name "*.txt"`,忽略大小写:`find /home -iname "*.txt"`;③ 当前目录及子目录下查找所有以 `.txt``.pdf` 结尾的文件:`find . \( -name "*.txt" -o -name "*.pdf" \)``find . -name "*.txt" -o -name "*.pdf"`
191196
- `pwd`:显示当前工作目录的路径。
192197
- `rmdir [选项] 目录名`:删除空目录(删)。例如:`rmdir -p my_directory`,删除名为 `my_directory` 的空目录,并且会递归删除 `my_directory` 的空父目录,直到遇到非空目录或根目录。
193198
- `rm [选项] 文件或目录名`:删除文件/目录(删)。例如:`rm -r my_directory`,删除名为 `my_directory` 的目录,`-r`(recursive,递归)表示会递归删除指定目录及其所有子目录和文件。
@@ -243,11 +248,11 @@ Linux 中的打包文件一般是以 `.tar` 结尾的,压缩的命令一般是
243248

244249
示例:在随意某个目录下 `ls -l`
245250

246-
![](./images/Linux权限命令.png)
251+
![Linux 文件权限命令示例](./images/Linux权限命令.png)
247252

248253
第一列的内容的信息解释如下:
249254

250-
![](./images/Linux权限解读.png)
255+
![Linux 文件权限字段解读](./images/Linux权限解读.png)
251256

252257
> 下面将详细讲解文件的类型、Linux 中权限以及文件有所有者、所在组、其它组具体是什么?
253258
@@ -299,16 +304,21 @@ Linux 中的打包文件一般是以 `.tar` 结尾的,压缩的命令一般是
299304

300305
**`chmod u=rwx,g=rw,o=r aaa.txt`** 或者 **`chmod 764 aaa.txt`**
301306

302-
![](./images/修改文件权限.png)
307+
![chmod 修改 Linux 文件权限示例](./images/修改文件权限.png)
303308

304309
**补充一个比较常用的东西:**
305310

306311
假如我们装了一个 zookeeper,我们每次开机到要求其自动启动该怎么办?
307312

308-
1. 新建一个脚本 zookeeper。
309-
2. 为新建的脚本 zookeeper 添加可执行权限,命令是:`chmod +x zookeeper`
310-
3. 把 zookeeper 这个脚本添加到开机启动项里面,命令是:`chkconfig --add zookeeper`
311-
4. 如果想看看是否添加成功,命令是:`chkconfig --list`
313+
现在主流 Linux 发行版基本使用 systemd 管理服务,推荐做法是编写一个 `zookeeper.service` 单元文件,然后使用下面的命令设置开机自启:
314+
315+
```bash
316+
sudo systemctl enable zookeeper
317+
sudo systemctl start zookeeper
318+
sudo systemctl status zookeeper
319+
```
320+
321+
如果修改了 service 文件,需要先执行 `sudo systemctl daemon-reload` 让 systemd 重新加载配置。`chkconfig --add zookeeper``chkconfig --list` 属于 SysV init 时代的做法,只有在较老的发行版或兼容环境中才会用到。
312322

313323
### 用户管理
314324

@@ -348,6 +358,7 @@ Linux 系统是一个多用户多任务的分时操作系统,任何一个要
348358
- `sar [选项] [时间间隔] [重复次数]`:用于收集、报告和分析系统的性能统计信息,包括系统的 CPU 使用、内存使用、磁盘 I/O、网络活动等详细信息。它的特点是可以连续对系统取样,获得大量的取样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。
349359
- `ps [选项]`:用于查看系统中的进程信息,包括进程的 ID、状态、资源使用情况等。`ps -ef`/`ps -aux`:这两个命令都是查看当前系统正在运行进程,两者的区别是展示格式不同。如果想要查看特定的进程可以使用这样的格式:`ps aux|grep redis`(查看包括 redis 字符串的进程),也可使用 `pgrep redis -a`
350360
- `systemctl [命令] [服务名称]`:用于管理系统的服务和单元,可以查看系统服务的状态、启动、停止、重启等。
361+
- `journalctl [选项]`:用于查看 systemd 日志,排查服务启动失败、系统错误非常常用。例如:`journalctl -u nginx -f` 实时查看 nginx 服务日志,`journalctl -xe` 查看最近的系统错误上下文。
351362

352363
### 网络通信
353364

@@ -377,7 +388,7 @@ Linux 系统是一个多用户多任务的分时操作系统,任何一个要
377388
- 用户级别环境变量:`~/.bashrc``~/.bash_profile`
378389
- 系统级别环境变量:`/etc/bashrc``/etc/environment``/etc/profile``/etc/profile.d`
379390

380-
上述配置文件执行先后顺序为:`/etc/environment` --> `/etc/profile` --> `/etc/profile.d` --> `~/.bash_profile` --> `/etc/bashrc` --> `~/.bashrc`
391+
环境变量配置文件的加载顺序不是固定一条线,取决于当前 shell 是登录 shell、非登录交互 shell,还是非交互 shell。以 Bash 为例,登录 shell 通常会读取 `/etc/profile`,再读取用户目录下第一个存在且可读的 `~/.bash_profile``~/.bash_login` `~/.profile`;交互式非登录 shell 通常读取 `~/.bashrc`。很多发行版会在 `~/.bash_profile` 中手动加载 `~/.bashrc`,所以你实际看到的加载链路还会受发行版默认配置影响。
381392

382393
如果要修改系统级别环境变量文件,需要管理员具备对该文件的写入权限。
383394

docs/cs-basics/operating-system/operating-system-basic-questions-01.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ head:
1818

1919
开始本文的内容之前,我们先聊聊为什么要学习操作系统。
2020

21-
- **从对个人能力方面提升来说**:操作系统中的很多思想、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。比如说我们开发的系统使用的缓存(比如 Redis)和操作系统的高速缓存就很像。CPU 中的高速缓存有很多种,不过大部分都是为了解决 CPU 处理速度和内存处理速度不对等的问题。我们还可以把内存看作外存的高速缓存,程序运行的时候我们把外存的数据复制到内存,由于内存的处理速度远远高于外存,这样提高了处理速度。同样地,我们使用的 Redis 缓存就是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。高速缓存一般会按照局部性原理(2-8 原则)根据相应的淘汰算法保证缓存中的数据是经常会被访问的。我们平常使用的 Redis 缓存很多时候也会按照 2-8 原则去做,很多淘汰算法都和操作系统中的类似。既说了 2-8 原则,那就不得不提命中率了,这是所有缓存概念都通用的。简单来说也就是你要访问的数据有多少能直接在缓存中直接找到。命中率高的话,一般表明你的缓存设计比较合理,系统处理速度也相对较快。
21+
- **从对个人能力方面提升来说**:操作系统中的很多思想、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。比如说我们开发的系统使用的缓存(比如 Redis)和操作系统的高速缓存就很像。CPU 中的高速缓存有很多种,不过大部分都是为了解决 CPU 处理速度和内存处理速度不对等的问题。我们还可以把内存看作外存的高速缓存,程序运行的时候我们把外存的数据复制到内存,由于内存的处理速度远远高于外存,这样提高了处理速度。同样地,我们使用的 Redis 缓存就是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。高速缓存通常会利用局部性原理:程序在一段时间内访问的数据往往集中在一小部分区域,这和二八原则有些相似,但两者不是同一个概念。很多淘汰算法都和操作系统中的类似。说到缓存,那就不得不提命中率了,这是所有缓存概念都通用的。简单来说也就是你要访问的数据有多少能直接在缓存中直接找到。命中率高的话,一般表明你的缓存设计比较合理,系统处理速度也相对较快。
2222
- **从面试角度来说**:尤其是校招,对于操作系统方面知识的考察是非常非常多的。
2323

2424
**简单来说,学习操作系统能够提高自己思考的深度以及对技术的理解力,并且,操作系统方面的知识也是面试必备。**
2525

2626
## 操作系统基础
2727

28-
![](https://oss.javaguide.cn/2020-8/image-20200807161118901.png)
28+
![操作系统基础知识导图](https://oss.javaguide.cn/2020-8/image-20200807161118901.png)
2929

3030
### 什么是操作系统?
3131

@@ -169,7 +169,7 @@ _玩玩电脑游戏还是必须要有 Windows 的,所以我现在是一台 Win
169169

170170
这是我用 AI 绘制的一张图片,可以说是非常形象了:
171171

172-
![](https://oss.javaguide.cn/github/javaguide/cs-basics/operating-system/process-and-thread-difference-wechat-factory-as-an-example.png)
172+
![用微信工厂类比进程和线程的区别](https://oss.javaguide.cn/github/javaguide/cs-basics/operating-system/wechat-factory-process-thread.png)
173173

174174
下图是 Java 内存区域,我们从 JVM 的角度来说一下线程和进程之间的关系吧!
175175

@@ -211,7 +211,7 @@ _玩玩电脑游戏还是必须要有 Windows 的,所以我现在是一台 Win
211211
2. **读写锁(Read-Write Lock)**:允许多个线程同时读取共享资源,但只有一个线程可以对共享资源进行写操作。
212212
3. **信号量(Semaphore)**:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
213213
4. **屏障(Barrier)**:屏障是一种同步原语,用于等待多个线程到达某个点再一起继续执行。当一个线程到达屏障时,它会停止执行并等待其他线程到达屏障,直到所有线程都到达屏障后,它们才会一起继续执行。比如 Java 中的 `CyclicBarrier` 是这种机制。
214-
5. **事件(Event)**Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作
214+
5. **条件变量(Condition Variable)/事件通知**线程在条件不满足时等待,其他线程在条件变更后通知等待线程继续执行。它通常需要和互斥锁配合使用,避免“通知先发生、等待后发生”导致的丢通知问题。Java 中的 `Object.wait()/notify()``Condition.await()/signal()` 都属于这类思路
215215

216216
### PCB 是什么?包含哪些信息?
217217

@@ -301,7 +301,7 @@ PCB 主要包含下面几部分的内容:
301301

302302
这时,线程 1 等着线程 2 释放锁 B,而线程 2 等着线程 1 释放锁 A,双方都持有对方需要的资源,并等待对方释放,就形成了一个“死结”。
303303

304-
<img src="https://oss.javaguide.cn/github/javaguide/cs-basics/operating-system/deadlock-two-threads-waiting-for-each-other-to-release-lock.png" style="zoom: 50%;" />
304+
![死锁展示](https://oss.javaguide.cn/github/javaguide/cs-basics/operating-system/deadlock-conditions-robots.png)
305305

306306
### 产生死锁的四个必要条件是什么?
307307

0 commit comments

Comments
 (0)