【Linux】操作系统及进程概念

article/2025/9/24 17:51:10

大家好我是沐曦希💕

文章目录

  • 一、冯诺依曼体系结构
  • 二、操作系统OS
  • 三、系统调用和库函数概念
  • 四、进程
    • 1.概念
    • 2.描述进程-PCB
    • 3.查看进程
    • 4.查看系统调用
    • 5.查看进程调用
    • 6. 通过系统调用创建进程-fork初识


一、冯诺依曼体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
在这里插入图片描述

计算机包含输入设备、输出设备、存储器、中央处理器(运算器+控制器)
至目前,我们所认识的计算机,都是有一个个的硬件组件组成。

输入设备:键盘、磁盘、网卡、鼠标、摄像头等
输出设备:显示器、磁盘、网卡、各种打印机等
存储器:内存(掉电易失)只能作为临时存储
运算器&&控制器:CPU

磁盘属于外存,具有永久性存储能力。
CPU作为计算机的核心,负责计算,速度最快,寄存器次之,内存在次之,而外设是较慢的。
在这里插入图片描述
但是CPU只能被动接受别人的指令和别人的数据,那么CPU必须先认识别人的指令(每个CPU被制作都有自己的指令集),才能执行别人的指令,起到计算别人数据的目的。

上面说到CPU的速度很快,而外设的速度很慢,那么CPU直接从外设拿数据效率就降低了,所以数据是从外设加载到内存中的,然后CPU再从内存中读取数据,CPU处理完的数据再返回给内存(产生了缓存),数据再从内存中加载到外设,这大大提高的数据的处理。

所以CPU再读取和写入时候,在数据层面只和内存打交道,为了整体效率。

内存从外设读取和写入数据的过程成为I/O过程(input/output)

对于冯诺依曼体系,我们应该注意:

这里的存储器指的是内存
在数据层面不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
CPU不和外设直接打交道,和内存直接打交道。外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
所有外设有数据需要载入,只能载入到内存中,内存写出也一定是写到外设中
简单来说,就是所有设备都只能直接和内存打交道,提高整机效率

所以程序的运行必须要加载到内存,CPU执行的代码访问数据,只能从内存中读取(这也是体系结构规定的)。

对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上,请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。 从你打开窗口,开始给他发消息,到他的到消息之后的数据流动过程。如果是在qq上发送文件呢?

  • 发送消息 --> 接受消息 的数据流动:A 的键盘 --> A的内存 --> A的CPU (加密) --> A的网卡 --> B的网卡 --> B的内存 --> B的CPU (解密) --> B的显示器;
  • 发送文件 --> 接受文件 的数据流动:A 的磁盘 --> A的内存 --> A的CPU (加密) --> A的网卡 --> B的网卡 --> B的内存 --> B的CPU (解密) --> B的磁盘;

二、操作系统OS

  • 是什么

操作系统是一个进行软硬件资源管理的软件,操作系统包含了进程管理,文件管理,内存管理,驱动管理。
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库, shell程序等等)

  • 为什么

操作系统通过合理的管理软硬件资源(手段),为用户提供良好的,稳定的,高效的,安全的执行环境(目的)。

在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的“搞管理”的软件

  • 怎么办
  1. 管理者不需要与被管理者直接交互,依旧能够很好的将被管理者管理起来

比如在学校学生是被管理者,校长是管理者。管理者不需要和被管理者直接交互,依旧能够把被管理者对象管理起来。

  1. 管理的本质是对数据进行管理

对于计算机来说,各种硬件对应的驱动就是所谓的执行者,比如网卡有网卡驱动,磁盘有磁盘驱动;操作系统从这些驱动获取硬件数据,然后通过对硬件的数据进行管理实现对硬件的管理;

  1. 管理的方法是先描述,再组织

可以利用面向对象的思想将学生的数据描述成一个结构体或者一个类,然后每个学生都对应着由这个类/结构体实例化出的一个对象;最后,我们可以使用某一种数据结构 (比如顺序表、链表) 将这些类对象组织起来,形成一个学生信息管理系统;此时,我们对学生数据的管理就转变成了对某一数据结构的增删查改,大大提高了管理的效率。

在这里插入图片描述

所有的管理,本质是对数据做管理,管理的方法是先描述在组织
计算机管理硬件

