操作系统——进程线程(一)

来源:互联网 发布:我是皇弓箭进阶数据 编辑:程序博客网 时间:2024/06/05 03:21

本篇总结一下进程与线程的一些概念,原理等。

首先最基础的定义:进程是一块包含了某些资源的内存区域,进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是操作系统进行资源分配和调度的一个独立单位。

进程中所包含的一个或多个执行单元就是线程。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.


关于进程和线程之间,有一句话是这样说的"进程是操作系统分配资源的最小单位,线程是操作系统调度的最小单位"。

首先,关于“进程是操作系统分配资源的最小单位”。

下图是进程的虚拟内存地址空间的分配模型图:


进程的虚拟内存地址空间分为用户空间和内核空间。用户空间从低端地址往高端地址发展,内核空间从高端地址往低端地址发展。用户空间存放着这个进程的代码段和数据段,以及运行时的堆和用户栈。堆是从低端地址往高端地址发展,栈是从高端地址往低端地址发展。内核空间存放着内核的代码和数据,以及内核为这个进程创建的相关数据结构,比如页表数据结构,task数据结构,area区域数据结构等等。


然后,关于“线程是操作系统调度的最小单位”。

在传统OS中,拥有资源、独立调度和分派的基本单位都是进程,在引入线程的系统中,线程是调度和分派的基本单位,而进程是拥有资源的基本单位。

在同一个进程内线程切换不会产生进程切换,由一个进程内的线程切换到另一个进程内的线程时,将会引起进程切换。



线程试图实现的是,这些线程可以为了完成某一任务而共同工作。

每个线程都有自己的堆栈,每个线程的堆栈有一帧,供各个被调用但还没有从中返回的过程使用。在帧中存放了相应过程的局部变量以及过程调用完成之后使用的返回地址。需要堆栈的原因是通常每个线程会调用不同的过程,各自有一个不同的执行历史。


实现线程有两种方式,分别是在用户空间中实现和在内核中实现。

在用户空间中实现,是把整个线程包放在用户空间中,内核对线程包一无所知,从内核的角度,是按照单线程进程的方式管理。

在用户空间管理线程是,每个进程需要有专用的线程表,用来跟踪该进程中的线程。这些表与内核中的进程表类似,它不仅记录各个线程的属性,如每个程序的程序计数器,堆栈指针,寄存器和状态等,该线程表由运行时系统管理。这种方式的优点:1.用户线程包可以在不支持线程的操作系统上实现。2.它允许每个进程有自己定制的调度算法。但也有一些问题:1.如何实现阻塞系统调用。使用线程的一个主要目标是,首先要允许每个线程使用阻塞调用,但是还要避免被阻塞的线程影响其他的进程。2.如果一个线程开始运行,那么在内核中的其他线程就不能运行,除非第一个线程自动放弃CPU。3.程序员通常在经常发生线程阻塞的应用中才希望使用多个线程。

在内核中实现线程,在内核中有用来记录系统中所有线程的线程表。当某个线程表希望创建一个新线程或撤销一个已有线程时,它进行一个系统调用。内核的线程表保存了每个线程的寄存器,状态和其他信息。所有能够阻塞线程的调用都以系统调用的形式实现,代价是很大的,因此某些系统采用“环保”的处理方式,回收其线程。当某个线程被撤销时,就把它标志为不可运行的,但是其内核数据结构没有受到影响。稍后,在必须创建一个新线程时,就重新启动某个旧线程,从而节省了一些开销。


一些区别:

1.进程中的不同线程不像不同进程之间那样存在很大的独立性,所有的线程都有完全一样的地址空间,共享同样的全局变量。由于各个线程都可以访问进程地址空间中的每一个内存地址,所以一个线程可以读,写,甚至清除另一个线程的堆栈,线程之间是没有保护的。

2.进程与线程包含的内容:



为什么在已经有了进程的情况下还需要线程(多线程)?

第一,在许多应用中同时发生多种活动,其中某些活动随着时间的推移会被阻塞。在多线程的概念中,我们加入了:并行实体共享同一个地址空间和所有可用数据的能力。

第二,由于线程比进程更轻量级,所以线程比进程更快也更容易创建。

第三,涉及性能方面,系统中存在大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠允许,加快应用程序的执行速度。






0 0