@[toc] 前言
我目前正在学jyy的操作系统,该文章为我的笔记。 学习链接 : 链接点击跳转

P3多处理器编程
并发
并发的:同时存在、发生或完成的。在计算机科学中,并发指的是一个程序、算法或问题的不同部分或单元按无序或部分顺序执行而不影响最终结果的能力。
- 并发和并行的区别 : 链接
- 并发是一段时间内有多个任务,并行是同一时间点有多个任务. (区分时间点和时间段)
单线程和多线程程序
therad.h 简化线程API

写出多处理器的程序
- gcc a.c -lpthread && ./a.out
证明线程确实共享内存
- 因为睡眠了 所以 hello 打印慢与printf
证明线程具有独立堆栈
__thread 特性:线程局部变量 == 依附于在每一个线程上TLS 有指针
验证栈的地址空间
- 练习
原子性
- 山寨支付宝
求和
- 在man中搜索
/ xxx查找xxx - 读手册 做实验 !
顺序
可见性
- T1 写 x 读y
- T2 写 y 读x
T1T2的实现
#include "thread.h"
int x = 0, y = 0;
atomic_int flag; // 0 close 1 open
#define FLAG atomic_load(&flag)
#define FLAG_XOR(val) atomic_fetch_xor(&flag, val) //异或操作
#define WAIT_FOR(cond) while (!(cond)) ;
__attribute__((noinline))
void write_x_read_y() {
int y_val;
asm volatile(
"movl $1, %0;" // x = 1
"movl %2, %1;" // y_val = y
: "=m"(x), "=r"(y_val) : "m"(y)
);
printf("%d ", y_val);
}
__attribute__((noinline))
void write_y_read_x() {
int x_val;
asm volatile(
"movl $1, %0;" // y = 1
"movl %2, %1;" // x_val = x
: "=m"(y), "=r"(x_val) : "m"(x)
);
printf("%d ", x_val);
}
void T1(int id) {
while (1) {
WAIT_FOR((FLAG & 1));
write_x_read_y();
FLAG_XOR(1);
}
}
void T2() {
while (1) {
WAIT_FOR((FLAG & 2));//等待全部
write_y_read_x();
FLAG_XOR(2);
}
}
void Tsync() {
while (1) {
x = y = 0;
__sync_synchronize(); // full barrier
usleep(1); // + delay
assert(FLAG == 0);
FLAG_XOR(3); // change to
// T1 and T2 clear 0/1-bit, respectively
WAIT_FOR(FLAG == 0);
printf("\n"); fflush(stdout);
}
}
int main() {
create(T1);
create(T2);
create(Tsync);
}
- 多线程的执行顺序以语句任意排列,而不区分函数
- 可以发现 奇怪的出现了 00 的情况
- 精妙的unit 设计 只要你写的程序 足够清晰 那么它就可以优化 。
改正: 加上
mfence保证内存写入到共享内存以后,才执行下一条指令,来保证内存的一致性

- 处理器如果有了下面这样一个有向无环图(拓扑序) 则可以有同时执行的操作

- fetch->issue->execute->commit
- 指令的有向无环图,然后按照这个有向无环图来执行指令 , 哪里短板补哪里
- 总结 :