Linux---进程概念

Linux进程的基本概念

1.冯诺依曼体系结构
       冯诺依曼体系结构是现代计算机的硬件体系结构,冯诺依曼体系结构定义了计算机硬件应该包含输入设备、输出设备、存储器、运算器、控制器五大部分。每一部分的主要功能如下:
输入设备:用于数据的采集,例如键盘、鼠标、网卡(网卡接收网络中的信息时就是输入设备)。
输出设备:用于数据的输出,例如显示器、网卡(网卡在传输信息时就是输出设备)。
存储器:用于数据的缓冲,在计算机中内存就是存储器。
运算器:用于数据的运算和处理。
控制器:控制设备的控制。

运算器 + 控制器 = CPU中央处理器

CPU的数据处理机制:计算机中,CPU处理数据时并不是直接从输入设备获取数据,输出数据时也不是直接输出到输出设备,而是通过内存获取数据、输出数据的。这是因为CPU的执行速度非常快,如果每次都直接从输入设备获取数据会降低CPU的运行速度,所以从输入设备获取的数据会先存入内存中,CPU在从内存中读取数据进行处理,而内存的运行速度相对较快同时CPU从内存中读取数据依次可以读取较多的数据,从而提高CPU的执行速度。如下图:
在这里插入图片描述
扩展小常识:
1.为什么要使用内存作为数据缓冲而不是使用硬盘呢(内存的价格比硬盘的价格大很多)?
答:硬盘的吞吐量太低了,一般的机械硬盘的吞吐量大概是200MB/S,而内存的吞吐量是它的数十倍。CPU的执行速度是非常快的,如果使用硬盘会降低计算机的运行速度。
2.内存存储速度快,为什么不使用内存存储数据而是使用硬盘存储数据呢?
答:硬盘和内存的存储介质不同,内存的使用的是易失性介质,断电后数据就会丢失,而我们在存储数据时有些数据是需要长期存储的。而使用硬盘存储数据,虽然速度较慢但是断电数据不会丢失,可以长期保存数据。
2.操作系统
       操作系统(Operation System,简称OS)是安装在计算机上负责管理计算机软硬件资源的程序。可以分为内核外部应用两个部分,其中内核是操作系统的核心功能,负责软硬件管理、内存管理、文件管理…
操作系统如何管理软硬件资源?
       为了防止用户直接访问系统内核而损坏了内核,操作系统不允许用户直接访问系统内核。而是向外提供了一些系统调用接口,每个接口完成固定的功能,用户通过调用这些接口来访问操作系统的内核从而实现对计算机软硬件的管理。
       操作系统向外提供的接口使用起来并不是很方便,因此一些专业人员将部分接口进行封装,封装成库函数来供使用者使用。例如,shell就是通过对接口的封装实现的。
在这里插入图片描述

系统调用接口与库函数的关系:系统调用接口是操作系统提供的访问操作系统内核的接口每个接口都是实现特定的功能的,而库函数封装了这些接口。
3.进程概念
进程:进程就是运行中的程序,但是对于操作系统来说,进程就是一个PCB(进程控制块,描述程序运行状态的信息),是一个程序运行的动态描述,通过PCB才能实现程序的动态运行管理。
CPU的分时机制:
       CPU的分时机制是指,CPU在执行程序时并不会将一个程序执行完在执行下一个程序,而是给一个程序分一个时间片,时间片运行完后由操作系统进行调度,这样轮询执行程序的过程。
       PCB:CPU执行程序时操作系统负责程序的调度,操作系统对程序的调度是通过记录程序的运行状态的信息来实现对程序的调度的。这种动态描述程序运行的信息就称为PCB,即进程控制块。
在这里插入图片描述

Linux系统中,PCB就是一个struct task_struct结构体

PCB信息描述:
       内存指针:能够让操作系统调度程序运行的时候,知道进程对应的指令以及数据在内存中的位置。
       上下文数据:程序运行过程的指令和数据、程序即将执行的指令和数据、操作调度切换进程运行的时候能够让CPU这个进程接着切换之前继续运行,继续处理之前没有处理完的数据。
       程序计数器:也属于上下文数据,保存的是指令的位置,切换回来知道从哪里继续运行。
       标识符:能够让操作系统识别唯一的运行中的程序。
4.进程状态
进程状态:每一个进程中PCB都会描述一个运行状态的信息,用于告诉操作系统进程的运行状态(告诉操作系统这个进程应该干什么)。
前台进程:当前占据了终端的进程。
状态分类:运行、就绪、阻塞
详细分类:
       运行-R:包括运行和就绪,指拿到时间片就可以运行或者正在运行。
       可中断休眠-S:可以被打断的休眠称为可中断休眠。
       不可中断休眠-D:只能等到唤醒条件满足后自然唤醒的休眠状态。
       停止-T:只能手动唤醒。
       僵尸状态-Z:一个进程退出了,但是资源没有完全被释放,而是处于等待处理的状态。
