news 2026/4/16 11:01:52

【操作系统】第二章进程的描述与控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【操作系统】第二章进程的描述与控制

1. 什么是进程?比较进程与程序

进程:是正在运行的程序的实例,是操作系统进行资源分配和调度的基本单位,包含代码、数据、PCB(进程控制块)等。

进程 vs 程序

程序是静态的(存储在磁盘的指令集合),进程是动态的(有生命周期:创建、运行、结束);

程序不占用系统资源,进程占用 CPU、内存等资源;

一个程序可对应多个进程(如打开多个 “记事本” 程序)。

2. 为什么要引入进程这一概念?进程存在的标志是什么?

引入原因

程序是静态的,无法描述 “并发执行” 的动态行为(如多个程序同时运行时的资源竞争、状态变化),

进程能刻画程序的动态执行过程,实现资源分配与调度。

存在标志进程控制块(PCB)(操作系统通过 PCB 识别和管理进程)。

3. 什么是进程控制块?举例说明操作系统是如何利用进程控制块中的信息来管理进程的?

进程控制块(PCB):是操作系统管理进程的核心数据结构,存储进程的状态、PID、程序计数器、寄存器、资源占用等信息。

管理举例

调度进程时,通过 PCB 中的 “优先级” 决定下一个运行的进程;

进程阻塞时,通过 PCB 中的 “状态” 将其移入阻塞队列;

进程切换时,通过 PCB 保存 / 恢复寄存器、程序计数器等上下文信息。

4. 什么是操作系统内核?操作系统内核主要完成什么功能?

操作系统内核:是操作系统的核心部分,运行在特权态,直接控制硬件并提供基础服务。

核心功能

进程管理(调度、同步互斥)、

内存管理(分配 / 回收)、

设备管理(驱动、I/O 控制)、

中断处理。

5. 操作系统在什么时候创建进程?操作系统如何创建一个进程?

创建时机:用户执行程序(如双击 exe)、系统启动服务(如开机启动进程)、进程主动创建子进程(如fork())。

创建过程

  1. 分配唯一 PID;
  2. 创建 PCB 并初始化(状态设为 “就绪”);
  3. 分配内存(加载程序代码、数据);
  4. 将进程加入就绪队列。

6. 什么是进程的阻塞、唤醒、挂起?

阻塞:进程因等待资源(如 I/O 完成、锁)而暂停执行,状态转为 “阻塞态”,移出运行队列。

唤醒:进程等待的资源就绪后,由操作系统将其状态转为 “就绪态”,加入就绪队列。

挂起:进程被暂时调出内存(如内存不足),状态转为 “挂起态”,数据暂存磁盘;后续可被唤醒并调回内存。

7. 举例说明时钟对于计算机系统的重要性

时钟是系统的 “时间基准”,例如:

进程调度:按时间片切换进程,依赖时钟中断;

定时任务:如 “30 分钟后自动关机”,依赖时钟计时;

时间戳:文件修改时间、日志时间等,由时钟提供。

8. 时钟中断信号是如何产生的?时钟中断处理程序的功能是什么?

产生方式:硬件时钟(如晶体振荡器)按固定频率(如 100Hz)产生脉冲,触发时钟中断。

处理程序功能

更新系统时间;

递减进程时间片,时间片用完则触发进程调度;

处理定时任务(如超时检测)。

9. 什么是进程的就绪态、阻塞态、执行态?在什么情况下发生三种状态的转换?

就绪态:进程已准备好,等待 CPU 调度;

阻塞态:进程等待资源,无法执行;

执行态:进程正在 CPU 上运行。

状态转换

  1. 就绪→执行:进程被调度器选中;
  2. 执行→就绪:时间片用完,或高优先级进程进入就绪队列;
  3. 执行→阻塞:进程请求 I/O、等待锁等资源;
  4. 阻塞→就绪:进程等待的资源就绪(如 I/O 完成)。

10. 说明进程的阻塞和唤醒的过程

阻塞过程

进程请求资源,自身状态改为 “阻塞”;

操作系统将其 PCB 移入阻塞队列;

调度其他就绪进程执行。

唤醒过程

资源就绪(如 I/O 完成),操作系统找到对应的阻塞进程;

将其状态改为 “就绪”,PCB 移入就绪队列;

等待调度器选中执行。

11. 什么是用户空间?什么是系统空间?什么是系统态?什么是用户态?

用户空间:用户进程运行的内存区域,权限低,不能直接访问硬件。

系统空间:内核运行的内存区域,权限高,可直接访问硬件。

系统态(内核态):CPU 的特权模式,运行内核代码,可执行所有指令。

用户态:CPU 的非特权模式,运行用户程序,只能执行受限指令。

12. 举例说明系统调用的执行过程。系统调用和普通函数有什么区别?

系统调用执行过程(以open()为例)

1.用户程序调用open(),触发软中断(陷入内核);

2.CPU 切换到系统态,保存用户态上下文;

3.内核执行open()对应的系统调用处理函数;

4.处理完成后,恢复用户态上下文,返回用户程序。

系统调用 vs 普通函数

普通函数:在用户态执行,不切换特权级;

系统调用:会切换到系统态,由内核执行,可访问硬件资源。

13. 什么是线程?为什么引入线程?

线程:是进程内的执行单元,共享进程的资源(内存、文件句柄等),是 CPU 调度的基本单位。

