进程和线程
<!-- toc -->
<!-- tocstop -->
进程
具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程
进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
进程和线程的区别?
(并发性、调度、系统开销、拥有资源)
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
引入线程带来的主要好处:
- 在进程内创建、终止线程比创建、终止进程要快;
- 同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。
进程的实现
为了实现进程模型,操作系统维护着一张表格(一个结构数组),即进程表(process table)。每个进程占用一个进程表项。(有些作者称这些表项为进程控制块。)该表项包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息,以及其他在进程由运行态转换到就绪态或阻塞态时必须保存的信息,从而保证该进程随后能再次启动,就像从未被中断过一样。
图2-4展示了在一个典型系统中的关键字段。第一列中的字段与进程管理有关。其他两列分别与存储管理和文件管理有关。应该注意到进程表中的字段是与系统密切相关的,不过该图给出了所需要信息的大致介绍。
进程的控制来管理
系统中的进程不断地产生和消亡,进程生命周期的动态变化过程由进程管理程序来控制,对于进程的控制和管理包括:创建进程、阻塞进程、唤醒进程、挂起进程、激活进程、终止进程和撤销进程等,这些功能均由系统中的原语来实现。
原语(primitive)在核心态执行,是完成系统特定功能的不可分割的过程,它具有原子操作性,其程序段不允许被中断,或者说原语不能并发执行。原语的实现方法之一是以系统调用的方式提供原语接口,采用屏蔽中断的方式来实现,以保证原语操作不被中断的特性。