特殊进程
       僵尸进程:处于僵尸状态的进程。
              危害:资源泄露
              产生:一个进程先于父进程退出,父进程没有关注子进程退出状态,导致子进程资源无法被完全释放,进入僵尸状态。
              解决:进程等待—一直关注子进程,子进程退出了就能立刻发现。
       孤儿进程:父进程先于子进程退出,子进程就会变成孤儿进程。
              特性:让出终端,进入系统后台运行,并且父进程称为1号进程。
5.环境变量
环境变量:终端shell中进行系统环境配置的变量。
作用:使系统环境配置更加灵活;通过环境变量向子进程传递参数。
操作指令:env-查看所有环境变量;echo-打印某个变量的内容;set-查看所有变量,不只是环境变量;export-声明定义转换环境变量;unset-删除变量,包括环境变量。

echo $PATH;($表示后边的变量名是一个环境变量) export PATH = $PATH;
注:shell中的普通变量可以起到环境配置的作用,但是无法进行数据传递。

典型环境变量:PATH—存储程序运行的默认搜索路径
        运行一个程序时,如果没有指定程序路径,则shell会在PATH环境变量保存的路径下查找这个程序,如果没有找到就会报错找不到文件,可以将程序的路径加到环境变量中解决找不到报错的问题。
关于环境变量的几个代码操作:

获取环境变量

1.main函数中的第三个参数
2.使用external char** environ;
3.char* getenv(char* key);

设置环境变量

扫描二维码关注公众号,回复: 12428563 查看本文章

1.setenv(char* key,char* val,int override);
2.putenv(char* key = val);

6.程序地址空间
        计算机中,将内存分成不同的区域,用来存储不同的数据。内存分区图如下:
在这里插入图片描述
        地址就是指,为内存中的每一个区域以字节为单位进行编号,通过地址就能找到相应的空间。而程序只有运行后才会占据内存,因此程序地址空间也成为进程地址空间。
什么是进程地址空间?
        进程中所访问的地址都是虚拟的地址,并非真实的物理地址。因此,程序地址空间也是一个虚拟的地址空间。虚拟地址空间通常由操作系统通过mm_struct 结构体进行创建。

mm_struct(task_size,start_code,end_code)—通过大小以及区域的编号进行描述

为什么要使用虚拟地址空间?
1)程序在编译时,编译器就会给指令和数据进行地址编号,但是如果某个地址暂时被占用,则这个程序就无法使用该内存(可能该程序在这个内存被使用完后才会使用这块内存)。直接使用物理地址,很难动态知道内存使用情况,这样编译器就不方便处理。
2)进程直接访问物理地址,如果存在一个野指针,就有可能直接将某个程序的数据改变了,造成程序运行问题。
3)程序的加载通常需要使用一块连续的内存,如果直接使用物理内存,内存的利用率就会比较低。
4)通过虚拟地址空间,将物理地址映射在虚拟地址上,可实现数据的离散存储,从而提高内存的利用率。
5)使用虚拟地址,每一个进程都拥有自己一块连续的空间。
注:进程加载时,一般要使用一块连续的空间,但是这块空间内数据的存储可以是离散的。因此,即实现了数据在内存中的离散存储,又保证了内存的连续。
如何通过虚拟地址找到物理地址?
1)操作系统管理内存的方式
a.分段式
        将虚拟地址分成段号和段内偏移两部分,通过段号对应的段和段内偏移组成一个完整的物理地址,找到对应的物理存储单元。
在这里插入图片描述
特点:对编译器比较友好,方便编译器进行内存管理;由于分段式中,每一个段内数据必须连续存储,因此,分段式没有解决物理地址连续的问题。
b.分页式
        分页式和分段式类似,只是在分页式中不要求每一页内数据连续存储。
在这里插入图片描述
特点:因为通常物理块比较小,而且不要求同一个进程的多个数据在同一块内,因此分页式实现了数据的历史那存储,提高了内存的利用率。同时,在分页式中页表会在内存访问时进行内存访问控制。
举例:
在这里插入图片描述
c.段页式
        段页式集合了分段式和分页式的优点,是的内存管理更加方便,段页式也是目前使用最多的一种管理方式。
2)父子进程举例分析

猜你喜欢

转载自blog.csdn.net/qq_47406941/article/details/110441519