一、进程
1.进程的定义
进程是操作系统为了实现CPU级别的并发而抽象出来的一个概念,表示加载在内存中,进行中的程序。
2.进程的由来
要了解进程的由来,先要了解一下操作系统
1>操作系统的定义
操作系统是介于计算机硬件和应用软件之间的软件系统,统一管理计算机的所有资源
2>单道批处理系统
最开始计算机只提供内置的库函数,用户手动输入要调用的函数来完成工作。这个阶段的操作系统只有内置的库函数,用户自己控制程序的开始和结束。
人们发现这种工作模式的效率相当低,大部分时间计算机在等待操作员的输入而空闲。人们设想,如果操作员能够提前把需要调用的函数想好,批量导入计算机,那么计算机的执行效率就会大大提高,从这个角度出发,人们设计出了单道批处理系统,用户提前把需要调用的函数写在纸带上,操作员收集一定数量的用户程序后,批量导入计算机,一个接一个的自动执行。这个阶段的操作系统由库函数和批处理监视器组成,批处理监视器负责程序的调度和程序的执行。
3>多道批处理系统
单道批处理系统提高了计算机的使用效率,但是存在一个问题,程序是串行执行的,后一个程序必须在前一个程序执行完之后,才能执行,即便前一个程序因为某些原因阻塞而导致CPU空闲。当时计算机是机器昂贵的,人们无法容忍计算机因为阻塞而空闲下来。如果能够在程序因为资源阻塞时,调度其他没有阻塞操作的程序执行,在程序获取阻塞资源后,再通过调度继续执行,那么计算机的效率将获得空前的提高。按照这种设想,人们设计出了多道批处理系统。它同时加载多个程序到内存中,形成后备队列,通过批处理监视器完成程序的调度,当计算机空闲时,批处理监视器按照某种算法从后备队列取一个程序执行,直到所有的程序执行完。
4>分时操作系统
在批处理系统中,用户提交程序给操作员,操作员批量导入程序执行,一段时间之后,用户拿到程序的执行结果,此时管理计算机的人只有操作员,用户不能控制自己程序的执行和结束。基于让用户重新回到计算机前即每个用户自己控制程序的开始和结束的思考,人们设计了分时操作系统。在多道批处理系统的基础上,按照某种算法,计算机定时在不同的程序之间轮换,在宏观上创造出所有程序都在同时运行的假象。在分时操作系统中,多个程序被加载到内存中,通过时间片轮换来执行,那么程序的调度和管理就成了非常关键的问题。为了更好的管理和调度程序,操作系统抽象出了进程的概念。
3.进程的组成
由进程的定义可以知道,进程至少由两个组成部分:程序和内存地址。除此之外,进程代表执行中的程序,所以需要一个程序计数器,记录程序执行的位置;当操作系统调度进程时,涉及到进程状态的恢复,所以需要寄存器保存进程的执行状态;进程申请的资源(创建的文件、打开的文件等)也需要记录;操作系统加入安全模块后,进程申请的权限也需要记录下来,所以总体来讲,进程主要由以下部分组成:程序机器码、内存地址、程序计数器、寄存器、系统资源描述符、权限。同时,操作系统为进程创建了进程控制块(PCB)来记录进程的关键信息:进程ID、进程状态、内存信息、寄存器信息等
4.进程间通信
进程通信的方式,可以类比人类社会,人与人通信的方式,因为计算机科学的许多设计和实践都来源于对人类社会的观察和思考。
进程间通信的主要方式有:
1>(匿名)管道:使用标准输入输出单向传递数据的通道。一端写入,一端读取,数据写入端写入的数据被操作系统缓存,直到数据被读入端读取。
2>有名管道:使用文件系统中的文件代替了标准输入输出的管道。多个进程可以读取和写入数据到文件中。
3>共享内存:通过在一块可以被多个进程访问的内存地址上创建共享缓冲区的方式,实现进程间的通信
4>信号:从一个进程发到另一个进程的系统消息。通常不用来传输数据,而是发送远程控制指令。
5>文件:磁盘存储的或者文件服务器提供的可被多个进程访问的记录
6>消息传送:允许多个进程访问一个消息队列,通常用在并发控制上。
7>Socket:一种通过网络接口发送的数据流,可以发送到本机的进程或者网络进程。
8>内存映射文件:一个被映射在内存中的文件,可以通过内存地址直接修改而不必创建输出流。
5.进程的销毁
进程执行完毕或者被操作系统终止,就没有存在的必要了。操作系统可能立即删除进程信息或者把它移入终止状态。一旦进程被删除,它的申请的资源就会被操作系统回收。
二、线程
线程是操作系统抽象的一个概念,是进程的一个执行上下文或者执行序列。进程提供CPU级别的并发,线程提供进程级别的并发。在线程模型中,一个进程可以有多个线程,但至少有一个线程,就是主线程。这些线程共享进程的代码、内存地址,但是有自己独立的程序计数器、寄存器。
1.线程的由来
进程概念的提出,可以让CPU在宏观上实现同时运行多个程序并发执行,但是因为每个进程有独立的空间,进程之间的调度和资源协调非常昂贵,而如果能够在一个进程内,共享资源的情况下,实现并发,那么开销会大大减小,调度效率会大大提高,这就是线程模型。
2.线程的组成
线程设计的一个目的是在共享资源的情况,减少调度开销,所以线程主要由共享资源和非共享资源组成。地址空间、全局变量、打开的文件等是跟其他线程共享的;程序计数器、栈、寄存器、状态字这些跟线程执行相关的信息是线程的独享资源。另外,管理线程的调度程序还维护了线程的线程控制块,它记录了线程的ID等线程运行信息。
3.线程的同步问题
实现同步的手段:
1>锁
2>管程
3>信号量
4>栅栏
5>消息传递
4.线程实现方案
1>用户态实现
2>内核态实现
3>用户态和内核态混合实现
三、参考资料