操作系统进程线程相关知识个人总结

本文是本人在阅读《现代操作系统》以及其他操作系统相关知识后对进程线程相关知识的一些回顾和总览,由于目前学艺不精而且文笔有限,行文比较混乱,敬请谅解。

纯属个人见解,如有错误欢迎指正

我们所编写的代码实际上就是一个程序,以C++为例,当我们写好了一段C++代码后,首先进过预处理将宏定义内联函数等内容展开,得到经过预处理的代码后再进行编译将C++代码编译为汇编代码,之后再经过汇编将汇编代码变成可以被计算机直接读取的二进制机器码,原本到这一步已经是可以生成能被计算机直接运行的可执行文件了,但是在早期计算机中内存是很小的,不能一次性编译完大量的代码,并且一段代码中即使一小部分的改变也需要整段代码重新编译十分浪费时间,于是伟大的计算机科学家就发明了分段编译和链接,将一个很大的C++文件分成多个.h文件和.cpp文件,这样每个cpp文件单独编译,编译后的文件经过链接就可以得到真正能被计算机使用的可执行文件。分段编译和链接带来多个好处:1、可以将一个任务变成多个任务,就可以更充分利用多核CPU的功能并行编译

2、代码中某一个部分发生改变时不再需要重新编译所有代码,只需重新编译发生变化的cpp文件再重新链接即可 3、可以将可能会被广泛使用的功能写成库,使用这些功能时直接通过库来调用就不用重复造轮子了(库分为动态库和静态库)。

得到可执行文件后,在linux中使用命令./可执行文件名后系统就会通过fork拷贝一份当前进程(实际上并没有正在的拷贝,使用了copy_on_write技术和父进程共用数据和代码,只有真正写入时才拷贝出属于自己的数据),之后再通过exec调用将可执行文件的代码放入新的进程的内存中,这样一来一个新的任务进程就生成了。因此我们可以说进程就是一段放入内存的运行中的程序。

现在我们知道了进程是运行中的程序,那么进程难道就只包含了程序中的代码和数据吗?答案显然是否定的,首先我们来看看如果是只能运行一个进程的计算机中程序除了拥有数据和代码之中还需要拥有什么。

在程序编译完成后,我们可以得到一些全局变量静态变量相关数据和代码相关数据,当程序被运行起来后,就向将全局变量静态变量相关数据和代码放入内存,在程序执行过程中需要有一个寄存器来存放当前程序运行到哪个位置,同时伴随程序的执行还会有局部变量生成,局部变量分为在栈中的变量(生命周期跟随函数的变量),在堆中的变量(生命周期由程序员控制),因此还需有用来存放栈和堆的位置寄存器和一些方便计算的通用寄存器。总的来说如果一部计算机只要运行一个进程的话,进程在内存中需要有代码段,全局变量段,堆段,栈段,同时还需要有用来程序计数器、存放栈和堆的位置寄存器和一些方便计算的通用寄存器。

 

                                                        图一、只支持一个进程的计算机

 在分析完只支持一个进程的计算机的情况后接下来就要看看,多进程的情况下进程需要拥有什么,首先如果有多个进程的话一定要有一个可以用于区分不同进程的标识符,其次不同进程可能会有不同的用户,所以还需要有用户相关的标识。通过之前内存的分析我们得知如果要实现多进程的话,每个进程还要有独立的地址空间,这就需要每个进程都有自己独立的页表,此外每个进程还要存储一些资源相关的信息如打开文件状态,I/O设备信息。要使用多进程,进程之间还需要合理的调度,调度进程时就需要进程提供进程当前状态以及进程的优先级。最后还有有的就是寄存器相关的信息

                                                            图二、多进程计算机进程相关的信息

得到了多进程中进程的相关信息后,接下来就需要知道多进程是如何实现的,首先因为内存和CPU资源有限,所以多进程的实现不可避免的需要进行调度(选择合适的部分进程来运行,其他进程则暂时挂起),调度涉及进程调度相关知识这里先不列举了,之后有时间再讨论。

由于需要进行调度所以每个进程都有自己的运行状态,运行状态分为创建、运行、就绪、阻塞、结束(还有一个特殊的挂起状态)

程序刚刚被创建时就会变为创建状态,随后变为就绪状态,当进程被调度到时,就从就绪态转换为运行状态,当处于运行状态的进程时间片用完时就恢复到就绪态,当处于运行状态的进程发生阻塞时就变为阻塞状态,当运行中的进程运行到return或异常core dump时进程从就绪态变为结束,其中这个挂起状态是指阻塞或就绪的进程因为内存换页或其他换入换出的情况被从内存移到了交换空间的状态。

 

进程被调度的时机,在非抢占式调度算法时,只有进程主动放弃CPU使用权时(可能是发生了IO阻塞或发生缺页中断)才会发生进程调度,在抢占式算法时一般是进程主动放弃CPU使用权和发生定时器中断或其他中断且进程时间片用完的情况下会发生进程调度以及有更高优先级的进程出现。

进程切换的过程实际可以看做是PCB切换的过程。

到现在为止多进程运行的相关知识大致都提到了,那么为什么要有多进程呢?或者说多进程存在的好处是什么,要探讨这个问题首先要谈一谈两种任务,一个进程运行过程中要么在使用CPU,要么在等待IO,进程占用CPU的时间大于等待IO的进程叫做任务密集型进程,反之叫做IO密集型任务。由于在IO过程中只需要用到少量的CPU所以在等待IO的过程完全可以可以让其他进程来运行,这样就可以提高CPU的使用率。

但是使用多进程还是有些太令人满意的地方,其实其令人不满意的地方正正是进程的优点,每个进程都有独立的页表,由于这个每个进程都有自己独立的页表带来了两个缺点:1、由于每个进程都有自己的独立页表所以不借助其他进程IPC手段无发访问到其他进程的内容,不同进程之间就很难互相配合完成任务 2、每次切换进程时需要切换虚拟地址相关的内容,消耗的时间也非常大。

也是改善了这两种缺点的任务就被发明了出来,这就是线程,一个进程之间可以有多个线程,每个线程共享进程的虚拟内存和全局变量。这样一来多个线程之间就能使用公共的全局变量配合完成任务,同时线程切换占用的时间也会变短。但是由于多个线程有用到公共的全局变量,就很容易引发竞争条件,造成意想不到的效果,需要使用锁来保护全局变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值