8Linux进程(Linux系统阶段)-创新互联

Linux下一切皆文件。 

10余年创新互联公司网站建设,由一走到现在,当中离不开团队顽强的创业精神,离不开伴随我们同行的客户与专业的合作伙伴,创力信息一直秉承以“见一个客户,了解一个行业,交一个朋友”的方式为经营理念,提出“让每一个客户成为我们的终身客户”为目标,以为用户提供精细化服务,全面满足用户需求为宗旨,诚信经营,更大限度为用户创造价值。期待迈向下一个更好的10余年。
一、进程概念 1.硬件结构(冯诺依曼结构)

内存的存储介质是一种易失性介质,断电数据丢失。但内存的吞吐率非常高,因此适宜做中间缓冲带使用磁盘实现数据的持久化存储。

其实所有的设备都是围绕存储器工作的,存储器进行中间的数据缓冲。

2.操作系统:一个完整的操作系统包含内核+应用

定位:让计算机更加好用

功能:管理计算机上的软硬资源

管理:管理体系

但是系统调用接口功能相对单一,所以加入了库函数以下

系统调用接口:操作系统向上层提供的用于访问系统内核的接口

库函数:针对某个功能,使用大量的系统接口进行封装而成的函数接口

库函数和系统调用接口关系:库函数内部实际上就算调用了系统调用接口完成功能

3.进程的概念(重点)

进程就是运行中的程序。或者说在操作系统的角度,进程实际上是一个系统对于程序动态运行的描述,通过这个描述操作系统才能实现对于程序运行的管理。这个,描述是pcb进程控制块,在Linux下是task_struct结构体。

应用程序:就是程序员所写的代码程序。

代码程序:一堆硬盘上固定指令,运行程序就是让cpu去处理的程序指令。

运行程序:首先要将程序从硬盘上加载到内存中,cpu从内存指定位置开始处理。

并发:循环一个一个处理

并行:同时运行

cpu的分时机制:我们有多个程序同时运行,但是cpu(单核)只有一个,也就是说同一时间只能处理一个程序。cpu的分时机制就是,将cpu对于任务的处理进行划分,让每一个程序的指令和数据在cpu上只运行一段很短的时间(时间片),时间片运行结束,则切换到下一个程序。时间片很短,就给人一种同时运行的感觉。

那么,当运行切换回来的时侯,我怎么知道上一次运行到哪里??? 

因为程序是切换调度运行的,所以我们的系统必须能够知道每个程序要运行的代码和数据在内存哪里。

因此,操作系统对于每一个程序运行都进行了一个描述,描述了当前程序在内存的位置,以及切换时的上下文数据信息,就是描述的是整个程序的运行信息。而这个运行信息是pcb进程控制块

操作系统就是通过这个描述信息实现对于程序运行调度管理的。

描述信息:内存指针,上下文数据,程序计数器,进程状态,io信息

总结:进程就是操作系统对于程序运行的动态描述,叫做pcb进程控制块,在Linux下通过task_struct结构体进行实现,其中包含的各种对于程序运行的描述信息,通过这些信息,操作系统实现对于系统运行,以及系统管理。

二,进程状态

进程状态就是告诉操作系统,如何去调度进程,让程序运行更好。

Linux下的进程状态:

  • 运行态-R:包含了就绪和运行,指的是正在运行的和拿到时间片运行的都是运行
  • 可中断休眠态:休眠态,一种暂时不需要被调度运行的状态(休眠是可以被打断进入运行态的,要么满足自动唤醒进入运行态)
  • 不可中断休眠态:休眠态,一种暂时不需要被调度运行的状态(休眠是不可以被打断)
  • 停止状态:一种能够被调度,但是什么都不做的状态
  • 僵死态:进程退出了,但是资源又没有完全被释放的状态
  • 僵尸进程:僵尸态的进程,退出了但是资源又没有完全被释放的进程,是一种待处理状态
1.僵尸进程

一个进程退出了,进程会有一个退出原因保存在pcb中,因此当进程退出后,pcb不能直接被释放,因为要保存退出原因,因此退出前通知父进程,但是父进程因为某种原因无法收到,因此这个进程就一直处于一种资源没有完全释放的待处理状态。


僵尸进程的危害:资源泄露(占据的内存没有完全释放,一个用户所能创建的进程数量是有限的)

如何退出僵尸进程:僵尸进程是杀不死的,所以可以把父进程杀死(因为子进程的退出原因就是给父进程保留的)

如何避免:进程等待

进程查看指令:ps -ef        ps-aux

杀死进程指令:kill pid        kill -9 pid强制杀死

cpu使用率查看:top

运行状态:遇到某些操作条件不满足,进入阻塞状态(条件满足了再来唤醒我运行),当cpu调度时,阻塞状态则查看条件是否满足,满足则置为运行状态,不满足则切换。而可中断休眠时刻被打断的,一旦被打断,也会进入运行状态。

我们在终端运行的指令或者程序,他们的父进程都是shell-bash进程,而这个进程,一旦他的子进程退出了,立即就会去处理,因此所运行的程序退出了不会成为僵尸进程。

创建一个子进程:

  pid_t fork(void);

通过复制调用进程,实现创建一个新的进程。(进程就是pcb,Linux下就是一个task_struct结构体)

