• 【2022南京大学jyy操作系统】(二) 多处理器编程



    前言

    我目前正在学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);
    }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 多线程的执行顺序以语句任意排列,而不区分函数
    • 可以发现 奇怪的出现了 00 的情况

    在这里插入图片描述

    • 精妙的unit 设计 只要你写的程序 足够清晰 那么它就可以优化 。
      在这里插入图片描述
      改正: 加上mfence保证内存写入到共享内存以后,才执行下一条指令,来保证内存的一致性
      在这里插入图片描述
      在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    • 总结 :
      在这里插入图片描述
  • 相关阅读:
    桌面平台层安全随手记录
    [复现-ing|论文]YOLO-landmark detection
    阿里云·短信发送
    秒杀:只出现一次的数字系列
    GaussDB整体性能慢分析
    等保测评FAQ
    利用泽攸科技原位TEM技术揭示真空击穿过程中电场与电极材料相互作用
    XC5350A 单节锂电池保护芯片 过放2.9V/2.8V/2.4V保护IC
    官宣!Wayland正式支持基于IntelliJ的IDE
    everything的高效使用方法
  • 原文地址:https://blog.csdn.net/weixin_49486457/article/details/127704221