进程的简单介绍(1)

  1. 调研进程的调度算法.
  2. 调研task_struct结构体, 理解结构体中的各个字段的含义.
  3. 使用代码模拟实现僵尸进程, 孤儿进程的场景.
  4. 同学们课后自行找到 <<深入理解计算机系统>> 虚拟内存相关章节.
  5. 同学们课后自行找到 <<操作系统精髓设计原理>> 进程相关章节.
  6. 练习使用setenv, export等环境变量相关的函数和命令.

1.进程:程序的一个执行实例,正在执行的程序等。
从内核角度来说,进程担当分配系统资源的实体。
2.进程控制块(PCB):为了使参与并发执行的每个程序(含数据)都能独立的运行,在操作系统中必须为之配置一个专门的数据结构。系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。
所谓创建进程,实际上是创建进程实体中的PCB,撤销进程,实际上是撤销进程实体中的PCB。

3.进程与程序的关系:
<1>.进程是程序的一次执行。
<2>.进程是一个程序及其数据在处理机上顺序执行所发生的活动。
<3>.进程具有独立功能的程序在一个数据结合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

4. task_struct结构体:在Linux下描述进程的结构体为task_struct结构体。它将会被装载到RAM(内存)里并且包含着进程的信息。
task_struct内容分类:
.标识符:描述本进程的唯一标识符。
.状态:任务状态,退出代码等。
.优先级:
.:程序计数器:程序中即将被执行的下一条指令的地址。
.内存指针:程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
.上下文数据:进程执行时处理器的寄存器中的数据。
**.**IO状态信息:显示的IO请求,分配给进程的I/O设备和被进程使用的文件列表。
.记账信息:包括处理器时间总和,使用的时钟数总和,时间限制,记账号。
.其他信息
5.进程的组织与查看:
组织:所有运行在系统里的进程都以task_struct链表的形式存在内核中。
查看:
./proc目录:Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。虚拟文件系统,此目录是kernel加载后,在内存里面建立的一个虚拟目录,有专属的文件系统,主要提供系统一些实时的信息,此目录下不能建立和删除文件;(某些文件可以修改).
所有查看进程通过ls /proc文件夹即可。
这里写图片描述
还可利用top与ps获取:
这里写图片描述
6.进程的特征:
<1>.动态性:进程的实质是进程实体的执行过程,进程实体有一定的生命周期。
<2>.并发性:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程进行快速调度。
<3>并行性:多个进程在多个CPU下分别同时进行运行。
<4>.独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
<5>.竞争性:系统进程数目多,但CPU资源少,所以进程之间存在竞争性。
7.进程的调度:因为在多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程进行快速调度。
进程调度有好几种,先来讲讲进程优先级。
进程优先级:用于描述进程使用处理机的优先级别的一个整数,优先级高的进程优先获得处理机。

在Linux中,用ps-l 命令会输出下面内容。
这里写图片描述
UID:执行者的身份。
PID:进程的代号。
PPID:父进程的代号。
PRI:代表进程可被执行的优先级,值越小越早被执行。
NI:进程的nice值,进程优先级的修正参数。
进程的nice值不是进程的优先级,但是进程的nice值会影响进程的优先级变化。nice值是进程优先级的修正数据。

修改优先级的命令:
nice:
这里写图片描述
renice:调整已存在进程的nice值://PID为2518的进程的nice设为-5
这里写图片描述

进程调度算法:

1.FCFS:

FCFS的意思是先来先服务(First Come First Service)。顾名思义就是按照进程被添加到等待队列的先后顺序来进行调用的.
2.SPF:

SPF的意思是短进程优先(Short Process First)。意思也很清楚,就是让短的进程先运行,是什么短呢?这里说的是进程的运行时间。不要误以为系统好牛逼,带进程要运行多长时间都可以提前知道。其实,这个值是程序提前写在进程里面的了,系统只要去读取这个值就可以了。