1.描述起来,用struct结构体或者类
2.组织起来,用链表或其他高效的数据结构

总结:

管理的本质是对数据进行管理;
管理的方法是先描述,再组织;

三、系统调用和库函数概念

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

系统提供调用接口原因:操作系统不相信任何用户 – 操作系统不确定我们是否会对各种软硬件进行违法操作。但是操作系统又必须给上层用户提供各种服务,于是 给用户提供系统调用的接口,即当用户有访问软硬件的需求时,直接调用操作系统提供的接口,然后由操作系统来帮助用户完成对应的工作;这样即满足了用户的需求,又保护了软硬件资源。
在这里插入图片描述

四、进程

1.概念

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

也有书籍是一个运行起来(加载到内存)的程序时进程。

进程和程序相比进程具有动态属性。
而程序的本质计算文件,存储在磁盘中。

2.描述进程-PCB

当大量的程序加载到内存中,,操作系统用进行管理,会对程序进行先描述,在组织。

而描述进程-PCB

//进程控制块
struct task_struct3
{//该进程的所有属性struct task_struct* next;//该进程对应的代码和属性的地址
}

组织:对进程管理变成了进程对应的PCB进行相关的的管理。而对进程管理转化成了对链表的增删查。

struct task_struct* p1 = malloc(struct task_struct);
p1->..=xx;
p1->addr = 代码和数据的地址;
  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct

先描述,再组织工作 : struct task_struct内核结构体 --> 内核对象task_struct 对象 --> 将该结构体,代码和数据关联起来。

所以 进程 = 内核数据结构(task_struct) + 进程对应的磁盘代码

  • 程序和进程

程序的本质是放在磁盘上的可执行文件(.exe文件),就是一个文件,根据冯诺依曼体系,软件运行要加载到内存中,而进程则是将程序加载到内存当中,并且由操作系统进行管理,生成一个描述自身性质的数据结构(PCB),由内核数据结构和进程对应的磁盘代码两者共同组成“进程”

  • task_struct

task_struct-PCB的一种,在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息 。

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。

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

3.查看进程

首先创建一个死循环文件,方便查看进程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
make一下,生成可执行程序,开始执行:
在这里插入图片描述
接下来可以查看进程:

进程的信息可以通过 /proc 系统文件夹查看
如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹
大多数进程信息同样可以使用top和ps这些用户级工具来获取

ps ajx | grep "myproc"
ps ajx | head -1
ps ajx | head -1 && ps ajx | grep "myproc"

在这里插入图片描述
同时,我们可以杀掉(kill)进程,当然ctrl+c也可以直接结束掉:

kill -9 进程PID

在这里插入图片描述
进程在调度运行的时候,进程就具有动态属性。
进程在运行的时候本质是在读取进程内部的代码,内部在执行,从启动到终止中间可能会有一段很长的时间,这个进程就具备了动态属性。

查看进程:

ls /proc/

在这里插入图片描述

4.查看系统调用

  • getpid()
man 2 getpid

如果指令无法实现,则要下载:

sudo yum -y install man-pages

在这里插入图片描述
获取进程PID需要两个头文件,调用响相应函数,最后的返回值就是进程的PID
对myproc.c进行修改:
在这里插入图片描述
运行并查看进程:
在这里插入图片描述

此外,还有另一种方法查看进程:
在Linux中proc是内存级目录

ls /proc/

在这里插入图片描述
数字开头就是进程的pid,一个进程也可以当做文件来看待

ls /proc/进程PID -d

在这里插入图片描述
在这里插入图片描述

如果程序被删除了,那么进程还会跑吗?
在这里插入图片描述
可以看到进程依然可以跑。

5.查看进程调用

  • getppid()
    获得父进程ID
man 2 getppid

在这里插入图片描述

  • 创建文件
touch myproc.c
tpuch Makefile

在这里插入图片描述
在这里插入图片描述

  • 运行停掉
    在这里插入图片描述
    可以看到每次进程运行的时候,子进程的ID是变的,父进程的ID不变。
  • 查看父进程
ps axj | head -1 && ps axj | grep 父进程PPID

在这里插入图片描述
命令行上启动的进程,一般它的父进程没有特殊情况的话,都是bash
以子进程方式运行,遇到问题只与子进程有关,与父进程无关。

