目录

1.冯诺依曼体系结构

 小结:

2.操作系统 

概念:

结构示意图: 

理解操作系统:

用户使用底层硬件层次图:​编辑

 3.进程

概念

 结构示意图

task_ struct内容分类 

典型用法示例

观察进程:

了解 PID PPID

查看进程


1.冯诺依曼体系结构

  1. 输入设备:键盘、鼠标、摄像头、话筒、磁盘、网卡等,这些设备用于向计算机输入数据和指令。
  2. 输出设备:显示器、声卡、磁盘、网卡等,用于将计算机处理的结果输出展示。
  3. CPU:由运算器和控制器组成,是计算机的核心部件,负责数据的运算和控制计算机各部件协调工作。
  4. 存储器:内存,用于临时存储计算机正在运行的程序和数据。

CPU 不和外设直接打交道,CPU 只和内存打交道。 

外设 (输入和输出) 的数据,不是直接给 CPU 的,而是先要放入内存中。 

程序由代码和数据组成,未被加载到内存时,以二进制文件形式存储在磁盘等外部存储设备中。 

数据流动:数据在计算机体系结构中流动并进行加工处理,从一个设备到另一个设备本质上是一种拷贝操作。 

数据设备间的拷贝的效率,决定了计算机整机的基本效率

越靠近cpu,容量越小,速度越快,价格越高。

 小结:

  1. 存储特性:距离 CPU 越近的存储设备,数据处理效率越高,但成本也越高。
  2. 硬件数据流动规则
    • CPU 不直接与外设交互,仅与内存进行数据交换。
    • 外设的数据需先存入内存,再由内存传递给 CPU 处理。
  3. 程序运行机制
    • 程序由代码和数据组成,在运行时需要加载到内存中,因为 CPU 只会从内存中读取代码和数据。
    • 当程序未被加载到内存时,以二进制文件形式存储在磁盘等外部存储设备中。

2.操作系统 

概念:

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。

笼统的理解,操作系统包括:

内核(进程管理,内存管理,文件管理,驱动管理)


其他程序(例如函数库,shell程序等等)

操作系统是进行软硬件资源管理的软件。

从广义角度看,它包括操作系统的内核以及操作系统的外壳(周边程序),外壳给用户提供使用操作系统的方式;

从狭义角度看,操作系统只是指其内核。内核是操作系统的核心部分,负责管理系统的硬件资源、提供基本的服务等;而外壳则是基于内核之上的部分,为用户提供更友好的交互界面和操作方式。

结构示意图: 

理解操作系统:

操作系统是进行软硬件资源管理的软件,而任何管理离不开这句话:

先描述,后组织。

 以管理学生为例: 管理学生的本质是对学生的数据进行管理。

凡是对特定的对象进行管理都是 先描述,后管理

在操作系统中驱动层将操作系统的请求转化为硬件能理解的命令。操作系统识别到相应的设备,创建相应的对象,硬件通过驱动层将硬件设备的相关属性上传到操作系统,通过链表的形式以便操作系统进行管理。

 

用户使用底层硬件层次图:

 我们经常使用的 scanfprintf 等本质需要接触键盘和显示器等底层硬件。但是我们不可能绕过管理系统进行接触。操作系统保证其稳定性,用户又不能直接接触操作系统,这时候就需要用到操作系统提供的 系统调用接口 来满足用户的需求,也能保证操作系统的稳定性。

  

按照之前的知识,每种操作系统提供的调用接口让用户使用,但在学习C/C++等语言在Windows、Linux不同系统下,我们使用 scanf 和 printf 的方式没有变化,说明我们使用的不是系统调用接口,而是通过用户操作接口。我们拿之前在Linux写的C语言程序查看依赖库:

ldd [选项] [可执行文件或共享库路径]

 

libc就是我们C语言的依赖库: 

 ​​​​​​

库函数对系统调用的封装

许多高级编程语言中的标准库函数会对系统调用进行封装,以提供更方便、更友好的编程接口。例如,C 标准库中的printf函数,它内部会调用 write 系统调用来将数据输出到标准输出设备(如终端)。这种封装隐藏了系统调用的底层细节,提高了编程效率。

