并发和并行
- 并发:在一个时间段内有多个进程/线程同时执行。可通过时间片轮转实现并发。
- 并行:在同一时刻有多个进程/线程同时执行。物理上的多核CPU才能实现并行。
进程 Process
- 进程是某个程序当前正在执行的实例。是系统进行资源分配的基本单位。
进程控制块 PCB
- Process Control Block,即进程控制块。
- PCB是一个数据结构,创建一个进程,就是创建PCB;撤销一个进程,就是撤销其PCB。
- PCB是进程存在的唯一标志。
- 进程 = PCB + 程序段 + 相关数据段。
- PCB中存储的内容有:UID,PID,进程状态信息,段指针,打开的文件,访问的资源,寄存器数据副本,CPU现场等。
进程生命周期
- 运行态
- 阻塞态:如等待网络请求返回结果
- 就绪态
进程间通信方式
- 共享存储。
- 消息传递(类似于网络传输)。
- 管道通信。
C#进程类
1
System.Dianostics.Process;
线程 Thread
- 线程是系统调度的基本单位。
- 每个进程包含一个或多个线程。
多线程的优点
- 执行I/O受限操作的线程会被操作系统忽略,直到I/O子系统返回结果。所以,从I/O受限线程切换到处理器受限线程能提高处理器利用率,防止处理器在等待I/O操作完成期间闲置。
多线程的缺点
- 上下文切换有代价:必须将CPU当前的内部状态保存到内存,还必须加载与新线程关联的状态。如线程太多,切换开销就会开始显著影响性能。
- 时间分片本身对性能也有巨大影响。
- 要在通过多线程来加快解决处理器受限问题时谨慎衡量性能。
C#线程类
1
System.Threading.Thread
UI线程
- UI是单线程的,与任何UI组件(例如,文本框)的交互必须始终发生在单个UI线程中。
线程池
- 线程池是多个线程的集合,通过一定逻辑决定如何为线程分配工作。有任务要执行时,它分配池中的一个工作者线程执行任务,并在任务结束后解除分配,从而使该线程在下次请求额外工作时可用。
- 线程池避免了启动和终止线程的巨大开销。此外,线程池避免了太多线程的创建,防止系统将大多数时间花在线程的切换而不是运行上。
调整线程数量的启发式算法
- 爬山算法:爬山算法在开始阶段不断创建新线程来运行任务,然后监控这些任务的性能。当发现性能开始下降时就减少线程,使性能回升到最佳。
- 工作窃取算法:工作窃取算法能够识别工作量过度饱和以及过度枯竭的线程。工作量不足的线程会从过于繁忙的线程“窃取”任务。