Skip to content

Commit 0488ccc

Browse files
committed
update OS part
1 parent ad0a423 commit 0488ccc

5 files changed

Lines changed: 33 additions & 12 deletions

File tree

JavaKnowledge/常用命令行大全.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,10 @@ $ file .bashrc
526526
527527
### Shell脚本
528528
529+
Shell的作用就是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式,Shell还有一种执行命令的方式称为批处理,用户事先写一个Shell脚本,其中有很多条命令,让Shell一次把这些命令执行完,而不是一条一条的敲命令。
530+
Shell脚本和编程语言很类似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行。
531+
532+
529533
```shell
530534
#!/bin/bash
531535
# This line is a comment

OperatingSystem/2.进程与线程.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ A给B发送信号,B收到信号之前执行自己的代码,收到信号后
336336
337337
操作系统会中断目标程序的进程来向其发送信号、在任何非原子指令中,执行都可以中断,如果进程已经注册了新号处理程序,那么就执行进程,如果没有注册,将采用默认处理的方式。
338338
339+
信号效率非常高,但是可携带的数据有限,只能写到一个标志位,无法携带其他数据。
339340
- 信号量
340341
341342
信号量(semaphore)是由荷兰人E.W.Dijkstra在20世纪60年代所构思出的一种程序设计构造。其原型来源于铁路的运行:在一条单轨铁路上,任何时候只能有一列列车行驶在上面。而管理这条铁路的系统就是信号量。任何一列火车必须等到表明铁路可以行驶的信号后才能进入轨道。当一列列车进入单轨运行后,需要将信号改为禁止进入,从而防止别的火车同时进入轨道。而当列车驶出单轨后,则需要将信号变回允许进入状态。这很像以前的旗语,在计算机里,信号量实际上就是一个简单整数。一个进程在信号变为0或者1的情况下推进,并且将信号变为1或0来防止别的进程推进。当进程完成任务后,则将信号再改变为0或1,从而允许其他进程执行。需要注意的是,信号量不只是一种通信机制,更是一种同步机制。
@@ -358,7 +359,7 @@ FIFO常被称为命名管道,以区分管道(pipe)。管道(pipe)只能用于
358359
一旦使用mkfifo创建了一个FIFO,就可以使用open打开它,常见的文件I/O函数都可用于fifo。如:close、read、write、unlink等。
359360
360361
361-
- 存储映射I/O
362+
- 存储映射
362363
       存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。这样,就可在不适用read和write函数的情况下,使用地址(指针)完成I/O操作。
363364
       使用这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。
364365
总结:使用mmap时务必注意以下事项:
@@ -370,6 +371,15 @@ FIFO常被称为命名管道,以区分管道(pipe)。管道(pipe)只能用于
370371
6.     如果文件偏移量必须为4K的整数倍
371372
7.     mmap创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。
372373
374+
- 匿名映射
375+
376+
使用映射区完成文件读写操作十分方便,父子进程间通信比较容易。但缺陷是,每次创建映射区一定要依赖一个文件才能实现。通常为了建立映射区要open一个temp文件,创建好了再unlink、close掉,比较麻烦。可以直接使用匿名映射来代替。其实linux系统给我们提供了创建匿名映射区的方法,无需依赖一个文件即可创建映射区。
377+
需要借助标志位参数来指定:
378+
使用MAP_ANONYMOUS或MAP_ANON,例如:
379+
```c
380+
int *p = mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
381+
// 4是随意举例,该位置表示大小,可依据实际需要填写
382+
```
373383

374384
- Message Queue消息传递系统/消息队列
375385

OperatingSystem/3.内存管理.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ TLB通常由CPU制造商提供,但TLB的更换算法则有可能由操作系
402402

403403

404404

405-
## 内存映射
405+
## 内存映射(共享内存)
406406

407407
进程通过一个系统调用(mmap)将一个文件(或部分)映射到其虚拟地址空间的一部分,访问这个文件就像访问内存中的一个大数组,而不是对文件进行读写。
408408

VideoDevelopment/.DS_Store

-2 KB
Binary file not shown.

VideoDevelopment/P2P技术/P2P原理_NAT穿透.md

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
P2P原理_NAT穿透
22
===
33

4-
5-
64
### NAT
75

86
NAT(Network Address Translation,网络地址转换),也叫做网络掩蔽或者IP掩蔽。NAT是一种网络地址翻译技术,主要是将内部的私有IP地址(private IP)转换成可以在公网使用的公网IP(public IP)。
97

108

11-
129
网络地址转换,就是替换IP报文头部的地址信息。NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力。那么,什么是内部网络IP地址?
1310

1411
[RFC1918](https://datatracker.ietf.org/doc/rfc1918/)规定了三个保留地址段落:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255。这三个范围分别处于A,B,C类的地址段,不向特定的用户分配,被IANA作为私有地址保留。这些地址可以在任何组织或企业内部使用,和其他Internet地址的区别就是,仅能在内部使用,不能作为全球路由地址。这就是说,出了组织的管理范围这些地址就不再有意义,无论是作为源地址,还是目的地址。对于一个封闭的组织,如果其网络不连接到Internet,就可以使用这些地址而不用向IANA提出申请,而在内部的路由管理和报文传递方式与其他网络没有差异。
@@ -33,18 +30,28 @@ NAT(Network Address Translation,网络地址转换),也叫做网络掩
3330

3431
简单的背景了解过后,下面介绍下NAT实现的主要方式,以及NAT都有哪些类型。
3532

36-
37-
3833
### NAT的实现方式
39-
40-
41-
4234
- 静态NAT: 就是静态地址转换。是指一个公网IP对应一个私有IP,是一对一的转换,同时注意,这里只进行了IP转换,而没有进行端口的转换。
4335

4436
- NAPT: 端口多路复用技术。与静态NAT的差别是,NAPT不但要转换IP地址,还要进行传输层的端口转换。具体的表现形式就是,对外只有一个公网IP,通过端口来区别不同私有IP主机的数据。
4537

46-
38+
### NAT映射
39+
40+
表内记录了私有ip和公有ip的对应关系,例如:
41+
```
42+
192.168.1.35:8000 <--> 123.24.56.78:10000
43+
....
44+
```
45+
46+
### NAT打洞
4747

48+
正常两个人发送数据,例如通过QQ聊天,目前的步骤是:
49+
- A使用私有ip经过NAT映射转换为公有IP后将数据发送给腾讯
50+
- 腾讯将数据转发给B用户
51+
那后续能不能直接A和B进行链接,这样可以提高效率:
52+
- 直接通讯存在一个问题,路由器内部有一个保护支持,对于陌生的IP第一次发的数据包,路由器会丢弃或屏蔽掉,以此来防止陌生网络进行攻击。
53+
- 所以要想能够让B的路由器直接接受到A发送的数据,那就必须保证B的路由器要熟悉A的IP地址,这样B才能够进行接收。而A和B首次登录QQ的时候腾讯已经将自己的ip返回给A和B了,所以A和B的路由中都认识腾讯的IP了,这样A和B都能接受腾讯发送的数据包。
54+
- 那如何让A和B进行直接通信,这里就是腾讯所有的事情,腾讯就通过腾讯的公网IP对AB之间进行了打洞的操作,将对方的IP都下发给对应的AB用户,这样就把他俩形成了一个私有的通路,这个操作就是打洞。
4855

4956

5057

@@ -68,4 +75,4 @@ NAT(Network Address Translation,网络地址转换),也叫做网络掩
6875
---
6976

7077
- 邮箱 :charon.chui@gmail.com
71-
- Good Luck!
78+
- Good Luck!

0 commit comments

Comments
 (0)