操作系统-多处理器编程

162 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

前言

多处理器时代:单线程变成多线程(并发场景)

单处理器多线程下也能并发,那么多处理器的复杂点。。。。。

并发:有两个人同时做一件事情,不管是并发进程还是并发线程。

并发是一段时间内有多个任务,并行是同一时间点有多个任务,并发会导致每个人做的事情的完成先后顺序啥的不同,操作系统是最早的并发程序之一。

实现多处理器的malloc/free

并发的基本单位:线程

  • 执行流拥有独立的堆栈/寄存器
  • 共享全部的内部

从状态机视角将单线程拓展成多线程

image.png

单线程:局部代表一个单线程,全局变量和其他东西代表共享的内容

image.png

多线程并发状态

image.png

并发程序的每一步都是不确定的

create:在状态机中加入一个栈帧的链表

join:等待,等所有线程完成时再返回,否则死循环

  • 操作系统会自动把线程放置在不同的处理器上
  • 在后台运行,可以看到CPU使用率超过了100%

如何证明线程确实会共享内存?

线程有着独立的堆栈。

多线程并发问题存在

(1)原子性

两个线程对一个事件操作,会导致BUG

两个线程同时支付100元,跟数据库中的原子性类似,会导致并发问题,余额有可能出现2^64-100,计算机内2的补码-100.

image.png

lock,unlock保证原子性,可以阻止线程并发

(2)顺序性

编译器对内存访问“eventually consistent”的处理导致共享内存作为线程同步工具的失效

(3)可见性(最大的麻烦)

多处理器编程:放弃对“程序”的旧理解

不原子,能乱序,不立即可见,下节详述。