wywwzjj's Blog

CSAPP 并发编程 笔记

字数统计: 749阅读时长: 2 min
2019/12/16 Share

基于进程的并发

基于进程的并发服务器

进程的优劣

基于 I/O 多路复用的并发

基于 I/O 多路复用的并发事件驱动服务器

I/O 多路复用技术的优劣

基于线程的并发

线程

  • 用户线程
  • 内核线程
  • 轻量级进程:内核中实现,支持用户线程(Solaris)

管理、控制线程的模块称作线程包。

线程模型中,由一个线程作为协调者来分派任务,而其他线程负责处理任务的模型称作分派/工作模型。

各线程相互独立,每个线程可单独完成任务的接收、处理、结果返回的模型称作队列模型。

进程 = 资源 + 指令执行序列

是否可以资源不动而切换指令序列?可!只切PC!保留了并发的优点,避免了进程切换的代价。从而引入线程。

线程切换:TCB 与栈互相配合。

yield,next,突然想起了py的协程

与进程的区别

线程:处理器分配调度的基本单位,进程内资源所有线程共享,线程切换开销小

进程:其他资源(除处理器外)分配的基本单位,进程切换开销大

进程可以创建线程、子进程,线程只能创建线程。

线程执行模型

POSIX 线程

创建线程

终止线程

回收已终止线程的资源

分离线程

初始化线程

基于线程的并发服务器

多线程程序中的共享变量

线程内存模型

将变量映射到内存

共享变量

用信号量同步线程

进度图

信号量

用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作。

信号在进程间通信、同步起到了重要的作用,但信号表示的含义有限,信号 => 信号量。

struct semaphore {
int value;
PCB* queue;
};

P(semaphore s) {
s.value--;
if (s.value < 0) {
sleep(s.queue);
}
}

V(semaphore s) {?
s.value++;
if (s.value <= 0) { // <= 0,暂无资源还去唤醒?
wakeup(s.queue);
}
}
  • P 消费资源。来自荷兰语的 problem,即 test。

  • V 生产资源。来自荷兰语 verhogen,即 increment。

特点

信号量的双用途
  • 互斥和条件同步
  • 但等待条件是独立的互斥
容易出错
  • 使用的信号量已经被另一个线程占用
  • 忘记释放信号量
不能够处理死锁问题

互斥

mutex = 1

同步

xxx = 0

前驱

每一个前置都能看成一个同步关系

信号量

使用信号量实现互斥

利用信号量来调度共享资源

综合:基于预线程化的并发服务器

使用线程提供并行性

其他线程并发问题

线程安全

可重入性

在线程化的程序中使用已存在的库函数

竞争

死锁

CATALOG
  1. 1. 基于进程的并发
  2. 2. 基于 I/O 多路复用的并发
  3. 3. 基于线程的并发
    1. 3.1. 线程
    2. 3.2. 与进程的区别
  4. 4. 多线程程序中的共享变量
  5. 5. 用信号量同步线程
    1. 5.1. 进度图
    2. 5.2. 信号量
      1. 5.2.1. 特点
        1. 5.2.1.1. 信号量的双用途
        2. 5.2.1.2. 容易出错
        3. 5.2.1.3. 不能够处理死锁问题
      2. 5.2.2. 互斥
      3. 5.2.3. 同步
      4. 5.2.4. 前驱
  6. 6. 使用线程提供并行性
  7. 7. 其他线程并发问题