线程和进程的理解

最近发现对于进程和线程的理解存在一些疑惑,就复习了下大学教科书操作系统教程。

先转发一个关于linux进程和线程的总结博客:http://blog.csdn.net/ylyuanlu/article/details/9115073

在来说操作系统对于进程介绍:首先要明白一点对于进程是基于操作系统存在的前提下,在操作系统中才存在进程;现在使用的操作系统大部分都是多任务的,操作系统为方便管理多个相互独立的任务,给每一个用户运行起来的程序,创建一个进程(程序和进程的对应关系为1个程序可以对应多个进程),操作系统在创建进程后,负责维护

进程篇:

每一个进程都有一个也只有一个进程控制块 PCB(Process Control Block),进程控制块是操作系统用于记录和刻画进程状态及有关信息的数据结构,也是操作系统掌握进程的唯一资料结构,是操作系统控制和管理进程的主要依据。


进程映像(ProcessImage)包括:

  1. z 进程程序块,即被执行的程序,规定了进程一次运行应完成的功能。通常它是纯代码,作为一种系统资源可被多个进程共享。
  2. z 进程数据块,即程序运行时加工处理对象,包括全局变量、局部变量和常量等的存放区以及开辟的工作区,常常为一个进程专用。
  3. z 系统/用户堆栈,每一个进程都将捆绑一个系统/用户堆栈。用来解决过程调用或系统调用时的信息存储和参数传递。
  4. z 进程控制块,每一个进程都将捆绑一个进程控制块,用来存储进程的标志信息、现场信息和控制信息。进程创建时,建立进程控制块;进程撤销时,回收进程控制块,它与进程一一对应。

PCB包含三类信息:

  1. z 标识信息。用于唯一地标识一个进程,常常分为由用户使用的外部标识符和被系统使用的内部标识号。几乎所有操作系统中进程都被赋予一个唯一的、内部使用的数值型的进程号,操作系统的其他控制表可以通过进程号来交叉引用进程控制表。常用的标识信息包括进程标识符、父进程的标识符、用户进程名、用户组名等。
  2. z 现场信息。用于保留一个进程在运行时存放在处理器现场中的各种信息,任何一个进程在让出处理器时必须把此时的处理器现场信息保存到进程控制块中,而当该进程重新恢复运行时也应恢复处理器现场。常用的现场信息包括:通用寄存器的内容、控制寄存器(如 PSW 寄存器)的内容、用户堆栈指针、系统堆栈指针等。
  3. z 控制信息。用于管理和调度一个进程。常用的控制信息包括:1)进程调度相关信息,如进程状态、等待事件和等待原因、进程优先级、队列指引元等;2)进程组成信息,如正文段指针、数据段指针;3)进程间通信信息,如消息队列指针、信号量等互斥和同步机制;4)进程在辅存储器内的地址;5)CPU资源的占用和使用信息,如时间片余量、进程己占用 CPU 的时间、进程己执行的时间总和,记账信息;6)进程特权信息,如在内存访问权限和处理器状态方面的特权;7)资源清单,包括进程所需全部资源、已经分得的资源,如主存资源、I/O 设备、打开文件表等。

关于并发执行任务,实际上在多进程工作的操作系统上已经到达了使用要求,为什么会出现多线程的并发技术呢?

传统的多进程并发程序, 并发程序设计效率带来了一系列新的问题,主要表现在:

  1. z 进程时空的开销大,频繁的进程调度将耗费大量处理器时间,要为每个进程分配存储空间限制了操作系统中进程的总数。
  2. z 进程通信的代价大,每次通信均要涉及通信进程之间或通信进程与操作系统之间的信息传递。
  3. z 进程之间的并发性粒度较粗,并发度不高,过多的进程切换和通信延迟使得细粒度的并发得不偿失。
  4. z 不适合并行计算和分布并行计算的要求,对于多处理器和分布式的计算环境来说,进程之间大量频繁的通信和切换,会大大降低并行度。
  5. z 不适合客户/服务器计算的要求。对于 C/S 结构来说,那些需要频繁输入输出并同时大量计算的服务器进程(如数据库服务器、事务监督程序)很难体现效率。

如果说操作系统中引入进程的目的是为了使多个程序能并发执行,以改善资源使用率和提高系统效率,那么,在操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好。解决问题的基本思路是:把进程的两项功能--“独立分配资源”与“被调度分派执行”分离开来,前一项任务仍由进程完成,它作为系统资源分配和保护的独立单位,不需要频繁地切换;后一项任务交给称作线程的实体来完成,它作为系统调度和分派的基本单位,会被频繁地调度和切换,在这种指导思想下,产生了线程的概念。

因此在实现了进程和线程的操作系统中,进程是操作系统中进行保护和资源分配的单位,允许一个进程中包含多个可并发执行的控制流,这些控制流切换时不必通过进程调度,通信时可以直接借助于共享内存区,每个控制流称为一个线程,这就是并发多线程程序设计。

线程是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程。同一个进程中的所有线程共享进程获得的主存空间和资源,但不拥有资源。线程具有:

  1. z 线程执行状态(运行、就绪、等待、...);
  2. z 当线程不运行时,有一个受保护的线程上下文,用于存储现场信息。所以,观察线程的一种方式是运行在进程内一个独立的程序计数器;
  3. z 一个执行堆栈
  4. z 一个容纳局部变量的主存存储区。

因此,进程包含运行时信息资源和线程资源,处理器调度和分派的基本单位是线程,线程是一个运行时的数据处理流程。


在linux平台上的线程历史:开篇的引用链接介绍了线程的历史

1. 早期的多线程库实现,实际上是在用户空间实现,用户空间的线程对应的是系统级别的进程,

2. 后来实现了轻量级进程,在用户空间创建线程后系统创建一个对应的轻量级进程。这个轻量级进程实际上就是内核创建的对应线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值