6. 通过系统调用创建进程-fork初识

  • fork
make fork

在这里插入图片描述

  • fork第一种用法

在这里插入图片描述

运行

在这里插入图片描述

fork是一个函数,用于创建子进程,函数执行前只有一个进程,函数执行后有两个进程:父进程和子进程,即打印两条。
即前一个进程的子进程是后一个进程的父进程。

  • fork第二种用法
    fork()返回类型是 pid_t
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
同一个变量id,在后续不被修改的情况下,竟然有不同的内容。
(所以对于结果我们很好理解,返回成功时,会给父进程返回子进程的pid,子进程会返回0)。但是,这里居然一个变量id居然会有两个返回值。我们根据这个返回结果写代码:
在这里插入图片描述
在这里插入图片描述
我们可以看到,两个while循环都执行起来了,这也证明了实际上参与while循环的有两个进程!并且它们是父子进程,即父子关系。

这也说明了,在fork之后,又创建了一个进程,两个进程分别在两个执行流中,因此可以分别执行if 和 else if,也可以分别进入while循环!

总结一句话,fork()之后,会有父进程+子进程两个进程在执行后续代码,fork()后续的代码,被父子进程共享,通过返回值不同,让父子进程执行共享代码的一部分,这就是并发式编程。


http://chatgpt.dhexx.cn/article/8BDisEXV.shtml

相关文章

Linux操作系统——基础详解

目录 Linux操作系统 Linux 简介 Linux 接口 Linux 组成部分 Shell Linux 应用程序 Linux 内核结构 Linux 进程和线程 基本概念 Linux 进程间通信 Linux 中进程管理系统调用 Linux 进程和线程的实现 Linux 调度 Linux 启动 Linux 内存管理 基本概念 Linux 内存…

Linux(一)操作系统基础知识

Linux操作系统基础知识 1、Linux简介与程序开发环境 1.1 什么是Linux? Linux是一个可以自由发布的类UNIX内核实现,它是一个操作系统的底层核心。Linux是由芬兰赫尔辛基大学的Linus开发,期间得到了网上广大UNIX程序员的帮助。它最初是受其教…

【Linux操作系统】——Linux概述

Linux操作系统——Linux概述 1、操作系统OS 定义:操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序。 作用:是把计算机系统中对硬件设备的操作封装起来,供应用软件调用,也是提供一个让用户与…

Linux操作系统(详解及配置操作)

Linux操作系统 重点:linux的安装 linux的常用指令 linux的网络配置 shell编程 难点:linux的磁盘分区 linux的shell编程 linux日志 1 linux基础篇 1.1 linux的基本概述 1.1.1 linux的由来 ​ linux是一个开源、免费的操作系统,其稳定性、安…

Linux操作系统简介

文章目录 Linux发行版简介学习Linux的必备硬件知识 关键硬件器件——CPU关键硬件器件——存储关键硬件器件——内存其他一些查看硬件信息的命令 Linux开机过程(以Ubuntu16.04为例) 阶段1:BIOS阶段2:boot Loader阶段3:k…

Power Query 系列 (13) - 自定义函数

本篇博客介绍 Power Query 自定义函数的技巧,在 PQ 中计算个税。 以工资类所得应交个税为例,最新的个税起征点为 5000 并按下表的级次进行缴税(假设没有其它扣除项)。 对照税率表,我们先看看手工如何计算。比如 xxx…

MySQL—自定义函数

函数 本文是在 navicat 中演示如何创建 自定义函数 ,建议先去看有关的书籍了解一下。我之前分享过一篇 《MySQL 8》的资料 可以参考一下。因为是 navicat 是客户端工具,所以他会给我们省去一些操作,比如 ; 的转义; 参…

【MySQL 第十天 自定义函数|创建和使用自定义函数|循环判断语句的使用】

【MySQL 第十天 自定义函数|创建和使用自定义函数|循环判断语句的使用】 【1】mysql自定义函数的介绍【2】mysql创建和使用自定义函数【3】mysql删除自定义函数【4】mysql流控的使用【4.1】mysql流程控制语句【4.2】mysql IF语句【4.3】mysql CASE语句【4.4】mysql WHILE循环语…

SQL Function 自定义函数

