Ch5 并发计算 Flashcards
Ch5 并发计算
什么是 并发计算?
并发计算是一种计算形式,其中多个计算在重叠的时间段内(并发地)执行,而不是顺序执行。它涉及多个进程或线程协同工作以更快地完成任务。
并发的三种形式是什么?
- 分布式系统:多个机器通过网络协同工作。
- 多进程系统:同一台机器上运行多个进程。
- 多线程系统:单个进程内的多个线程共享相同的内存空间。
什么是 分布式系统?
分布式系统是一个在多个物理机器上执行的程序,通常位于不同的位置,通过网络进行通信(例如内网或互联网)。它用于提高速度、必要性和便利性。
什么是 多进程系统?
多进程系统涉及在同一台机器上同时运行的多个进程(可执行文件),每个进程都有自己的控制流和虚拟内存。进程通过 进程间通信 (IPC) 进行通信。
什么是 多线程系统?
多线程系统是单个进程内的多个线程共享相同的内存和资源。线程轮流使用 CPU,需要同步以避免竞争条件和死锁。
并发系统中的主要问题有哪些?
- 共享资源:多个进程/线程访问同一资源(例如文件、变量)。
- 死锁:多个进程/线程被阻塞,等待对方释放资源。
- 竞争条件:程序的正确性取决于执行顺序,可能导致不可预测的结果。
什么是 互斥锁 (mutex)?
互斥锁(互斥对象)是一种程序对象,允许多个线程轮流共享资源。只有锁定互斥锁的线程才能解锁它。
什么是 信号量 (semaphore)?
信号量是一种用于控制多个进程或线程访问共享资源的变量。它是互斥锁的泛化,可以通知其他线程资源可用。
什么是 进程管理?
进程管理涉及为进程分配资源,使它们能够共享和交换信息,保护资源,并实现进程间的同步。
前台 和 后台 进程的区别是什么?
- 前台:进程在终端中运行,进程完成前无法使用 shell。
-
后台:进程独立运行,允许你继续使用 shell(使用
&
在后台运行)。
C 语言中 fork()
函数的用途是什么?
fork()
函数创建一个新进程(子进程),该进程是当前进程(父进程)的副本。子进程从 fork()
调用的位置开始执行。
exec()
函数族的用途是什么?
exec()
函数用新程序替换当前进程的代码。新程序在同一进程中运行,具有相同的 PID。
wait()
函数的用途是什么?
wait()
函数暂停父进程的执行,直到其某个子进程终止。它返回终止子进程的 PID。
system()
函数的用途是什么?
system()
函数允许程序执行一个 shell 命令,就像在终端中输入一样。进程会阻塞,直到命令完成。
什么是 进程间通信 (IPC)?
IPC 是进程之间发送和接收信息的过程。它可以在同一台机器上或通过网络在不同机器之间进行。
IPC 中的 信号 是什么?
信号是一个值(整数),从一个进程发送到另一个进程以通知某个事件(例如终止、错误)。它是一种简单的通信形式。
IPC 中的 套接字 是什么?
套接字是进程之间发送或接收数据的端点。它可以用于同一台机器上的通信或通过网络进行通信。
套接字的三种类型是什么?
- 流套接字:基于连接的(例如 TCP)。
- 数据报套接字:无连接的(例如 UDP)。
- 原始套接字:绕过传输层。
什么是 客户端/服务器模型?
在客户端/服务器模型中,一个进程(服务器)接收来自多个客户端的请求并执行相应的任务。它常用于网络通信。
TCP 和 UDP 的区别是什么?
- TCP:基于连接,可靠,确保数据按顺序传递。
- UDP:无连接,更快,但数据可能会丢失、损坏或乱序到达。
什么是 线程?
线程是由操作系统独立管理的一系列程序指令。同一进程内的线程共享内存和资源。
pthread_create()
函数的用途是什么?
pthread_create()
函数在进程中创建一个新线程。它接受一个函数指针作为参数,该函数是线程的起点。
什么是 竞争条件?
竞争条件发生在程序的正确性取决于线程或进程的执行顺序时。它可能导致不可预测的结果。
如何防止竞争条件?
可以使用同步机制(如 互斥锁 和 信号量)来确保一次只有一个线程访问共享资源。
C 语言中 volatile
关键字的用途是什么?
volatile
关键字表示变量的值可能会意外更改(例如由另一个线程更改)。它防止编译器优化对该变量的访问。
sem_wait()
和 sem_post()
函数的用途是什么?
-
sem_wait()
:减少信号量,如果信号量为 0 则阻塞。 -
sem_post()
:增加信号量,允许其他线程访问资源。
C 语言中 传值 和 传引用 的区别是什么?
- 传值:传递值的副本,函数内的修改不会影响原始变量。
- 传引用:传递变量的地址,允许函数修改原始变量。
套接字编程中 select()
函数的用途是什么?
select()
函数监视多个文件描述符(例如套接字),以查看它们是否准备好进行读取、写入或有异常情况。它用于 UDP 服务器以处理多个客户端。
recvfrom()
和 sendto()
函数的用途是什么?
-
recvfrom()
:从 UDP 套接字接收数据。 -
sendto()
:向 UDP 套接字发送数据。
pthread_join()
函数的用途是什么?
pthread_join()
函数阻塞调用线程,直到指定的线程终止。它允许主线程等待其他线程完成。