引入原因

进程切换开销大(需切换地址空间),

线程切换开销小(共享资源),更适合并发场景(如多任务的程序)。

14. 什么是用户级线程?什么是内核级线程?试对两者进行比较

用户级线程:由用户库(如 pthread)管理,内核无感知;

内核级线程:由操作系统内核管理,内核直接调度。

比较

维度用户级线程内核级线程
调度单位进程(内核看不到线程)线程
切换开销小(用户态切换)大(内核态切换)
并发性同一进程内线程不能并行(单 CPU)可并行(多 CPU)
依赖内核不依赖依赖

15. 线程与进程有什么区别和联系?

联系:线程是进程的一部分,共享进程的资源(内存、文件等);一个进程至少有一个线程。

区别

资源分配:进程是资源分配单位,线程不独立分配资源;

调度:线程是 CPU 调度单位,进程是资源隔离单位;

开销:线程切换开销远小于进程。

16. 分别说明用户级线程与内核级线程的阻塞和唤醒过程

用户级线程(阻塞):线程阻塞时,整个进程会被内核阻塞(因为内核看不到线程),需用户库调度进程内其他线程。

用户级线程(唤醒):由用户库将阻塞线程标记为就绪,等待库调度执行。

内核级线程(阻塞):线程阻塞时,内核将其状态改为阻塞,调度其他线程(同进程或其他进程)执行。

内核级线程(唤醒):内核将阻塞线程改为就绪,加入就绪队列,等待 CPU 调度。

17. 说明操作系统的引导过程

操作系统引导(开机启动)过程:

加电自检(POST):检查硬件(CPU、内存、磁盘)是否正常;

加载 BIOS:运行 BIOS 程序,找到启动设备(如硬盘);

加载引导程序(MBR):从启动设备读取 MBR(主引导记录),执行引导程序;

加载内核:引导程序加载操作系统内核到内存;

初始化系统:内核初始化硬件、启动服务,进入用户界面。

18. 用 C 语言实现一个多线程程序(以 Linux 下 pthread 为例)

c

运行

#include <stdio.h> #include <pthread.h> #include <unistd.h> // 线程函数:打印线程ID和计数 void *thread_func(void *arg) { int thread_num = *(int*)arg; for (int i = 0; i < 3; i++) { printf("线程 %d:计数 %d\n", thread_num, i); sleep(1); // 休眠1秒 } pthread_exit(NULL); // 退出线程 } int main() { pthread_t tid1, tid2; int num1 = 1, num2 = 2; // 创建线程1 if (pthread_create(&tid1, NULL, thread_func, &num1) != 0) { perror("创建线程1失败"); return 1; } // 创建线程2 if (pthread_create(&tid2, NULL, thread_func, &num2) != 0) { perror("创建线程2失败"); return 1; } // 等待线程结束 pthread_join(tid1, NULL); pthread_join(tid2, NULL); printf("所有线程执行完成\n"); return 0; }

编译运行(需链接 pthread 库):gcc thread_demo.c -o thread_demo -pthread

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 19:20:19

终极指南:uniapp时间选择器完整使用教程

终极指南&#xff1a;uniapp时间选择器完整使用教程 【免费下载链接】uniapp-datetime-picker 项目地址: https://gitcode.com/gh_mirrors/un/uniapp-datetime-picker 在移动应用开发中&#xff0c;时间选择功能是用户交互的重要组成部分。无论是预约系统、日程管理还是…

作者头像 李华
网站建设 2026/4/12 22:02:01

9、系统设计中的架构平衡与错误检测处理

系统设计中的架构平衡与错误检测处理 1. 架构平衡概述 在系统设计中,架构平衡是至关重要的。许多系统特性相互制约,架构师需要在满足一个特性的同时,可能会牺牲另一个特性,因此需要有意识地进行权衡,并记录决策的依据。以下是几种常见的架构平衡关系。 2. 可用性与可靠…

作者头像 李华
网站建设 2026/4/3 3:19:58

如何快速配置YimMenu:GTA V游戏防护的完整指南

如何快速配置YimMenu&#xff1a;GTA V游戏防护的完整指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …

作者头像 李华
网站建设 2026/4/8 15:24:26

网盘直链解析工具文章创作指南

网盘直链解析工具文章创作指南 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xff0c;无需输入“暗号”即可使用&a…

作者头像 李华
网站建设 2026/4/15 18:26:33

19、形式化设计验证与编码准则

形式化设计验证与编码准则 1. Spin 工具概述 Spin 工具可用于检查系统的性质。当运行带有额外 Promela 代码的 Spin 检查器时,能得到相应结果。使用特定术语来说,某些线性时态逻辑(LTL)可用于检查“安全”属性,同时也能生成用于检查“活性”属性的 Promela 代码。例如,…

作者头像 李华
网站建设 2026/4/15 12:35:42

21、安全关键系统的代码覆盖与静态分析

安全关键系统的代码覆盖与静态分析 代码覆盖指标 代码覆盖测量的挑战 在安全关键系统的嵌入式软件开发中,代码覆盖的测量存在诸多困难。一方面,语句和分支覆盖难以准确衡量。例如,一组测试可能在C源程序中实现了100%的分支覆盖,但在生成的汇编代码中,分支覆盖可能仅为40…

作者头像 李华