8.进程的状态:
在将进程的状态之前,先来说说进程标识符:
进程标识符存在于task_struct中,用于唯一的标识一个进程,一个进程通常有两种进程标识符。
<1>外部标识符:由创建者提供的,通常有字母、数字组成。设置父进程标识及子进程标识符。
<2>.内部标识符:即赋予每个进程一个唯一的数字标识符,它通常是一个进程的序号。
进程id:(PID)
父进程id:(PPID)
这里写图片描述
编写一个makefile文件。
这里写图片描述
结果为:
这里写图片描述
下面来简单介绍一个创建进程的函数—fork函数。
fork函数:它从已存在进程中创建一个新进程。新进程称为子进程,而原进程为父进程。
返回值:子进程中返回0,父进程中返回子进程的id,出错返回-1。
父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)。
这里写图片描述
结果为: 这里写图片描述
状态:
<1>.R运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行要么在运行队列里。
<2>.S睡眠状态(sleeping):意味着进程在等待事件完成
<3>.D磁盘休眠状态(Disk sleep):也叫作不可中断睡眠状态,在这个状态的进程通常会等待IO的结束。
<4>.T停止状态(stopped):可以通过发送SIGTOP信号给进程来停止(T)进程。这个被暂停的进程可以发送SIGCONT信号让进程继续运行。
<5>.X死亡状态(dead):这个状态只是一个返回状态,在任务列表中看不到此状态。
<6>.Z僵尸进程(zombie):当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。
下面来看僵尸进程的代码:
这里写图片描述
该进程维持了30秒后僵死,因为子进程先退出了。
这里写图片描述
僵尸进程的危害:
因为退出状态本身是要用数据维护,也属于进程基本信息,所以保存在PCB中,而Z状态一直不退出,PCB就需一直维护。而父进程创建了子进程而不回收会造成内存泄漏。
<7>.孤儿进程:父进程提前退出,子进程称为孤儿进程。孤儿进程被1号init进程领养和回收。
这里写图片描述
环境变量:
1. 概念:在操作系统中用来指定操作系统运行环境的一些参数。
环境变量通常具有特殊用途,在系统中通常具有全局特性。
常见的环境变量:
PATH:指定命令的搜索路径。
HOME:指定用户的主工作目录。
HISTSIAZE:保存历史命令记录的条数。
SHELL:当前的Shell,它的值通常是 /bin/bash.
查看环境变量:echo $NAME:NAME为环境变量名称。

export PATH=$PATH:文件名程序所在路径。
2.环境变量有关的命令:
<1>.echo:显示某个环境变量值。
<2>.export:设置一个新的环境变量。
<3>.env:显示所有环境变量。
<4>.unset:清除环境变量。
<5>.set:显示本地定义的shell变量和环境变量。

setenv函数

作用:改变或增加环境变量

相关函数getenv,putenv,unsetenv,首先要说明的是,通过此函数并不能添加或修改shell进程的环境变量,或者说通过setenv函数设置的环境变量只在本进程,而且是本次执行中有效。如果在某一次运行程序时执行了setenv函数,进程终止再次运行该程序,上次的设置是无效的,上次设置的环境变量是不能读到的。

参数value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。注释stdlib.h在Linux和windows中略不同,比如setenv函数是用在linux中的,在Windows中没有setenv函数而用putenv来代替。

定义函数:int setenv(const char *name,const char *value,int overwrite);

函数说明setenv函数用来改变环境变量或增加环境变量的内容,参数name为环境变量名称字符串,参数value则为变量的内容,参数overwrite用来决定是否要改变已存在的环境变量。如果没有此环境变量,则无论overwrite为何值均添加此环境变量。若此环境变量存在,overwrite不为0时,原内容会被改为参数value所指的变量内容,当overwrite为0时,则参数会被忽略。返回值执行成功则返回0,有错误发生时,返回-1
export设置环境变量是暂时的,只在本次登录中有效,可修改如下文件来使命令长久有效。

猜你喜欢

转载自blog.csdn.net/xiaodu655/article/details/79661811
今日推荐