Bakery's Algoritm面包店算法-处理多个进程间互斥

Outline

  • 在进入临界区以前,进程获得一个编号
  • 最小编号的进程进入临界区
  • 出临界区以后,ticket设为0

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Initial
choosing[0..n]=flase;
ticket[0..n]=0;
Repeat
choosing[i] = true;
ticket[i] = max(ticket[0], ticket[1], ..., ticket[n-1]) + 1; //给i一个最大的ticket号
choosing[i] = false;
for k = 0 to n - 1
do begin
while choosing[k] do no-op; //当前有人在获取ticket号,等待
while ticket[k] != 0 and ( ticket[k], k) < (ticket[i], i) do no-op; //有进程优先级更高
end
critical section
ticket[i] = 0; //当ticket = 0,说明没有拿ticket
remainder section
until false

ps命令详解

还是在看disown的问题,发现就算是disown或者nohup了一个进程,他所属的pgid和sid也没有变化嘛,好谜,索性这里把ps命令的参数和输出都过一遍吧。

常用命令

ps命令支持三种使用的语法格式

  • UNIX 风格,选项可以组合在一起,并且选项前必须有“-”连字符
  • BSD 风格,选项可以组合在一起,但是选项前不能有“-”连字符
  • GNU 风格的长选项,选项前有两个“-”连字符

UNIX风格

1
2
3
4
$ ps -e
PID TTY TIME CMD
1 ? 00:00:07 systemd
2 ? 00:00:00 kthreadd

这里-e相当于-A输出所有进程

关于pyhton的yield, 生成器与尾调用

前言

什么时候可以认真看过一遍SICP啊 (:3」∠)

以下单纯的作为学习笔记

迭代器

好像没什么徒手撸一个迭代器的机会所以留意一下Python的for循环本质上就是通过不断调用next()函数实现。next()方法返回容器的下一个元素,在结尾时引发StopIteration异常

1
2
3
4
5
6
7
8
9
10
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
print(next(it))
except StopIteration:
# 遇到StopIteration就退出循环
break