📜  操作系统中的并发(1)

📅  最后修改于: 2023-12-03 15:26:01.332000             🧑  作者: Mango

操作系统中的并发

在操作系统中,并发(concurrency)是指多个任务同时执行的能力。并发通常是通过线程或进程实现的,以提高系统的效率和响应性。但同时也带来了一些挑战,如竞态条件(race condition)、死锁(deadlock)、饥饿(starvation)等问题。

线程和进程

在操作系统中,进程(process)是一个执行中的程序,它在内存中有独立的地址空间和系统资源。一个进程可以包含多个线程(thread),每个线程有自己的栈和程序计数器(PC),但它们共享进程的地址空间和系统资源。

线程有以下优点:

  • 比进程更轻量级,启动、切换和销毁都更快
  • 线程间共享内存,通信更容易、效率更高

进程有以下优点:

  • 进程间有独立的地址空间和系统资源,相互之间相互独立,安全性更高
  • 更容易实现多机器分布式计算
并发与并行

并发和并行(parallelism)这两个概念经常被混淆。

并发指的是多个任务同时在执行,但这些任务之间并不一定在同一时刻执行和互相交错运行。比如,在一个单核 CPU 下,多个线程同时运行就是并发,因为它们共享 CPU 时间片,按一定顺序轮流执行。

而并行指的是任务之间的真正同时执行,即在多个 CPU 或多台机器上同时运行。并行可以显著提高系统的处理能力和效率,比如在一个有多个 CPU 的服务器上同时处理多个客户请求。

竞态条件

竞态条件是指当多个线程同时访问共享资源时,最终结果取决于它们执行的顺序。如果线程之间的执行顺序是不可预测的,那么就会产生竞态条件。

竞态条件的解决方法有以下几种:

  • 关键区域(Critical Section) - 对共享资源进行加锁,保证同一时刻只有一个线程可以访问
  • 互斥锁(Mutex) - 保证只有获得锁的线程才能访问共享资源
  • 信号量(Semaphore) - 限制共享资源的访问数量
  • 形成事务(Transaction) - 保证对共享资源的修改是原子性的
死锁

死锁是指多个线程或进程等待彼此所持有的资源,导致程序无法继续执行的情况。常见的原因是在资源竞争时,多个线程或进程之间形成了一个环形依赖。

为了避免死锁,可以采用以下策略:

  • 避免持有多个资源
  • 根据固定顺序获得资源
  • 使用超时机制,定时释放资源
饥饿

饥饿是指某一个线程永远无法获得所需的资源,无法执行的情况。这个问题可以通过公平锁和优先级调度等方式避免。

总结

并发是操作系统中的一个重要概念,它可以提高系统的效率和响应性。但同时也带来了一些挑战,如竞态条件、死锁和饥饿等问题。程序员需要掌握线程和进程、竞态条件、死锁和饥饿等概念,并选择适合的锁、调度策略和超时机制来避免这些问题的发生。