本文主要从 进程和线程对比 的角度 出发,较少涉及基本概念,去进一步了解 进程和线程。
在没有引入线程前,进程是
- 系统资源的分配独立单位
- 系统进行调度的独立单位
在单道批处理系统中,系统中只有一个进程运行,这样做存在 系统资源利用率不高的情况(当进程发生阻塞,CPU 处于 等待状态,降低了利用率)
1 并发
随着发展,人们为了提高系统资源利用率,提出了并发这一概念,
多道批处理系统便是如此,进程并发,保证 CPU 始终处于忙碌状态,提高内存利用率
并发这一概念 也是现代操作系统中最重要的基本概念
1.1 并发问题 — 进程同步
当然进程的并发同时也带来了许多问题,其中一个重要问题,进程同步,保证多个进程能够有条不紊地运行。这里不是本篇文章重点,暂时略过。
1.2 并发问题 — 时空开销
另一个并发带来的问题就是,程序并发执行时需要的时空开销
为了使程序能够并发执行,系统必须要完成的一系列操作:
-
进程的创建
系统创建进程,为其分配除处理机以为的所有所需资源,内存空间,IO设备,建立相应的PCB -
进程的切换
当进程进行上下文切换时,需要保存当前进程的CPU环境,然后设置新的调度进程的CPU环境。这一过程需要花费不少的处理机时间, -
进程的撤销
当进程运行结束后,需要回收其占用的资源,撤销PCB
进程因创建而产生,因调度而运行,因撤销而消亡。
进程是一个资源的拥有者,在创建、撤销和切换中,系统中需要付出较大的时空开销。这就限制了系统中所设置的进程的数目,而且进程切换也不宜过于频繁,从而 限制了并发程度的进一步提高。
2 线程的引入 (线程与进程的比较)
人们提出了 线程 的概念, 个人认为可以从 对 并发的进一步提高,以及 对进程的时空开销的优化这两个角度出发理解 线程的引入
2.1 并发的进一步提高
2.1.1 调度的基本单位
传统的进程作为调度基本单位,进程可以独立运行,但在调度时需要进行上下文切换,开销较大。引入线程后,线程作为调度的基本单位,可以独立运行,线程切换,仅需保存和设置少量寄存器内容,切换代价远低于进程
2.1.2 并发性
引入线程后,一个进程中的多个线程也可以并发执行,这样使得OS具有更好的并发性,从而能更加有效提高系统资源的利用率和系统的吞吐量。如文字处理器中,一个进程用来从键盘获取输入,一个进程用来处理屏幕显示,一个进程用来检查语法错误;还有网络服务器,多个用户进行访问时,如果仍只使用单线程的进程处理,一次只能为一个用户服务;然而可以设置一个线程用来监听用户请求,有一个用户请求时,就创建一个线程来处理用户请求。
2.1.3 支持多处理机系统
多处理机系统,一个进程的多个线程可以分配到不同处理机上,并行执行,加速进程的完成。而单线程进程,无论多少处理机都只能运行在一个处理机上。现代多处理机OS都引入了多线程。
2.2 时空开销的优化
2.2.1 拥有资源
线程并不拥有系统资源,只是一点运行必不可少的,比如 TCB,指示执行指令序列的程序计数器,保留局部变量、少量状态参数和返回地址的一组寄存器和堆栈。
2.2.2 独立性
同一进程的线程之间的独立性要低于进程间的独立性,因为线程的创建就是为了提高并发性以及进行相互合作,它们共享进程的内存空间和资源,每个线程都可以访问它们所属进程地址空间中的任何地址。如一个线程的堆栈可以被其他线程读、写、甚至完全清除,一个线程打开的文件,可供其他线程读,写。
2.2.3 系统开销
进程切换时,涉及上下文切换,而线程的切换代价远低于进程的,且线程之间的同步和通信也比进程简单。在一些OS中,线程切换,同步,通信都无需操作系统内核的干预
参考
[1] 《计算机操作系统》西安电子科技大学出版社 第四版