diff --git a/Latex/algorithme_and_equation/kuohao.tex b/Latex/algorithme_and_equation/kuohao.tex new file mode 100644 index 00000000..b6e81efa --- /dev/null +++ b/Latex/algorithme_and_equation/kuohao.tex @@ -0,0 +1,13 @@ + +\documentclass{article} +\title{括号里面} +\author{应用} +\usepackage{ctex} +\newcommad\degree{^\circ} +\begin{document} + +\maketitle + +\section{hello} +hello world殷康龙 +\end{document} diff --git a/code_segment/shili.cpp b/code_segment/shili.cpp new file mode 100644 index 00000000..bfe37026 --- /dev/null +++ b/code_segment/shili.cpp @@ -0,0 +1,18 @@ +#include +using namespace std; +int add(int a,int b){ + int c = a+b; + return c; +} + +int main(){ + int a=10,b=11; + add(a,b); + int m = 10; + while(m--){ + if(m>5){ + cout< 5. OS结构设计 ## 1 操作系统的目标和作用 - +![](image/2021-09-04-08-49-51.png) ### 定义 * 操作系统(Operating System,OS)是计算机系统最基础的系统软件,管理软硬件资源、控制程序执行,改善人机界面,合理组织计算机工作流程,为用户使用计算机提供良好运行环境。 diff --git a/操作系统/2.1 进程的基本概念.md b/操作系统/2.1 进程的基本概念.md index 7c24144f..779d4514 100644 --- a/操作系统/2.1 进程的基本概念.md +++ b/操作系统/2.1 进程的基本概念.md @@ -40,8 +40,8 @@ ### 进程的特征 * 结构特征:由程序段、数据段和 PCB 三部分便构成了进程实体。 -* 动态性:进程的实质是进程实体的一次执行过程,包含创建、调度、撤销。进程具有一定的声明周期。程序是一组指令的集合,是静态的。 * 并发性:这是指多个进程实体同存于内存中,且能在一段时间内同时运行。 +* 动态性:进程的实质是进程实体的一次执行过程,包含创建、调度、撤销。进程具有一定的声明周期。程序是一组指令的集合,是静态的。 * 独立性:独立性是指进程实体是一个能独立运行、独立分配资源和独立接受调度的基本单位。 * 异步性:这是指进程按各自独立的、 不可预知的速度向前推进,或说进程实体按异步方式运行。 diff --git a/操作系统/2.2 进程控制.md b/操作系统/2.2 进程控制.md index 3d6f3cf0..3c169efc 100644 --- a/操作系统/2.2 进程控制.md +++ b/操作系统/2.2 进程控制.md @@ -1,6 +1,6 @@ # 2.2 进程控制 -> 上一节主要从状态的角度介绍了静态的状态有哪些。这一节朱啊哟介绍状态之间如何切换,引起切换的原因,和切换的步骤。 +> 上一节主要从状态的角度介绍了静态的状态有哪些。这一节介绍状态之间如何切换,引起切换的原因,和切换的步骤。 > 7中状态主要包括创建、终止、就绪、阻塞、执行、静态阻塞、静态就绪。 > 状态转换主要包括:创建、终止(释放)、阻塞、唤醒、调度、挂起、激活。 @@ -73,8 +73,8 @@ ### 进程挂起的过程 -1. 首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪; 对于活动阻塞状态的进程,则将之改为静止阻塞。为 -2. 了方便用户或父进程考查该进程的运行情况而把该进程的 PCB 复制到某指定的内存区域。 +1. 首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪; 对于活动阻塞状态的进程,则将之改为静止阻塞。 +2. 为了方便用户或父进程考查该进程的运行情况而把该进程的 PCB 复制到某指定的内存区域。 3. 最后,若被挂起的进程正在执行,则转向调度程序重新调度 ### 进程激活的过程 diff --git a/操作系统/2.3 进程同步.md b/操作系统/2.3 进程同步.md index 65d82226..2c7f0f9f 100644 --- a/操作系统/2.3 进程同步.md +++ b/操作系统/2.3 进程同步.md @@ -5,9 +5,11 @@ ### 两种制约关系 > 针对两种制约关系,合作制约关系和互斥制约关系,需要通过同步机制实现。 -- 直接制约关系(合作/同步)。由于多个进程相互合作产生,使得进程有一定的先后执行关系。 +- 直接制约关系(同步)。由于多个进程相互合作产生,使得进程有一定的先后执行关系。 - 间接制约关系(互斥)。由于多个进程资源共享产生,多个进程在同一时刻只有一个进程能进入临界区。 + +> 显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个任务之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!因此互斥具有唯一性和排它性,但互斥并不限制任务的运行顺序,即任务是无序的,而同步的任务之间则有顺序关系。 ### 临界资源和临界区 * 共享的互斥资源称为**临界资源**。 * 对临界资源进行访问的那段代码称为**临界区**。 diff --git a/操作系统/2.4 进程通信.md b/操作系统/2.4 进程通信.md index 5f38932e..62bfae91 100644 --- a/操作系统/2.4 进程通信.md +++ b/操作系统/2.4 进程通信.md @@ -17,7 +17,7 @@ ### 进程通信的实现划分 * 基础进程通信机制。只能传递状态和整数值(控制信息)。特点:传送信息量小,效率低,每次通信传递的信息量固定,若传递较多信息则需要进行多次通信。编程复杂:用户直接实现通信的细节,容易出错。 - * 条件变量、信号量、管程 + * 锁、信号量、条件变量 * 信号signal wait notify * 共享内存通信机制 * 共享内存。(可以通过信号量控制) diff --git a/操作系统/Linux系统分析.md b/操作系统/Linux系统分析.md new file mode 100644 index 00000000..32c6af8b --- /dev/null +++ b/操作系统/Linux系统分析.md @@ -0,0 +1 @@ +## \ No newline at end of file diff --git a/操作系统/Readme.md b/操作系统/Readme.md new file mode 100644 index 00000000..130b7cd8 --- /dev/null +++ b/操作系统/Readme.md @@ -0,0 +1,43 @@ +# 同步异步 + +> 经过长久的观察发现。同步异步,是一个跨越所有领域的知识的共同点。 + +> 发现,这一系列同步异步相关内容。可以抽象成一些共通的模型和方式。这些模型和方式,应该是凌驾于语言和应用场景之上的。 + + +> 而我要做的是,对这一系列的同步异步场景,抽象出共通的模式模型,然后针对每一种模式模型,总结相关的场景和操作。对相关内容进行跨领域跨语言各个场景的总结。 + + +## 本质原理 +### 相关领域 + + +1. 操作系统的进程线程协程之间可以同步异步(Linux并发编程) +2. IO也可以同步异步(LinuxIO编程) +3. 计算机网络通信可以是同步异步(Linux网络编程) + +4. 设计模式中可能包含同步异步的模式(reactor、Proactor)、 + +5. 数据库中的数据读取可以是同步异步、 +6. C++中的多线程同步异步和异步IO、 +7. Python的多线程和协程asyncio的实现、 +8. go的channel并发机制、 +9. nodejs的单线程并发、 +10. java的多线程同步io和异步io + + +### 该领域相关的问题或者说概念名词 + + +* 并发与并行 + * 单线程并发 + * 多线程并发(并行) +* 机制: + * 事件响应机制(event handler) + * 消息传递机制(消息队列IPC) + * 回调机制(call back) +* IO + * IO多路复用Poll、epoll、select + * 异步?非阻塞。 + * 同步?阻塞 + * 同步?轮询 \ No newline at end of file diff --git a/操作系统/image/2021-09-04-08-49-51.png b/操作系统/image/2021-09-04-08-49-51.png new file mode 100644 index 00000000..dc2f5ad0 Binary files /dev/null and b/操作系统/image/2021-09-04-08-49-51.png differ diff --git a/操作系统/计算机操作系统.xmind b/操作系统/计算机操作系统.xmind index 41fae56b..f796b6ce 100644 Binary files a/操作系统/计算机操作系统.xmind and b/操作系统/计算机操作系统.xmind differ diff --git a/操作系统/附录1 课后习题答案.md b/操作系统/附录1 课后习题答案.md index a411cef5..fe842513 100644 --- a/操作系统/附录1 课后习题答案.md +++ b/操作系统/附录1 课后习题答案.md @@ -17,9 +17,9 @@ 3. OS实现了对计算机资源的抽象 -**3.为什么说OS实现了对计算机资源的抽象?** +**3.为什么说OS实现了对计算机资源的抽象?为什么说Linux一切皆文件?** -答:OS首先在裸机上覆盖一层I/O设备管理软件,实现了对计算机硬件操作的第一层次抽象;在第一层软件上再覆盖文件管理软件,实现了对硬件资源操作的第二层次抽象。OS 通过在计算机硬件上安装多层系统软件,增强了系统功能,隐藏了对硬件操作的细节,由它们共同实现了对计算机资源的抽象。 +答:OS首先在裸机上覆盖一层I/O设备管理软件,实现了对计算机硬件操作的第一层次抽象;在第一层软件上再覆盖文件管理软件,实现了对硬件资源操作的第二层次抽象。OS 通过在计算机硬件上安装多层系统软件,增强了系统功能,隐藏了对硬件操作的细节,由它们共同实现了对计算机资源的抽象。不同的资源实现相同的接口,就可以实现可扩展性。 **4.试说明推动多道批处理系统形成和发展的主要动力是什么?** diff --git a/操作系统/多线程通信和并发的理解.md b/操作系统/附录10 回调函数.md similarity index 94% rename from 操作系统/多线程通信和并发的理解.md rename to 操作系统/附录10 回调函数.md index b46d90cd..e8ffe52e 100644 --- a/操作系统/多线程通信和并发的理解.md +++ b/操作系统/附录10 回调函数.md @@ -13,7 +13,7 @@ this 不是指向类。而是在实例化的时候与当前类的实例也就是 在C++和java这种只能传递基本数据类型和构造数据类型的语言中,即函数不作为数据类型的语言中,可以通过传递整个对象的方法,使得被调用者,能够通过调用者对象的指针,进行回调,这也是设计模式的一种。(观察者模式?) -关于回调函数的本质理解:当其他程序执行时,能够通过回调函数,转移进程控制权限,给调用者。可以把调用者与被调用者分开。调用者能够显式调用被调用者,同时被调用这能通过回调函数隐式调用调用者。 +关于回调函数的本质理解:当其他程序执行时,能够通过回调函数,转移进程控制权限,给调用者(这里并没有转移控制权,而是保留控制权在本地,完成不可知的后续处理)。可以把调用者与被调用者分开。调用者能够显式调用被调用者,同时被调用这能通过回调函数隐式调用调用者。 关于回调函数的本质理解:回调函数在同一个层次内是没有用的,或者说没有必要的。如果一个人,在实现一个层次内部的函数执行权限转移过程中,可以直接进行相互调用,因为本质上,两个部分是完全可知的。但是在不同层次的调用中,例如用户层与系统层中,用户层调用系统层,可以通过显式调用,但是系统层并不会考虑用户层的具体实现,对用户层是不可知的。这个时候,系统层会通过传递来的回调函数,将进程控制权交给用户层。 diff --git a/操作系统/多线程通信和并发的理解2.md b/操作系统/附录11 单线程并发.md similarity index 100% rename from 操作系统/多线程通信和并发的理解2.md rename to 操作系统/附录11 单线程并发.md diff --git a/操作系统/附录8 同步异步、阻塞非阻塞.md b/操作系统/附录8 同步异步、阻塞非阻塞.md index d1b70677..e915418f 100644 --- a/操作系统/附录8 同步异步、阻塞非阻塞.md +++ b/操作系统/附录8 同步异步、阻塞非阻塞.md @@ -45,7 +45,7 @@ 2. 当然两者似乎也有重合的部分。例如在socket编程(网络编程)网络进程通信过程中,即是一种**网络进程通信(两个远程进程)**,也是一种**网络IO过程(一个进程与网卡设备IO)**。可以看成两个远程的网络进程通信,也可以看成单个线程与本地网卡设备的IO过程。 -3. 所以在某种程度上。可以把两个进程的通信,看成某一个用户进程的IO过程,而另一个进程看成是设备。 +3. 所以在某种程度上。可以把两个进程的通信,看成某一个用户进程的IO过程,而另一个进程看成是内核。 ## 4 实现方式 ### 同步阻塞通信 @@ -75,10 +75,10 @@ > 此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性! -### 实现并行编程的几种方法 +### 实现并发编程的几种方法 1. java 多线程。 2. nodejs 单线程异步回调。非阻塞异步回调。Proactor模式 3. linux 单线程IO复用。select/poll/epoll事件回调。多路堵塞,同步回调。reactor模式 -> 这里所谓的什么机制、什么方法。都是设计模式的一部分。通过某种设计模式,实现并行编程:异步回调模式、事件回调模式等。 \ No newline at end of file +> 这里所谓的什么机制、什么方法。都是设计模式的一部分。通过某种设计模式,实现并发编程:异步回调模式、事件回调模式等。 \ No newline at end of file diff --git a/操作系统/面试问题整理.md b/操作系统/面试问题整理.md index 07500013..9cd88bab 100644 --- a/操作系统/面试问题整理.md +++ b/操作系统/面试问题整理.md @@ -1,3 +1,5 @@ +## 操作系统的基本特征 + ## 1 进程的三态模型、五态模型、七态模型 1. 创建 diff --git a/数据库/Redis/16 Redis消息队列.md b/数据库/Redis/16 Redis消息队列.md index f7610f7c..d85058da 100644 --- a/数据库/Redis/16 Redis消息队列.md +++ b/数据库/Redis/16 Redis消息队列.md @@ -300,3 +300,13 @@ Stream 是新增加的数据类型,它与其它数据类型一样,每个写 * 生产者限流:避免消费者处理不及时,导致持续积压 * 丢弃消息:中间件丢弃旧消息,只保留固定长度的新消息 + + +在发布消息时,你可以指定队列的最大长度,防止队列积压导致内存爆炸。 +``` +// 队列长度最大10000 +127.0.0.1:6379> XADD queue MAXLEN 10000 * name zhangsan +"1618473015018-0" +当队列长度超过上限后,旧消息会被删除,只保留固定长度的新消息。 +``` +这么来看,Stream 在消息积压时,如果指定了最大长度,还是有可能丢失消息的。 \ No newline at end of file