diff --git a/notes/计算机操作系统 - 进程管理.md b/notes/计算机操作系统 - 进程管理.md index 71cf390b..20372564 100644 --- a/notes/计算机操作系统 - 进程管理.md +++ b/notes/计算机操作系统 - 进程管理.md @@ -254,6 +254,8 @@ Linux 的进程状态和僵尸进程、孤儿进程见 [Linux](Linux.md#进程 - 同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系; - 互斥:多个进程在同一时刻只有一个进程能进入临界区。 +实现互斥的锁在拿不到时有两种等法:互斥锁让线程阻塞、让出 CPU,锁释放后再被唤醒;自旋锁让线程在原地循环检查,省去了阻塞和唤醒的切换,但一直占着 CPU,只适合锁的持有时间很短、并且有多个 CPU 核的情况。Java 中的自旋见[自旋锁](Java%20并发.md#自旋锁)。 + ### 3. 信号量 信号量(Semaphore)是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作。 @@ -711,6 +713,8 @@ static void *worker(void *arg) { return NULL; } // main 中: +setvbuf(stdout, NULL, _IONBF, 0); // 关闭 stdout 的缓冲,否则输出重定向到文件时,子进程 _exit() 前的 printf 不会写出 +printf("主线程 pid=%d tid=%d\n", getpid(), gettid()); pid_t c = fork(); if (c == 0) { counter++; printf("子进程 pid=%d tid=%d\n", getpid(), gettid()); _exit(0); } waitpid(c, NULL, 0);