同时,一种编程语言至少需要一套语法,一套标准库,一套编译器。在不同的操作系统下,库函数实现 printf 调用的系统调用接口不同,对其进行封装可以实现跨平台性,实现在不同操作系统下也能实现 printf

 3.进程

概念

课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。

 结构示意图

PCB 在 Linux 为 struct task_struct 

  

task_ struct内容分类 

  1. 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  2. 状态: 任务状态,退出代码,退出信号等。
  3. 优先级: 相对于其他进程的优先级。
  4. 程序计数器: 程序中即将被执行的下一条指令的地址。
  5. 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  6. 其他信息

以开机、开机举例:

操作系统关机时以二进制文件形式存储在磁盘中。开机后,内核被加载到内存并初始化。初始化过程中,内核会静态创建第一个进程(如 init)的 PCB,并存入内存。后续的进程如(fork( ))运行时动态分配PCB和资源,随后CPU通过调度器选择PCB开始工作,系统完成启动。 

进程task_struct在不同的队列中,就能分配不同的资源。 

 

 

ls 、file、程序的执行本质就是让系统创建进程并运行

--- 我们自己写的代码形成的可执行 == 系统命令 == 可执行文件。
linux中运行的大部分执行操作,本质都是运行进程!!!

file 是 Linux 系统中一个常用的命令行工具,用于识别文件的类型。它通过分析文件的内容、元数据或特定标识(而非仅依赖文件名后缀),判断文件属于哪种类型(如文本文件、可执行程序、压缩包、图片等)。

基本语法

file

file [选项] 文件名/路径

常用选项

-b:仅显示文件类型描述,不包含文件名(简洁输出)。
-i:显示文件的 MIME 类型(如 text/plain、application/x-executable)。
-z:尝试分析压缩文件内部的文件类型(如 .zip、.tar.gz 中的文件)。
-L:如果文件是符号链接,显示链接指向的目标文件的类型(默认显示链接本身为 “symbolic link”)。

典型用法示例

观察进程:

 

 编写一个简单的代码并生成程序。

#include <stdio.h>
#include <unistd.h>int main(){while(1){printf("I am a process\n");sleep(1);}}
~ 

 运行程序使用命令为:

ps axj|grep process    axj顺序没有要求

ps axj:ps 是查看进程状态的命令,axj 是组合选项:

a:显示所有用户的进程(包括非当前终端的进程)。
x:显示没有控制终端的进程(如后台运行的进程)。
j:以作业控制格式输出,主要包含 PPID(父进程 ID)、PID(进程 ID)、PGID(进程组 ID)、SID(会话 ID) 等列,适合查看进程间的父子关系和会话信息。


| grep process:管道符 | 将前一个命令的输出传递给 grep 过滤,grep process 用于筛选出包含 “process” 字符串的行(匹配进程名、命令行参数等,进程的默认命名与程序的名字一样)。 

ps axj|grep process  本身也是一个进程。所以终止process程序后,还能看见process有关的进程。

 想要直观地了解属性可以加入

