目录
1.fork的相关介绍
fork实际上就是一个函数,这个函数被调用的时候会创建两个进程,一个父进程,一个子进程,上面的这个实力里面,fork函数给子进程返回0,给父进程返回子进程的pid,这样做是为了区分不同的数据流,执行不同的代码块;
进程包括PCB和对应的代码和数据,fork函数调用的时候创建子进程,这个时候子进程和父进程共同使用一份代码和数据,但是当我们的子进程想要对于数据进行修改的时候,就会发生写实拷贝,什么是写实拷贝呢?意思就是这个父进程的数据被拷贝一份,我们子进程对于数据进行修改的时候不会影响父进程的独立性;
当我们执行return语句的时候,这个时候子进程已经被创建完成了,因此子进程和父进程都会返回一个数值,这个代码是被执行了两次的,所以这个作为返回值的变量会有不同的数值;
2.进程状态
2.1运行状态
我们之前介绍过这个PCB就像类似于链表一样排队,这个时候就是处于运行状态,在一个时间段里面,所有的进程都会被执行,不可能只让一个程序一直执行而不给其他的程序执行时间;
大量的进程把CPU放上去,然后再拿下来的过程,就叫做进程的切换;
2.2阻塞状态
当设备没有准备就绪,这个进程处于等待队列里面,我们就可以称之为阻塞状态,当设备就绪后,这个等待进程就进入到了运行队列里面;
2.3挂起状态
我们的进程里面的数据和代码可能会占用大量的内存空间,这个就会导致我们需要对于这个进程里面的代码和数据进行一定的管理,我们的代码和数据当处于等待的时候就会被换出,当轮到他执行的时候,再被换入,当换出的时候这个状态就叫做挂起状态;
3.具体的linux是怎么维护的
3.1进程状态分类
linux里面的进程状态被划分为下面的几个类别,运行状态running状态,这个就是很容易理解的,也是很常见的一个状态,S状态就是睡眠状态,这个状态和后面介绍到的这个D状态还有所区别,这个D是深度睡眠,S是浅度睡眠,浅度睡眠就是这个进程暂时没有被执行,但是轮到这个进程执行的时候这个进程还是可以执行的,就是可以被唤醒的;
后面还有两个T进程,就是stopped停止的意思,这个可能是被我们自己手动停止的,也可能是被系统停止的,因为这个进程如果占用内存时间过长,而且又被这个操作系统判定为没有进行有效的工作,这个时候操作系统就会停止这个进程,让后面的等待的进程继续去走下去,也有可能是我们的用户处于某需要,需要暂时停止这个进程;
下面还有两个进程,一个是僵尸进程,一个是孤儿进程,程序退出来的时候,这个进程并不会直接变成dead的死亡进程,而是有一个z状态的僵尸进程,因为如果这个进程的父进程没有对于这个进程的相关信息进行回收,这个子进程就会一直处于z状态,也就是僵尸进程,进程的相关支援和PCB不可以被释放掉,这个就会导致这个子进程会一直占用内存空间,导致内存泄漏;为什么不能直接退出:因为这个子进程退出的时候相关的信息必须要被父进程获悉,这个父进程是对于自己的子进程需要进行管理的,不可以直接退出,而父进程一无所知;
但是也有特殊的情况,就是这个父进程先退出(可能处于什么突发情况和特殊原因)这个时候,我们的子进程尽管想要把这个相关的信息告诉父进程,但是这个时候的父进程已经退出了,所以这个时候的子进程就有操作系统来进行管理,这个时候没有了自己的父进程的管理,这个时候的子进程我们就称之为孤儿进程,这个进程虽然是被操作系统管理的,但是这个进程未来也会退出,也会被释放掉的;
3.2进程管理
上面的这个就是一个双向链表的结构,我们之前已经介绍过了这个进程在准备的时候是PCB在链表上面排队的,当这个PCB被轮到的时候,这个再去调用对应的数据和代码,而对于这个双向的链表结构,里面有一个叫做link的对象,这个就是每一个节点的连接部分,我们这个进程如何对于这个除link之外的地方进行管理的呢,这个实际上就是根据的偏移量计算出来的,根据这个0位置和start的差值(向上进行偏移),我们就可以计算出来这个除了link之外的内容相关属性;
4.进程优先级
4.1优先级和权限
优先级就是对于资源,谁可以先访问,谁是后访问的,对于资源的使用先后顺序;
4.2为什么有优先级
因为资源有限,这个注定了不同的进程之间要相互竞争资源,随着进程的增加,这个竞争就会加剧
操作系统必须保证进程之间良性竞争,确认优先级;
如果这个进程没有良性竞争,某一些进程没有机会被运行(无法得到CPU资源),这样的话这个进程就会处于饥饿状态(我们的windows里面的***无响应就是这个情况,很常见的);
4.3怎么实现优先级
下面这个关于进程的属性的内容里面,这个PRI表示的就是进程的优先级,数字越小,这个进程的优先级就会越高,NI这个数据使我们可以修改的,这个就是进程的优先级修改之后的数据;
我们可以通过修改NI来调度这个进程的优先级,但是这个有一定的范围,就是这个基础数值是80,我们可以在-20~19 的范围里面进行调度,换算之后就是60~99这个区间里面是我们可以更改的范围;