1. 什么是进程?
进程是程序执行的过程,涵盖创建、调度和消亡阶段,是活的。
而程序是一段数据的集合,是死的。
进程还是操作系统资源分配的最小单元,拥有独立的虚拟地址空间,包括文本段、数据段、系统数据段等区域,用于存储代码、数据等不同类型信息。
2. 进程空间如何划分?每个区域的特点?每个区域存放哪些数据?
32 位操作系统中,进程有 0 - 4G 虚拟内存空间,包含内核、栈区、系统数据段、堆区、数据段、未初始化数据段(.bss)、字符串常量区(.rodata)、文本段。
文本段:存储代码和指令;
数据段:存放全局变量、静态变量、字符串常量,编译时分配空间,程序结束回收;
系统数据段:栈区由操作系统管理,存放局部变量,变量定义时分配空间,作用域结束回收,未初始化值为随机值;堆区由程序员管理,通过 malloc 申请、free 释放;
内核:操作系统核心区域,用户无法访问,负责多种系统管理任务。
3. 常见的进程调度算法有哪些?
常见的进程调度算法有:
先来先执行(先到的任务先执行)
高优先级调度算法(优先执行优先级高的任务)
时间片轮转调度算法(CPU 按固定时间片在进程间切换执行)
多级队列反馈(根据进程特性划分队列,不同队列有不同调度策略)
负载均衡调度算法(将任务均衡分配到多个处理器上执行)
4. 进程状态分为哪几种类型?
进程状态分为:
就绪态(正在运行的任务,未占用 CPU)
运行态(正在运行且占用 CPU)
可唤醒等待态(进程挂起,等待资源到达后继续执行)
不可唤醒等待态(进程挂起,等待特定信号继续执行)
暂停态(进程挂起,等待 CPU 指令继续执行)
僵尸态(代码执行完毕,但空间仍存在)
结束态(代码执行完毕,空间被回收)
5. 进程相关的命令有哪些?
进程相关命令有:
top:按 CPU 占用率查看当前所有进程任务
ps -ef:查看所有进程,可与 grep 组合查找特定进程
ps -aux:查看进程状态
pstree:查看所有进程的关系
kill:通过 PID 或进程名终止进程
在命令后加 &:在后台执行程序。
6. 如何创建进程?fork 和 vfork 有什么区别?
通过 fork 函数创建进程,fork 函数调用后会创建一个子进程,父进程和子进程从 fork 函数调用处开始并发执行。
fork 和 vfork 的区别在于:
fork 创建的子进程拥有独立的地址空间,父子进程的地址空间相互独立
vfork 创建的子进程共享父进程的地址空间,子进程执行期间父进程被阻塞,直到子进程调用 exit 或 exec 系列函数,并且 vfork 保证子进程先运行。
7. 什么是僵尸进程?如何产生?如何避免?
僵尸进程是进程执行结束后,空间没有被回收的进程。
产生原因是子进程结束时,父进程未回收其空间。
避免方法有两种:
一是让父进程先结束,子进程成为孤儿进程被 init 进程收养,子进程结束时 init 进程回收其空间;二是子进程结束时,父进程使用 wait 或 waitpid 函数回收子进程空间。