解释:创建子进程就是创建一个新的结构体,复制父进程就是复制了父进程pcb中的大部分信息(内存指针,上下文.......)

  • 复制了内存指针,意味着子进程运行的程序和父进程是一样的。
  • 复制了上下文,意味着运行当前位置也是一样的,在创建子进程后,俩个进程都会从创建子进程之后开始运行相同的代码。

创建子进程的功能:

  1. 父子运行的功能相同,在大量任务处理中,多个人处理更高效——分摊压力
  2. 让子进程运行另一段代码,让父子进程功能不同,让子进程处理任务

既然让子进程运行其他代码,那么就需要区分父子进程。

那要怎么区分????

函数返回值:

  1. 在父进程中返回创建的子进程的pid
  2. 在子进程中返回0(父进程是大于0)
  3. 出错返回-1
2.孤儿进程

父进程先于子进程退出,子进程就会成为孤儿进程。

特点:运行在后台,并且父进程成为1号进程()

3.守护进程&&精灵进程(了解)

是一种特殊的孤儿进程,运行在后台(不占据终端),并且,给自己新建了会话,完全脱离了登录终端时所建立的登录会话,就是不受终端的影响,默默进行一些任务处理。

二、环境变量

环境变量其实就是保存当前运行环境参数的一些变量,可以让环境配置更加简单

PATH环境变量:保存系统的程序默认查找路径,将我们自己的程序所在的路径加入其中,则我们运行自己的程序就不需要路径了。(如果没有环境变量,则所有的配置都在配置文件中,每当你修改了配置文件就需要重新加载配置)

命令:

env查看所有环境变量
echo $PATH打印指定环境变量的内容
set

查看当前环境中的所有变量(包含环境变量在内,还有普通变量)

MYVAL=10000在shell环境中添加一个普通变量
export MYVAL声明一个变量为环境变量
unset MYVAL移除指定的环境变量

环境变量和普通变量的区别:在程序中可以获取到当前环境的环境变量数据,但是获取不到普通变量的数据

每个终端都有自己独立的运行环境,互不交叉,在一个终端中设置环境变量,在其他终端是找不到的

环境变量在进程之间有一定的传递性,可以通过设置环境变量对进程传递数据。

三、程序地址空间

地址空间——内存地址空间

程序本身并不占内存,只有运行起来后,被加载到内存,才占据空间,因此程序地址空间应该被称为——进程地址空间

其实进程内部我们所访问的空间地址实际上都是一个假地址,而进程地址空间,其实是一个虚拟地址空间,进程中的使用的地址都是虚拟地址空间中的地址。

eg:物理内存只有4G,但是操作系统现在通过虚拟地址空间告诉每个进程,说你拥有4G内存,但是实际上你是用多少给你分多少,并且你访问的是虚拟内存,在物理与虚拟之间建立一个映射关系,这样就可以做到虚拟访问的地址,和实际存储的物理地址不同,这样就可以离散存储数据(完美利用物理内存的各个碎片空间)

因此使用虚拟地址空间,可以使内存利用率更高并且每一个进程都有自己独立的虚拟地址空间,虚拟地址随便用,不用担心与其他进程地址冲突,并且还可以在虚拟和物理映射这里做出内存访问控制


每个进程都有自己的一个独立的虚拟地址空间。

那么虚拟地址空间的本质 是什么,又如何实现?

虚拟地址空间由操作系统为每个进程虚拟的描述的一个地址空间,或者说, 虚拟地址空间就是系统为进程进行的虚拟空间维度的划分描述,这个描述是一个mm_struct结构体

写时拷贝技术:空间原本访问同一块,但当空间中数据要改变时候,就为子进程重新开辟空间,拷贝数据进去,修改映射关系


内存管理方式 

虚拟地址地址到物理地址是如何映射的:内存管理方式 

1.分段式内存管理

将虚拟地址空间进行分段,划分出:代码段、数据段

作用:便于编译器进行地址管理(一个程序中的数据所用到的地址除了动态申请以外,其实都是在编译完成后就确定了)

实现:将虚拟地址空间进行分段,而虚拟地址包含俩个信息:段号&&段内地址

2.分页式

将虚拟地址空间进行更加细致的分页管理,一个内存页默认4096给字节

虚拟地址组成:页号&&页内偏移

分页式划分更加细致,主要实现数据经过页表映射之后,在物理内存上的离散存储,提高内存利用率,并且在页表映射中进行内存访问控制。

3.段页式

将地址空间进行分段,每个分段采用分页管理。

地址组成:段号+段内页号+页内偏移

通过段号找到段表项,段表项中记录了对应段的页表位置,找到页表,通过段内页号,找到页表中的页表项,通过页表项的物理块地址+页内偏移找到变量的实际存储位置。

缺页中断:

发现当前要访问的数据不在物理内存中,触发缺页中断,将需要的数据从交换分区中重新加载进来

内存置换:

在计算机上有个设备叫内存条,物理内存通常都不大(8G,16G)但是运行的程序多了,加载的数据就会多,物理内存就可能会不够用,则将物理内存中的(不常用)的数据取出来,放到磁盘的交换分区中存储,这个磁盘的交换分区被当作交换内存使用。

什么样的数据是不常用数据??

  1. 最久未使用 LRU
  2. 最少未使用 LFU
  3. ..........

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:8Linux进程(Linux系统阶段)-创新互联
路径分享:http://azwzsj.com/article/epssi.html