Update 计算机操作系统 - 进程管理.md

附录 A4 的代码补上关闭输出缓冲的一行,补充互斥锁与自旋锁的区别。
This commit is contained in:
CyC2018
2026-11-04 22:39:58 +08:00
parent 41665ad273
commit 68974bb287
@@ -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);