并发(Concurrency)

操作系统是支持应用程序的系统软件;
应用程序由代码和数据构成的软件
使用syscall等指令调用操作系统API(程序级调度)

什么是并发?
为什么需要并发?
(共享内存)多处理器上的并发程序?

并发(concurrency)与并行(parallelism)

Concurrent: existing happening or done at the same time.
比如两个Java程序以不同的顺序执行,但是不会影响最终结果的正确性。即并发的体现!

并发性的来源: 进程会调用操作系统的API

  • 并发(Concurrency): 多个执行流可以不按照一个特定的顺序执行。
  • 并行(parallelism): 允许多个执行流同时执行(多个处理器)

线程

线程:多个执行流并发/并行执行,并且它们共享内存。

  • 两个执行流共享代码和所有全局变量(数据、堆区)
  • 线程之间指令的执行顺序是不确定的(non-deterministic)

线程:什么该共享、什么不共享?

  • 共享代码:所有线程的代码都来自当前进程的代码
  • 共享数据:全局数据/堆区可以自由引用
  • 独立堆栈:每个线程有独立的堆栈

操作系统封装线程API

  • create(fn)

    • 创建并运行一个线程,该线程立即开始执行函数fn
    • 函数原型void fn(int tid)
    • tid是从1开始编号
  • join(fn)

    • 等待所有线程执行结束
    • 执行函数fn
    • 只能join一次

理解并发程序的执行

状态机视角下的程序执行

有限状态机 Finite State Machine(FSM)

程序 = 有限状态机

(操作系统上的)程序执行时,状态是有限的

  • 寄存器(包括PC指针)
  • 内存:代码、数据、堆栈(暂时假设内存静态分配)

“程序 = 状态机 = 有向图”是一种理解程序、分析程序的工具

线程共享代码和数据
拥有独立的寄存器和堆栈

  • 堆栈也位于同一个地址空间中
  • 允许把局部变量的指针(&local_var)传递给另一个线程
posted @ 2021-03-02 13:41  Felix_Openmind  阅读(999)  评论(0)    收藏  举报
*{cursor: url(https://files-cdn.cnblogs.com/files/morango/fish-cursor.ico),auto;}