说说进程

进程表述
书上对进程的叙述有很多,程序的执行实例或者正在运行的程序等,这些都是关于进程的表述;而对于内核来说是当担系统资源分配的实体。
可以想一下,当我们为执行某个功能而写一个程序后,这个程序是怎么变成一个进程的呢?
当程序被加载到内存中,从第一条指令开始执行,仅仅有代码是不能完成指定功能的,在执行过程中它需要一系列的资源(比如CPU、内存等),而操作系统又是怎么保证程序按照顺序执行的呢?操作系统又是怎么给进程分配其所需资源的呢?
可以先举个例子,当我们进入学校学习,要怎样才能算是这个学校的学生呢?学校怎么才能为我们制定培养方案呢?学校是怎样对我们实施奖赏处罚的呢?
我们从上学开始学校就会为我们建立一个档案,我们在学校的情况都记录这个档案里面,当我们要转学或者升学时,就必须把原学校的档案一起带到新学校去,而学校领导也是根据档案里面的记录对我们实施奖赏或者处罚的。所以,只有我们在学校教务处有一个档案后,学校为我们分配了老师,教室等资源后,才能算是这个学校的学生。
类似的,程序只有在内存里面有一个“档案”,并且有操作系统分配的一系列资源后,才是一个“进程”。而计算机中可能同时存在很多个进程,所以内核就会用某种数据结构来将这些个“档案”组织在一起,以方便管理。因此操作系统管理进程就是以先描述后组织的方式进行管理。
深入理解进程
程序在内存中的“档案”我们称之为PCB,即进程控制块。linux中的PCB是一个叫做task_struct的玩意儿,这是一种用来描述进程的结构体,它包含着进程的所有信息。
当程序被加载到内存中后,内核就会为这个程序生成一个task_struct,并分配空间、页表等资源,程序的整个执行过程就是内核根据程序指令,利用资源进行操作,然后对这个task_struct数据进行修改的过程。
那么用task_struct来描述进程需要记录哪些信息呢?task_struct是个非常复杂的结构体,其信息可分为这些:
标识符:就是进程的PID。
状态:任务状态、退出代码,退出信号等。
优先级:相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
无论是用户层次还是内核层次,都需要区别有区别各个进程的东西,而进程ID负责这个功能;而一个进程在整个生命周期内有多个状态,在退出时也需要记录其退出信息等,进程PCB中会将这些信息全都记录下来,对于进程的状态可以从这张图来看:
这里写图片描述
在计算机中只有一个CPU,而进程却有很多个,因此程序都是并发执行,而有的进程执行的任务比较重要,而有的并不重要,所以每个进程都具有优先级,进程的优先级在PCB中,进程调度算法会根据优先级来调度进程,可用ps -l 命令查看进程的优先级,也可用nice或renice 修改优先级。
虚拟地址空间
计算机中,内存有限,但是可能存在非常多的进程,有的进程占用的内存还很大,如果给全部进程都分配物理内存,那么物理内存肯定是不够的,而进程也不会在每个时刻都用到所占有的整个空间,所以就出现了虚拟内存这个概念。操作系统为每个进程提供一个4G的虚拟地址空间,这个空间可以认为是由这个进程独自拥有的,这块虚拟地址空间由一个叫做页表的东西映射进物理内存中的一小部分,进程的每个时刻都在这一小部分物理内存上进行操作。其基本模型是这样的:
这里写图片描述
这样,即能保证进程的独立性(每个进程在物理内存上的位置都不同),又能使每个进程拥有足够的空间。
这就是一个进程最初级的模型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值