
目录
1. 并发,同步,异步,互斥,阻塞,非阻塞的理解
并发:并发是指多个任务或操作在同一时间段内执行,它们相互独立,不一定按照严格的顺序执行。
同步:同步是为了协调多个任务或操作之间的顺序和行为,以确保数据的一致性。在同步中,任务或操作可能会按照特定的顺序执行或等待其他任务的完成,以满足特定的条件。
异步:异步是指任务或操作可以独立于当前线程继续执行,而不需要等待其他任务完成。在异步操作中,任务可以在后台或另一个线程中执行,并且可以提供结果或通知以后再处理。
互斥:互斥是指通过一种机制来确保同一时间只有一个任务或线程可以访问共享资源。它通过锁或信号量等机制实现,以避免数据竞争和冲突。
阻塞:阻塞是指当一个线程或任务在执行过程中遇到某种条件而无法继续进行时,暂停执行,等待条件满足或被唤醒。在阻塞状态下,资源通常不可用,直到条件满足。
非阻塞:非阻塞是指任务或操作在执行过程中不会暂停等待条件满足,而是立即返回并继续执行其他任务。非阻塞操作可以持续进行,而不会受到其他任务的影响。
2. 什么是进程?
定义:进程是正在执行的程序的一个实例。它不仅仅是代码,还包括当前的活动(如程序计数器、寄存器值)、内存空间、系统资源等。
简单比喻:
-
程序 = 菜谱(静态的指令集)
-
进程 = 按照菜谱做饭的过程(动态的执行过程,有状态、有资源)
3. 父进程、子进程的关系以及区别
父进程是创建子进程的进程。当父进程创建一个新的进程时,该新进程就成为子进程。父进程在创建子进程时,会为子进程分配独立的资源和运行环境。子进程是由父进程创建的新进程。子进程会继承父进程的大部分属性和资源。它可以独立运行,并且可以执行不同的代码路径。子进程可以创建自己的子进程,形成进程的层次结构。
3.1 创建关系
-
关系:父进程通过 fork() 系统调用创建子进程。没有父进程,就没有子进程。
-
区别:创建者是父进程,被创建的是子进程。
3.2 进程ID
-
关系:子进程知道自己的父进程是谁(通过 getppid() ),父进程也知道自己创建了哪些子进程。
-
区别:
-
PID不同:每个进程都有唯一的进程ID。
-
PPID:子进程的父进程ID就是父进程的PID。
-
3.3 内存空间
-
关系:在 fork() 的瞬间,子进程获得父进程内存空间的完整副本(代码段、数据段、堆栈等)。
-
区别: fork() 之后,父子进程的内存空间完全独立。在一个进程中修改变量,不会影响另一个进程。
3.4 执行流程
-
关系: fork() 成功后,父子进程同时执行后面的代码。
-
区别:通过 fork() 的返回值来区分父子进程:
-
父进程中: fork() 返回子进程的PID
-
子进程中: fork() 返回 0
-
返回 -1 表示创建失败
-
3.5 资源继承
-
关系:子进程继承父进程的许多属性:
-
环境变量
-
打开的文件描述符
-
信号处理设置
-
当前工作目录等
-
-
区别:继承后各自独立管理,关闭一个进程中的文件不会影响另一个进程。
3.6 生命周期
-
关系:父进程通常应该等待子进程结束,以避免产生"僵尸进程"。
-
区别:
-
父进程可以创建多个子进程
-
子进程只能有一个父进程
-
父进程终止时,子进程会成为"孤儿进程",被 init 进程(PID=1)收养
-
fork() 用法详见:
4. 孤儿进程、僵尸进程、守护进程的概念
孤儿进程:父进程先于子进程结束运行,子进程成为孤儿进程并由 init 进程接管。
僵尸进程:子进程已经终止,但父进程尚未调用 wait() 或 waitpid() 来获取子进程的终止状态,子进程进入僵尸进程状态。
守护进程:在后台运行的特殊进程,通常以 init 进程为父进程,独立于终端或控制终端,用于执行常驻任务。
5. 进程有哪五种状态,如何转换

创建状态:进程刚被创建,系统为其分配所需的资源,创建进程控制块(PCB)来管理进程的信息和状态。
就绪状态:进程已经准备好开始执行,但还没有获取到处理器资源,处于等待调度的状态。
执行状态:进程已经获取到处理器资源,正在执行指令和运行程序。
阻塞状态:在执行状态下,如果进程遇到阻塞操作,例如等待 I/O 完成,它会进入阻塞状态。在此状态下,进程暂时无法继续执行,直到阻塞的操作完成或者条件满足后才能再次进入就绪状态。
终止状态:进程执行结束或者被系统终止,进入终止状态。在终止状态下,进程的资源会被释放,PCB 会被删除。
6. 进程通信的方式有哪些?
管道(Pipe):适用于有亲缘关系的进程,是一种单向通信方式。
命名管道(Named Pipe):适用于没有亲缘关系的进程,通过特殊文件实现通信。
共享内存(Shared Memory):多个进程可以访问同一块物理内存来实现数据共享。
信号量(Semaphore):用于进程之间的同步和互斥操作。
消息队列(Message Queue):通过消息队列来发送和接收消息,实现异步通信。
套接字(Socket):通用的进程间通信机制,可在不同主机间进行通信。
文件:通过操作文件来实现进程间的通信和数据交换。
7. 什么是信号量,有什么作用?
信号量是一种同步机制,它本质上是一个计数器,用于多进程或多线程对共享资源的访问。信号量的主要作用是保护共享资源,使得在一个时刻只有一定数量的进程或线程可以访问。
信号量的原理是基于 P(sv) 和 V(sv) 两种操作:
- P(sv) 操作会将信号量的值减1,如果信号量的值大于零,进程或线程可以继续访问共享资源;如果信号量的值为零,进程或线程会被挂起,直到其他进程或线程通过 V(sv) 操作释放信号量。
- V(sv) 操作会将信号量的值加1,如果有进程或线程因等待信号量而被挂起,它们中的一个会被唤醒继续执行;如果没有进程或线程等待信号量,信号量的值会增加。
8. 进程控制块包含哪些?
PCB 是操作系统管理进程的核心数据结构,包含:
-
进程ID:唯一的标识符
-
进程状态:运行、就绪、阻塞等
-
程序计数器:下一条要执行的指令地址
-
寄存器:CPU寄存器内容
-
内存管理信息:页表、段表等
-
I/O状态信息:打开的文件列表、I/O设备分配等
-
CPU调度信息:优先级、调度队列指针等
-
账户信息:CPU使用时间、时间限制等




被折叠的 条评论
为什么被折叠?



