mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-11-06 06:24:09 +00:00
Update 计算机操作系统 - 进程管理.md
附录 A4 的代码补上关闭输出缓冲的一行,补充互斥锁与自旋锁的区别。
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user