• Linux基础内容(10)—— 进程概念


    目录

    1.冯诺依曼体系结构

    ​编辑1.冯诺依曼体系特点

    2.cpu运算原理

    3.数据传输

    2.操作系统

    1.操作系统管理的真相

    2.操作系统与硬件的交互方式 

    3.操作系统与用户的交互方式

    1.系统调用接口

    2.用户对系统调用的使用

    3.进程

    1.进程的概念

    2.Linux中的进程

    3.与进程有关的系统调用

    1.子进程

    2.父进程 

    3.子进程创建


    1.冯诺依曼体系结构

    1.冯诺依曼体系特点

    1.存储器指的是内存,失电易失;

    2.外存是刨去内存的一切存储结构,他们是属于外设的;

    3.外设是输入设备和输出设备总和,磁盘和网课既是输入又是输出设备;

    4.运算器+控制器+寄存器+其他 组成了中央处理器;

    2.cpu运算原理

    首先我们得明白,cpu所提供的功能是计算。那么当我们将代码给cpu时,cpu看不懂编程语言,它只看得懂机器语言,当代码翻译为机械语言后,进行运算。cpu内部设计就有对应的指令集,我们做的代码无非就是被划分为指令集上对应的指令依次执行而已。

    3.数据传输

    1.cpu的读取数据速度最快,内存的读取速度较快,外设的磁盘读取速度较慢;

    2.cpu在读取和写入时,在数据层面上只和内存打交道,其目的是为了加快效率;

    3.内存的数据并非天生就有,它无电易失,内存想要存在数据就必须在磁盘的读取得到;

    内存提前找磁盘中需要的数据载入,等cpu读取内存数据时就可用直接用;这样运行效率高;即cpu不与外设直接沟通,只与内存打交道。


    2.操作系统

    操作系统是一个进行软硬件管理的软件

    1.操作系统管理的真相

    管理的原因:

    通过对软硬件的管理为用户提供安全高效稳定的执行环境

    如何管理?

    计算机体系的各部分以冯诺依曼体系结构作为依据,相互链接

    操作系统不需要和软硬件直接交互,通过管理软硬件的数据,并且对数据进行决策

    2.操作系统与硬件的交互方式 

    那么便有了些问题,既然硬件不与操作系统直接交互,操作系统怎么拿到数据呢?又是怎么对数据进行改变,使得硬件执行呢?

    答案是:驱动,驱动在操作系统和硬件之间起到“桥梁作用”,操作系统通过驱动收集硬件的数据,硬件又是根据驱动传达的操作系统的指令进行执行命令。

    硬件中的数据非常多,海量信息对于操作系统的处理和存放都是非常困难的。虽然数据很多,但是我们发现数据中的种类都是差不多的,那么操作系统可以定义并且描述数据变出一个类,抽象出类型,所有数据都一样的数据类型,使得我们管理数据本身只需要管理数据对应的结构体即可。那么访问结构体也非常方便,我们只要对结构体中存放对应的指针,我们可以通过指针得到数据具体存放在哪。此外,软件(操作系统)不仅仅管理硬件,也管理软件,即对自己内的功能模块进行管理。

    此时我们会发现:管理数据的操作分为两步1.描述数据变为抽象的类以便管理2.描述类使得得到数据的管理。

    3.操作系统与用户的交互方式

    1.系统调用接口

    用户想和操作系统交互不能直接访问,这是因为系统本身结构决定的,操作系统本身需要被保护起来。但是如果完全封闭那用户不能交互,所以操作系统还需要对用户提供调用接口使得用户访问操作系统而不可以做出非法操作。

    这样的接口调用被叫做:系统调用;它是操作系统本身提供给用户的。

    2.用户对系统调用的使用

    用户操作界面:不过上面的系统调用是不够的,因为调用的函数也需要从二进制语言转化为人能看得懂的语言进行使用,所以用户为了利用系统需要shell、c/c++的库函数等进行执行,也有更加直观的可视化界面通过点击就可调用的工具。


    3.进程

    1.进程的概念

    定义:一个加载到内存的程序叫做进程;进程是具有动态属性的,但是程序是代码是静态的。

    那么我们知道,程序都是先存储在磁盘里的,想要变成进程必须进入到内存中。那么内存也有很多的进程需要加载,这时就需要操作系统进行组织管理,所以操作系统又需要对所谓的硬盘中的数据进行描述再组织。那么操作系统为了描述进程引出PCB的概念。

    PCB:进程控制块;是一种结构体,用来描述进程的数据的类型。 

    PCB是对进程的优先级别和具体操作的规定。操作系统对进程描述为PCB后,传回PCB的指针,通过对进程的属性进行对应的操作。

    操作系统从对进程管理变为了对PCB管理(即指定链表的增删查改)

    本质:进程=内核数据结构+对应的磁盘代码

    2.Linux中的进程

    ps ajx:显示当前用户的进程

    1.首先我们创造了一个一直在while循环的myproc代码,执行该文件后,myproc变成了进程,我们通过管道过滤需要显示的进程:ps ajx | grep “myproc”找到对应进程名字。

    2.过滤其他进程名,我们得到两个关于该程序的进程,上面的是执行myproc的代码,下面的是grep找myproc的执行代码。

    3. 为了更加直观,我们把头部也打印出来,观察对应的属性:ps ajx | head -1

     4.kill -9 对应的PID:杀掉正在运行的进程

    我们会发现,所谓进程具有动态属性就是进程在被执行,表现的形式就是不断的刷新着自己的任务代码。

    另外一种显示

    ls /proc/:显示进程

     进程存在时,会出现一个pid对应的文件夹放在/proc中

    进入到对应的文件夹;此时会发现该进程的属性都在之中。

    此外,如果此时删除进程对应的文件代码,会发现进程还在进行。意味着当程序加载到进程中时,进程已经独立于文件,在内存中进行执行。删除进程,proc中对应的pid文件也会消失

    3.与进程有关的系统调用

    1.子进程

    getpid():得到该进程对应PID。

    man手册的getpid说明

    1.为了直观调用,写了一个代码用来显示PID

     

    2.显示pid

     

    3.杀死进程

    4.进程停止了

    2.父进程 

    getppid():得到该进程的父进程对应的PID。

    man手册对getppid的说明

    运行文件变为进程,我们发现:该进程的pid每次执行都会变为不同的值,而对应的父进程的pid却不变

     搜索19011对应的文件

     我们发现父进程对应文件是bash(命令行解释器):该进程就是shell

    至于为什么shell要设立子进程来调用代码的原因是:因为shell如果执行错误的代码会对shell有威胁,为了避免这种威胁,放设子进程来执行,就算错误了,也不会对shell有影响。shell在登陆时就带有这个进程,所以ppid只会在退出后又进来才会变化。

    3.子进程创建

    fork():创造一个子进程

    man手册对fork的说明 

    fork()在函数执行前,其实优先执行了对应的父进程,然后开始执行子进程。

    演示:

     

    上一个进程信息是该文件的,下一个进程信息是fork出来的。fork的父进程是该文件的子进程,该文件的父进程是bash进程。 

    fork的返回值又两个,调用成功返回pid给父进程,0给子进程

    言外之意,fork()函数调用时同时会有两个进程:父进程和子进程。fork()后父子进程共用代码,执行代码的其中一部分。

  • 相关阅读:
    Three.js做了一个网页版的我的世界
    PostgreSQL常用的领域和用例
    聊聊 QianKun JS 沙箱的那些事
    易云维®智慧工厂数字化管理平台助推工业制造企业数字化转型新动能
    如何用chatGTP function calling 写sql query,附代码!
    Nginx安装与虚拟主机配置shell脚本
    【前端】jQuery-概述+基本使用+常用API
    k8s-生产级的k8s高可用(2) 25
    从0-1,使用腾讯OCR进行身份证识别
    接口和抽象类的区别详解
  • 原文地址:https://blog.csdn.net/m0_63488627/article/details/127672248