并发(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)传递给另一个线程
学而不思则罔,思而不学则殆!

浙公网安备 33010602011771号