ch9 同步
Background 多进程作为现代操作系统的重要特性,交互则会引起同时对共享资源的访问,当这些资源访问不正确会出现冲突或产生不适当的输出(冲突、死锁、饥饿);而在同步的基础上,进程被分为以下两种类型: 独立进程 Independent Process 不和其他进程共享资源或状态 确定性,输入状态确定结果 可重现,能够重现起始条件,I/O 调度的顺序不重要 协作进程 Cooperative Process; 多进程共享资源或状态 不确定性 probabilistic 不可重现 不确定性和不可重现意味着bug可能是间歇性发生的 Cooperation 进程的互相影响,即进程间的合作(相互或破坏);最简单的例子就是两个进程使用同一个文件,一个进程读,一个进程写。读进程的结果会被写进程所影响。 进程需要合作的原因: 资源共享:多个进程访问相同的数据 一台电脑,多个用户 一个银行存款余额,多台ATM机 嵌入式系统(机器人手臂和收的协调) 计算加速: I/O 和 CPU计算可重叠 多处理器 - 将任务分解为子任务并分布在不同的进程中,它通常可以更快地运行(也需要多个可共享的 CPU) 模块化:复杂的任务组织成单独的子任务,让不同的进程运行 大程序分成小程序 是系统易于扩展 程序可以调用函数fork()来创建一个新的进程 操作系统需要分配一个新的并且唯一的进程ID 因此在内核中,这个系统调用会运行 new_pid = next_pid++; 翻译成机器指令: Load next_pid Reg1 STORE Reg1 new_pid INC Reg1 STORE Reg1 next_pid 假设两个进程并发执行 如果next_pid等于100, 那么其中一个进程得到的ID应该是100, 另一个进程的ID应该是101, next_pid应该增加到102 可能在INC前进行了上下文切换, 最终导致两个进程的pid都是100,而next_pid也是101 无论多个线程的指令序列怎样交替执行,程序都必须正常工作 多线程程序具有不确定性和不可重现的特点 不经过专门设计,调试难度很高 不确定性要求并行程序的正确性 先思考清楚问题,把程序的行为设计清楚 切忌给予着手编写代码,碰到问题再调试 Race Condition 竞态条件是由操作系统软件中的同步错误。出现在进程试图同时执行两个或多个操作时,这是一种不希望出现的情况。 怎么样避免竞态?...