资讯详情

资讯详情

Linux 学习笔记(十四):从冯诺依曼到进程——操作系统是如何“管”程序的?

一、 底层基石冯诺依曼体系现代计算机大多遵循冯诺依曼体系。核心定律所有输入设备的数据必须先加载到内存CPU 只能读写内存不能直接访问外设输出设备也只能从内存中拿数据。这也是为什么内存RAM的速度和大小对电脑性能影响巨大。二、 操作系统的“管理学”操作系统OS负责管理底层的软硬件资源为上层的应用程序提供运行环境。它是如何管理的核心思想先描述再组织。描述用结构体struct将硬件或程序的信息封装起来。组织用链表等数据结构把结构体串联起来。OS 不直接让用户操作硬件而是提供系统调用接口如read、write供上层封装成库函数使用。三、 认识进程Process什么是进程课本概念程序的一个执行实例。底层真相进程 内核数据结构PCB 程序的代码和数据。在 Linux 中这个 PCB 结构体叫做task_struct。它包含了进程的所有属性如PID进程标识符、状态、优先级、内存指针等。四、 实战获取和查看进程每个进程都有独特的身份证号PID和父进程 IDPPID。1. 代码获取#include stdio.h #include sys/types.h #include unistd.h int main() { printf(当前进程 PID: %d\n, getpid()); printf(父进程 PPID: %d\n, getppid()); return 0; }2. 命令行查看# 查看系统所有进程配合管道过滤 ps aux | grep 进程名 # Linux 的特色/proc 目录下记录了所有运行中进程的信息 # 进入 /proc/进程PID 目录能看到该进程的所有底层数据 ls /proc/1总结进程不只是一个跑起来的程序它在操作系统眼里是一个拥有完整档案PCB的实体。通过getpid()和ps命令我们可以轻松洞悉进程的身份。自我实战操作实战 1获取自己的 PID代码实战cd ~/linux_study mkdir proc_test cd proc_test vim getpid.c(输入以下代码保存退出)#include stdio.h #include sys/types.h #include unistd.h int main() { // getpid() 获取当前进程的 PID // getppid() 获取父进程的 ID printf(我的 PID 是: %d\n, getpid()); printf(我爸爸的 PPID 是: %d\n, getppid()); while(1) { sleep(1); // 死循环卡住方便我们查看 } return 0; }实战 2编译、运行与查看# 1. 编译 gcc getpid.c -o getpid # 2. 运行注意程序会卡住这就代表它作为一个进程正在后台/前台运行 ./getpid(此时屏幕上打印了 PID。不要按 CtrlC新开一个 Xshell 窗口或者把当前终端挂起 CtrlZ 然后 bg 放后台)在新终端里查看这个进程# 1. 用 ps 命令配合管道符复习前面学的查找 ps aux | grep getpid # 2. 去系统 /proc 目录下看看它的真面目 ls -l /proc/你的PID # 把你的PID换成刚才程序打印出来的数字 # 3. 用 top 命令动态查看 top -p 你的PID(复习在ps aux的结果中第二列就是 PID第三列是 PPID。你会惊奇的发现你运行的这个程序的爸爸PPID其实就是你当前所在的 Bash 终端的 PID)
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →