< Linux >:Linux 进程概念 (1)

目录

本章重点:

一、冯诺依曼体系结构

二、操作系统(Operator System)

2.1、概念

2.2、设计 OS 的目的

2.3、定位

2.4、系统调用和库函数的概念

三、进程

3.1、进程的基本概念

3.2、描述进程 - PCB

3.3、struct task_ struct 结构体成员变量列表

3.4、组织进程


本章重点:

1、认识冯诺依曼系统,理解冯诺依曼体系结构在硬件角度上的数据流走向的问题、

2、操作系统概念与定位,了解一下操作系统是如何进行管理的、
3、深入理解进程的概念,理解为什么存在 PCB ,什么是 PCB ,和 PCB 的周边概念、
4、学习进程状态,学会创建进程,掌握僵尸进程和孤儿进程,及其形成原因和危害、
5、了解进程调度,Linux进程优先级,理解进程竞争性与独立性,理解并行与并发、
6、理解环境变量,熟悉常见环境变量及相关指令,getenv / setenv 函数、
7、理解 C 内存空间分配规律,了解进程内存映像和应用程序区别,认识地址空间、
8、选学Linux2.6 kernel,O(1) 调度算法架构、

一、冯诺依曼体系结构

         我们常见的计算机,如笔记本,我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系,体系结构相当于计算机硬件的骨架,决定了计算机硬件如何进行组织在一起,再赋予其软件,使得软硬件配合,最终形成一台计算机,冯诺依曼体系结构图如下所示:

冯诺依曼体系结构内容包括如下五大部分(硬件组件):

1、输入设备:键盘,鼠标,扫描仪,写板,话筒,摄像头,磁盘,网卡等等,当进行部分文件操作时,本质上就是把磁盘当做了输入设备,计算机的存储器主要分为内部存储器和外部存储器,内部存储器主要是指内存,存取信息的速度快,断电后所存储的内容全部丢失,而外部存储器主要是指磁盘,存储信息不受断点的影响,存取速度相对内存来说会慢很多,磁盘又分为硬盘和软盘,当从磁盘中读取数据时,磁盘充当输入设备,当向磁盘中写入数据时,磁盘充当输出设备、

2、输出设备:显示器,打印机,音响,磁盘(ROM),网卡,显卡等等,其中:输入输出设备都是外设、

3、存储器:本质上就是内存(RAM),其存在的原因:(1):从技术角度来看:存储设备有很多种,但是在存取速度方面会有差别,比如:CPU的运算/存储速度  >  寄存器的存取速度  >  CPU内部中的各种缓存(Cache,即:硬件在CPU系统中所集成的),即:L1-L3Cache 的存取速度  >  内存的存取速度  >>  外设(比如:磁盘)的存取速度  >>  光盘/磁带的存取速度  ,其中:CPU 的运算速度比内存的存取速度大概快100倍,CPU 是做计算用的,而内存是做存储用的,所以这两者比速度是怎么比的呢,其实,所谓的 CPU 运算速度比内存存取速度快,是指:通过 CPU 中的计算单元访问 CPU 中的内部计算器,如果这个速度是1纳秒,那么通过 CPU 中的计算单元访问内存的速度就是100纳秒,其次:CPU,寄存器,缓存的存取速度都是纳秒级别,而内存是微秒级别的,外设就是毫秒甚至是秒级别的,在冯诺依曼体系结构中,若不考虑存储器(内存)的存在,输入设备和输出设备就会导致整个计算机体系的运作速度比较慢,效率很低,从数据角度来看,外设不与 CPU 直接交互,但并不排除外设与 CPU 之间有一些控制信号的交互,目前暂时不考虑,而是外设和 CPU 直接与存储器(内存)进行交互,当中央处理器想做数据计算时,此时可以直接把数据从输入设备预加载到存储器,由上可知,则整个计算机体系的效率取决于存储器(内存),不再取决于外设(输入输出设备),存储器具有一定的数据暂存的能力,一般就是4G或8G,虽然内存空间不是很大,但是能起到很重要的作用,正是因为有存储器(内存)的存在,从而使得软件的存在具有更大的意义,比如:当在开机时,就是把操作系统加载到对应的存储器中,此时外设中的相关的数据就可以被操作系统进行管理,由此可知,由于存储器的存在,从硬件上,具有更好的适配外设和 CPU 之间运行速度不均衡的特点,其次,使得软件的存在更具有意义和价值,在硬件角度上,存储器就是体系结构中的一个大的缓存,该缓存主要用来适配外设与CPU 运行速度不均衡的问题,(2):从成本角度来看:寄存器  >>  内存  >>  磁盘(外设) 、

4、(运算器和控制器)(中央处理器/CPU):CPU 内部集成了许多的寄存器,寄存器就是一些存储单元,用各种各样的触发器来完成数据的0,1序列的存储,在底层中,当数据电路交互时,寄存器能够保存对应的数据,寄存器的速度非常快,其次:运算器主要承担了运算的能力,包括算术计算和逻辑计算,控制器也是一个硬件,外设只是不与 CPU 在数据上直接进行交互,但不代表外设不与CPU 直接进行交互,我们知道,数据通过输入设备预加载到内存只是大概率的情况下,但不代表会存在小概率的情况,数据并未通过输入设备被预加载到内存,此时,中央处理器就会与外设进行直接交互(不是在数据上),类似于催促输入设备尽快将数据加载到内存,所以,中央处理器还要能够执行一些协调数据流向,何时流,流多少这样的问题,这就是由控制器来直接控制外设(输入输出设备)的,运算器和控制器本身有计算能力,中央处理器只是一个具有运算和控制能力的提线木偶,真正让中央处理器去完成计算和某些控制的是:软件(主要是指操作系统OS),几乎所有的硬件只能被动地完成某种功能,一般不能主动地完成某种功能,这句话严格来说不是很准确,目前先这样理解,一般都是要配合软件(主要是指操作系统OS)来完成某种功能的,操作系统是软件,并没有任何功能性的能力,只能通过硬件的手段来完成某些功能,计算机是一种软硬件结合的非常好且重要的产品、  

        在计算机中存在的一些设备,不是输入设备,就是输出设备,除了内存之外的存储设备都是外存,一般来说,除了内存之外,剩下的就是外设了,外存是充当输入输出的一种存储设备,外存最常见的就是磁盘,具有数据存储能力的不仅仅只有磁盘(企业中常用的机械磁盘),还有SSD(固态硬盘),光盘,磁带等等,计算机中存储器(内存)的存在本质就是:使用较少的钱,能够获得较高的性能,当然也存在比冯诺依曼体系结构效率更高的体系结构,但是综合考虑,冯诺依曼体系结构是最合适的,Cache 缓存是一种技术,不属于冯诺依曼体系结构的必要组成部分,冯诺依曼体系结构计算机的基本原理是存储程序和程序控制,因为内存的存在,可以预先装载一些常见的内存管理软件,数据管理软件,就可以将数据以预加载的方式提前放到存储器中、

        操作系统可以将外设(输入设备)中的数据预加载到存储器中,比如:我们自己写的程序,经过编译链接后形成可执行程序,要运行,则必须要先加载到内存,这是由体系结构所规定的,是因为:在数据角度上,CPU 只和存储器直接进行交互,而我们由编译链接形成的可执行程序本质上就是一个普通文件,该普通文件存在于磁盘(外设)上,因此必须将该可执行程序通过输入设备(磁盘)先加载到存储器,才能被 CPU 读取,让 CPU 根据在内存中的代码和数据执行取指令,分析指令,执行指令这样的基本的指令流来完成对代码的执行和计算的执行,因为,CPU 只会从存储器中读取指令,代码和数据,当想要但还未运行该可执行程序时,此时数据可能早就已经通过输入设备(磁盘)被预加载到了存储器中了,在该过程中,CPU 并未停止工作,而是在进行其他的计算,此时,该预加载过程与 CPU进行其他计算的过程是同一时间段进行的,所以效率会变高,很多数据都是由操作系统提前预加载到内存中的,在开机时,本质上就是把操作系统加载到内存中,因为 CPU 还会执行操作系统的代码,当操作系统加载到内存完成后,在软件层面上,我们就可以预先把我们要访问的数据加载到内存中,比如:当我们刚读取某一个文件中的数据,但数据还未读取完时,有可能该文件中的数据早已被操作系统预加载到了内存中,或者是:我们仅仅是打开了磁盘中某一个文件,但是还未对该文件中的数据做任何读取,此时操作系统就可能会把该文件中的所有的数据全部预加载到内存中,这就是操作系统预加载的特点,操作系统预加载数据取决于局部性原理,因为局部性原理的存在,当访问某些数据时,大多数情况下,都是把这些数据周边的数据都预加载到内存中,这就是操作系统预加载数据的根本理论基础,也存在一小部分情况不是这样的,但大多数情况都是,因为,执行的大部分代码或访问的大部分数据都具有很强的聚集性,比如大部分代码都是顺序结构,只有当特别需求时才不是顺序结构,即使这样,相对来说代码也都是在一块的,有着很强的聚集性,当我们刚启动电脑时,可能比较卡,但是用一段时间后就比较快了,这就是局部性原理在起作用,注意:磁盘中的可执行程序一般不会进行预加载,预加载可以理解成全局变量在哪里进行定义和初始化,预加载是在进程启动时被执行,一般系统中多应用共享的资源会被列为预加载资源,预加载的好处就是在于系统只在进程启动时进行一次加载操作,所有应用用到的该资源就不再需要重新加载,减少资源加载耗时,一般都是先运行可执行程序,然后该可执行程序中链接的一些库或者数据存在预加载,当运行可执行程序时,操作系统甚至有可能根本就没有把磁盘中的可执行程序加载到内存中(目前我们先不这样理解,具体的在后面再进行阐述),而是先在内存中建立与进程相关的内核数据结构,然后再把形成该进程所需要的的代码,即磁盘中可执行程序中的代码,数据等,分批进行加载到内存中,然后通过页表创建映射,在分批加载时,他就有可能对磁盘中的可执行程序做一个类似于将其加载到内存中的这样的过程,最后填写内核数据结构所有的属性数据信息,具体的过程就不再进行阐述,可以百度了解一下、

        实际上,计算机为了提高整机性能,在中央处理器和存储器交互过程中还加了很多其他的一些优化策略,比如:添加了寄存器和缓存等等,不考虑缓存的情况,在数据角度,CPU 能且只能直接和内存交互,而不能直接和外设(输入输出设备)进行交互、

        在计算机中,可以把决策和执行理解成分离的,管理者做决策,执行者做执行,所谓管理的本质,不是对被管理对象进行直接管理,而是只要拿到该被管理对象的相关数据,对该数据的管理就可以体现出对该被管理对象的管理,对该数据的管理也可以转换为对某种数据结构的管理,此时,操作系统充当管理者的身份,硬件充当被管理对象的身份,驱动充当执行者的身份,Linux 操作系统(内核)是用 C 语言写的,管理的核心理念就是:对所有的被管理对象先进行描述(使用 struct 结构体),再进行组织(用链表或者其他高效的数据结构),计算机不管是管理软件还是管理硬件,都是先进行描述,再进行组织、