目录 产生背景(已经有了存储过程,为什么还要使用自定义函数) 发展历史 构成 使用方法 适用范围 注意事项 疑问 内容 产生背景(已经有了存储过程,为什么还要使用自定义函数) 与存储过程的区别&…

【精品】MySQL 自定义函数

语法 CREATE FUNCTION <函数名>(参数列表) RETURNS <返回值数据类型> BEGINRETURN(<SQL语句>); END示例一&#xff1a;生成随机的电话号码 CREATE FUNCTION generatePhone() RETURNS char(11) CHARSET utf8 DETERMINISTIC BEGINDECLARE head VARCHAR(100)…

sql:mysql:自定义函数

一、基本语法 delimiter 自定义符号  -- 如果函数体只有一条语句, begin和end可以省略, 同时delimiter也可以省略create function 函数名(形参列表) returns 返回类型  -- 注意是retrunsbegin函数体    -- 函数内定义的变量如&#xff1a;set x 1; 变量x为全局变量&am…

mysql之自定义函数

本文内容&#xff1a; 什么是函数函数的创建函数的调用函数的查看函数的修改函数的删除 首发日期&#xff1a;2018-04-18 什么是函数&#xff1a; 函数存储着一系列sql语句&#xff0c;调用函数就是一次性执行这些语句。所以函数可以降低语句重复。【但注意的是函数注重返回值&…

SQL Server 自定义函数(Function)

SQL Server 自定义函数&#xff08;Function&#xff09;——参数默认值 sql server 自定义函数分为三种类型&#xff1a;标量函数&#xff08;Scalar Function&#xff09;、内嵌表值函数&#xff08;Inline Function&#xff09;、多声明表值函数&#xff08;Multi-Statemen…

mysql自定义函数实现

mysql自定义函数实现 环境准备 查看mysql版本 select version();查看mysql存储引擎 show variables like %storage_engine%;创建测试表 CREATE TABLE dsp_user_media_tag (id int(11) NOT NULL AUTO_INCREMENT,imei varchar(50) COLLATE utf8_bin DEFAULT NULL,tagname va…

MySQL自定义函数用法详解

MySQL自定义函数用法详解-复合结构自定义变量/流程控制 自定义函数 (user-defined function UDF)就是用一个象ABS() 或 CONCAT()这样的固有&#xff08;内建&#xff09;函数一样作用的新函数去扩展MySQL。 所以UDF是对MySQL功能的一个扩展 创建和删除自定义函数语法: 创建UDF:…

SQL server 自定义函数FUNCTION的使用

前言&#xff1a; 在SQL server中不仅可以可以使用系统自带的函数&#xff08;时间函数、聚合函数、字符串函数等等&#xff09;&#xff0c;还可以根据需要自定义函数。 一、定义&#xff1a; 用户自定义函数的类型&#xff1a; 1、标量值函数&#xff08;返回一个标量值&a…

功能测试用例设计方法分享

测试用例可以用来衡量一个项目测试质量&#xff0c;因此在平时的测试流程中&#xff0c;编写测试用例就是测试过程中很重要的一步&#xff0c;每一个测试工程师都需要并且非常熟练的编写测试用例&#xff0c;能在编写测试用例中尽可能的覆盖任何异常的测试点&#xff1b;如何能…

判定表测试用例方法——实例

测试用例设计方法——判定表法 判定表法表示的是有多个输入&#xff0c;和多个输出&#xff0c;而且输入与输入之间有相互的组合关系、输入和输出之间有相互的制约和依赖关系, 判定表由四个组成部分 判定表基本概念  条件桩&#xff1a;输入条件, 列出了系统的所有输入&…

测试用例编写方法

测试用例编写方法 等价类划分法 一、等价类划分法的定义 把程序的输入域和输出域划分成若干部分&#xff0c;然后从各个部分中选取若干代表性数据作为测试用例。这些数据在测试中的作用等价于其所属部分的其他值。 二、等价类划分法的术语 等价类&#xff1a;输入域的各个…

软件测试用例设计方法(一)

目录 软件测试用例设计之等价类划分法一、等价类划分法的定义二、等价类划分法的术语三、等价类划分原则四、实例演示&#xff08;三角形问题和档案管理系统问题&#xff09; 软件测试用例之边界值分析法一、边界值分析法定义二、等价类划分法和边界值分析法的区别三、内部边界…