
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
本文摘要: 本文主要介绍了计算机进程的基本概念和管理机制。首先解释了内存存在的必要性,指出数据流动的本质是拷贝,CPU通过内存与外设交互以提高效率。然后阐述了进程的定义:进程=内核数据结构(task_struct)+程序代码和数据,类比学籍与学生的关系。操作系统通过PCB(进程控制块)管理进程,采用"先描述后组织"的方式将进程属性存储在链表中进行调度。文章还演示了如何通过getpid获取进程ID、

本文介绍了Linux内核中的7种进程状态及其应用场景,重点分析了R(运行/就绪)、S(可中断休眠)、D(不可中断休眠)、T(停止)等状态的特点。通过代码示例演示了IO操作导致进程进入S状态的原因,以及纯计算程序保持R状态的机制。文章还详细讲解了前后台进程的区别,包括键盘输入权限、状态显示(+号标识)以及信号控制(如kill -19暂停进程、kill -18恢复进程)等核心概念,帮助读者深入理解Li

先交代一下环境:语言从 C 切换成 C++,操作系统从 CentOS 7 换成 Ubuntu 24.04(内核 6.8.0)。CentOS 7 已经停更了——虽然有些企业还没换,但 VS Code 新版本已不再支持 CentOS 7(它自带的 glibc 太老了),连都连不上。所以换。前面学过的所有系统调用接口在 Ubuntu 上 100% 一样——内核接口不随发行版变,平滑切换。
0x4010c0。不是main的地址。不是你以为的"程序从 main 开始"。停。先别往下读。你刚才脑子里是不是闪过一个念头——“哦,入口地址,就是程序开始执行的地方”?换个问法:你双击一个程序,CPU 执行的第一条指令,到底长什么样?为什么是那条指令?操作系统怎么知道把那条指令放在内存的什么位置?如果你只能回答"入口地址就是 entry point address"——你只是记住了名字。你还没搞
这里有一大堆东西没讲到。页表到底长什么样?多级页表怎么省空间?TLB 是什么?页错误(page fault)怎么处理?ELF 可执行文件格式怎么和虚拟地址空间配合?缺页中断怎么触发、操作系统怎么响应?内存回收算法怎么决定把谁的页换出去?这些都不是一节课能讲完的。但你现在有了一张地图——不是"代码段、数据段、堆、栈"那个图,是理解这件事需要抓住的主线你看到的地址是假的。是虚拟地址,是地图上的坐标。这

本文首先回顾了环境变量和命令行参数的概念,重点讲解了环境变量的全局属性和获取方式。然后通过实验揭示了fork创建子进程后的一个关键现象:父子进程访问相同虚拟地址却得到不同值,证明程序中看到的地址都是虚拟地址而非物理地址。文章深入分析了虚拟地址空间的原理,指出操作系统通过页表维护虚拟地址到物理地址的映射关系,解释了为什么同一虚拟地址在不同进程中可能指向不同的物理内存内容。最后强调访问内存的基本单位是

这篇文章摘要如下: 本文详细讲解了如何从零开始手搓一个简易shell,主要涵盖以下核心内容: 基础系统调用:重点介绍了fork、wait、exec系列函数的工作原理和使用方法,包括进程创建、程序替换和进程回收机制。 Shell核心架构:采用"读取-解析-执行"的循环结构,通过打印提示符、获取用户输入、解析命令、执行命令四个步骤实现基本交互。 关键技术实现: 使用getenv/getcwd获取系统环

先看一段代码。同一个地址0x60104c,子进程读出来是 200,父进程读出来是 100。同一个地址,两个不同的值。这怎么可能?答案只有一种:你在 C/C++ 里用到的地址,根本就不是物理地址。它是虚拟地址。这件事一旦接受,一系列问题就涌上来了:虚拟地址是怎么工作的?fork 到底干了什么?一个进程从出生到死亡,操作系统在背后做了哪些事?
在myshell.c中定义全局变量,用static// 提示符相关// 与命令行相关每次解析前需要清空,因为上次解析的痕迹会残留(比如上次argc = 3,下次解析新命令如果不重新清零,argc就从 3 开始计数了)。命令行提示符:用getenv从环境变量获取用户名、主机名、当前路径,用强制刷新输出缓冲用户输入:用fgets(而非scanf)获取整行字符串,去掉末尾换行符字符串解析:用strtok

这篇文章讲三件事,但它们其实是一件事的三个阶段。你敲了一个命令,回车。一个程序被启动了。就这么简单的一个动作,背后有一个长长的故事:你敲的字符串是怎么变成程序能读到的参数的?程序怎么知道你登录的是哪个用户、你的家目录在哪儿?程序被加载到内存之后,它"以为"自己住在哪里?我们先从一个实验开始。







