Linux --OS和PCB

article/2025/6/23 12:28:02

目录

认识冯诺依曼系统

操作系统概念与定位

1.概念

2.设计OS的目的

3.OS的核心功能

4.系统调⽤和库函数概念

深⼊理解进程概念,了解PCB

1.基本概念与基本操作

2.描述进程-PCB

基本概念

task_ struct 的内容分类


认识冯诺依曼系统

  在计算机中小到个人的笔记本,大到企业的服务器,大多都遵从冯诺依曼体系结构。

  截⾄⽬前,我们所认识的计算机,都是由⼀个个的硬件组件组成 , 输⼊单元:包括键盘, ⿏标,扫描仪, 写板等 。中央处理器(CPU):含有运算器和控制器等 。输出单元:显⽰器,打印机等

  为什么大多数的计算机都要遵从这套体系呢,这是因为cpu在数据层面,不会和外设直接打交道,而是通过这里的储存器也就是内存,进行交换。当程序运行时首先会加载到内存中,由内存和cpu进行交互。那么为什么要有内存,内存其实是cpu和外设间的一个巨大缓存,外设如果和cpu直接进行交互,cpu的传输速率很快,但是外设的传输速率很慢,那么这个计算机的传输速率就会很慢,就像木桶定律一样,一只水桶能装多少水取决于它最短的那块木板,所以内存就诞生了,能够使程序提前加载到内存中,在需要运行程序时会直接与cpu交互,且速率并不会太慢,这是一个伟大的发明,使一般计算机能够拥有不错的效率,促进了计算机的发展。

  下面利用qq收发数据时来理解冯诺依曼

  关于冯诺依曼,必须强调⼏点:不考虑缓存情况,这⾥的CPU能且只能对内存进⾏读写,不能访问外设(输⼊或输出设备) 。外设(输⼊或输出设备)要输⼊或者输出数据,也只能写⼊内存或者从内存中读取。 ⼀句话,所有设备都只能直接和内存打交道。

操作系统概念与定位

1.概念

  任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,⽂件管理,驱动管理)
