一 进程成分:
*前两部分是基本组成,PCB由操作系统创建和管理。
(1)程序代码。
(2)和代码相关的数据集。
(3)进程控制块PCB:
*标示符:跟这个进程相关的唯一标识符,用来区分进程。
*状态:进程状态。
*优先级。
*程序计数器:程序中即将执行下一条指令的地址。
*内存指针:包括程序代码和进程相关数据的指针,还有与其他进程共享内存块的指针。
*上下文数据:进程执行时处理器的寄存器中的数据。
*I/O状态信息:包括显式的I/O请求、分配给进程的I/O设备和被进程使用的文件列表等。
*记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制、记账号等。
二 进程状态(注意状态之间转换):
*基本状态:就绪态、运行态和阻塞态。
*新建态和终止态:方便进程管理。
(1)新建态:刚刚创建的进程,os还没把它加入到可执行进程组中,通常是进程控制块已经创建好但还没有加载到内存中的新进程。
(2)终止态:操作系统从可执行进程组中释放出的进程,与进程相关的表和其它信息临时被操作系统保留起来,为辅助程序提取所需信息提供了时间。
(3)就绪态:进程做好了准备,只要有机会就执行。
(4)阻塞态:进程在某些时间发送前不能执行,例如I/O完成。
(5)运行态:该进程正在运行。
(6)挂起状态(从内存换出到磁盘):当内存中的所有进程都处于阻塞态,OS把被阻塞的进程换出到磁盘中的“挂起队列”(将进程置于挂起态,并将它转移到磁盘),内存中释放的空间可被调入的另一个进程使用。取哪个进程到内存执行的选择:新创建的进程或调入一个以前被挂起的进程(倾向于这个,不会增加系统的负载)。
*静止就绪(就绪/挂起状态):进程在外存中,但是只要被载入内存就可以执行。
*静止阻塞(阻塞/挂起状态):进程在外存中并等待一个事件。
三 进程切换:
(1)进程切换在操作系统从当前运行的进程中获得控制权的任何时刻发生。控制权交给OS的事件包括:系统调用、中断(对异步外部事件的相应)、处理错误和异常条件。
(2)进程切换的步骤:
*保存处理器的上下文环境,包括程序计数器和其它寄存器。
*更新处于运行态进程的进程控制块,包括进程的状态(运行到就绪、阻塞、就绪/挂起态、退出等),还必须更新其它域,包括离开运行态的原因和记账信息。
*将进程的进程控制块移到相应的队列(就绪、阻塞、就绪/挂起态)。
*选择另一个进程执行(进程调度)。
*更新所选进程的PCB,包括把状态改为运行态。
*更新内存管理的数据结构。
*恢复处理器在被选择进程最后一次切换出运行状态的上下文环境,通过载入程序计数器和其它寄存器以前的值来实现。
四 进程和线程区别:
1.进程是资源分配的基本单位,也是调度运行的基本单位;线程是调度的基本单位。
2.进程有独立的虚拟地址空间。父子进程共享文件表,但不共享用户地址空间。
*优点:一个进程崩溃后不会对其他进程产生影响;通常进程之间不共享资源不需要加锁,省去了锁的开销(共享区仍要加锁)。
*缺点:进程间共享数据变得困难,必须使用显式的IPC机制。
*进程虚拟地址空间包括:代码段、堆栈段(临时数据:如函数参数、返回地址和局部变量)、数据段(包括全局变量)、堆(动态分配的内存)等等。
3.线程运行在进程的上下文中,所有运行在一个进程内的线程共享该进程的整个虚拟地址空间:代码、数据、堆、共享库和打开文件。
*每个线程有自己的线程上下文:一个线程ID、栈、栈指针、程序计数器、通用目的的寄存器和条件吗。
4.创建、切换和终止开销小:线程的上下文比进程的上下文小很多,所以线程的创建、上下文切换和终止要比进程快很多。
*线程间共享数据容易,因为多个线程共享进程地址空间,但需要同步。
5.补充程序和进程区别(选自操作系统概念第7版):
*程序本身不是进程,程序只是被动实体,如存储在磁盘上的一系列指令的文件内容(常被成为可执行文件)
*进程是活动实体,它有一个程序计数器来表示下一个要执行的命令和相关资源集合。
*当一个可执行文件被装入内存时,一个程序才成为进程。
*虽然多个进程可以与统一程序相关,但是它们被当做两个独立的执行序列,都是独立的进程,虽然文本段相同,但是数据段、堆、堆栈段都不同。