进程

进程

定义:(清华)一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程

程序本身是静态的,只有操作系统把执行程序调入到内存中后,通过CPU执行程序中的一条条指令,对数据进行处理,完成一定功能的过程(动态执行的过程)
进程不完全等于程序,从某种角度来说,正在运行的程序可以看做进程,会消耗资源(如CPU,内存,网络,文件系统等),进程是一个动态执行的过程,程序是一个代码

程序的每次执行构成不同的进程,一个程序可对应多个进程(程序是一样的,但是处理的数据可不同,最终产生的行为也会不同,但功能体现是一样的,同样的排序算法,输入不同的数,排出的数也不同.但都是排序功能)

进程主要知识点:(读书红线)
1.每个进程都有一个唯一的正数(非零)进程ID(PID)
2.从程序员的角度,进程总是处于 运行,停止,终止 三种状态之一.

在这里插入图片描述

进程的组成

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
核心态:进程在执行过程中需要完成某些功能,功能需要操作系统才能提供,如读写硬盘只有操作系统才能完成,操作系统代表进程在内核中执行。

在这里插入图片描述

在这里插入图片描述
进程的特点:
独立性(通过页表机制来确保):此处的独立并不是完全的独立,而是A进程的执行并不会破坏B进程

进程控制

进程控制块(PCB)

定义:操作系统管理控制进程运行所用的信息集合.操作系统用PCB来描述进程的基本情况以及运行变化过程
意义:PCB是进程存在的唯一标志(进程与进程控制块是一对一的关系)
PCB内容:(三大类信息)
1.进程标识信息(如本进程标识,本进程的父进程的标识,本进程属于哪个用户的标识)
2.处理机状态信息保存区(主要指寄存器,CPU使用寄存器完成很多操作):用户可见寄存器,控制和状态寄存器,栈指针
3.进程控制信息:OS对进程的管理和控制
PCB组织方式:常用链表(频繁的插入删除),数组索引(不频繁的插入和删除操作)

进程管理(进程状态)

一.进程的生命期管理

init进程

init进程的PID是1,是在系统启动时由内核创建的,它不会终止,是所有进程的祖先.

进程创建:

引起进程创建的3个主要事件:
1.系统初始化时
2.用户请求创建一个新进程
3.正在运行的进程执行了创建进程的系统调用

进程运行

选哪个?如何选?
涉及调度及调度算法问题

进程等待(阻塞)

此时不占用CPU,进程自身阻塞自己(只有进程本身知道何时需要等待某种事件的发生)

进程唤醒

原因:
1.被阻塞进程需要的资源可被满足
2.被阻塞进程等待的事件到达
3.将该进程的PCB插入到就绪队列
进程只能被别的进程或操作系统唤醒

进程结束

四种情况下,进程结束:
1.正常退出(自愿)
2.错误退出(自愿)
3.致命错误(强制性的)
4.被其他进程所杀(强制性的)
在这里插入图片描述
二.进程状态变化模型

三.进程挂起模型
执行模式:
1.用户模式
2.内核模式(也称系统模式,控制模式)

fork函数(父子进程)

作用:父进程通过fork函数创建一个新的运行的子进程
特点:调用一次,返回两次
返回值:(fork函数有不同的返回值,用以判断程序是在父进程还是在子进程中执行)
返回0 :程序在子进程中
返回>1 :程序在父进程中,返回值为创建出的子进程的PID
返回-1 :出错

使用fork()函数得到的子进程是父进程的复制品, 子进程完全复制了父进程的资源(将父进程的地址空间完全的复制一份到子进程中),包括进程上下文、代码区、数据区、堆区、栈区、内存信息、打开文件的文件描述符、信号处理函数、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等信息, 而子进程与父进程的区别有进程号、资源使用情况和计时器等。 其中父子进程最大的区别在于它们有不同的PID
父子进程特点:
1.fork函数调用一次,返回两次
2.并发执行:父子进程是并发运行的独立进程(二者运行顺序不确定)
3.(父子进程具有)相同但独立的地址空间
4.共享文件

vfork函数(virtual fork,虚拟的fork)
只复制了一小部分,开销代价大大的小于fork的大量复制,效率高
很nice的参考博客(fork函数&子进程与父进程&守护进程).

进程的挂起

个人理解:(状态有挂起两字的都是在外存上)操作系统临时从内存中踢出该进程,(清华理解)进程没有占用内存空间
挂起状态:
1.阻塞挂起状态:进程在外存(已经落在磁盘)上等待某个事件出现
2.就绪挂起状态:进程在外存,但只要进入内存即可运行

底层的操作系统需要做的就是不断选择哪个进程占用CPU来执行 以及 把切换哪个进程到什么状态.
队列是操作系统管理不同进程的重要数据结构(如下图中,完成状态的表示,切换等。。。)
不同队列优先级可能也不同,如下下图中的就绪队列1,2。。。

注意:如果一个状态队列有多个进程,如果事件1只能满足一个进程,则只能切换状态队列中这一个进程的状态;如果事件1都满足,则将队列中进程的状态都切换(都放到另一个相应的状态队列中)

在这里插入图片描述

线程(轻量级进程)

定义:进程当中的一条执行流程
线程之间可以并发的执行,并且共享相同的地址空间

进程与线程:
1.资源管理角度:进程是用来管理资源的(地址空间,打开的文件,访问的网络...)
进程的执行功能交给线程管理,线程是进程的重要组成部分
即进程包括 资源管理 和 线程.
一个进程中可以存在多个线程,属于同一个进程的多个线程共享进程的所拥有的资源,即线程可以直接访问进程提供的代码,数据,内存和文件等.(资源共享)