其他程序(例如函数库,shell程序等等

2.设计OS的目的

在计算机中OS对上为用户和程序提供了一个安全稳定高效的运行环境,对下管理所有的软硬件资源,不直接与硬件进行交互,而是通过驱动程序,每一种硬件都有自己对于的驱动程序。

3.OS的核心功能

OS不直接与硬件进行交互,而是作为一个管理者的身份,描述被管理对象(硬件)并组织被管理对象,使用struct结构体描述对象,用链表的其他的高效数据结构组织起来。

4.系统调⽤和库函数概念

  在计算机中用户并不能直接去和硬件交互,而是需要通过系统调用来交互,因为不是每个用户都深入了解底层硬件的,使用系统调用的方法能够极大保证安全的运行环境。

  在开发⻆度,操作系统对外会表现为⼀个整体,但是会暴露⾃⼰的部分接⼝,供上层开发使⽤,
这部分由操作系统提供的接⼝,叫做系统调⽤。
    系统调⽤在使⽤上,功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有⼼的开发者可以对部
分系统调⽤进⾏适度封装,从⽽形成库,有了库(c++等一些语言库),就很有利于更上层⽤⼾或者开发者进⾏⼆次开发。图形化操作界面也是系统调用封装的一种形式,如安卓系统,其实内核用的也是Linux。
  

深⼊理解进程概念,了解PCB

1.基本概念与基本操作

课本概念:程序的⼀个执⾏实例,正在执⾏的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。
进程的进一步理解其实是:内核数据结构体和程序的代码和数据,因为软件在加载到内存中的时候还包含着自己的进程信息,而这个进程信息被放在一个结构体中。

2.描述进程-PCB

基本概念

进程信息被放在⼀个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
  在Linux中描述进程的结构体叫做task_struct,task_struct是Linux内核的⼀种数据结构,它会被装载到RAM(内存)⾥并且包含着进程的信息。
为什么要有 PCB,因为OS要管理进程,通过进程信息也就是PCB来调度程序运行。

task_ struct 的内容分类

标⽰符: 描述本进程的唯⼀标⽰符,⽤来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执⾏的下⼀条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下⽂数据: 进程执⾏时处理器的寄存器中的数据[休学例⼦,要加图CPU,寄存器]。
I/O状态信息: 包括显⽰的I/O请求,分配给进程的I∕O设备和被进程使⽤的⽂件列表。
记账信息: 可能包括处理器时间总和,使⽤的时钟数总和,时间限制,记账号等。
组织进程
可以在内核源代码⾥找到它。所有运⾏在系统⾥的进程都以task_struct链表的形式存在内核⾥。

进程属性

1.查看进程

  在进程创建以后会 /proc系统文件下创建对应的属性文件夹, 在进程的信息可以通过 /proc 系统⽂件夹查看,因为Pid的唯一的,所以每一个带Pid序号的文件夹里面都是一个进程的详细属性。
如:要获取PID为1的进程信息,你需要查看 /proc/1 这个⽂件夹。
  ⼤多数进程信息同样可以使⽤top和ps这些⽤⼾级⼯具来获取,我启动了一个自己写的循环进程,然后用ps ajx | head -1 && pa ajx |grep code 来查看进程。这个命令的意思是查看进程信息属性第一行和带有code关键字的进程。
  这里我们可以看到code这个进程的Pid是27328,那么它对应会在/proc下创建一个27328文件来储存code的进程信息
  /proc 是是一个内存级的文件,即这个文件并不会写入文件中,电脑关机这些文件就没有了,进程也就都关闭了。一个进程关闭对应的/proc下的属性文件夹也会被删除。所以此时我将code终止,27328文件夹就自动会删除了。

2.通过系统调用来获取进程标识符

  在进程信息中我们可以看到每个进程都有自己的Pid和ppid,ps是通过一些系统调用遍历/proc文件夹来获取的,那么这两个标识符我们自己也可以通过系统调用来获取。

  进程pid我们可以使用getpid()来获取,父进程id可以用getppid()来获取,这两个函数存在于sys/types.h头文件中。

#include<iostream>
#include<unistd.h>
#include<sys/types.h>using namespace std;int main()
{while(1){cout<<"pid :"<<getpid()<<endl;cout<<"ppid :"<<getppid()<<endl;sleep(1);}return 0;
}

  这是一个进程id获取的代码,运行起来可以发现获取的的id和pid确实一致

  我们在/proc文件夹找到对应进程信息能够看到exe和cwd

  那么这两个属性是什么呢,cwd为current work  dir即当前工作目录,exe为当前可执行程序所在的路径。创建一个可执行程序或者是在当前路径下创建的吗?其实是在当前的工作目录下创建的,我们可以用chdir来改变这个路径,这里用创建一个txt文件来展示

int main()
{chdir("./mydir");FILE* fp=fopen("log.txt","w");if(fp == NULL){}while(1){cout<<"pid :"<<getpid()<<endl;cout<<"ppid :"<<getppid()<<endl;sleep(1);}return 0;
}

可以看到目前的cwd更改了,而且log.txt也创建在更改的cwd目录下了

3.通过系统调用创建进程--fork

  如果我们想要在代码中创建一个进程,那么就需要使用fork系统调用,fork的有分流的意思,即本来是一个进程,fork后就变成了一个父进程和子进程,通过man可以得知fork的返回值有两个,父进程返回子进程的Pid,子进程返回0,这是因为父进程和子进程是一比n的关系,因为一个父进程可以用于多个子进程,但是子进程的父进程是唯一的。

int main()
{pid_t id = fork();if(id > 0){while(1){cout<<"我是父进程 pid :"<<getpid()<<" ppid :"<<getppid()<<" id :"<<id<<endl;sleep(1);}}else if(id == 0){while(1){cout<<"我是子进程 pid :"<<getpid()<<" ppid :"<<getppid()<<" id :"<<id<<endl;sleep(1);}}return 0;
}

  

  可以看出父进程对应的id确实就是子进程的Pid,而子进程的id为0,他的父进程正是16918,这两个循环其实是在同时运行的,fork以后进程一分为二,这两个进程共享代码(采⽤写时拷⻉),但是数据是独立的,所以各自拥有各自的id值,也就能够同时进入这两个循环,而不是一会id大于0一会id等于0。所以进程之间有很强的独立性,多个进程直接运行时互不影响,这里可以用一个例子来说明他们的数据独立且互不影响。

int globl=0;int main()
{pid_t id = fork();if(id > 0){while(1){cout<<"我是父进程 pid :"<<getpid()<<" ppid :"<<getppid()<<" globl :"<<globl<<endl;sleep(1);}}else if(id == 0){globl++;while(1){cout<<"我是子进程 pid :"<<getpid()<<" ppid :"<<getppid()<<" globl :"<<globl<<endl;sleep(1);}}return 0;
}

  这里增加了一个全局变量来说明,如果父子进程确实数据独立,那么他们的globl的值应该就是不一样的,运行代码可以看出确实如此。

  这里结合系统调用再说明一下为什么fork以后会出现两个id返回值,这是为了数据的独立性,在fork的过程中,先会将父进程的PCB拷贝给子进程,然后子进程再调整新的属性,将新的PCB连接到进程列表中,此时子进程就已经创建了而不是返回id以后才会创建,所以此时父子进程数据已经独立了,返回的时候根据PCB的属性返回不同的id。


http://www.hkcw.cn/article/YVgJLlAJnn.shtml

相关文章

2025最新版在Windows上安装Redis(仅限开发环境)

使用一位GitHub的博主做的Redis-Windows,截止现在更新到8.0.2 Releases redis-windows/redis-windows GitHub https://github.com/redis-windows/redis-windows/releases 我使用6.2.18版本做例子,使用6.2以上版本,因为一些语法,比如lpop,rpop,zrange,zdiff集合操作比旧版有…

[python]Prophet‘ object has no attribute ‘stan_backend‘解决方法

测试环境&#xff1a; prophet1.1.4 写代码&#xff1a; from prophet import Prophet modelProphet() print(123) 在anaconda prompt里面没有报错&#xff0c;但是打开jupyter notebook会报错Prophet object has no attribute stan_backend&#xff0c;据此猜测jupyter应该…

Python----目标检测(《基于区域提议网络的实时目标检测方法》和Faster R-CNN)

一、《基于区域提议网络的实时目标检测方法》 1.1、基本信息 标题&#xff1a;Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 作者&#xff1a;任少卿&#xff08;中国科学技术大学、微软研究院&#xff09;、何凯明&#xff08;微软研究…

流媒体基础解析:从压缩到传输的基本了解

流媒体&#xff0c;又称为流式媒体&#xff0c;已成为现代网络视频传输的核心技术。其基本原理是将连续的影像和声音信息经过精心设计的压缩&#xff08;编码&#xff09;处理后&#xff0c;妥善存放在网站服务器上。随后&#xff0c;这些压缩后的数据通过网络高效传输至终端用…

【MFC】如何设置让exe的控制台不会跟着exe退出而退出

在 Windows 下&#xff0c;MFC 程序&#xff08;如 echo.exe&#xff09;如果用 AllocConsole 创建了控制台窗口&#xff0c;默认情况下&#xff0c;当主程序&#xff08;exe&#xff09;退出时&#xff0c;控制台窗口也会自动关闭。这是操作系统的行为&#xff0c;不能直接阻止…

图像风格迁移笔记

图像风格迁移 最早实现风格迁移的原理:损失函数内容损失函数风格损失函数融合内容损失函数与风格损失函数可以融合多种风格图片的效果同一个网络可以生成多种风格图像的效果效果改进最早实现风格迁移的原理: 最早出现的论文的实现想法是将风格图像、内容图像、白噪声图像输入…

浏览器隐私:原理与检测方法

引言 浏览器信号和详细信息是在线识别用户和防止欺诈的关键。这些数据包括用户代理字符串、JavaScript设置和屏幕分辨率等信息&#xff0c;有助于区分不同的浏览器。然而&#xff0c;一些用户会有意修改这些信号&#xff0c;使用用户代理欺骗等方法来隐藏自己的身份。虽然一些…

python:在 PyMOL 中如何查看和使用内置示例文件?

参阅&#xff1a;开源版PyMol安装保姆级教程 百度网盘下载 提取码&#xff1a;csub pip show pymol 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 可视化示例‌&#xff1a;打开 PyM…

设计模式——建造者设计模式(创建型)

摘要 本文详细介绍了建造者设计模式&#xff0c;这是一种创建型设计模式&#xff0c;旨在将复杂对象的构建过程与其表示分离&#xff0c;便于创建不同表示。文中阐述了其设计意图&#xff0c;如隐藏创建细节、提升代码可读性和可维护性&#xff0c;并通过构建电脑的示例加以说…

深入Java性能调优:原理详解与实战

一、JVM内存模型与GC机制 原理&#xff1a; 堆内存结构&#xff1a; 新生代&#xff1a;Eden 2个Survivor区&#xff08;Minor GC&#xff09; 老年代&#xff1a;长期存活对象&#xff08;Major GC/Full GC&#xff09; 元空间&#xff1a;类元信息&#xff08;替代永久代…

acwing刷题

目录 6122. 农夫约翰的奶酪块 6123. 哞叫时间 6122. 农夫约翰的奶酪块 #include <iostream> using namespace std; int res; int n, q; int X[1010][1010]; int Y[1010][1010]; int Z[1010][1010]; void solve() {int x, y, z;cin >> x >> y >> z;X…

姜老师的MBTI课程:MBTI是可以转变的

我们先来看内向和外向这条轴&#xff0c;I和E内向和外向受先天遗传因素的影响还是比较大的&#xff0c;因为它事关到了你的硬件&#xff0c;也就是大脑的模型。但是我们在大五人格的排雷避坑和这套课程里面都强调了一个观点&#xff0c;内向和外向各有优势&#xff0c;也各有不…

leetcode hot100刷题日记——34.将有序数组转换为二叉搜索树

First Blood&#xff1a;什么是平衡二叉搜索树&#xff1f; 二叉搜索树&#xff08;BST&#xff09;的性质 左小右大&#xff1a;每个节点的左子树中所有节点的值都小于该节点的值&#xff0c;右子树中所有节点的值都大于该节点的值。 子树也是BST&#xff1a;左子树和右子树也…

使用yocto搭建qemuarm64环境

环境 yocto下载 # 源码下载 git clone git://git.yoctoproject.org/poky git reset --hard b223b6d533a6d617134c1c5bec8ed31657dd1268 构建 # 编译镜像 export MACHINE"qemuarm64" . oe-init-build-env bitbake core-image-full-cmdline 运行 # 跑虚拟机 export …

探索TiDB数据库:WordPress在分布式数据库上的部署实践

作者&#xff1a; 江湖有缘 原文来源&#xff1a; https://tidb.net/blog/359d4e00 引言 在当今数据驱动的互联网应用中&#xff0c;数据库的性能与可扩展性已成为系统架构中的关键一环。WordPress 作为全球最流行的网站内容管理系统之一&#xff0c;传统上依赖于 MySQL 等…

2.3JS变量和数据类型m

1.认识JS变量 变化数据的记录--变量 2.变量的命名格式 在JS中如何命名一个变量呢 变量的声明&#xff1a;在JS中声明一个变量使用var关键字&#xff08;variable单词的缩写&#xff09;&#xff08;后续学习ES6还有let、const声明方式&#xff09; 变量赋值&#xff1a;使用给变…

深度学习总结(41)

微调预训练模型 另一种常用的模型复用方法是微调&#xff0c;如图所示&#xff0c;它与特征提取互为补充。微调是指&#xff0c;对于用于特征提取的已冻结模型基&#xff0c;将其顶部几层“解冻”​&#xff0c;并对这解冻的几层与新增加的部分&#xff08;本例中为全连接分类…

QT入门学习

一: 新建QT项目 二:QT文件构成 2.1 first.pro 项目管理文件&#xff0c;下面来看代码解析 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11TARGET main# The following define makes your compiler emit warnings if you use # any Qt feature …

kaggle 预测房价

利用简单的线性模型&#xff0c;训练kaggle 房屋数据集&#xff1a; import os import random import tarfile import time import zipfile import pandas as pd import requests import torch from torch import nn from torch.utils import data from matplotlib import pyp…

ASP.NET Core SignalR的基本使用

文章目录 前言一、SignalR是什么&#xff1f;在 ASP.NET Core 中的关键特性&#xff1a;SignalR 工作原理简图&#xff1a; 二、使用步骤1.创建ASP.NET Core web Api 项目2.添加 SignalR 包3.创建 SignalR Hub4.配置服务与中间件5.创建控制器(模拟服务器向客户端发送消息)6.创建…