jyy的操作系统 | 青训营笔记

295 阅读2分钟

@[toc] 前言

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

![在这里插入图片描述](img-blog.csdnimg.cn/7363babcb49… =x200)

P3多处理器编程

并发

并发的:同时存在、发生或完成的。在计算机科学中,并发指的是一个程序、算法或问题的不同部分或单元按无序或部分顺序执行而不影响最终结果的能力。 在这里插入图片描述

  • 并发和并行的区别 : 链接
  • 并发是一段时间内有多个任务,并行是同一时间点有多个任务. (区分时间点和时间段)

单线程和多线程程序

therad.h 简化线程API

在这里插入图片描述 ![在这里插入图片描述](img-blog.csdnimg.cn/f11d0256bd6… =x0300)

写出多处理器的程序

在这里插入图片描述

  • 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保证内存写入到共享内存以后,才执行下一条指令,来保证内存的一致性 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 ![在这里插入图片描述](img-blog.csdnimg.cn/f9a0a899b60… =x400)

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

![在这里插入图片描述](img-blog.csdnimg.cn/fa6cbb7f94b… =x400)

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

在这里插入图片描述

  • 总结 : 在这里插入图片描述