二、操作系统(Operator System)

2.1、概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS),笼统的理解,操作系统包括:
1、内核( 进程管理,内存管理,文件管理,驱动管理),操作系统有四个重要的管理任务:内存管理,进程管理,文件管理,驱动管理、
2、其他程序( 例如函数库,shell 程序等等)、

2.2、设计 OS 的目的

与硬件交互,管理所有的软硬件资源,为用户程序( 应用程序 )提供一个良好的执行环境、

2.3、定位

在整个计算机软硬件架构中,操作系统的定位是:一款纯正的 " 搞管理 " 的软件、
操作系统管理结构图( 用户操作接口再加上图形化界面 ):  

        上图中的底层硬件在底层都是以冯诺依曼的结构去组织好的,我们所看的冯诺依曼体系结构是逻辑图,而在真实情况中,所有的硬件都是在主板中,内部电路是嵌入在主板之中的,还有一些周边的概念可以不了解,几乎每一种硬件都有与自己对应的驱动程序来进行对硬件的相关操作,而操作系统在系统层面上对内存中对各种数据或资源进行管理,最核心的就是内存管理,进程管理,文件管理,驱动管理,我们主要对进程管理,部分文件管理,和少量的内存管理进行研究,操作系统不仅可以管理硬件,也可管理软件,此处所谓的软件指的是宏观上的软件,不仅仅只是在电脑上安装的一些客户端,在操作系统内部也有很多如进程,文件等,也需要被操作系统进行管理的,最重要的就是对进程的管理、

操作系统为什么要对外进行服务呢?

        此处所谓的服务是软硬件层面上的概念,比如我们刷抖音,并不能只认为是抖音为我们提供了服务,很多功能比如刷抖音都是间接通过操作系统来完成的,即很多功能都是间接通过操作系统为我们提供的服务,比如:所谓的打印就是指把数据写到硬件(显示器)上,我们只能使用 printf 库函数和 cout 标准输出流将数据写入硬件(显示器),只有他们才有资格,如果我们不调用 printf 库函数和 cout 标准输出流,我们自己写的程序代码没有资格向硬件写入数据,因为硬件的管理者是操作系统,驱动硬件做事情的是驱动程序,用户是没有资格越过所有的软件,直接访问硬件,进行数据的写入的,因为硬件的管理者是操作系统,用户要想将数据写入到硬件中,只能通过操作系统来完成这一项任务,即用户经过无数层软件层,才能向硬件中写入数据,操作系统对外提供服务是因为:计算机和操作系统设计出来就是为了给用户提供服务的,否则他们的设计是毫无意义的、

