Operating Systems Three Easy Pieces(OSTEP) - Concurrency
Chapter26 Concurrency: Introduction 线程和进程类似,但多线程程序,共享 address space 和 data。 多线程各自独享寄存器组,切换进程的时候需要上下文切换。 进程上下文切换的时候把上一个进程的寄存器组保存到 PCB(Process Control Block)中,线程切换需要定义一个或更多新的结构体 TCBs(Thread Control Blocks)来保存每个线程的状态。 线程切换 Page table 不用切换,因为线程共享地址空间。 线程拥有自己的栈。 26.1 Why use threads? Parallelism。单线程程序只能利用一个 CPU 核,多线程程序可以并行利用多个 CPU 核,提高效率。 防止 I/O 操作导致程序 block。即使是单核 CPU,多线程程序可以在一个线程执行 I/O 操作的时候,其他线程继续利用 CPU。 如果是 CPU 密集型工作,单核 CPU 跑多线程对效率提升不大 26.2~26.4 Problem of Shared data 创建两个线程,分别对全局变量 counter 加 1e7, 最后结果会不等于 2e7。 #include <stdio.h> #include <pthread.h> #include "common.h" #include "common_threads.h" static volatile int counter = 0; void *mythread(void *arg) { printf("%s: begin\n", (char *) arg); int i; for (i = 0; i < 1e7; i++) counter = counter + 1; printf("%s: done\n", (char *) arg); return NULL; } int main(int argc, char *argv[]) { pthread_t p1, p2; printf("main: begin (counter = %d)\n", counter); Pthread_create(&p1, NULL, mythread, "A"); Pthread_create(&p2, NULL, mythread, "B"); // join waits for the threads to finish Pthread_join(p1, NULL); Pthread_join(p2, NULL); printf("main: done with both (counter = %d)\n", counter); return 0; } pthread_create: 创建线程。 pthread_join: 阻塞等待线程终止。...