进程管理
1、进程
进程简单点来说就是正在运行的程序就算是一个进程,它是一个动态的运行的过程,没有运行的程序只能算是一段代码,不能称为进程。进程是计算机进行资源管理和调度的独立单位。
特征
有五大特征 结构性:进程由三部分组成,程序+数据+PCB(进程控制块) 动态性:进程可以看作是运行中的程序,所以其拥有生命周期,包括五个阶段创建、就绪、运行、阻塞、终止 并发性:在内存中多个进程可以并发的同时运行 独立性:进程是操作系统资源分配和调度的独立单位 异步性:在操作系统里运行的多个进程互不干扰,各自完成属于自己的任务
PCB
是操作系统中用来存储与进程相关的信息的数据结构。每个进程在系统中都对应一个PCB,操作系统通过PCB来管理进程的状态、资源以及其他相关信息。
主要包括:进程标识符PID、进程状态、CPU寄存器、内存管理信息、调度信息、I/O状态信息等
进程的状态
进程的状态对应其生命周期的五个阶段,创建、就绪、运行、阻塞、终止
创建:当用户启动一个程序或操作系统创建一个新的进程时,进程会进入创建阶段。在这一阶段,操作系统会为进程分配必要的资源(如内存、文件描述符、进程控制块(PCB)等),并初始化进程的数据结构。 就绪:进程已经被创建好,进入就绪队列等待被CPU调度时的状态。 运行:在就绪队列中的进程,被CPU所调度获得CPU资源,并执行对应程序。 阻塞:进程在运行过程中因某些原因(如等待 I/O 操作或某个事件发生)无法继续执行,进入阻塞状态。 终止:进程完成了所有任务,或被操作系统强制终止,预示进程的生命周期结束。
状态转换
创建态-->就绪态:当一个进程被创建时,它进入创建态。完成必要的资源分配和初始化后,进程准备好执行,并进入就绪队列,等待 CPU 调度。
就绪态-->运行态:在就绪态的进程等待 CPU 调度,当操作系统调度该进程并分配 CPU 时资源时,进程从就绪队列中被移除,进入运行态,开始执行。
运行态-->就绪态:当运行中的进程被操作系统抢占或时间片耗尽,导致它暂停执行时,进程会返回到就绪态,等待下一次调度。
运行态-->阻塞态:当进程在执行过程中需要等待某些资源或事件(如 I/O 操作完成、等待信号等)时,它会从运行态转入阻塞态。
阻塞态-->就绪态:当进程等待的事件或资源(如 I/O 操作完成、信号的到达等)变得可用时,进程会从阻塞队列移到就绪队列,准备重新获得 CPU 时间执行。
运行态-->终止态:当进程执行完成(正常结束或出现错误)时,它会进入终止态。操作系统回收该进程的所有资源,移除该进程的控制块(PCB)并清理所有分配给该进程的内存和其他资源。
2、线程
线程是操作系统中最小的执行单位,属于进程的一个组成部分。每个进程至少有一个线程,可以包含多个线程,这些线程共享进程的资源(如内存、文件描述符等),但每个线程有自己独立的执行路径、栈和寄存器。
由于进程是资源的拥有者,所以在创建、撤销、切换操作中需要较大的时空开销,限制了并发程度的进一步提高。为了减少进程切换的开销,把进程作为资源分配的单位和调度单位这两个属性分开来处理,即进程还是作为资源分配的基本单位,但是不作为调度的基本单位(减少调度或切换),把调度执行与切换的责任交给“"线程”来处理。
进程与线程的区别
进程 | 线程 | |
---|---|---|
组成 | 程序+数据+PCB | 函数+数据+TCB |
基本单位 | 资源分配和独立调度的单位 | 仅仅是独立调度的单位 |
并发性 | 多个进程可并发执行,并发度低 | 多个线程可并发执行,并发度高 |
共享资源 | 每个进程拥有自己的资源 | 线程共享其所在进程的资源 |
3、进程的调度算法
4、进程的同步机制
指在多进程或多线程环境下,确保多个进程或线程能够协调工作,避免冲突、资源竞争和数据不一致的问题。进程同步主要用于处理共享资源的访问,确保系统的正确性和一致性。
常见的同步机制:
1. 互斥锁
互斥锁(Mutual Exclusion)是用于保护共享资源的最基本同步机制。它确保同一时间只有一个进程能够访问共享资源。
工作原理:当一个进程需要访问共享资源时,它必须首先获得锁。如果锁已经被其他进程持有,那么当前进程就会被阻塞,直到锁被释放。
优点:能够确保共享资源不会被多个进程同时修改,防止数据不一致。 缺点:可能导致进程的阻塞或死锁。
2. 信号量机制
信号量是一个更为灵活的同步工具,通常用于限制对共享资源的访问数量。信号量维护一个计数器,当进程访问共享资源时,信号量的值会减少,释放时会增加。
工作原理:信号量有一个计数器,进程在进入临界区之前首先检查信号量的值,如果信号量大于 0,进程可以访问资源,并将信号量减 1;如果信号量为 0,则进程需要等待。资源释放后,信号量加 1。
3. 条件变量
条件变量用于在某些条件成立时进行进程的阻塞和唤醒,通常与互斥锁一起使用,帮助进程协调执行顺序。
工作原理:条件变量使得一个进程在等待某个条件时可以阻塞,并在条件满足时被其他进程唤醒。它通常与锁(例如互斥锁)一起使用,以确保在检查或修改条件时不会出现数据竞争。
4. 读写锁
读写锁允许多个进程/线程同时读取共享资源,但当一个进程/线程需要修改资源时,必须独占锁。它通常适用于读取操作远多于写入操作的情况,以提高效率。
工作原理:读写锁分为 读锁 和 写锁。多个进程/线程可以同时获得读锁,但只有一个进程/线程可以获得写锁,且获得写锁时,其他进程不能同时获得读锁或写锁。
5、进程间的通信方式
指不同进程之间为了交换数据或协调工作而采用的各种通信方式。由于进程之间的内存空间是独立的,不能直接访问彼此的内存,因此需要通过一定的通信机制来实现数据的交换。
常见的通信方式
1. 管道通信
所谓管道通信,实际上就像我们生活中的管道一样,一边水流进去,然后从一边流出来。管道是 Unix/Linux 系统提供的一种进程间通信方式,允许一个进程的输出直接传递给另一个进程的输入。但是这种通信方向是单向的,要想实现双向通信就需要再建立一个反向的管道。
2. 消息队列
消息队列是一种允许进程之间通过发送和接收消息来进行通信的机制。消息队列中的消息是按照先进先出(FIFO)顺序排列的。它支持多个进程异步地发送和接收消息。
Linux中消息队列通信的四个系统调用
msgget()函数:创建一个消息队列并返回消息队列标识符。
msgsnd()函数:向消息队列中发送数据。
msgrcv()函数:从消息队列中获取数据。
msgctl()函数:删除消息队列。
3. 共享内存
所谓共享内存也就是说两个进程可以直接共享访问同一块内存区域。这一块内存区域被映射到每一个进程地址空间 中,比如说A进程写了一个hello word,那么在B进程的地址空间也映射了这样一个区域,B进程有权限访问它,比如说B进程就可以读这个区域。共享内存是一种允许多个进程访问同一内存区域的通信方式。通过共享内存,进程可以直接读写共享区域中的数据,这种方式的效率非常高,因为不需要通过内核进行数据传输。
Linux中共享内存代码的四个重要系统调用
shmget()函数:调用此函数创建共享内存,获取内存ID。
shmat()函数:将共享内存映射到自己进程的逻辑地址上。
shmdt()函数:将共享内存从当前进程的逻辑地址中分离。
shmctl()函数:删除共享内存。
4. 信号
信号是操作系统提供的一种进程间通信机制,允许一个进程发送某种信号给另一个进程,以通知它发生了某种事件。信号的使用场景包括进程间的中断、异常通知等。
5. 套接字
套接字是网络通信中使用的一种通信方式,不仅可以用于不同计算机之间的通信,也可以用于同一台计算机的进程间通信。套接字可以基于 TCP/IP 协议,也可以基于 UNIX 域套接字进行通信。
标签:操作系统,管理,队列,调度,信号量,线程,进程 From: https://blog.csdn.net/weixin_73792626/article/details/145120252