画册设计理念和设计思路乐陵seo优化信德
画册设计理念和设计思路,乐陵seo优化信德,网站推广一般怎么做,知名网站建设官网深入理解Linux进程概念#xff1a;从理论到实践 #x1f3ac; Doro在努力#xff1a;个人主页#x1f525; 个人专栏: 《MySQL数据库基础语法》《数据结构》⛺️严于律己#xff0c;宽以待人 文章目录深入理解Linux进程概念#xff1a;从理论到实践前言一、从冯诺依曼体系…深入理解Linux进程概念从理论到实践 Doro在努力个人主页 个人专栏: 《MySQL数据库基础语法》《数据结构》⛺️严于律己宽以待人文章目录深入理解Linux进程概念从理论到实践前言一、从冯诺依曼体系说起二、操作系统与管理的艺术2.1 操作系统的核心定位2.2 先描述再组织的管理哲学三、进程的本质是什么3.1 课本概念的局限性3.2 进程的准确定义3.3 为什么要引入进程概念四、深入理解PCBtask_struct4.1 PCB是什么4.2 PCB中的核心属性4.2.1 标识符PID4.2.2 进程状态4.2.3 优先级4.2.4 程序计数器4.2.5 内存指针4.2.6 上下文数据4.2.7 I/O状态信息4.2.8 记账信息五、操作系统如何管理进程5.1 从描述到组织5.2 进程管理的本质六、如何查看系统中的进程6.1 使用 /proc 文件系统6.2 使用 ps 命令6.3 使用 top 命令七、进程的父子关系7.1 PPID与父子进程7.2 命令行启动的进程7.3 使用 fork 创建子进程八、当前工作目录CWD8.1 什么是当前工作目录8.2 查看和修改CWD8.3 CWD的实际意义九、总结与思考9.1 核心概念回顾9.2 深入思考9.3 学习建议前言各位同学大家好今天我们来聊一聊操作系统中最核心的概念之一——进程。作为Linux系统编程的入门课程理解进程概念对于我们后续学习进程调度、进程通信、多线程编程等高级话题至关重要。很多同学在学习操作系统时对进程的理解往往停留在运行中的程序这样一个模糊的定义上。但实际上进程这个概念背后蕴含着操作系统设计的核心思想。今天我将带大家从是什么、为什么、怎么办三个维度深入剖析进程的本质。一、从冯诺依曼体系说起在正式介绍进程之前我们有必要回顾一下计算机的基本工作原理。我们日常使用的计算机无论是笔记本还是服务器基本上都遵循冯诺依曼体系结构。这个体系结构将计算机划分为几个核心组成部分输入单元键盘、鼠标、扫描仪等设备负责接收外部数据中央处理器CPU包含运算器和控制器是计算机的大脑存储器也就是内存用于临时存储数据和程序输出单元显示器、打印机等负责将处理结果呈现给用户这里有一个非常重要的原则需要大家牢记在冯诺依曼体系中CPU只能直接访问内存不能直接访问外设而外设要进行数据交换也只能通过内存进行。换句话说所有设备都只能直接和内存打交道。这个设计决定了我们程序运行的基本方式程序必须先加载到内存中CPU才能执行它。而这个加载到内存并运行的程序就是我们今天要讨论的主角——进程。二、操作系统与管理的艺术2.1 操作系统的核心定位操作系统是一款纯粹的搞管理的软件。它对下管理着计算机的所有硬件资源对上为应用程序提供良好的运行环境。没有操作系统我们就无法使用现代计算机。那么操作系统是如何进行管理的呢这里就涉及到一个核心思想——先描述再组织。2.2 先描述再组织的管理哲学这个世界上对任何事物的管理本质上都是对信息的处理。举个例子你的父母管理你并不是直接针对你这个人而是基于他们采集到的关于你的信息——你是不是饿了、是不是冷了、学习成绩怎么样——然后做出相应的决策。计算机管理也是如此。操作系统要管理进程首先要把进程的各种属性描述出来然后用某种数据结构把这些描述信息组织起来。这样对进程的管理就转化成了对数据结构的增删查改操作。在C语言中我们用结构体来描述对象的属性而在操作系统内核中描述进程的结构体叫做PCBProcess Control Block进程控制块。三、进程的本质是什么3.1 课本概念的局限性很多操作系统教材会给出一个简单的定义“进程是程序的一个执行实例”或者进程是加载到内存中的程序。这些定义虽然没错但过于表面没有触及进程的本质。让我用一个类比来说明这个问题假设你考上了大学你人到了学校但学校并不认识你因为你没有在学校的学籍管理系统中注册。按照人在学校就是学生的逻辑任何跑到学校的人都可以自称学生这显然是不对的。真正决定你是哪个学校学生的不是你的肉身而是你在学籍管理系统中的档案信息。进程也是如此。程序加载到内存只是第一步操作系统还必须在内核中创建一个描述这个程序的数据结构这个程序才能成为一个真正的进程。3.2 进程的准确定义基于上面的分析我们可以给出一个更加准确的定义进程 内核数据结构PCB 程序的代码和数据在Linux系统中描述进程的内核数据结构叫做task_struct。每一个进程都有一个对应的task_struct对象其中包含了描述该进程的所有属性信息。3.3 为什么要引入进程概念可能有同学会问为什么操作系统不直接运行程序非要搞个进程的概念出来答案很简单进程代表的是用户的意志。当你想听音乐时你打开了网易云音乐当你想写代码时你打开了VS Code。这些软件在操作系统看来都是用户想要完成某项任务的请求。操作系统通过创建进程来响应用户的请求让CPU调度执行相应的程序从而满足用户的需求。如果没有进程这个概念操作系统就无法区分不同用户的不同请求也无法合理地分配CPU资源。可以说进程是用户与操作系统之间的桥梁。四、深入理解PCBtask_struct4.1 PCB是什么PCBProcess Control Block进程控制块是操作系统中用于描述进程属性的数据结构。在Linux内核中PCB的具体实现是task_struct结构体。这个结构体非常庞大包含了进程运行所需的所有信息。我们可以打开Linux内核源码以早期版本为例看到task_struct的定义structtask_struct{// 进程状态volatilelongstate;// 进程标识符pid_tpid;pid_ttgid;// 进程优先级intprio,static_prio,normal_prio;unsignedintrt_priority;// 进程关系structtask_struct*real_parent;structtask_struct*parent;structlist_headchildren;structlist_headsibling;// 内存管理structmm_struct*mm;structmm_struct*active_mm;// 文件系统structfs_struct*fs;structfiles_struct*files;// 信号处理structsignal_struct*signal;structsighand_struct*sighand;// 时间统计cputime_tutime,stime;// ... 还有很多其他字段};4.2 PCB中的核心属性虽然task_struct包含的字段非常多但作为初学者我们需要重点关注以下几类属性4.2.1 标识符PID每个进程都有一个唯一的标识符称为PIDProcess ID。就像每个学生都有学号一样PID是操作系统区分不同进程的依据。在Linux中我们可以通过getpid()系统调用来获取当前进程的PID#includestdio.h#includeunistd.hintmain(){pid_tpidgetpid();printf(当前进程的PID是: %d\n,pid);return0;}4.2.2 进程状态进程在生命周期中会经历不同的状态比如运行态、就绪态、阻塞态等。PCB中的state字段记录了进程当前的状态操作系统根据这个状态来决定如何调度进程。4.2.3 优先级在多任务系统中多个进程会竞争CPU资源。优先级决定了进程被调度的先后顺序。PCB中的优先级字段让操作系统能够实现更加合理的调度策略。4.2.4 程序计数器程序计数器记录了进程下一条要执行的指令的地址。这个字段对于进程切换至关重要——当进程被暂停执行时程序计数器的值会被保存当进程恢复执行时操作系统会从这个地址继续执行。4.2.5 内存指针内存指针指向进程代码和数据在内存中的位置。通过内存指针操作系统可以找到进程的实际执行内容。4.2.6 上下文数据当进程被切换出去时CPU中的寄存器值等临时数据需要被保存下来以便进程下次恢复时能够继续正确执行。这些保存的数据称为上下文数据。4.2.7 I/O状态信息进程可能打开了一些文件或设备I/O状态信息记录了这些资源的占用情况。4.2.8 记账信息记账信息记录了进程使用CPU的时间、创建时间等统计信息用于系统监控和资源管理。五、操作系统如何管理进程5.1 从描述到组织我们说过操作系统管理进程的核心思想是先描述再组织。现在我们已经知道了PCB是如何描述进程的那么操作系统是如何组织这些PCB的呢答案是链表。在Linux内核中所有的task_struct对象被组织成一个双链表。每个PCB节点都包含前驱指针和后继指针将它们连接在一起。5.2 进程管理的本质既然所有进程的PCB都被组织在链表中那么对进程的管理就转化成了对链表的操作创建进程在链表中插入一个新的PCB节点终止进程从链表中删除对应的PCB节点并释放资源查找进程遍历链表根据PID等属性找到目标进程调度进程从链表中选择一个合适的进程将CPU分配给它执行这种设计的精妙之处在于操作系统对进程的所有操作都不需要直接操作进程的代码和数据只需要操作PCB即可。PCB中的内存指针字段可以帮助操作系统在需要时找到进程的代码和数据。六、如何查看系统中的进程6.1 使用 /proc 文件系统Linux系统提供了一个特殊的文件系统/proc它以文件的形式暴露了内核中的各种信息包括进程信息。在/proc目录下你会看到许多以数字命名的子目录$ls/proc110100101102...999...这些数字就是进程的PID。如果你想查看PID为1234的进程信息只需要进入/proc/1234目录$ls/proc/1234 attr clear_refs cpuset exe loginuid mounts oom_adj... cmdlinecommcwd environ maps mountstats oom_score...其中一些重要的文件包括exe指向进程对应的可执行文件cwd指向进程的当前工作目录cmdline进程的启动命令environ进程的环境变量6.2 使用 ps 命令ps命令是查看进程信息最常用的工具。常用的选项组合包括# 查看当前用户的所有进程$psaux# 查看所有进程的详细信息$psaxj# 查找特定进程$psaux|grepmyprogramps命令的输出包含很多字段其中我们最关心的是PID进程标识符PPID父进程标识符STAT进程状态COMMAND启动进程的命令6.3 使用 top 命令如果你想实时监控系统中的进程活动可以使用top命令$toptop命令会动态显示系统中资源占用最高的进程以及CPU、内存等系统资源的使用情况。七、进程的父子关系7.1 PPID与父子进程每个进程除了有自己的PID外还会记录其父进程的PID称为PPIDParent Process ID。在Linux中我们可以通过getppid()系统调用来获取父进程的PID#includestdio.h#includeunistd.hintmain(){pid_tpidgetpid();pid_tppidgetppid();printf(当前进程的PID是: %d\n,pid);printf(父进程的PID是: %d\n,ppid);return0;}7.2 命令行启动的进程当你在命令行中启动一个程序时这个进程的父进程通常是bash命令行解释器。$ ./myprogram在这个例子中myprogram进程的父进程就是当前运行的 bash 进程。bash 本身也是一个进程它的内部有一个死循环不断读取用户输入的命令然后创建子进程来执行这些命令。这种设计的好处是即使子进程出现问题比如崩溃也不会影响到 bash 本身用户可以继续使用命令行。7.3 使用 fork 创建子进程在程序中我们可以使用fork()系统调用来创建一个新的子进程#includestdio.h#includeunistd.hintmain(){pid_tpidfork();if(pid0){// fork失败perror(fork);return1;}elseif(pid0){// 子进程printf(我是子进程PID%d父进程PID%d\n,getpid(),getppid());}else{// 父进程printf(我是父进程PID%d子进程PID%d\n,getpid(),pid);}return0;}fork()函数的特点是一次调用两次返回在父进程中fork()返回子进程的PID一个正数在子进程中fork()返回0如果出错fork()返回-1通过这种方式父子进程可以执行不同的代码逻辑实现并行处理。八、当前工作目录CWD8.1 什么是当前工作目录在C语言中当我们使用fopen()打开一个不指定路径的文件时文件会被创建在当前目录下。那么这个当前目录到底是什么答案是当前工作目录Current Working DirectoryCWD是进程的一个属性记录在进程的PCB中。当进程启动时操作系统会把进程启动时所在的目录路径保存到PCB的CWD字段中。之后当进程进行文件操作时如果没有指定绝对路径操作系统就会使用CWD作为默认路径。8.2 查看和修改CWD我们可以通过/proc文件系统查看进程的CWD$ls-l /proc/1234/cwd lrwxrwxrwx1user user0Feb2310:00 /proc/1234/cwd -/home/user/myproject在程序中我们可以使用getcwd()函数获取当前工作目录使用chdir()函数修改当前工作目录#includestdio.h#includeunistd.hintmain(){charcwd[128];// 获取当前工作目录getcwd(cwd,sizeof(cwd));printf(修改前的工作目录: %s\n,cwd);// 修改工作目录chdir(/tmp);// 再次获取getcwd(cwd,sizeof(cwd));printf(修改后的工作目录: %s\n,cwd);return0;}8.3 CWD的实际意义理解CWD的概念对于理解文件操作非常重要。当你在程序中使用相对路径时实际上是在使用CWD作为基准路径。这也是为什么同一个程序在不同的目录下启动可能会产生不同的文件操作结果。九、总结与思考9.1 核心概念回顾通过今天的学习我们需要掌握以下核心概念进程的本质进程 PCB 代码和数据PCB的作用描述进程的所有属性是操作系统管理进程的依据进程管理的方式通过链表等数据结构组织PCB实现对进程的高效管理进程的标识PID唯一标识一个进程PPID记录父子关系进程的动态性进程可以被创建、调度、切换、终止9.2 深入思考在学习进程概念时有几个问题值得大家深入思考为什么操作系统不直接管理程序的代码和数据而要通过PCB来间接管理进程切换时除了保存程序计数器还需要保存哪些信息如果进程的代码和数据占用了大量内存PCB中如何高效地记录这些信息这些问题将引导我们进入更加深入的进程管理话题包括进程调度算法、虚拟内存、进程同步等内容。9.3 学习建议进程是操作系统中最核心的概念之一理解进程的本质对于后续学习至关重要。建议大家在学习过程中多动手实践编写程序创建进程观察进程的行为多看系统信息使用/proc文件系统和ps命令观察系统中的进程多思考原理不要只记住概念要理解背后的设计思想