TCB(Thread Control Block线程控制块)只负责管理与执行流程相关的信息
PC程序阅读器,SP堆栈,State, Registers
组织结构:线程间有各自独立的部分(有不同的控制流,有不同的堆栈,要通过不同的寄存器来表示其各自的执行状态,才能确保独立),也有共享的部分(代码段,数据段)
在这里插入图片描述
在这里插入图片描述
如果重视性能方面,则考虑线程;如果重视安全性方面,则考虑进程
谷歌浏览器打开网页使用进程,某个网页崩溃不会引起其他网页崩溃

对于单线程支持在线程空间中有一个控制流,对于多线程支持进程空间中有多个控制流且每个控制流不同,有独立的寄存器,堆栈,但是共享代码段数据段等...

线程与进程比较

线程的创建(同理终止)时间比进程短:进程创建时要创建的更多(如内存如何管理,打开文件如何管理)
线程创建时,直接用进程创建好的,没那么多信息要创建
线程切换时间也短:同属于一个进程的多个线程具有相同的地址空间,也就是说有同一个页表,即不需要切换内存管理所需要的页表;但对进程来说,页表也需要切换(开销较大,因为访问的地址空间信息及硬件信息都不一样,需重新加载,开销较大)
在这里插入图片描述

线程的实现(用户线程、内核线程和轻量级进程)

在这里插入图片描述
基本定义:
用户线程:操作系统看不到的线程(由应用程序的库来实现,用户线程库管理)
内核线程:操作系统所管理的线程(操作系统能看到)

用户线程与内核线程的对应关系:
1.多对一(n个用户线程对应一个内核线程)
2.一对一(1个用户线程对应一个内核线程)
3.多对多(n个对应m个)

用户线程

用户线程:操作系统只能看到进程信息,但看不到进程中的线程信息,即线程的调度和管理由用户线程库来参与,操作系统不直接参与线程的调度。在用户空间实现的线程机制,它不依赖于操作系统的内核,由一组用户级线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度
如果进程被操作系统阻塞,则进程中的线程都被阻塞
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

内核线程

定义:是指操作系统的内核当中实现的一种线程机制,由操作系统的内核来完成线程的创建、终止和管理(Windows采用)
进程的PCB统一管理属于该进程的所有TCB,但具体的调度是由TCB完成的。只要完成一次线程的切换,就要完成一次从用户态到内核态的切换(开销较大,与用户线程不同【用户线程均在用户态完成】)
Win系统主要采取内核线程机制来管理
优点:力度更小
缺点:切换的开销大(创建、终止等开销较大)
在这里插入图片描述
在这里插入图片描述

轻量级进程

定义:它是内核支持的用户线程。一个进程可有一个或多个轻量级进程,每个量级进程由一个单独的内核线程来支持(Solaris/Linux采用)
管理复杂,但灵活,效率高
在这里插入图片描述
进程的上下文切换:
将进程A的上下文保存在PCB中,把进程B的PCB中保存的信息恢复到CPU中(汇编语言来写)

操作系统为活跃进程准备了PCB
操作系统将PCB放置在一个合适的队列里

1.就绪队列
2.等待IO队列(每个设备的队列)
3.僵尸队列

进程控制

弹幕:fork复制进程,exec重写
wait父进程等子进程

exec函数

exec(): 调用允许一个进程“加载”一个不同的程序并且开始在main开始执行(事实上_start)
作用:加载(假设程序在磁盘上,读取这个程序,此过程时间较长) + 执行

执行exec函数时进程可能处于不同状态,正常应该处于running态,但可能因为exec的加载功能时间过长(程序从硬盘上加载进来)而使进程由running=>阻塞态

它允许一个进程指定参数的数量(argc)和它的字符串参数数组(argv)
如果它调用成功,则:
1、它是相同的进程
2、但是它运行了一个不同的程序
执行exec()时进程本身的代码段、堆、栈都会被重写覆盖
在这里插入图片描述
提升效率的优化措施(使用fork后99%会调用exec,加载新的程序,则刚才复制的那些又都被重新覆盖掉,之前的fork相当于多余的)
1.使用vfork
2.内存管理(虚存管理)角度,使用写时复制COW(Copy on Write):
只复制了与地址空间管理有关的页表等。。,根据是否完成写操作来决定是否复制,(要是只读则没必要复制)

wait()函数(父进程来执行)

为什么父进程要等子进程?(子进程执行完直接exit不就好了嘛?wait存在的意义是什么)
大概意思:有的信息可以通过exit完成回收释放操作,有的信息如PCB则不能自己回收自己,例如不能自己提着自己的头将自己提起来,因此需要父进程来帮助完成最后一步(将子进程在内存中的资源释放掉,主要指子进程的PCB)
总结:父进程的wait()函数配合子进程的exit函数完成对子进程的所有资源的
回收

僵尸进程(zombie/defunct)

含义:子进程的exit执行完毕,至父进程wait()还没有执行完的之间的空档期。此时子进程并未完全死亡,且也不处于就绪态、等待态等状态,子进程此时无法回到用户态了,此时无法正常工作,只能等着被回收

孤儿进程

含义:如果父进程先于子进程死亡,则子进程无法通过父进程回收。
解决办法:祖宗进程init(也称root)会定期扫描PCB列表,捕获孤儿进程的存在,此时init会代替父进程完成子进程的回收
在这里插入图片描述
在这里插入图片描述
考虑僵尸进程的六状态图
执行exec函数时进程可能处于不同状态,正常应该处于running态,但可能因为exec的加载功能时间过长(程序从硬盘上加载进来)而使进程由running=>阻塞态

在这里插入图片描述

下接 调度.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值