操作系统是如何对外提供服务的呢?

        在操作系统中,操作系统不相信任何用户,因此操作系统并不会将自己所有的数据结构,结构体,代码,逻辑,其他数据相关的细节,直接全部暴露给用户,避免因用户恶意或非恶意的误操作导致修改了操作系统中的内容,避免影响操作系统的稳定性,因此操作系统对外提供的所有服务都是通过系统调用的方式来对外提供操作系统方面的接口,要防止少数用户,又要给多数用户提供服务,所以操作系统是通过给用户提供接口的方式来让用户调用操作系统的功能,此处所谓的接口就是:Linux 内核是使用 C 语言写的,这里所谓的接口本质上就是指使用 C 语言来给我们提供的函数调用接口,我们把这样由操作系统提供的接口称为系统调用,我们学习系统编程本质就是在学习这里的系统调用,Windows 和 Linux 系统下的系统调用接口是不一样的,语言标准库会自动解决不同操作系统下系统调用接口不一样的差异,因为,像 C/C++ 等具有跨平台性的语言不仅适用于Windows 系统,还适用于 Linux 系统,在 Windows 系统下,则语言标准库会自动使用 Windows系统的系统调用接口,而在 Linux 系统下,则语言标准库会自动使用 Linux 系统的系统调用接口,所以上层并不需要考虑这些问题,比如不管在 Wiodows 还是 Linux 系统下,我们只需要写好C/C++ 程序即可,从而在不同的操作系统下表现出相同的功能,语言标准库会自动解决系统调用接口的选择问题,类似于多态,如果出现了一个新的操作系统,则语言的标准库需要兼容这个新系统、

        在计算机中,如果直接使用系统调用接口是比较困难的,一般小白,小灰和初级工程师不会使用,在操作系统层面上,会存在图形化界面供小白使用,存在命令行解释器供小灰使用,由图形化界面和命令行解释器来帮小白和小灰去进行这些系统调用,从而降低访问操作系统的成本,而对于初级工程师而言,他比小白和小灰要强一点,初级工程师要进行编程,则需要有各种各样的功能,从而给初级工程师一个第三方 lib 库,比如:有一种第三方 lib 库是 C/C++ 标准库,从而使得初级工程师自己写 C/C++ 代码再结合 C/C++ 标准库,由标准库去帮助初级工程师访问底层的系统调用接口,当我们使用 C/C++ 标准库中的接口时,只要发现该接口要访问各种各样的硬件时,则此时底层一定存在系统调用,如果没有访问硬件或者没有直接访问像外设那样的硬件时,此时底层不一定存在系统调用,比如求 10+20 等简单的运算,在 CPU 上就能够直接完成,虽然 CPU 也是硬件,但是它比较特殊,我们暂时理解成此时接口就没有访问硬件或者没有直接访问像外设那样的硬件,存储器也是硬件、

        如何直接使用操作系统中的系统调用接口呢,此处所谓的直接使用操作系统中的系统调用接口其实并不是真正意义上的直接使用,而在实现某些功能时还是需要使用到第三方 lib 库的,具体的在后期会进行阐述、

2.4、系统调用和库函数的概念

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

三、进程

