2025/12/31 16:22:15
网站建设
项目流程
网站域名登录,做网站联系,建设信息门户网站的条件,飞凡 做电商网站一、进程基础定义
进程是程序的执行过程#xff0c;操作系统会为其分配内存、CPU 等系统资源。
1.1 进程控制块#xff08;PCB#xff09;
PCB#xff08;Process Control Block#xff09;是内核中的结构体#xff0c;用于存储进程的所有关键信息#xff0c;是操作系统…一、进程基础定义进程是程序的执行过程操作系统会为其分配内存、CPU 等系统资源。1.1 进程控制块PCBPCBProcess Control Block是内核中的结构体用于存储进程的所有关键信息是操作系统管理进程的核心数据结构1PID进程唯一标识符2当前工作路径可通过chdir修改3umask默认文件权限掩码如 00024进程打开的文件描述符列表关联文件 IO5信号相关配置处理异步事件6用户 ID、组 ID权限控制1.2 进程资源限制Linux 系统对进程资源有默认限制可通过ulimit修改最大打开文件数1024栈空间大小8M二、进程与程序的核心区别维度程序Program进程Process状态静态硬盘中代码 数据的集合动态程序的执行过程生命周期永久存在文件形式临时存在创建 → 调度 → 消亡状态变化无有运行 / 阻塞 / 就绪 等并发能力无支持并发执行资源占用不占用系统资源占用 CPU、内存、文件描述符等资源关联关系一个程序可运行为多个进程一个进程可加载运行一个程序同一程序可被多次加载注.c源文件→编译为a.out程序→运行a.out生成进程分配 PID三、进程的内存管理3.1 虚拟内存与 MMU隔离性多进程环境中进程 A 无法直接访问进程 B 的内存空间由 MMU内存管理单元实现地址映射安全性通过权限控制限制进程对内核空间的访问避免任意修改系统核心数据3.2 进程内存空间划分进程拥有独立的虚拟内存空间32 位系统默认 4G包括10~3GB用户空间代码段(.text)、数据段(.data/.bss)、堆(heap)、共享库区域、栈(stack)23~4GB内核空间存放内核核心代码、物理内存映射、进程内核态数据结构、硬件I/O映射及内核动态分配资源的共享区域四、进程分类4.1 交互式进程说明依赖用户输入触发执行如终端命令行、图形界面应用vim、chrome特点响应性优先需快速处理用户操作4.2 批处理进程说明无需用户交互批量执行预设任务如 Shell 脚本、定时任务crontab特点吞吐量优先后台静默运行4.3 守护进程Daemon说明系统启动后自动运行长期驻留后台等待特定条件触发如定时更新、网络请求监听示例sshdSSH 服务、crond定时任务守护进程、杀毒软件后台进程特点独立于终端父进程通常为initPID1五、进程的核心作用并发宏观并行一个时间段内多个进程看似同时运行如同时打开浏览器、编辑器微观串行任意时刻 CPU 仅能执行一个进程单核通过进程切换实现 “并发”六、进程状态与调度6.1 Linux 进程状态运行态R正在执行或等待 CPU阻塞态S/D等待资源如 IO、信号暂停态T被信号暂停如SIGSTOP僵尸态Z进程终止但 PCB 未被回收死亡态X进程完全销毁不可见6.2 进程调度算法操作系统通过调度算法决定 CPU 分配策略1时间片轮转每个进程分配固定时间片轮流执行2短任务优先优先执行运行时间短的进程3进程优先级Linux 通过nice值-20~19设置优先级值越低优先级越高4完全公平调度CFSLinux 默认调度算法按进程 CPU 使用比例分配时间6.3 进程上下文切换当进程时间片耗尽或被抢占时操作系统需保存当前进程的上下文PCB、寄存器、内存映射等加载下一个进程的上下文实现进程切换。1保存将进程状态写入 PCB缓存到内存非硬盘2恢复从 PCB 加载进程状态恢复执行七、进程相关命令命令功能描述示例ps aux查看所有进程的详细信息ps aux | grep sshdtop实时监控进程资源占用直接执行topkill向进程发送信号kill -9 1234强制终止 PID1234 的进程killall按进程名终止进程killall -9 a.outulimit -a查看进程资源限制直接执行ulimit -a说明1kill -9 是 SIGKILL不可被捕获慎用2正常结束进程推荐kill PID默认 SIGTERM3ps aux 中的 a u x 是固定组合不要漏写八、进程编程核心函数C 语言8.1 进程创建fork()#includeunistd.hpid_tfork(void);功能从当前进程父进程克隆一个子进程特性1一次调用两次返回父进程返回子进程 PID子进程返回 02父子进程执行顺序不确定由调度器决定3子进程复制父进程的 0~3G 用户空间及 PCBPID 不同4Linux 2.6 采用写时复制COW 初始共享父进程内存仅当修改时才分配独立空间5失败返回 - 1如进程数达到上限8.2 获取进程 IDgetpid()/getppid()#includeunistd.hpid_tgetpid(void);// 获取当前进程PIDpid_tgetppid(void);// 获取父进程PID8.3 进程终止1正常终止①main函数return仅适用于主线程返回值为进程退出状态②exit(int status)C 库函数执行清理工作刷新缓冲区、关闭文件流、调用atexit注册的退出函数status退出状态0 表示成功非 0 表示失败可通过EXIT_SUCCESS/EXIT_FAILURE宏③_exit(int status)/_Exit(int status)系统调用直接终止进程不执行缓冲区刷新和清理函数2异常终止①abort()触发SIGABRT信号强制终止②外部信号如kill -9发送SIGKILL③线程相关主线程退出、pthread_exit主线程、pthread_cancel最后一个线程8.4 进程回收wait()/waitpid()1wait()阻塞回收#includesys/wait.hpid_twait(int*status);功能阻塞等待任意子进程退出并回收该进程的状态仅父进程可回收子进程参数status存储子进程退出状态NULL 表示不关心若需获取退出状态需结合宏解析返回值成功返回被回收的子进程 PID 失败返回 - 1状态解析宏宏功能WIFEXITED(status)判断子进程是否正常结束通过return或exitWEXITSTATUS(status)获取子进程正常结束时的退出码WIFSIGNALED(status)判断子进程是否被信号终止WTERMSIG(status)获取终止子进程的信号编号示例if(WIFEXITED(status)){printf(exit code %d\n,WEXITSTATUS(status));}elseif(WIFSIGNALED(status)){printf(killed by signal %d\n,WTERMSIG(status));}2waitpid()支持阻塞 / 非阻塞回收#includesys/wait.hpid_twaitpid(pid_tpid,int*status,intoptions);功能指定回收某个 / 所有子进程支持阻塞 / 非阻塞模式等价关系waitpid(-1, status, 0) wait(status)参数①pid指定回收的子进程-1 表示所有子进程0 表示指定 PID 的子进程②status子进程退出状态NULL 表示不关心③options0阻塞模式等待子进程退出后回收 WNOHANG非阻塞模式立即返回不等待返回值①成功返回被回收的子进程 PID②0非阻塞模式下无子进程退出需后续重试③-1调用失败如无可用子进程非阻塞回收示例需在外层套死循环轮询检测子进程是否退出8.5 进程程序替换exec 族函数1核心功能执行系统中任意可执行文件常与fork()搭配使用子进程中执行exec从内存角度执行exec的进程代码段会被新程序替换新程序执行结束则整个进程终止。2函数命名规则llist参数以列表形式逐个传入以 NULL 结尾vvector参数存储在字符串数组中数组最后一个元素为 NULLpPATH仅需传入文件名系统自动从环境变量PATH中查找程序路径3常用 exec 函数函数原型说明int execl(const char *path, const char *arg, ...);path程序完整路径 文件名arg参数列表以NULL结尾int execlp(const char *file, const char *arg, ...);file程序文件名依赖PATH环境变量查找arg参数列表以NULL结尾int execv(const char *path, char *const argv[]);path程序完整路径 文件名argv参数数组以NULL结尾int execvp(const char *file, char *const argv[]);file程序文件名依赖PATH环境变量查找argv参数数组以NULL结尾通用规则若需调用自定义可执行程序无论使用哪个exec函数第一个参数按 “完整路径 文件名” 填写均可成功调用。8.6 系统命令执行system ()#includestdlib.hintsystem(constchar*command);功能执行指定 Shell 命令内部通过forkexec实现注意事项不能执行修改父进程状态的命令适合执行信息输出、文件操作类命令参数command待执行的 Shell 命令如ls -l返回值-1 表示调用失败8.7 工作路径操作函数1获取当前工作路径getcwd ()#includeunistd.hchar*getcwd(char*buf,size_tsize);参数buf存储路径的字符数组size字符数组的最大长度返回值成功指向buf的指针失败NULL2修改当前工作路径chdir ()#includeunistd.hintchdir(constchar*path);参数path目标路径绝对 / 相对路径均可返回值-1 表示调用失败…九、特殊进程9.1 僵尸进程产生原因子进程终止后父进程未调用wait()/waitpid()回收其 PCB危害长期占用内核 PCB 资源导致内核内存不足解决父进程及时回收子进程父进程退出后子进程由init进程接管并回收9.2 孤儿进程产生原因父进程先于子进程终止子进程成为 “孤儿”处理子进程被init进程PID1收养由init负责回收其资源特点无危害无需特殊处理