Knowledge
2020-08-26 10:27:40 0 举报
AI智能生成
知识
作者其他创作
大纲/内容
linux
概念
文件系统
硬链接/软链接
<b>硬链接</b>: 直接链接到inode上<br><i>(故删除原文件并不会导致链接失效)</i>
<b>软链接</b>: 用目录作链接<br><i>(故原文件不在对应目录下则链接失效)</i>
<b>inode(索引节点)</b>:<br><i>Linux 文件系统通过把 inode 节点和文件名进行连.<br>需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的 inode 节点号.<br>通过该 inode 节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。</i><br>
安全
<b>CC攻击</b>: 多个不同用户不停访问
<b>DDOS攻击(分布式拒绝服务攻击)</b>: <br>多个计算机联合, 通过大量合法的请求占用大量网络资源
<strike><b>nginx_waf防止SQL注入</b>: <br>应用程序存在安全隐患. 用户可以提交一段数据库查询代码.<br>根据程序返回的结果, 获得某些他想得知的数据.<br></strike>
shell
常用命令
文件管理
文件处理
<b>cp</b>
<b>mv</b>
<b>rm</b>
查找
<b>find</b>:<br>find pathname -options [-print -exec -ok ...]<br>
<b>locate</b>:<br>类似find, 通过内建文档数据库快速查找<br><b>updatedb</b>用以更新<br>
<b>which</b>:<br>查看可执行文件的位置(搜PATH)<br>
<b>whereis</b>: <br>whereis 查看文件的位置<br>
文件内容查看
<b>head</b>
<b>tail</b>:<br>用于显示指定文件末尾内容.<br>不指定文件时, 作为输入信息进行处理.<br>常用查看日志文件. <br>
<b>more</b>
<b>less </b>
<b>grep</b>:<br>grep [option] pattern file|dir<br>
<b>wc</b>
<b>sed</b>: 文件编辑命令
<b>ln</b>: 建立链接<br>ln -sv source.log link.log<br>
<b>chmod</b>:<br>文件类型/文件所有者/用户组/其他<br>_/rwx/rwx/rwx
<b>chown</b>:<br>chown <所有者>:<用户组> <文件名>
磁盘命令
<b>cd</b>
<b>df</b>: 磁盘使用情况
<b>du</b>: 查看文件和目录的使用空间
<b>ls</b>
<b>mkdir</b>: 创建文件夹<br>-p创建整个路径<br><b>rmdir</b>: 删除文件夹
<b>pwd</b>: 当前工作路径
<b>读取用户输入</b>: read <变量名>
用户/用户组管理
<b>添加组</b>: groupadd <组名>
<b>添加用户</b>: useradd -g <组名> <用户名>
<b>删除用户</b>: userdel -r <用户名>
网络命令
<b>ifconfig</b>: 查看网络接口(<b>-a</b>表示所有)<br>使用 <b>up</b> 和 <b>down</b> 命令启动或停止某个接口: ifconfig eth0 up 和 ifconfig eth0 down <br>
<b>netstat</b>: 显示网络状态<br>netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]<br>
<b>ping</b>: 检测主机
<b>telnet</b>: 远端登录<br>telnet 192.168.0.5<br>
系统管理命令
<b>date</b>: 时间
<b>free</b>: 内存使用情况
<b>kill</b>: 发送指定的信号到相应进程.<br>不指定型号将发送SIGTERM(15)终止指定进程.
<b>ps</b>: 进程状态
<b>pstree</b>: 进程树<br>
<b>top</b>: 系统状态<br>包括进程 ID、内存占用率、CPU 占用率等<br>
定时执行<br>
crontab
压缩/解压缩, 打包/解包
压缩/解压
<b>bzip2</b>:<br> 创建 *.bz2 压缩文件:bzip2 test.txt 。<br> 解压 *.bz2 文件:bzip2 -d test.txt.bz2 。
<b>gzip</b>:<br> 创建一个 *.gz 的压缩文件:gzip test.txt<br> 解压 *.gz 文件:gzip -d test.txt.gz<br> 显示压缩的比率:gzip -l *.gz
<b>uzip</b>
打包解包
<b>tar</b>
程序/编程
<b>ulimit -a</b>: 数据段大小之类的<br>
参数/变量
$0: 脚本本身文件名称<br>$1~$n: 各参数值<br>$*: 所有参数列表("1 2 3")<br>$@: 所有参数列表("1" "2" "3")<br>$#: 参数个数<br>$$: 脚本运行时的PID<br>$! : Shell最后运行的后台Process的PID<br>$?: 脚本退出码<br>
<b>取消变量</b>: unset <参数名>
列表/数组
<b>调用seq</b>: $(seq 1 30)
<b>直接空格隔开</b>: A B C
<b>用括号</b>: a=(Shirley 2 Hank)<br>遍历时可用${a[*]};<br>访问特定索引可用: ${a[1]}<br>对特定索引赋值: a[1]=loves<br>获取长度: ${#variable[*]}
${}操作
数字运算:<br><ul><li>$[16 + 4]</li><li>expr 16 + 4</li></ul>
语句
比较运算符: <br><ul><li>==</li><li>-gt</li><li>-lt</li></ul>
<b>if语句</b>:<br>if [ $x -gt $y ] then<br> 命令<br>else <br> if [ 条件 ] then<br> 命令<br> else<br> 命令<br> fi<br>fi
循环
<b>for循环</b>:<br>for 变量 in 循环列表<br>do<br> 命令<br>done<br>
也可以这样:<br>for((i=1;i<51;i++))
<b>while循环</b>:<br>while [ 条件 ]<br>do<br> 命令<br>done
函数
gcc
<b>-E</b>: 只预处理(宏, 头文件等)<br>
<b>-c</b>: 直接生成.o文件<br>
系统调用<br>
进程
<b>fork()</b>
Shared Memory(POSIX)<br>
<b>int shm_open(const char *name, int oflag, mode_t mode)</b><br><i>// open a shared memory</i><br>
<b>int ftruncate(int fd, off_t length)</b><br><i>// Configure the size</i><br>
<b>void *mmap(void *addr, size_t length, int prot, int flags,<br> int fd, off_t offset)</b><i><br>// mmap</i>. Here we set flags as <b>MAP_SHARED <br></b>
<b>int shm_unlink(const char *name)</b><br><i>// unlink and remove</i><br>
管道
Anonymous Pipe<br>
<b>int pipe(int pipefd[2])</b><br><i>// pipefd[0] is the read end<br>// pipefd[1] is the write end<br>// This pipe is anonymous,<br>// using fork() to share fds</i><br>
Named Pipe<br>
<b>int mkfifo(const char *pathname, mode_t mode)</b><br>// Named pipe<br>
<b>int mkfifoat(int dirfd, const char *pathname, mode_t mode)</b><br>//<br>
<b>int mkfifo(const char *pathname, mode_t mode)</b><br>// Named pipe<br>
内存管理
<b>brk()<br></b><i>// </i><i>在malloc()时要用到<br>// grow and shrink memory area</i><br>
进程调度<br>
<b>CFS</b><br>通过<b>虚拟运行时间vruntime</b>(与基于优先级的衰减因子有关)<br>调度程序选择具有<b>最小</b>vruntime值的任务运行<br>这里用<b>红黑树</b>维护任务<br>
<b>友好值(nice value)</b>, -20~+19<br>
<b>目标延迟(target latency)</b>, 即每个可运行任务应当运行一次的时间间隔
并行编程
OpenMP
基本操作
并行块<br>
<b>#pragma omp parallel</b><br><i>// 并行执行后续程序<br>// By default, there is a barrier at the end.</i><br>
Clauses
<b>#pragma omp parallel num_threads(N)</b><br><i>// N个线程并行执行后续程序</i>
<b>#pragma omp parallel shared(A,B,C) private(id)</b><br><i>// specify the shared and private variables</i><br>
同步
<b>#pragma omp barrier</b><i><br> // Wait for all threads reaching here</i>
<b>#pragma omp critical</b><br><i>// The following codes can be accessed by only ont thread at one time</i>
<b>#pragma omp atomic</b><br><i>// Like critical, <br>// but for simple scenarios(like increments), <br>// it will use special hardware constructs if available</i><br>
for循环并行
<b>#pragma omp for<br></b>
Clauses
<b>#pramga omp for reduction(op:list)</b><br><i>// The elements in list will be identity of op<br>// Elements are copied as local variable<br>// and finally be reducted</i><br>
<b>#pramga omp for nowait</b><br><i>// Generally the threads in for parallel<br>// won't exit until all threads are done.<br>// If waiting is unnecessary, use <b>nowait</b>.</i><br>
work sharing<br>
master结构
<b>#pragma omp master</b><br><i>// Only the master will execute codes in this structure.</i><br>
single结构
<b>#pragma omp single</b><br><i>// Only 1 thread (the first one gets here) <br>// will do the codes</i><br>
Clauses
<b>#pragma omp single nowait</b>
section结构
<b>#pragma omp sections<br>{<br> #pragma omp section<br> do_x();<br> #pragma omp section<br> do_y();<br>}</b><br>
锁<br><b>omp_lock_t</b><br>
<b>omp_init_lock()<br></b>
<b>omp_set_lock()</b>
<b>omp_unset_lock()</b>
<b>omp_destroy_lock()</b>
<b>omp_test_lock()</b>
Runtime Library<br>
threads numbers<br>
<b>omp_set_num_threads()</b>
<b>omp_get_num_threads()</b><br>// You won't get the threads number <br>// unless you've entered the parallel region<b><br></b>
<b>omp_get_thread_num()</b>
<b>omp_get_max_threads()</b>
<b>omp_in_parallel()</b><br>// To check if running in parallel region<br>
dynamic mode:<br>Threads given may differ<br>
<b>omp_set_dynamic(int _Dynamic_threads)</b>
<b>omp_get_dynamic()</b>
<b>omp_num_procs()</b><br>// Get how many processors available<br>
Environment Variables<br>
<b>OMP_NUM_THREADS</b><br>By default, how many threads should I use <br>
<b>OMP_STACKSIZE</b><br>Tell the system the stacksize needed<br>
<b>OMP_WAIT_POLICY<br>ACTIVE | PASSIVE</b><br><ul><li>ACTIVE: actively spin till available(cost almost nothing)</li><li>PASSIVE: put it sleep(cost a lot)</li></ul>
<b>OMP_PROC_BIND<br>TRUE | FALSE</b><br>Threads once binded to a processor, leave there<br>
Data Environment<br>
<b>pivate</b><br>// This clause won't initialize the variable<br>
<b>firstprivate</b><br>// Will be initialized as the global value<br>
<b>lastprivate</b><br>// The value will be copied to the global variable<br>
<b>shared</b>
Tasks
<b>#pragma omp task</b><br>// Create a task to execute following codes<br>
<b>#pragma omp taskwait</b><br>
Memory Model<br>
<b>Week Consistency</b><br>S>>W, S>>R, R>>S, W>>S, S>>S
<b>#pragma omp flush(list)</b><br>// Rs and Ws overlaping after the flush<br>// don't executed until after the flush.<br>
<b>implicit flushes</b><br><ol><li>entry/exit of parallel region</li><li>implicit/explicit barrier</li><li>entry/exit of critical section</li><li>a lock is set/unset</li></ol>
<b>#pragma omp atomic [read|write|update|capture]<br></b>
Thread Private<br>
<b>#pragma omp threadprivate(xxx)</b><br>// Each thread will have their <br>// own(identified by thread ID) xxx copy.<br>// And it's global, which means it is<br>// alivethrough all parallel blocks<br>
<b>copyin(xxx)</b><br>// copy in the main thread's xxx<br>
书<br>
<b>Using OpenMP<br></b>
<b>Patterns For Parallel Programming</b><br>by Tim Mattson<br>
<b>Concurrency in Programming Languages<br></b><i>(About the histroy)</i><b><br></b>
<b>The Art of Concurrency<br></b>
pthread(POSIX标准)
pthread_create()
<b>pthread_exit()</b><br>// 可以给出返回值<br>
pthread_join()
pthread_kill()
结构体为: pthread_t
pthread_cancel()<br>pthread_testcancel()<br>
模式(Patterns)<br>
SIMD(Single Instruction Multiple Data)<br>
for parallel<br>
<b>Divide and Conquer Pattern</b>:<br>Split problem, and solve the subproblem.<br>Recursively do above.<br>
编程语言<br>
Python
re
<b>re.match(pattern, string, flags=0)</b><br># 尝试从字符串的起始位置匹配
<b>.group(num)<br>.groups()<br>.span(num) # 返回索引<br></b>
<b>re.search(pattern, string, flags=0)</b><br># 返回第一个成功的匹配。
<b>re.sub(pattern, repl, string, count=0, flags=0)</b><br># 替换<br>
<b>re.findall(string[, pos[, endpos]])</b><br># 返回所有匹配子串列表<br>
<b>re.finditer(pattern, string, flags=0)</b><br># 类似findall, 但返回迭代器<br>
<b>re.split(pattern, string[, maxsplit=0, flags=0])</b><br>按照能够匹配的子串将字符串分割后返回列表
Consistency<br><i>(about R(read), W(write), S(sync)</i><br>
<b>Sequential Consistency</b><br>Program Order = Code Order = Commit Order<br>
<b>Relaxed Consistency<br></b>
Algorithm
关联性
Apriori系
FP Tree<br>
FP Tree算法原理总结
从零实现机器学习算法(十四)FP-growth
近邻算法<br>
KNN<br>
CNN
强化学习
Markov 决策过程<br>
Q-Learning
SARSA
一致性哈希(Consistent Hashing)<br>
K-V Store<br>
Data Structures<br>
Log-Structured Merge Tree (<b>LSM-tree</b>)
<b>Advantages</b>:<br>high write efficiency<br>low costs as a tiered storage
<b>Disadvantages</b>:<br>slow compactions(much I/O)<br>
background compaction operations(a.k.a merge)<br>
Paper
fast20: <b>FPGA-Accelerated Compactions <br>for LSM-based Key-Value Store</b>
数据中心
Fat Tree<br>
All Reduce<br>
Parameter Server<br>有一个服务器来弄<br>
Collective AllReduce<br>
Halving-Doubling
ring
double binary tree<br>
Hierachical Aggregation<br>
由于数据中心的特点, 一般两层<br>
Math
概率论与数理统计
概率论<br>
常见分布
离散
二项分布
Poisson分布
均匀分布
连续
正态分布
指数分布
卡方分布
t分布
数字特征
均值
方差
协方差/协方差矩阵
相关系数
平均绝对差 E|X-EX|<br>
矩母函数: g(t)=E exp{tX}<br>
特征函数: Φ(t)=E exp{itX}<br>两个变量分布相同⇔特征函数相同<br>
极限理论
大数定律
Markov不等式<br>
Chebyshev不等式
中心极限定理
中心极限定理推广(研究生课程)<br>(不需要i.i.d. 而是Linderberg条件)<br>
数理统计
基础
样本的两重性<br>
统计量
样本均值<br>
样本方差
样本矩
样本原点矩
样本中心矩
样本中位数
样本极值
经验分布函数(不停抽样, 近似出分布)<br>
正态总体
四个推论
三大分布<br>
χ²分布
t分布
F分布
参数估计
点估计<br>
矩估计
极大似然估计<br>
区间估计
<b>单正态总体</b>
<b>二正态总体</b>
假设检验
<b>参数检验</b>
<b>显著性水平</b>
<b>拒绝域</b>
<b>功效函数</b>:<br>β(θ)=P(H0被拒绝|θ)
<b>检验方法</b>:<br>和区间估计类似, 也需要找到对应无参数分布(见区间估计模块)
<b>拟合优度检验</b>:<br>检验分布
<b>卡方拟合优度检验</b>(Karl Pearson提出)
<b>离散情形拟合优度检验</b>
<b>含有未知参数</b>(假设有r个): <br>通常用极大似然估计未知参数,<br>此时<b>卡方分布自由度为(k-1-r)</b>
<b>p-value</b>: 对应卡方分布上的P(t>统计量T)
应用
<b>独立性检验问题</b>
<b>H0</b>: 属性A与属性B独立<br>
<b>齐一性检验</b>: <br>检验一个属性A各个水平对应的另一个属性B的分布完全相同
数理逻辑
命题演算 L<br>
语法<br>对公式运算<br>¬¬x≠x
L1,L2,L3和MP——P19
L1: P→(q→p)——肯定后件律
L2: (p→(q→r))→((p→q)→(p→r))——蕴含词分配律
L3: (¬p→¬q)→(q→p)——换位律
P21
1). 同一律: ⊢p→p
2). 否定前件律: ⊢¬q→(q→p)
3). 演绎定理,<br> 4).三段论(HS)——P23<br>
5). 否定肯定律(P24): ⊢(¬p→p)→p
1.2.4. 反证,归谬,双否<br>
6). 反证律: <Γ∪{¬p}⊢q, Γ∪{¬p}⊢¬q> ⇒ Γ⊢p
7). 归谬律: <Γ∪{p}⊢q, Γ∪{p}⊢¬q> ⇒ Γ⊢¬p
8). 双否律: ⊢¬¬p→p<br>9). 第二双否律⊢p→¬¬p<br>
语义<br>对0,1运算<br>¬¬x=x<br>
赋值: 具有保运算性(¬,→)的映射v: L(X)→Z₂
真值指派: v₀: X→Z₂
各种律——P41
语义演绎定理——P42<br>
等值公式,对偶律,推广的De.Morgan律——1.5.1(P46)
(主)析取范式与(主)合取范式——1.5.2(P50)
谓词演算 K
语法<br>
公式集——P64<br>
闭式, 自由——P65<br>
公理——P67
(K1) p→(q→p)<br>
(K2) (p→(q→r))→((p→q)→(p→r))
(K3) (¬p→¬q)→(q→p)
(K4) ∀xp(x)→p(t), 其中项t对p(x)中的x是自由的<br>
(K5) ∀x(p→q)→(p→∀xq), 其中x不在p中自由出现<br>
证明——P67
MP
Gen
一些定理或永真式
∃1规则——P69
演绎定理——P70
反证律, 归谬律——P71<br>
∃2规则——P71
等价判定(P72): Γ⊢p↔q ⇔ Γ⊢p→q且Γ⊢q→p
子公式的等价可替换性——P74
对偶律——P75
前束范式<br>
只涉及Q,→,¬(P77-78)
1. 若y不在p(x)中出现, 则 ⊢Qxp(x) ↔ Qyp(y)
2.
若x不在p中自由出现, 则 ⊢(p→Qxq) ↔ Qx(p→q)
若x不在q中自由出现, 则 ⊢(Qxp→q) ↔ Q*x(p→q)
3. ⊢¬Qxp ↔ Q*x¬p
涉及合取析取(P78-80)
⊢(∀xp∧∀xq) ↔ ∀x(p∧q)
⊢(∃xp∨∃xq) ↔ ∃x(p∨q)
若x不在p中自由出现, 则<br>
⊢(p∨Qxq) ↔ Qx(p∨q)
⊢(p∧Qxq) ↔ Qx(p∧q)
语义
一阶结构(解释域) M=(D,F,P)<br>
项解释——P83<br>
个体变元指派
变元变通——解释含量词公式
公式的赋值函数——P85
闭式的语义特征<br>
<ol><li>若对项t中任一变元x都有φ(x)=ψ(x), 则φ(t)=ψ(t)</li><li>若对公式p中任一自由出现变元x都有φ(x)=ψ(x), 则|p|(φ)=|p|(ψ)</li></ol>
任一闭式在给定M中恒真/恒假必居其一<br>
全称闭式——P90
|p|=1⇔|∀xp|=1⇔|p'|=1
|p|=0 ⇒ |∀xp|=0<br>|p|=0 ⇒ |p'|=0
语义推论与有效式——P92<br>
M可满足的
存在I(p)=t
M有效的
∅⊧p时, p叫做K的有效式
模型: Γ的每个公式都在M恒真:<br>r∈Γ ⇒ |r|_M=1<br>
语义推论/语义后承: Γ⊧p
逻辑有效的: 对一切M, ⊧p
UG有效性: Γ⊧p ⇔ Γ⊧∀xp
K的可靠性和完全性
形式算数与递归函数
<b>等词公理</b>(P105)
(E1) t≈t
(E2) t_k≈u → (f(t1, ..., t_k, ..., t_n)≈f(t1, ..., u, ..., t_n))
(E3) t_k≈u → (R(t1, ..., t_k, ..., t_n) → R(t1, ..., u, ..., t_n))
若M是E的模型, 则等词≈必解释为M上的<b>等价关系</b>(P107)
<ol><li>E ⊢ t≈t</li><li>E ⊢ t≈u → u≈t</li><li>E ⊢ t≈u → (u≈v → t≈v)</li></ol>
<b>等项替换</b>(P108)
(E2推广) E ⊢ u≈v → t(u)≈t(v)
(E3推广) E ⊢ t≈u → (p(t) → p(u))<br><i>(t和u的变元不在替换出受约束)</i>
<b>正规模型</b>: 等词解释为相等
<b>正规模型存在性</b>: <br>设任意E'⊆K+(Y)有K+模型, 则E'有正规K+模型<br><i>(证明: 构造这个模型的对应商集模型)</i>
<b>非正规模型存在性</b>:<br>设E*⊆K+(Y)是E的任何相容扩张, E⊆E*且E*相容, 则E*有非正规K+模型
符号<br>
set
∩
∪
⊆
∈
∅
⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹
₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉
ᵢ ⱼ ₖ ₗ ₘ ₙ
logic<br>
→
⇒
⇔
↔
∧
∨
¬
⊧
⊢
∀
∃
≠
数理方程
建立方程的问题
物理定律<br>
<b>牛顿第二定律(F=ma)</b>
<b>傅里叶热传导定律</b><br>热流密度q: 指单位时间沿某个方向流过单位横截面的热量<br>q与温度下降率(梯度)成正比, 即q=k∇u<br>
<b>牛顿热交换定律(边界条件)</b><br>物体流向外部的热流密度q与物体和介质在表面处的温度差成正比<br>即<b>q=h(u-θ)</b>, 其中h为热交换系数, u, θ分别表示物体和介质的表面处温度<br>
<strike>物体内温度升高所需热量与物体内源产生热量之和</strike>
<b>扩散定律</b>:<br>粒子流密度(定义类似热流密度), q=-k∇u
<b>Gauss定律</b><br>通过任意闭合曲面的电通量等于这个闭曲面所包围的自由电荷的电量/ε0<br>
<b>胡克定律</b><br>f=-kx<br>应力=杨氏模量*相对伸长, 即 <b>F / S=-E*(Δl / l)</b><br><i>(应力: 单位截面面积上的受力, 即F/S)</i><br>
初始条件个数=t的导数的阶数<br>
边界条件<br>
第一类: u在边界上=φ
<ul><li>固定端</li></ul>
第二类: 偏导在边界上=φ
<ul><li>绝热</li><li>自由端</li></ul>
第三类: αu+β偏导=φ
<ul><li>热交换</li></ul>
泛定方程
分类
<b>椭圆</b>(与t无关, 称<b>稳定方程</b>)<br>
Δu=0 (调和方程, Laplace方程)(齐次)<br>
Δu=f (Poisson方程)(非齐次)<br>
Lu=0
Lu=f
<b>抛物</b>(<b>发展方程</b>)
u_{t}=Δu (齐次)<br>
u_{t}=Δu+f (非齐次)<br>
u_{t}=Lu+f (齐次)<br>
u_{t}=Lu (非齐次)<br>
<b>双曲</b>(<b>发展方程</b>)
u_{tt}=Δu (齐次)<br>
u_{tt}=Δu+f (非齐次)<br>
u_{tt}=Lu (齐次)<br>
u_{tt}=Lu+f (非齐次)<br>
齐次泛定方程
有界区域
<b>分离变量法</b>
普通方程(Sturm-Liouville方程)
贝塞尔方程(柱坐标系)
勒让德方程(球坐标系)
非齐次泛定方程
有界区域
边界条件齐次
<b>固有函数展开法</b>后再分离变量法
<b>叠加原理<br></b>
<b>特殊函数法</b>
边界条件非齐次
把<b>边界条件转化为齐次</b><br><ul><li>v(t,x)=A(t)x+B(t)</li><li>v(t,x)=A(t)x^2+B(t)</li></ul>
泊松方程第一边值问题
<b>基本解法</b>
不考虑边界条件齐次性
√有关于趋于无穷的条件
变量取值范围为全无穷
<b>傅里叶变换</b>(291-296)
变量取值范围为<b>半无穷</b><br>
第一类边界条件(延拓为奇函数)
<b>傅里叶正弦变换</b>
第二类边界条件(延拓为偶函数)
<b>傅里叶余弦变换</b>(P296例3)
第三类边界条件(超出本书学习范围)
×无关于无穷点的条件
<b>Laplace变换</b><br><ul><li>要求有变换变量<通常是t>对应各低阶导数在0+的条件</li><li><span style="font-size: inherit;">无穷处一般应有界(问题的物理意义)</span></li><li><span style="font-size: inherit;">半无界(因此通常对t)</span></li></ul>
<b>叠加原理和齐次化原理<br></b>
无界区域
一维无界
<b>行波法</b>(<b>达朗贝尔公式</b>)
一维半无界<br>
尝试延拓<br>第一类边界条件奇延拓<br>第二类边界条件偶延拓<br>
u_{t}=Lu+f<br>u(0, M)=φ(M)<br>
<b>基本解法</b>
u_{tt}=Lu+f(t,M)<br>u(0, M)=φ(M), u_{t}(0,M)=ψ(M)
<b>基本解法</b>
分类
<b>一维无界区域弦振动</b><br>
行波法(达朗贝尔公式)
<b>一维半无界区域</b><br>
行波法作奇偶延拓
<b>非齐次发展方程<br></b>
齐次化原理
<b>方程非齐次的方程</b><br>
齐次化原理
常数变易法(先不看齐次项, 然后常数变易)<br>
若非齐次项是关于x的函数而与t无关, 考虑特殊解法<br>
<b>边界条件非齐次的方程</b>
先齐次化边界条件<br><ul><li>第一类用: v(t,x)=A(t)x+B(t)</li><li>第二类用: v(t,x)=A(t)x^2+B(t)</li></ul>
<b>齐次有界区域方程<br></b>
分离变量法
<b>齐次有界区域方程——极坐标下Δu=0的周期性问题</b><br>
套用公式
运筹学基础
规划问题
线性规划
凸组合理论<br>
线性规划可行域必为凸集
基可行解对应于可行域的顶点
目标函数在可行域(有界情况下)的顶点上达到最优<br>
单纯形法
表格描述
<ol><li>计算检验数, 判断是否继续(求max时, 均≤0则不能再大; 求min反之)</li><li>若能继续, 最小检验数对应变量换入, b/系数取最小(保证矩阵变换后b≥0)</li></ol>
矩阵描述
对偶理论
对偶单纯形法
<ol><li>保证检验数≤/≥0, 检查b, 若未达均非负, 则继续计算</li><li>若能继续, 取负得最多的换出, 取检验数/系数负得最多的换入</li></ol>
<b>原问题</b><br>max z<br><br>n个变量<br>≥0<br>≤0<br>无约束<br><br>m个约束<br>≤<br>≥<br>=
<b>对偶问题</b><br>min ω<br><br>n个约束<br>≥<br>≤<br>=<br><br>m个变量<br>≥0<br>≤0<br>无约束
记忆方法:<br>正常情况<b>max问题: 变量≥0, 约束≤</b>;<br>而<b>min问题: 约束≥, 变量≥0</b>;<br>异常情况对应排除法推出.<br>而<b>=</b>和<b>无约束</b>的对应关系始终成立
性质(P68 3..4.2)
<b>对称性</b>: 对偶问题的对偶是原问题
<b>弱对偶性</b>: 若X, Y分别是原, 对偶问题可行解, 则CX≤Yb<br>换句话说, max问题的最优解小于等于min问题的最优解
<b>无界性</b>: max问题为无界解, 则min问题无可行解
<b>最优解条件</b>: X, Y分别是min, max问题的可行解, 当CX=Yb时, X和Y分别是最优解
<b>对偶定理</b>: 若max问题有最优解, 则min问题有<b>相同</b>最优解
<b>互补松弛性</b>: 若X, Y为min, max问题可行解. 则YX_S=0和Y_SX=0 当且仅当 X, Y为最优解
<b>检验数和基解的对应</b>: 原问题单纯形表的检验数行对应对偶问题的一个基解
灵敏度分析(本质还是单纯形法)
运输问题
确定初始基可行解
<b>西北角法</b>: 每次取西北角的
<b>最小元素法</b>: 每次取最小运价的确定
<b>伏格尔法</b>: 作行列差额(最小两运价之差), 每次取差额最大的<br><i>(每次取差额最大是为了充分考虑次小运费)</i>
最优解的判别<br><i>(本质是要算出检验数)</i>
<b>闭回路法</b>: 对所有空格, 找闭回路, 对空格+1运量, 计算运费增量, 则为检验数
<b>位势法</b>: 计算行列位势(可以设u0=0). 只要记住 c_{ij}-u_i-v_j 为 x_{ij} 的检验数.<br>这里用基变量检验数为0来求所有u, v
调整方法
<b>闭回路调整法</b>: 取最适检验数作换入变量, 作闭回路确定换出变量
退化: <br><ol><li>有非基变量为0——无穷多解</li><li>确定初始基可行解时, 正好行列余量相等, 则其行列应添一0</li><li>调整过程, 同时让两个运量变0, 应保留一0</li></ol>
线性目标规划
置偏差变量于式末: ...+(d-)-(d+) = b<br><ol><li>要求恰好达目标值, min z = f((d+)-(d-))</li><li>不超过目标值: min z = f(d+)</li><li>超过目标值: min z = f(d-)</li></ol>
解法: 主要为图解法或单纯形表法<br>
整数线性规划
普通整数线性规划
<b>分支定界法</b>: <br><ul><li>先求最优(无视整数条件), 对解中非整数分支(如x1=3.5, 则分x1≤3和x1≥4)</li><li>维护一个 可行下界(整数解) 和 可能上界(不一定整数)</li></ul>
<b>割平面法</b>: <br><ol><li>用单纯形表算非整数最优解</li><li>列关系式, 分离整数/非整数部分, 从而多得一条件.<br><i>(如x1-x3=3/4-(3/4 * x3 + 1/4 * x4), 则右边≤0(左边为整数), 于是多一个条件(多一割线))</i></li><li>继续改进单纯形表(可能需要用对偶单纯形表)</li></ol>
0-1型整数线性规划
<b>隐枚举法</b>(可以先找一个解, 便于后面列表排除)
指派问题
理论基础
<ul><li>指派矩阵行列同减最小元素, 最优解不变</li><li>指派系数矩阵中独立0元素个数最多等于能覆盖所有0元素的最少直线数</li></ul>
解法
第一步: 先后每行, 每列减去该行, 该列最小元素
第二步:<br><ol><li>轮流对只有一个0元素的行列上, 对应0元素加圈, 其他划去记作Φ</li><li>从剩0元素最少的行列开始<i>(按选择性多礼让选择性少的原则)</i>, 加圈和划零</li></ol>若圈数=矩阵阶数, 则指派完成
第三步: 作最少的直线覆盖所有0元素<br><ol><li>对没有圈的行打√</li><li>对已打√行中含Φ的列打√</li><li>对已打√列中含圈行打√</li><li>重复2, 3</li><li>对无√的行画横线, 有√的列画纵线</li></ol>若直线数l < n, 则转第四步. 若l=n而m<n, 回第二步2, 另作试探<br><i>(这里其实相当于找交错轨)</i>
第三步: 作最少的直线覆盖所有0元素<br><ol><li>对没有圈的行打√</li><li>对已打√行中含Φ的列打√</li><li>对已打√列中含圈行打√</li><li>重复2, 3</li><li>对无√的行画横线, 有√的列画纵线</li></ol>若直线数l < n, 则转第四步. 若l=n而m<n, 回第二步2, 另作试探<br><i>(这里其实相当于找交错轨)</i>
第四步: 处理最小元素(√行减, √列加). 重复执行前面步骤.
排队论
数学模型: <br>Kendall记号: X/Y/Z<br><i>(后扩充为X/Y/Z/A/B/C<br>本书只讨论X/Y/Z/∞/∞/FCFS)</i>
X: 相继顾客到达间隔时间的分布
Y: 服务时间的分布
Z: 服务台的个数
A: 系统容量限制N<br>B: 顾客源数目m<br>C: 服务规则(FCFS/LCFS等)
各种分布
M: 负指数分布<br>
D: 确定型
E_k: k阶爱尔朗分布(erlang)
GI: 一般相互独立的时间间隔分布
G: 一般服务时间的分布
基本概念符号
排队系统概念
<ul><li>队长: 系统中顾客数. 期望为L_s</li><li>排队长: 系统中排队等待的顾客数. 期望为L_q</li></ul>
<ul><li>逗留时间: 一个顾客在系统中停留时间. 期望为W_s</li><li>等待时间: 一个顾客在系统中排队等待的时间. 期望为W_q</li></ul>
<ul><li>忙期: 服务机构连续繁忙时间长度(关系到服务员工作强度)</li></ul>
<ul><li>损失率, 服务强度等</li></ul>
<ul><li>系统的状态: 系统中顾客数(期望为L_s)<br><i>系统中有n个顾客就称系统状态为n</i></li><li>t时刻状态为n概率为P_n(t)</li></ul>
一些平均值概念
平均间隔时间=总间隔时间/到达次数=总时间/到达次数
平均到达率=到达人数/总时间
平均服务时间=总服务时间/总人数
平均服务率=总人数/总服务时间
常用分布
<b>泊松流</b>
符号
<b>N(t)</b>: 时间区间[0, t)内到达顾客数(t>0)
<b>P_n(t1, t2)</b>表示在[t1, t2)内有(n≥0)个顾客到达)<br>P_n(t1, t2)=P{ N(t2) - N(t1)=n }
形成泊松流的条件
<b>无后效性</b>: 不重叠时间区间顾客到达独立.
充分小Δt内, [t, t+Δt)有1个顾客到达概率与Δt成正比<br>即<b>P_1(t, t+Δt)=λΔt + o(Δt)</b>.<br><b>λ表示概率强度</b>(单位时间内有一个顾客到达的概率
充分小Δt内, [t, t+Δt)有≥2个顾客到达概率极小, 可忽略
<b>泊松流概率公式</b>
数学期望: E[N(t)] = λt<br>方差: Var[N(t)] = λt
<b>负指数分布</b>
<b>负指数分布概率密度函数</b>
<b>负指数分布函数</b>
<b>负指数分布数字特征</b>
其他性质
Markov性
<b>相继到达的时间间隔是独立相同的负指数分布(参数为λ)</b>与<br><b>输入过程为泊松流(参数为λ)</b>是等价的.<br><i>所以在Kendall记号中都用M表示</i>
<b>服务时间v</b>的分布有时也服从负指数分布,<br>则μ表示单位时间能被服务完成的顾客数, 称为<b>平均服务率</b>.<br>而1/μ=E(v)表示<b>一个顾客的平均服务时间</b>.
<b>爱尔朗分布(Erlang)</b>:<br>参数为kμ的k个指数分布和<br>
<b>Erlang分布的概率密度函数</b>
<b>Erlang分布的数字特征</b>
Little公式
逗留时间(W_s)内有效到达的顾客数(λ_e*W_s)为队列长(L_s)?<br>
存储论
基本概念
<b>需求</b>: 从存储中间断式或连续式地取出一定量<br>
<b>补充</b>: <b>备货时间</b>(或称<b>提前时间</b>)<br>
费用: <br><ul><li>存储费: 存储所需仓库, 货物损坏等费用</li><li>订货费=订购固定费用+单价*数量</li><li>生产费: 自行生产(而不是订购)的费用</li><li>缺货费: 存储供不应求引起损失</li></ul>
存储策略
<ul><li>t0-循环策略: 每隔t0时间补充存储量Q</li><li>(s,S)策略: 存储量 x≤s 时才补充. Q=S-x</li><li>(t,s,S)混合策略: 经过t时间检查, 若x≤s才补充到S, 即Q=S-x</li></ul>
模型
<b>不允许缺货, 备货时间很短<br></b>
<b>不允许缺货, 生产需一定时间<br></b>
<b>允许缺货, 备货时间很短<br></b>
<b>允许缺货, 生产需一定时间</b>
<b>价格有折扣的存储问题</b>
订货方式<br>
定点订货<br>定时订货<br>定量订货<br>
计算机组成原理
CPU
技术指标
CPI
IC
主频
加速比(Amdahl定律)
部件加速比
可改进比例
周期
机器周期
时钟周期: 包含多个机器周期
指令周期: 包含多个时钟周期
流水线
相关
冲突
结构相关
数据相关
控制相关
技术指标
吞吐率
加速比
效率
数据通路<br>(2020-03-31<br>2020-04-03)
控制信号<br>(2020-03-31<br>2020-04-03)
相关<br>(2020-04-03<br>2020-04-07<br>2020-04-10)
结构相关
例子<br>
MEM和IF同时需要访问存储器<br>
解决方案<br>
<b>Stall</b>
哈佛结构
数据相关
分类
写后读(RAW)<br>
写后写(WAW)
读后写(WAR)<br>
解决方案<br>(2020-04-07)
<b>停顿(Stall)<br></b>
硬件实现<br><b>流水线互锁(interlock)</b><br>
编译器实现
<b>转发(Forwarding)<br></b>(或称<b>旁路(bypassing)</b>)<b><br></b>
控制相关<br>(2020-04-10)
解决方案
<b>分支延迟槽</b>:<br>先做, 如果跳转了再flush<br>必要时可以提前BEQ来减少延迟开销<br>
调度来源:<br><ul><li>分支前指令填充: 分支指令前的指令<br><i>(选择不会有依赖关系错误的放到分支指令后做)</i></li><li>分支目标指令填充</li><li>分支失败指令填充</li></ul>
编译器优化
分支预测技术
静态
动态<br>
饱和计数器
多发技术<br>(2020-04-10)
超标量技术
超长指令字<br>
超流水线<br>
SIMD技术
存储
主存
DRAM<br>
电容保存信息, 要刷新(按行刷新)
<b>集中刷新</b>: 存在死区(不能读写, 在刷新)
<b>分散刷新</b>: 穿插在读写中(每次访问都要等一次之类刷新之类的)
<b>异步刷新</b>: 有选择地结合上述两种
访存周期: 100~200ns
技术指标
存储容量
存取时间: 命令发出到完成及数据放到总线上的时间
存储周期: 连续两次读写最少间隔时间
存储器带宽
构成
控制线<br>
读写
片选
译码驱动
<b>线选法</b>: <br>通过译码器选通一行(相当于一个地址), <br>一行中的所有位一起输出
<b>重合法</b>:<br>行列地址分别选中, 得到交叉块
扩展
位扩展
字扩展
与CPU的连接
地址线连接: 低位连接, 高位用以扩展
数据线连接: 存储器扩展到和CPU的一样大来连接
命令控制线
提高速度的方法
双端口
高速主存(SDRAM, CDRAM)
并行访问存储器: 交叉访问<br>比如: 一个存储器具有独立的两组读写电路
<b>单体多字</b>: <br>一次访问多个字(一个地址多个字, 缓存起来(局部性原理)
<b>多体单字</b>: <br>预取, 需要了再从Bus过来(流水)
低位交叉编址: 易于利用局部性原理提高性能
高位交叉编址: 易于扩展
结构化的存储系统(加缓存)
可靠性
信息冗余
<b>海明码</b>
<b>CRC</b>(Cyclic Redundancy Check)<br><i>循环冗余校验</i>
<b>奇偶校验码</b>
时间冗余
<b>回滚</b>
空间冗余
<b>RAID</b>
Cache
<ul><li>加速(局部性原理)</li><li>解决冲突</li></ul>
SRAM:<br>密度低, 性能高, 访存延迟小
锁存器
全硬件实现, 用户透明
评价指标
命中率: 与容量和块长有关<br>
容量越大, 命中率越高(有极限值)<br>
块长变长, 命中率先增后减<br><i>(容量一定, 块数会减少)<br>一般每块4-8字.</i><br>
访问效率: e=t_{访问cache总时间} / t_{总时间}<br>
分类
单一/多级
统一/分离(指令和数据是否分开放)
地址映射
<b>全相联映射</b>: <br>地址分为块号+字号, 写Cache时同时写入<br>
优点: 冲突概率小<br>缺点: 需要相联存储器(代价高)<br>
<b>直接映射</b>:<br>{Cache块号 i} = {主存块号 j} mod {Cache块数 m}<br>
优点: 比较电路少<br>缺点: 冲突概率高<br>
<b>组相联映射</b>:<br>分u组, 按直接映射确定组, 按全相联映射确定块号(共v块)<br>若v=1, 就是直接映射, u=1就是全相联映射<br>称为<b>v路相联映射</b><br>
替换策略
FIFO
随机法
<b>最少使用(LFU)</b>: 每次访问计数器++, 替换时选计数器最小的块并清零<br>
<b>最近最少使用(LRU)</b>: 访问到置0, 其他没访问到的+1, 替换最大的块<br>
读写策略
读
写
写不失效时
<b>写直达法</b>:<br>写入Cache和内存. 时间为写内存时间<br>
<b>写回法</b>:<br>写入Cache. 时间为访问Cache时间<br>但替换的时候需要写回主存<br>多核的时候也会有问题<br>
写失效时
<b>写分配法</b>
<b>绕写法</b>
虚存
分类
<b>页式</b>: 虚拟页号通过页表换算成物理页号, 结合偏移量而得到物理地址<br>
组成结构<br>
页表基址寄存器(CPU中)<br>
页表(内存中)
二级页表
反向页表(逻辑页数大于物理页数)
TLB(Translation Look-aside Buffer)(快表): 缓存页表<br>
页长固定, 碎片少<br>
<b>段式<br></b>
组成结构<br>
段表基址寄存器
段表:<br>段起址+有效位+段长<br>
优点: 动态改变段长<i>(如代码为一段, 数据为一段)<br></i>缺点: 空间分配复杂, 容易产生碎片<br>
<b>段页式</b>:<br>先分段再每段自己分页
虚地址: 基号(程序的序号)+段号+页号+偏移量<br>
替换策略(由操作系统支持)
<b>FIFO</b>
<b>最少使用(LFU)</b>: 每次访问计数器++, 替换时选计数器最小的块并清零<br>
<b>最近最少使用(LRU)</b>: 访问到置0, 其他没访问到的+1, 替换最大的块<br>
<b>FIFO+LRU</b>
总线
分类<br>
并行/串行总线
计算机总线<br>测控总线<br>网络通信总线<br>...<br>
同步/异步/半同步/分离式总线
内部总线: CPU内部寄存器, 运算部件等<br>系统总线: 连接各高速设备和中低速IO等(包括数据/地址/控制总线)
常见总线
infiniband<br>nvlink
VPX<br>VME
ISA
EISA
VESA
PCI
AGP(Accelerated Graphics Port): 加速图形接口
STD
SCSI(Small Computer System Interface): 小型计算机系统接口
USB总线
连硬盘的<br>IDE<br>SATA
结构
<b>单总线结构</b>: 受限于最慢的设备, 且易产生冲突<b><br></b>
<b>多总线结构</b>: 还可加DMA(Direct Memory Access<br>
仲裁方式
<b>集中式仲裁</b>: 如CPU总线仲裁器<br>设备和仲裁器之间有<br><ol><li>送往仲裁器的请求信号BR</li><li>仲裁器送出的授权信号BG</li></ol>
<b>链式查询</b>: 一个一个按优先级查, 有请求就授权<br>
<b>计数定时</b>: 仲裁器计数决定设备地址<br>
<b>独立请求</b>
分布式仲裁
<b>自举分布式仲裁</b>: <br>各个设备通过请求总结果判断自己是否可以使用总线(独立判断自己是否具有最高优先级)<br>
<b>冲突检测分布式仲裁</b>: 检测到冲突则按某种规则选择一个设备<br>
并行竞争分布式仲裁
读写
<b>猝发式传送(Burst)</b>
<b>写后读</b>: 校验<br>
<b>读后写</b>: 保护共享资源<br>
<b>广播/广集</b>
总线周期
申请分配
寻址
传送
结束(撤除总线占用)
通信方式
同步/异步<br><b>波特率</b>(单位: bps): 总传输速率<br><b>比特率</b>(单位: bps): 有效传输速率<br>
<b>同步通信</b>: 需要取决于最低频时钟<br>
<b>异步通信</b>
<b>不互锁</b>
<b>半互锁</b>: 等从设备应答<br>
<b>全互锁</b>: 等从设备应答, 主设备再告诉从设备好了<br>
<b>半同步</b>: 同步为基本, 但有等待线(一直占有), 设备好了再去取<br>
<b>分离式</b>: 分为两个子周期<br><ol><li>发送请求后放弃使用权</li><li>准备好了再次申请使用权</li></ol>
IO系统
控制方式
<ul><li>CPU指令控制</li><li>通道指令控制</li></ul>
发展阶段(2020-05-19)
<b>接口模块和DMA</b>:
<b>具有通道结构</b>:<br>专门的通道指令<br>
<b>具有IO处理机<br></b>
编址方式(2020-05-19)
<b>统一编址</b>: 看作存储器地址的一部分<br>
<b>独立编址</b>: 专门的IO指令<br>
接口与端口(2020-05-19)
<b>端口</b>: 接口电路中的一些寄存器<br>存放状态, 命令, 状态信息等<br>
<b>接口</b>: 若干端口加上逻辑控制组成<br>
功能<br>
选址<br>
传送命令
传送数据
反映IO设备状态
类型
并行/串行
可编程/不可编程
通用/专用
程序型/DMA
信息交换方式(2020-05-19)
<b>程序查询方式<br></b>
软件上: 写代码逐个查询设备是否准备好, 若好, 则处理之<br>
硬件上: 设备选择电路, 数据缓冲寄存器, 设备状态标志<br>
<b>程序中断方式<br></b>
软件: 设置中断服务程序<br>
硬件: CPU中设置中断机构, 外设接口设置中断控制器<br>
DMA方式
DMA完成数据传输功能, 其控制还是需要CPU<br>
DMA和CPU<b>同时访存冲突</b>怎么处理?
停止CPU访问
<b>周期挪用(窃取)</b>: CPU为主<br>
<b>交替访存</b>: 固定每个访问一周期之类的<br>
组成<br>
<b>内存地址寄存器(计数器)AR</b>:用于存放内存中要交换的数据的地址,DMA传送时,每交换一次数据,寄存器值加“1”<br>
<b>字计数器WC</b>:用于记录传送数据块长度
<b>数据缓冲寄存器BR</b>:用于暂存每次传送的数据
<b>设备地址寄存器DAR</b>:IO设备码或辅存寻址信息
<b>控制/状态逻辑</b>:负责管理DMA传送过程,用于修改相关信息和状态
通道方式
接受CPU专门的IO指令
IO设备(2020-05-19)
辅助存储器(2020-05-22)
磁盘
基本概念<br>
柱面(cylinder)
轨道(track)
扇区(sector)
技术指标
<b>道密度</b>: 沿半径方向单位长度的磁道数<br>
<b>位密度</b>: 单位长度磁道所记录的数据位数<br>
<b>存储总量</b>=盘面数*磁道数*每道代码数<br>
<b>寻址时间</b>=寻道时间+等待时间
<b>传输率</b> = 记录密度 * 介质运行速度<br><b>误码率</b> = 出错位数 / 总读位数<br>
<b>柱面数</b>=磁道数<br>(同磁道在同一柱面)<br>
记录方式<br>
方式
<b>归零制(NZ)</b>
<b>不归零制(NRZ)</b>
<b>见1就翻制(NRZ1)</b>
<b>调相制-曼彻斯特编码(PM)</b>: 0就给上升沿, 1就给下降沿<br>
<b>调频制(FM)<br></b>
<b>改进调频制(MFM)<br></b>
评价指标
编码效率
自同步能力
RAID技术
<b>RAID 0</b> (无差别控制的区组)<br>
<b>RAID 1</b> (镜像, 同样的数据备份, 可修复)<br>
<b>RAID 2</b> (带海明码检验)<br>
<b>RAID 3</b> (带奇偶校验(独立一个磁盘)的并行传送)<br>
<b>RAID 4</b> (按数据块访问数据)<br>
<b>RAID 5</b> (奇偶校验码分布在每个磁盘上, 与 RAID 4 不同在按 bit 存 ?)<br>
<b>RAID 10</b> (RAID 0 和 RAID 1 一起用(多体并行 + 镜像))<br>
光盘<br>
Flash闪存器<br>
写之前必须有额外擦除操作(原有数据先放在Buffer里)
固态硬盘(用的是NAND)
OS<br>
进程管理
X程
<b>进程(process)</b>
状态
new<br>
running
waiting
ready
terminated
PBC(Process Control Block, 程序控制块)<br>
组成
进程状态(process state)<br>
程序计数器(program counter)<br>
CPU寄存器(CPU registers)<br>
CPU调度信息(CPU-scheduling information)(优先级等)
内存管理信息(memory-management information)(基地址, 界限寄存器, 页表, 段表等)<br>
记账信息(accounting information)(CPU时间, 实际使用时间等)<br>
I/O状态信息(I/O status information)(I/O设备表, 打开文件表等)<br>
PCB块按双向链表存放, 有指针指向父进程<br>
进程终止时:
<ul><li>若子进程终止, 父进程未调用wait, </li></ul>则进程依然在进程表中(但资源已经释放), 称为<b>僵尸进程(zombie processs)</b><br><ul><li>若父进程结束了还没调用wait, 则子进程变成<b>孤儿进程(orphan process)</b>, </li></ul>系统会将init作为其父进程(re-parent). init进程会定期wait().<br>
用SIGCHLD唤醒父进程<br>
IPC 进程间通信<br><i>(Inter-Process Communication)</i><br>
共享内存<br><i>(POSIX shm)</i><br>
组成
A Producer Process<br>
Buffer
A Consumer Process<br>
消息传递<br><i>(socket, pipe)</i><br>
组成
send<br>
recv<br>
分类<br>
直接/间接<br>
直接
间接(相当于有个信箱)<br>
同步/异步<br>(阻塞/非阻塞)<br>
Buffer大小<br>
Zero Capacity<br>
Bounded Capacity<br>
Unbounded Capacity<br>
实现
socket
pipe
<b>Ordinary Pipe</b><br><ul><li>父子进程间</li><li>单向</li></ul>
<b>Named Pipe</b><br><ul><li>存在直到显式删除</li><li>双向半双工</li></ul>
进程同步
临界区(Critical Section)<br>
实现方法
硬件(原子指令)
test_and_set()
compare_and_swap()
软件
<b>禁止中断</b><br><ol><li>禁止中断</li><li>临界区</li><li>允许中断</li></ol>
优点<br><ul><li>便于kernel的简单操作</li></ul>缺点<br><ul><li>在用户进程不允许中断不合理(如恶意代码)</li><li>只对单处理器有效</li></ul>
<b>strict alternation(严格轮转)<br></b>
缺点<br><ul><li>访问次序太过严格</li><li>忙等</li></ul>
<b>peterson's solution</b><br><i>(限于指令不同)</i><br>
缺点<br><ul><li>忙等</li><li>优先权翻转(如果有优先权的话)</li></ul>
<b>mutex lock<br></b>
优点<br><ul><li>锁时间短的时候还是有用的, 还免去上下文切换<br></li></ul>缺点<br><ul><li>需要忙等(因此也称<b>自旋锁</b>)</li><li>需要硬件实现相应原子操作</li></ul>
<b>semaphore<br></b>
操作
wait()——P
signal()——V
up()
down()
类型
<b>Binary Semaphore(二进制信号量)</b><br><i>相当于互斥锁</i><br>
Counting Semaphore(计数信号量)<br>
优点<br>wait的进程可以丢进队列, 可以了再唤醒<br>
要求
<b>互斥(Mutual Exclusion)<br></b>
无过多约束<br><i>(要求两个CPU之类的)</i><br>
<b>进步(Progress)</b>: 进程要有进展<br>
<b>有限等待(bounded waiting)</b><br><i>一个进程请求临界区过程中允许其他进程进入次数有上限</i><br>
死锁<br>
条件
<b>Mutual Exclusion<br></b>
<b>Hold and Wait<br></b>
<b>No Preemption</b>(不允许抢占)<br><i>若允许, 抢占去执行就好了</i><br>
<b>Circular Wait<br></b>
描述
资源分配图
点边类型<br>
<b>进程结点P_i</b>
<b>资源类型R_j</b>
<b>申请边P_i -> R_j<br></b>
<b>分配边R_j -> P_i<br></b>
定理<br>
<b>无环⇒无死锁</b>
<b>有环 ∧ 所有资源各只有一个 ⇒ 死锁</b><br><i>(否则不一定)</i><br>
检测和分配
单资源: DFS找环<br>
多资源: 银行家算法<br>
处理方法
通过<b>协议来预防</b>避免死锁: 破坏死锁的四个条件<br>
可共享资源不要求互斥访问
每个进程申请一个资源的时候不能占有其他资源<br><ul><li>执行前就申请好全部所需资源</li><li>没有资源的时候才能申请资源. <br>先申请一部分, 用再申申请下一部分之前要释放之前的<br></li></ul>
抢占: 通常适用于状态可保存恢复的资源(CPU寄存器和内存等)<br>
对所有资源完全排序, 按顺序申请资源(打破循环等待条件)<br>
<b>检测死锁并加以恢复</b>
<b>鸵鸟算法</b>: 无视死锁, 不作处理<br>
经典案例
生产者消费者问题<br>
解决方案
Pipe
Binary Semaphore<br><ul><li>semaphore mutex = 1;</li><li>semaphore empty = N;</li><li>semaphore full = 0;</li></ul>
哲学家用餐问题
解决方案
先后拿起左右两边的筷子, 再吃.<br>这种方案下会<b>死锁</b>, 但满足互斥条件.<br>有这样几种补救方案:<br><ul><li>最多允许4个哲学家上餐桌</li><li>只有两根筷子都可用时才拿起</li><li>单号哲学家先拿左边, 双号先拿右边</li></ul>
Semaphore
读者写者问题
解决方案
semaphore db;<br>semaphore mutex; // 对read_count的锁<br>int read_count = 0;<br>
<b>线程(thread)</b>
模型
<b>Many-to-One Model</b>:<br>用户空间实现多线程, 由内核空间一个进程管理<br>内核易实现, 但一个阻塞全都阻塞<br>
<b>One-to-One Model</b>:<br>每个用户空间线程对应一个内核空间进程<br>高并发, 但要对内核做较多修改<br>Windows 和 Linux 都是用这种<br>
<b>Many-to-Many Model</b>:<br>并不严格一一对应<br>
<b>协程(coroutine)</b>
如Python中的yield语法<br>当执行不下去的时候, 协程让调度器调度其他协程运行<br>
发展历史:<br><ol><li>stack-twine: 栈中对应分配一段空间专门用作协程栈</li><li><b>stackful</b>: 利用多线程, 分配一个栈专门运行协程(Go语言的即是)</li><li>stackcopy: 把栈内容拷贝出去以减少内存消耗(但不安全, 没有流行)</li><li><b>stackless</b>: 本质上是一个状态机, 没有自己的栈, <br>只有自己的帧(python中的协程就是stackless的)</li></ol>
<b>纤程(fiber)</b><i><br>通常特指Windows对协程的实现</i>
进程调度
调度方案
普通Schedule(调度)
<b>Context Switch(上下文切换)</b>:<br>各种寄存器内存等状态的保存<br>
类型
<b>不可抢占</b>: 只能自己释放<br>优点<br><ul><li>减少了切换开销</li></ul>缺点<br><ul><li>相应延迟等</li></ul>
<b>可抢占</b><br>优点<br><ul><li>延迟小</li></ul>缺点<br><ul><li>上下文切换开销</li></ul>
性能指标
<b>CPU使用率</b>(通常达到40%~90%)
<b>吞吐量</b>: 每秒做多少xx(事务啥的)<br>
<b>周转周期</b>: 提交任务开始到任务结束时间(包括运行, 等待, IO等)<br>
<b>等待时间</b>: 在queue里等的时间<br>
<b>响应时间</b>: 提交开始到第一次运行的时间<br>
调度算法
<b>FIFO/FCFS(先到先服务)</b>
<b>SJF(Shortest Job Fisrt, 最短作业优先)</b><br>允许抢占则为SRTF(Shortest Remaining Time First)<br>
<ul><li>SJF是<b>最优</b>的, 平均等待时间最小.</li><li><b>问题</b>: 无法知道下次CPU执行长度<br>可以预测为以前长度的<b>指数平均(exponential average)</b><br></li></ul>
<b>RR(Round-Robin, 轮转)</b><br>给每个进程运行一段时间, 可抢占<br>针对多个不同优先级队列, 设置不同时间片长度<br>
优点<br><ul><li>响应好</li><li>公平性</li></ul>缺点<br><ul><li>等待时间, 运行时间, 切换开销都比较大</li></ul>
<b>Priority Scheduling(优先级调度)<br></b>
优先级定义依据<br>
时间限制
内存需要
打开文件数
CPU burst<br>
I/O burst<br>
缺点<br><ul><li>存在极端无限等待block(可随等待时间调整优先级)</li></ul>
Priority Scheduling with Multiple Queues<br><b>Multilevel Feedback Queue(多级反馈队列)</b><br>
参数
队列数量
每个队列的调度算法
确定升级优先级的方法
确定降级优先级的方法
确定进程需要服务时进入哪个队列的方法<br>
多处理器调度
方法<br>
<b>非对称多处理(asymmetric multiprocessing)<br></b>
<b>对称多处理asymmetric multiprocessing, SMP)</b>
<b>亲和性(processor affinity)</b>:<br>让一个进程尽可能在同一个CPU上运行,<br>即为一个进程对CPU的亲和性<br>
软亲和性
硬亲和性
负载均衡
<b>推迁移(push migration)</b><br>周期性检查, 负载高就推到空闲处理器<br>
<b>拉迁移(pull migration)</b><br>周期性检查, 空闲就拉一个来<br>
实时CPU调度<br><i>即有DDL之类的</i><br>
分类
<b>软实时系统(soft real-time system)</b><br>只保证关键进程优先级高点<br>
<b>硬实时系统(hard real-time system)</b><br>要求一个任务在截止期限前必须完成<br>
调度算法
<b>单调速率调度(rate-monotonic)</b><br><ul><li>采用<b>抢占</b>的, <b>静态优先级</b>的策略, 调度<b>周期性任务</b></li><li>优先级高的(周期短的)先抢占运行</li><li>不保证硬实时</li></ul>
<b>最早截止期限优先(Earliest-Deadline-First, EDF)<br></b>
案例
<b>linux的调度</b><br>总体是多级反馈队列, 0~99级用RR,<br>后面100~139表示nice value从-20~19, 使用<b>CFS算法</b>(vruntime越小, 越先运行)<br>
算法评估<br>
<b>确定型模型</b><br>给定workload, 测评各个算法<br>起演示效果<br>
<b>排队模型</b><br>W为队列平均等待时间, λ为平均到达率, n为平均队列长度, 则<br><b>n=λ*W</b><br>
<b>仿真</b><br>使用实际负载例子跑一遍<br>
内存管理
逻辑地址空间
结构
Global and Static Variable(Data Segment, 初始化了) and BSS(Block Started by Symbol, 未初始化)<br>Code and Constant<br>
分配
<b>首次适应(First-Fit)</b>: 从头开始, 找到足够大的空闲孔为止<br><b>下次适应(Next-Fit)</b>: 从上次适应结束开始, 找到足够大的空闲孔为止
<b>最优适配(Best-Fit)</b>: 满足要求的剩余最小的孔<br>
<b>最差适应(Worst-Fit)</b>: 分配最大的孔<br>
段错误: 读写非法区域<br>
空闲块组织形式
<b>隐式</b>空闲链表(相当于要遍历所有块)
<b>显式</b>空闲链表(free时加next和prev指针)
<b>分离</b>空闲链表(不同范围大小的分开, 伙伴系统)
MMU<br>(On-CPU Device)<br>
直接给个起始和大小, 见课本237页<br>
<b>分页</b>: LUT只用来查高几位<br>即高位定页, 低位定页内地址<br>需要一个<b>页表基地址寄存器</b><br>
页表
结构
<b>frame(帧)地址<br></b>
<b>Valid-Invalid Bit</b><br><i>未分配的逻辑空间不必对应一个帧, 可先不确定</i><br>
<b>Permission</b>(read, write, exec, share)<br>
<b>按需调页(Demanding Page)</b><br>访问的时候若invalid就触发Page Fault中断来分配一个Page<b><br></b>
页表替换算法
<b>最优页面置换</b>: 置换最长时间不会使用的页面<br>这只是一个标准, 实际一般不用<br>
<b>FIFO页面置换</b>: 置换最旧的页面<br>
正常应该帧数越多, 页错误数越少,<br>但FIFO页面置换会有<b>Belady异常(Belady's anamaly)</b><br>
<b>LRU(最近最少使用)页面置换</b>
实现方式
计数器
堆栈
近似LRU页面置换
<b>额外引用位算法</b><br>如页表每页保留一个8位字节, 每次右移, 有用就最高位置1. <br>这样最小编号的就是LRU页面<br>
<b>第二次机会算法</b><br>若页面引用位为0, 直接置换, 若为1, 给它一次机会, 变成0.<br>可以用<b>时钟算法</b>实现<br>
<b>增强型第二次机会算法</b><br>有 (引用位, 修改位) 两个位<br><ul><li>(0,0)是最佳 </li><li>(0,1)置换前要把修改写出</li><li>(1,0)最近用过但没有修改, 可能很快再次使用</li><li>(1,1)最近用过, 可能很快再次使用, 且换出要写出</li></ul>
内存已经分配完, 就要替换到交换区<br>涉及<b>页面替换算法</b><br>
需多次访存怎么缓解<b>?</b>
<b>扩大页表<br></b>
内部碎片化
重复数据删除(Deduplication)机会变小
<b>TLB缓存<br>(相联存储器)<br></b>
<b>有效内存访问时间EAT</b>=(t+ε)α+(2t+ε)(1-α)
其他类型页表
<b>多级页表</b>: 将页号进一步分<br>
<b>Hash页表</b>
<b>Inverted Page Table(倒置页表)<br></b>
帧分配
分配算法<br>
<b>平均分配</b><br>n个进程分配m个帧, 每个进程m/n帧<br>
<b>比例分配</b><br>根据进程大小的比例分配<br>可结合考虑<b>优先权</b><br>
系统抖动(thrashing)
原因: 需要物理帧不够, 会频繁导致Page Fault<br>
解决方案
<b>局部置换算法/优先级置换算法</b><br>即, 一个进程开始抖动则不能从另一个进程获取帧<br>但还是需要等待调页(Page List会变长), 所以其他进程有效访问时间仍然会增加<br>
<b>工作集模型</b>: 估计需要帧数<br>
<b>工作集(working-set)</b>: 在最近的Δ个访问页面的集合<br>太小不足以包含局部, 太大会包含多个局部<br>
<b>工作集大小WSS</b><br>其和大于m就会抖动<br>
内核内存管理
伙伴系统
slab分配
若干个连续帧分配为slab, 丢缓存里<br>kernel要分配的时候就先从cache整<br>
大容量管理
磁盘
磁盘管理
<b>坏块管理</b><br><i>正常来说有个上限</i>
方式
<b>Sector Sparing/Forwarding</b><br>调到别的地方<br><ul><li>可能影响调度效率</li></ul>
<b>Sector Slipping</b><br>坏了就写到接下来一个扇区<br><ul><li>可能出现数据移动</li><li>但这样能够使队磁盘调度的影响小</li></ul>
<b>格式化</b><br>通常出厂就设置好了, 侧重于<b>物理格式化<br></b>把磁盘做一个<b>扇区划分</b><br>
扇区结构
<b>头部和尾部</b>: 包含磁盘控制器的使用信息, 如<br><ul><li>扇区号</li><li>纠错代码(Error-Correcting Code, ECC)</li></ul>
<b>数据区域</b>(通常512KB)
使用
文件系统
<b>分区</b>
<b>逻辑格式化</b><br>创建文件系统, 存储文件系统信息<br>
<b>IO优化</b><br>更多顺序读写, 减少随机读写<br>
<b>Raw Disk</b>: 视作一个大数组, 相当于直接控制<br>
磁盘调度
<b>FCFS调度(先到先服务)<br></b>
<b>SSTF调度(Shortest-Seek-Time-First, 最短寻道时间优先)<br></b>并非最优<b><br></b>
<b>SCAN调度(扫描算法, 也称电梯算法(elevator algorithm)<br></b>移到0再移到另一端, 往复来回<b><br></b>
<b>C-SCAN(循环扫描)</b><br>从一端到另一端后立即返回开头, 再继续循环<br>
<b>LOOK调度</b><br>SCAN调度的实际实现, 即 <b>只移动到最远的就返回<br></b>相应有LOOK和C-LOOK调度<br>
固态硬盘SSD
特点
non-volatile<br>
shock resisting<br>
high speed<br>
low energy consumption<br>
结构<br>
外部接口<br>
Flash Controller<br>
软件层<br>
Flush Mux/Demux<br>
通道连接芯片(闪存颗粒)<br>
操作
<b>program</b>(写, 以page为单位)<br>
<b>erase</b>(只能以block为单位)
<b>trim</b>: 标记无效后, 读到缓存再弄回去, 实现真正清除
逻辑上<br>
读的时候(写就反过来)<br>Page-->registers-[bus]->(controller)<br>
Overwrite: no in-place overwrite<br>
读-修改-写的话, 需要读到缓存再刷回去<br>
<b>Flush Translation Layer</b><br>文件系统和Flush memory之间的层, 在硬盘里.<br>用的也是逻辑地址.<br>
Address Mapping<br>
Sector Mapping
Block Mapping
Hybrid Mapping
Log-Structured Mapping<br>
Garbage Collection<br>
Wear-leveling<br>
RISC V<br>
Instruction Formats<br>
I-type
ADDI
SLTI: Set Less Than Imm<br>
shift instructions<br>
R-type
<b>SLT</b>, <b>SLTU</b>: Set Less Than<br>
SRL, SLL, SRA: Shift Logic/Arimetic Left/Right<br>
S-type
branch
UJ-type
J/JAL
HTML
文本类
html: 描述网页
body: 网页可见内容<br>
背景色信息: bgcolor="yellow"<br>
h1, h2, h3: 标题<br>
对齐方式: align="center"
p: 段落<br>
br: 换行<br>
<hr />: 分割线<br>
链接类
a: 链接
href: 链接地址<br>
图表类<br>
img: 图像<br>
src: 图源<br>
width: 宽<br>
height: 高<br>
area: 定义可点击区域<br>
table: 表格<br>
<tr></tr>: 行
<td></td>: 行内单元格
board: 边框<br>
<th></th>: 表头单元格(大多数浏览器作加粗居中处理)
<td>&nbsp;</td>: 空格占位格<br>
colspan, rowspan: 指定跨越单元格数<br>
响应式设计: 随屏幕大小调整<br>(bootstrap)<br>
框架: 显示多个html文档<br>内联框架: 页面内显示页面<br>
头部元素
<title>
<base>
<link>
<meta>
<script> <br>
<style>
字符实体
表单: 各种input元素<br>
<b>input</b>: 输入<br>
文本框: <input type="text" name="firstname">
单选按钮: <input type="radio" name="sex" value="male" checked>Male
提交: <input type="submit" value="Submit"><br>
action: 指定处理程序(若忽略, 会被指定为当前页面)
method: 指定http方法(GET/POST)<br>
name: 设置该属性每个字段才能正确提交<br>
password, checkbox, date, number等<br>
<b>select</b>: 下拉列表<br>
<b>textarea</b>: 多行文本框<br>
<b>button</b>: 可点击按钮<br>
fieldset: 组合表单数据<br>
注释: <!--注释内容--><br>
收藏
0 条评论
下一页