3.1、进程的基本概念

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

        我们自己写的程序,经过编译链接后形成可执行程序放在磁盘中,可执行程序是一个普通文件,磁盘就是一个外设,当 CPU 要运行该可执行程序时,则必须要先通过输入设备(磁盘)将该可执行程序加载到内存,现在 CPU 可以直接与内存进行数据上的交互,即:CPU 可以运行该可执行程序了,因此,当把该可执行程序通过输入设备(磁盘)加载到内存中时,此时我们便可称该可执行程序被运行起来了,但是要注意,此时被加载到内存中的可执行程序不能称为进程,此时不管在磁盘中还是在内存中的可执行程序,都是程序,都是一个普通文件、

        在操作系统中,可能同时存在多个进程,因此操作系统需要将所有的进程管理起来,此时,操作系统对进程的管理本质上就是对进程数据的管理,由于同时存在多个进程,所以,当操作系统对所有的进程进行管理时,也需要进行对所有的进程先描述,后组织,要注意:当可执行程序被加载到内存中时,不要只认为操作系统就只是把可执行程序加载到了内存中,操作系统还要为了管理进程创建对应的数据结构,此时的操作系统是 Linux 操作系统,Linux内核是使用 C 语言写的,所以在Linux 系统中,要进行进程管理需要先描述,再组织,而描述一个进程则需要使用 struct 结构体来进行描述,即:struct task_struct,该 struct 结构体中包含了进程的所有的属性数据,因此,操作系统对进程的管理,变成了对对应的 Linux 内核数据结构的管理,根本就不是对加载到内存中的可执行程序的管理、

        所谓的进程就是:进程等于加载到内存中的可执行程序(代码及数据)加上该进程对应的内核数据结构(该进程对应的描述该进程所使用的 struct 结构体(task_struct),其也存在于内存之中)的组合,在操作系统学科中,把描述进程所使用的 struct 结构体称为 PCB (Process Control Block),PCB 又被叫做进程控制块,而在 Linux 系统下,具体的进程控制块叫做 task_struct ,而所谓的把进程组织起来就是把描述进程的进程控制块组织起来,每个进程都要有对应的 struct task_struct 结构体,因为这个结构体是操作系统为了管理进程而描述进程所设计的结构体类型,当有一个进程加载到内存时,操作系统在内核中一定会为该进程创建对应的 struct tsak_struct 类型的结构体变量,并把该变量链入到全局的链表(双向链表)中,Linux 内核确实是使用链表进行链接的,但不止这一张链表,操作系统要删除某一个进程可以通过遍历该链表,找到该进程的 PCB 和对应的加载到内存中的可执行程序(代码及数据)全部释放即可(同时也会释放该进程对应的进程地址空间(在Linux操作系统下即为该进程对应的:struct mm_struct)),操作系统对进程的管理就变成了对链表的增删改查、

        进程:进程等于加载到内存中的可执行程序(代码及数据)加上该进程对应的内核数据结构( 该进程对应的描述该进程所使用的 struct 结构体(task_struct) ),进程也叫做任务,进程是动态的过程,该加载到内存中的可执行程序和描述该进程所使用的 struct 结构体的结构体名字或标签是通过 map (非STL容器中的 map ,是系统上的一个概念)进行连接的,在后期的进程地址空间再进行讲解,其中:内核数据结构有:task_struct,mm_ struct,page table 等等,而 Linux 系统中的内核数据结构则是:task_struct ,task 就是任务的意思,当我们打开一个浏览器,启动一个游戏,打开一个阅读器,这就叫做新启动的一个任务,因此,任务是用户启动的,而该任务是程序员写的,用户把程序员写好的任务启动起来,这就叫做进程,所以在我们的系统里就是进程在帮我们完成看电影,打游戏,逛淘宝等等,对于结构体名字或结构体标签 task_struct 是 Linux 系统下特有的,在操作系统中,把进程控制块叫做 PCB ,task_struct 是具体的一种进程控制块 PCB ,所有的操作系统描述进程时使用的都是进程控制块 PCB ,在操作系统中统称为 PCB , 在 Linux 系统下有 PCB ,在 Windows 系统下也有 PCB ,每个操作系统下的 PCB 在他们自己的代码中的识别是有区别的,在 Linux 系统下的进程控制块 PCB 再细化就是所谓的结构体名字或结构体标签 task_struct ,结构体名字或结构体标签 task_struct 是一款具体的进程控制块 PCB 、

Linux 内核版本 2.6 部分源代码:

3.2、描述进程 - PCB

        进程的所有的属性数据信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性数据信息的集合,课本上称之为 PCB ( Process Control Block ),Linux 操作系统下的 PCB 是指:task_struct ,在 Linux 中描述进程的结构体的的结构体名字或标签叫做 task_struct ,task_struct 是 Linux 内核的一种数据结构,它会被装载到 RAM(内存) 里并且包含着进程的所有的属性数据信息、

3.3、struct task_ struct 结构体成员变量列表

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

基于上述所阐述的理论,在后面会通过使用编码来获取相关的属性、

3.4、组织进程

        可以在 Linux 内核源代码里找到它,所有运行在 Linux 系统里的进程都以 task_struct 链表(双向链表)的形式存在 Linux 内核里,在操作系统内,帮我们完成一些业务的就是进程,进程是每个操作系统中都存在的,并不单独存在于 Linux 操作系统中、

1、进程与程序不一定是一一对应的,一个程序可以同时运行多次,也就有了多个进程、

2、进程与作业不一定是一一对应的,因为一个作业任务的完成可由多个进程组成,且必须至少由一个进程组成、

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脱缰的野驴、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值