【初探操作系统】进程管理
理解Linux进程
进程概念
我对于程序已经有了一定程度的认知——一段指令集合。那么进程又是什么,进程不应该就是一种程序吗?一个经典的例子,把程序比喻成菜谱,记录了做一道菜的过程,那么进程就是动手做出一道菜的过程。可以说,进程就是执行的程序,程序的一次执行。
程序是静态的,进程是动态的实体
进程是操作系统进行资源分配和调度的基本单位。每个进程都有独立的内存空间、文件描述符、环境变量等资源,进程之间相互隔离,互不干扰。
进程具有并发性,也就是说,程序的执行并不一定是顺序的,是并发的,并发能够极大提高了程序的执行效率和资源利用率,于是引入线程的概念。
线程(Thread) 是进程中的一个执行单元,是CPU调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和资源,但每个线程有自己的栈和程序计数器。
多线程编程可以提高程序的并发性和响应性,但也需要注意线程安全问题(如竞态条件、死锁等)。
进程状态
创建(New):进程正在被创建。
就绪(Ready):进程已准备好运行,等待CPU分配时间片。
运行(Running):进程正在CPU上执行。
阻塞(Blocked):进程等待某些事件(如I/O操作完成)而暂停执行。
终止(Terminated):进程执行完毕或被强制终止。
以上的进程分类是广义上的,对于特定的操作系统可能有更细化特殊的状态分类。
拓展:Linux进程状态
R (Running / Runnable):进程正在运行或准备运行(在运行队列中等待CPU时间)。 |
进程分类
功能与服务:用户进程与系统进程
应用程序的服务类型:交互进程、批处理进程、守护进程
- 按功能与服务分类
(1)用户进程(User Process)
- 定义:由用户启动的进程,通常运行在用户空间。
- 特点:
- 执行用户编写的应用程序(如浏览器、文本编辑器、游戏等)。
- 权限受限,不能直接访问硬件或内核资源。
- 依赖于操作系统提供的系统调用(System Call)来访问底层资源。
- 示例:
- 用户打开的Chrome浏览器进程。
- 用户运行的Python脚本进程。
(2)系统进程(System Process)
- 定义:由操作系统内核启动和管理的进程,通常运行在内核空间。
- 特点:
- 负责管理硬件资源、内存、文件系统等。
- 具有较高的权限,可以直接访问硬件和内核资源。
- 通常是操作系统的核心组件。
- 示例:
- 内存管理进程。
- 文件系统管理进程。
- 调度器进程。
- 按应用程序的服务类型分类
(1)交互进程(Interactive Process)
- 定义:与用户直接交互的进程,通常需要用户输入并实时响应。
- 特点:
- 依赖于用户的输入(如键盘、鼠标)。
- 需要快速响应,对延迟敏感。
- 通常运行在前台。
- 示例:
- 文本编辑器(如Vim、Notepad)。
- 图形界面应用程序(如浏览器、游戏)。
(2)批处理进程(Batch Process)
- 定义:不需要用户交互,按预定义的任务列表自动执行的进程。
- 特点:
- 通常用于处理大量数据或执行重复性任务。
- 对实时性要求较低,注重吞吐量。
- 可以在后台运行。
- 示例:
- 数据备份任务。
- 日志分析任务。
- 编译大型项目。
(3)守护进程(Daemon Process)
- 定义:在后台运行的系统服务进程,通常没有用户界面。
- 特点:
- 在系统启动时自动运行,持续提供服务。
- 不依赖于用户交互。
- 通常以低优先级运行,避免影响系统性能。
- 示例:
- Web服务器(如Apache、Nginx)。
- 数据库服务(如MySQL、PostgreSQL)。
- 系统日志服务(如syslogd)。
- 其他分类方式
除了上述分类方式,进程还可以根据其他标准进行分类:
(1)按优先级分类
- 实时进程(Real-Time Process):对响应时间要求极高的进程(如音视频处理)。
- 普通进程(Normal Process):对响应时间要求较低的进程(如批处理任务)。
(2)按资源占用分类
- CPU密集型进程:主要消耗CPU资源(如科学计算)。
- I/O密集型进程:主要消耗I/O资源(如文件读写、网络通信)。
(3)按父子关系分类
- 父进程(Parent Process):创建其他进程的进程。
- 子进程(Child Process):由父进程创建的进程。
分类方式 | 类型 | 特点 | 示例 |
---|---|---|---|
功能与服务 | 用户进程 | 由用户启动,运行在用户空间,权限受限 | Chrome浏览器、文本编辑器 |
系统进程 | 由操作系统启动,运行在内核空间,权限较高 | 内存管理、文件系统管理 | |
服务类型 | 交互进程 | 与用户直接交互,对实时性要求高 | 文本编辑器、图形界面应用程序 |
批处理进程 | 自动执行任务,注重吞吐量,无需用户交互 | 数据备份、日志分析 | |
守护进程 | 后台运行,提供系统服务,无用户界面 | Web服务器、数据库服务 |
进程衍生
由进程产生进程,进程之间是有家族关系的
关键词:父子进程,僵尸进程,孤儿进程,进程0,进程1
父进程产生子进程,通过fork()
创建,子进程是父进程的副本
僵尸进程是系统资源已被回收但还未被父进程回收的进程,不占用系统资源但还有PID,占用进程表
孤儿进程是父进程不正常结束而导致没有父进程的进程,会被init进程收容接管
进程0,内核启动的第一个进程,是计算机启动时引导程序创建的最原始系统进程,负责初始化系统,进程0会产生进程1
进程1,init进程,用户空间的第一个进程,是始祖进程,产生其他所有进程,是所有进程的始祖,负责系统初始化和进程管理
进程管理
进程组(Process Group)和会话(Session)
- 进程组(Process Group)
- 定义:
- 进程组是一个或多个进程的集合,这些进程通常是由同一个父进程创建的,并且共享同一个进程组ID(PGID)。
- 进程组ID通常等于该组中第一个进程(组长进程)的进程ID(PID)。
- 作用:
- 用于作业控制(Job Control),例如将一组进程作为一个整体进行管理(如暂停、恢复、终止)。
- 方便向一组进程发送信号(如
SIGKILL
、SIGSTOP
)。
- 特点:
- 每个进程都属于一个进程组。
- 进程组可以包含多个进程,但只能有一个组长进程。
- 进程组的存在与终端会话无关。
- 会话(Session)
- 定义:
- 会话是一个或多个进程组的集合,通常与一个终端(Terminal)相关联。
- 每个会话有一个唯一的会话ID(SID),通常等于会话首进程(Session Leader)的进程ID(PID)。
- 作用:
- 用于管理终端会话,例如用户登录后启动的所有进程都属于同一个会话。
- 控制终端的输入输出(如键盘输入、屏幕输出)。
- 特点:
- 每个会话可以有一个控制终端(Controlling Terminal)。
- 会话中的进程组分为前台进程组(Foreground Process Group)和后台进程组(Background Process Group)。
- 前台进程组可以接收终端的输入和信号(如
SIGINT
),而后台进程组不能。
关键概念
- 进程组与会话的关系
- 一个会话可以包含多个进程组,但只能有一个前台进程组。
- 进程组可以属于某个会话,但不能跨会话。
- 前台进程组与后台进程组
- 前台进程组:
- 与终端交互的进程组。
- 可以接收终端的输入(如键盘输入)和信号(如
SIGINT
)。
- 后台进程组:
- 不与终端直接交互的进程组。
- 不能接收终端的输入,但可以接收信号。
- 会话首进程(Session Leader)
- 创建会话的进程称为会话首进程。
- 会话首进程的PID通常等于会话ID(SID)。
- 控制终端(Controlling Terminal)
- 会话可以与一个终端关联,称为控制终端。
- 控制终端用于处理输入输出和信号。
进程查看
jobs #查看当前Shell会话的后台进程组 |