Linux进程概念

进程的相关概念:

竞争性(系统进程数目众多但CPU资源只有少量,所以进程之间具有竞争性)

独立性(多进程运行,各自独享资源互不干扰)

并行(多个CPU在多个CPU下分别同时进行)

并发(多个进程一个CPU用进程切换方式运行)

 

环境变量:用于设置系统运行环境的变量(使程序运行更加高效,因为环境变量具有全局特性)

查看环境变量:env(只有环境变量) set(不仅仅有环境变量) echo(直接指定一个环境变量的名称进行查看)

声明环境变量:export

删除环境变量:unset

获取一个环境变量:getenv()

获取全部环境变量:1.main函数第三个参数法

int main(int argc,char *argv[ ],char *envri[ ]){

int i;

for(i=0;envri[ i ] != NULL;i++{

printf("env[%d]:[%s]",i,envri[ i ];

}

}

2.全局变量 char **environ;(这个是在库里定义的)

int i;

for(i=0;envri[ i ] != NULL;i++{

printf("environ[%d]:[%s]",i,environ[ i ];

}

程序地址空间:(重点)

进程地址空间:4G,其中1G内核空间,3G用户空间

Linux进程概念

进程的虚拟地址空间:我们所说的程序地址空间,实际上是一个进程的虚拟地址空间,目的是为了告诉进程,每个进程都有一个完整的连续的内存让程序能够运行,但是真正一个进程使用的内存经过页表映射之后可能只使用了很少一部分物理内存

页表:记录虚拟地址与物理地址的映射关系,并且对内存进行访问控制

分页式内存管理:提高内存利用率,内存访问控制

写时拷贝技术:提高创建子进程效率

MMU:内存管理单元

 

进程调度:cpu调度进程,实际上调度的是pcb(空间换时间)

大O(1)调度算法:用队列进行嵌套,先把pcb入队,然后把每个队列再嵌进另一个队列数组中,然后用PRI进行标记(这也解释了为什么PRI越小,优先级越高,因为PRI越小下标越小,越早出队),但还有一个队列中是否有结点(在这里指的是pcb)的问题,这里采取了位图进行标记,如果入队则为做一个标记。当队列取完后,为了提升效率,牺牲空间把指针调换再创建一个同样大的嵌套队列空间,上一个队列取一个,下面就放一个

 

进程概念:

什么是进程:进行中的程序---抽象化的概念(站在用户角度)

操作系统对进程的描述信息---这个描述信息是操作系统对进程的具象化描述---这个描述就是进程,叫做进程控制块PCB,Linux下这个描述结构叫struct task_struct,Linux下的进程实际就是这个struct task_struct结构体(在操作系统角度)

内存指针:pcb中的指针,指向进程运行起来后程序的代码和数据在内存中的位置

标识符pid(父进程标识符是ppid)

文件状态信息:

记账信息:进程在cpu上运行的时间,用于判断cpu是否处于一个饥饿状态

上下文数据:防止切换调度时丢失数据

程序计数器:同上

 

进程状态 :(重点)

通用说法:阻塞,运行,就绪

Linux下的进程状态:运行R,可中断睡眠S,不可中断睡眠D,停止T,僵尸Z,追踪(了解即可),死亡(了解即可)

僵尸进程:处于僵尸状态的进程 危害:资源泄漏 产生:子进程先于父进程退出,操作系统通知父进程,但是父进程没有联系上,然而操作系统擅自释放子进程资源(一旦释放就没地方保存退出原因,因此 子进程就成了僵尸进程 处理:退出父进程 预防:进程等待( )

孤儿进程(操作系统没有这个定义,这是人们):父进程先于子进程退出,子进程就会变成孤儿进程,孤儿进程的父进程将变为1号init进程,并且孤儿进程退出不会产生僵尸进程

守护进程(也叫精灵进程):特殊的孤儿进程

 

进程优先级:决定CPU资源的优先分配权,查看优先级的方法: ps -l 名称:PRI(值越大,优先级越低) NI(用于间接改变PRI的值) PRI=PRI+NI 修改优先级的方法:nice 和 renice(改变NI值)

 

查看进程:

/proc 目录保存当前运行的进程信息

ps命令: -ef(查看所有进程) aux top(查看CPU占用率高的前几个进程信息)

在程序中操作: 获取进程pid 获取进程标识符:getpid()

创建进程: 实质上就是创建一个pcb

fork:通过复制一个进程创建一个新的进程,创建一个新的pcb(进程),并且复制父进程pcb中的数据,因为复制了父进程的pcb,意味着子进程和父进程代码和数据指向同一块内存区域,所以父子进程代码共享,但是数据独有(比较难解释,后面再做详解)

fork的返回值:1.对于父进程来说,返回创建的子进程的pid 2.对于子进程来说,返回值是0

我们用户就是通过返回值对父子进程进行代码分流

 

终止进程: kill

 

CPU的分时计数:CPU只是在每个进程上运行很短的时间(时间片),如果CPU处理某个进程的时候时间片用尽,那么CPU就要去调度运行下一个程序了(一个进程并不是一直被CPU处理的,而是不断轮询切换CPU处理)