head -1&&ps axj 

    head -1 只取输出的第一行,即表头行(例如:PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND),用于说明各列的含义。

    ps axj| head -1&&ps axj |grep process  #打印进程信息后,取表头再打印进程信息

    了解 PID PPID

    操作系统的进程调度器通过 一个唯一的标识符 来区分不同进程,对进程进行调度、分配 CPU 时间片等操作 ,所以有了PID,PID 是每个进程在系统中的唯一数字标识,就像每个人的身份证号一样。

    PPID 记录创建当前进程的父进程的 ID,从而构建起进程间的父子关系,形成进程树状层次结构。这种结构有助于系统对进程进行管理,比如在进程清理时,当父进程结束,系统可以根据 PPID 找到所有子进程并进行相应处理(如在某些情况下,父进程退出后,子进程会被重新挂载到 init 进程下,init 进程的 PID 为 1 )。同时,系统管理员也可以通过查看进程的 PPID,了解进程的创建来源和相互关系,便于排查问题。

     getpid:用于获取当前进程的进程 ID(PID),返回值类型为pid_t,无参数。


    getppid:用于获取当前进程的父进程 ID(PPID),返回值类型也为pid_t,同样无参数。

     

     写个简易代码来观察

    #include <stdio.h>
    #include <unistd.h>int main(){pid_t pid = getpid();pid_t ppid = getppid();while(1){printf("I am a process PID=%d  PPID=%d\n",pid,ppid);sleep(1);}}

     

     想要连续观察进程的状态,可以添加shell脚本实时观察:

    hile :;do ps axj| head -1&&ps axj |grep process;sleep 1; done  每隔一秒打印一次
    

     

     多次运行编写的 process ,每次的子进程 PID 都不一样 父进程 PPID 不变。

     观察父进程,发现父进程由bash而来

     我们是否也能创建自己的子进程呢?

    答案是肯定的,我们来了解一下fork。

    fork() 是 Unix/Linux 系统中用于创建新进程的核心系统调用,通过复制当前进程(父进程)来生成一个几乎完全相同的新进程(子进程)。以下是对其关键特性的解析:

    核心功能
    进程复制:fork() 会复制当前进程的所有资源(代码段、数据段、堆、栈、文件描述符等),生成一个新的子进程。
    调用后双进程执行:调用 fork() 后,父进程和子进程会同时从 fork() 的下一行代码开始执行,但返回值不同:

    进程类型fork() 调用返回值说明
    父进程子进程的 PID(正数)父进程通过返回的 PID 识别和管理子进程
    子进程0子进程通过返回 0 标识自己是子进程
    失败情况-1通常因内存不足、进程数超限等原因导致创建失败
     
    差异项父进程子进程
    代码和数据来源从磁盘加载而来是父进程的 “副本”,默认继承父进程的代码和数据
    进程 ID(PID)有唯一的 PID有唯一的 PID,与父进程不同
    父进程 ID(PPID)-等于父进程的 PID
    内存锁可能有通过 mlock () 等函数锁定的内存区域不继承父进程的内存锁
    资源统计有累计的资源使用统计,如 CPU 时间、内存占用等资源使用统计重置为 0
    文件锁可能有通过 flock () 等函数锁定的文件

    不继承父进程的文件锁

    内存与资源的 “写时复制(COW)”
    为提高效率,fork() 使用 ** 写时复制(Copy-On-Write)** 技术:

    初始时,子进程与父进程共享同一内存空间,不实际复制数据。
    当任一进程(父或子)修改内存数据时,才会复制受影响的内存页,确保修改独立。

     我们写一段代码简单了解一下

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork failed");return 1;} else if (pid == 0) {while(1){printf("Child process: ID=%d PID = %d, PPID = %d\n", pid , getpid(), getppid());sleep(2);}} else {while(1){printf("Parent process: ID=%d PID = %d, Child PID = %d\n",pid , getpid(), pid);sleep(2);}}return 0;
    }
    

    可以观察到有两个进程在同时运行:

    删除子进程:

     删除父进程

     无论删除子进程还是父进程都不影响其独立性。

    进程一定要有独立性

     之前 进程 = 内核数据结构 task_struct +  代码 + 数据

    父进程和子进程都有对应的task_struct结构,代码是只读的,父进程和子子进程的数据是独立的。

    fork()返回两个值可以理解为分别从子进程和父进程的数据中返回的。

    本质上是父进程和子进程在各自独立的内存空间中,操作系统对同一个变量赋予了不同的值

     

    查看进程

    除了之前 ps 命令查看进程,我们能在  /proc 路径下查看进程:

    proc 路径下的进程按照 PID 命名。 

    我们来查看进程的详情

    ls /proc/2699451 -l

     删除可执行程序后,程序路径显示删除,但是当前进程仍在运行

     

    这是因为我们删除的是磁盘的文件进程已经加载到内存里面且文件很小,没有影响到其他进程且调度器也没有更紧急的需求,所以仍然可以运行。

    以前我们学过 fopen ("log.txt",“w”);

    他是怎么打开识别到当前路径的呢?

     我们先创建一个程序执行

     然后我们修改 log.txt 生成的路径

    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>int main()
    {chdir("/home/new");FILE *fp = fopen("log.txt", "w");(void)fp;fclose(fp);while(1){printf("I am a process, pid: %d\n", getpid());sleep(1);}return 0;
    }

    重新编译后再次运行程序:

     文件成功改变路径。

    fopen ("log.txt",“w”);

    fopen函数调用时,他会寻找自己进程的cwd,当我们把文件名参数输入(不是绝对路径时),他默认会拼接当前进程的路径。所以在当前目录下生成我们需要的"log.txt"文件。

    再见ヾ( ̄▽ ̄)Bye~Bye~

      本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
      如若转载,请注明出处:http://www.pswp.cn/pingmian/91339.shtml
      繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91339.shtml
      英文地址,请注明出处:http://en.pswp.cn/pingmian/91339.shtml

      如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

      相关文章

      LeetCode 面试经典 150_数组/字符串_买卖股票的最佳时机(7_121_C++_简单)(贪心)

      LeetCode 面试经典 150_数组/字符串_买卖股票的最佳时机&#xff08;7_121_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;贪心算法&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&…

      Ubuntu 18.04 repo sync报错:line 0: Bad configuration option: setenv

      repo sync时报 line 0: Bad configuration option: setenv因为 Ubuntu 18.04 默认的 openssh-client 是 7.6p1&#xff0c;还不支持 setenv&#xff0c;但是.repo/repo/ssh.py 脚本中明确地传入了 SetEnv 参数给 ssh&#xff0c;而你的 OpenSSH 7.6 不支持这个参数。需要按如下…

      bug记录-stylelint

      BUG1不支持Vue文件内联style样式解决&#xff1a; "no-invalid-position-declaration": null

      前端开发(HTML,CSS,VUE,JS)从入门到精通!第一天(HTML5)

      一、HTML5 简介1&#xff0e;HTML全称是 Hyber Text Markup Language&#xff0c;超文本标记语言&#xff0c;它是互联网上应用最广泛的标记语言&#xff0c;简单说&#xff0c;HTML 页面就等于“普通文本HTML标记&#xff08;HTML标签&#xff09;“。2&#xff0e;HTML 总共经…

      智慧收银系统开发进销存:便利店、水果店、建材与家居行业的—仙盟创梦IDE

      在数字化转型的浪潮中&#xff0c;收银系统已不再局限于简单的收款功能&#xff0c;而是成为企业进销存管理的核心枢纽。从便利店的快消品管理到建材家居行业的大宗商品调度&#xff0c;现代收银系统通过智能化技术重塑了传统商业模式。本文将深入探讨收银系统在不同行业进销存…

      三维扫描相机:工业自动化的智慧之眼——迁移科技赋能智能制造新纪元

      在当今工业4.0时代&#xff0c;自动化技术正重塑生产流程&#xff0c;而核心工具如三维扫描相机已成为关键驱动力。作为工业自动化领域的“智慧之眼”&#xff0c;三维扫描相机通过高精度三维重建能力&#xff0c;解决了传统制造中的效率瓶颈和精度痛点。迁移科技&#xff0c;自…

      Jmeter的元件使用介绍:(九)监听器详解

      监听器主要是用来监听脚本执行的取样器结果。Jmeter的默认监听器有&#xff1a;查看结果树、聚合报告、汇总报告、用表格查看结果&#xff0c;断言结果、图形结果、Beanshell监听器、JSR223监听器、比较断言可视化器、后端监听器、邮件观察器&#xff0c;本文介绍最常用的监听器…

      联通元景万悟 开源,抢先体验!!!

      简介&#xff1a; 元景万悟智能体平台是一款面向企业级场景的一站式、商用license友好的智能体开发平台&#xff0c;是业界第一款go语言&#xff08;后端&#xff09;开发的智能体开发平台&#xff08;7月19日&#xff09;&#xff0c;coze studio开源是7月26日&#xff0c;同时…

      Git之本地仓库管理

      一.什么是Git在学习工作中&#xff0c;我们经常会遇到改文档的场景。一个文档可能会被我们修改多次&#xff0c;而最终真正使用的可能是最先的几版。而如果我们直接在原文档上修改&#xff0c;就会导致无法找到最先的几次。这也就导致我们要对我们所有的版本进行维护&#xff0…

      Go再进阶:结构体、接口与面向对象编程

      &#x1f680; Go再进阶&#xff1a;结构体、接口与面向对象编程 大家好&#xff01;在前两篇文章中&#xff0c;我们深入学习了Go语言的流程控制语句以及数组和切片的使用并且还对Go 语言的核心知识点进行了补充讲解&#xff0c;这些知识让我们能够编写出更为复杂和灵活的程序…

      Python入门第六课:现代开发与前沿技术

      异步编程(asyncio) 1. 协程基础 import asyncio import time# 定义协程函数 async def say_after(delay, message):await asyncio.sleep(delay)print(message)# 主协程 async def main():print(f"开始时间: {time.strftime(%X)}")# 顺序执行await say_after(2, 你…

      STM32移植LVGL9.2.1教程

      一、环境说明 &#xff08;1&#xff09;开发板&#xff1a;STM32F401RCT6核心板&#xff08;网上很多&#xff0c;价格只有几块钱&#xff09; &#xff08;2&#xff09;屏幕&#xff1a;2.8寸spi屏gt911触摸 转接板&#xff08;某宝有卖&#xff0c;没有推广自行搜索&…

      python学智能算法(二十九)|SVM-拉格朗日函数求解中-KKT条件理解

      【1】引言 前序学习阶段中&#xff0c;我们掌握了最佳分割超平面对应的构造拉格朗日函数极值为&#xff1a; L(w,b,α)∑i1mαi−12∑i,j1mαiαjyiyjxiTxjL(w,b,\alpha)\sum_{i1}^{m}\alpha_{i}-\frac{1}{2}\sum_{i,j1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}^{T}x_{j}L(w,…

      大模型应用开发1-认识大模型

      1.基础概念 1.1 AI的概念&#xff1a; AI&#xff0c;⼈⼯智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;使机器能够像⼈类⼀样思考、学习和解决问题的技术。AI发展⾄今⼤概可以分为三个阶段&#xff1a;其中&#xff0c;深度学习领域的自然语言处理&#…

      Linux 远程连接解析:SSH 协议理论与应用

      Linux 远程连接解析&#xff1a;SSH 协议理论与应用在网络互联的时代&#xff0c;远程管理服务器已成为常态。SSH&#xff08;Secure Shell&#xff09;作为一种安全的网络协议&#xff0c;凭借其加密机制和灵活的功能&#xff0c;成为 Linux 系统远程操作的事实标准。本文将从…

      ubuntu22.04系统入门 linux入门 简单命令基础复习 实现以及实践

      以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址&#xff1a;星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 兑换码要是过期了&#xff0c;可以私信我获取最新兑换码&#xff01;&a…

      软考中级-信息安全工程师-每日一学(1)

      前提概要本文章主要用于分享软考中级-信息安全工程师-学习&#xff0c;以下是一些个人理解&#xff0c;请大家结合参考其他文章中的相关信息及个人经验进行归纳和补充&#xff0c;内容会存在一定错误&#xff0c;希望读者多多评论批评&#xff0c;本人在此先说感谢啦。1.密码学…

      EEG手工特征提取总结

      目录一、引言EEG信号简介EEG特征提取的重要性本次汇报目的与内容概述二、EEG信号核心特征时域特征 (Time-Domain Features)频域特征 (Frequency-Domain Features)三、EEG信号高级特征时频域特征 (Time-Frequency Domain Features)空间域特征 (Spatial-Domain Features)复杂动力…

      React 路由守卫

      下面&#xff0c;我们来系统的梳理关于 React Router 路由守卫 的基本知识点&#xff1a;一、路由守卫概述 1.1 什么是路由守卫 路由守卫是一种在用户导航到特定路由之前或离开特定路由时执行逻辑的机制。它允许开发者控制用户访问权限、验证条件或执行数据预加载等操作。 1.2 …

      7月31日作业

      1&#xff1a;请使用函数模板&#xff0c;写一个能够针对所有数据类型的数据的快速排序函数 并多写几个数组做测试代码#include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector…