线程

1.多线程

操作系统中引入进程的目的:
为了描述和实现多个程序的并发执行,以改善资源利用率及提高系统的吞吐量。
操作系统引入线程的目的:
这是为了减少程序并发执行时系统所付出的额外开销(减少管理进程以及切换进程的时间花销,使操作系统具有更好的并发性。
进程的两个基本属性:
(1)进程是一个拥有资源的独立单位;
(2)进程同时又是一个可以独立调度的基本单位。

1.1 系统为进程进行的操作

创建进程 、撤消进程 、进程切换 
进程作为资源的拥有者和系统的调度对象,需要花费系统较大的额外开销。因此,系统中同时存在的进程数目不宜过多,进程切换的频率也不宜过高,而这也就限制了并发度的进一步提高。

1.2 由进程到线程

目标:既能提高进程并发度,又能降低系统的额外开销。
实现:将进程的资源申请和调度属性分开。即进程作为资源的申请和拥有者,但不作为调度的基本单位。这样,就产生了线程的概念。线程是进程中的一个实体,是独立调度和分派的基本单位。线程自身基本上不拥有系统资源,只拥有少许运行中必不可少的私有资源。线程可与同属一个进程的其它线程共享进程的全部资源。
进程中的所有线程共享该进程的状态。
线程具有三种基本状态:就绪、执行和阻塞。
线程一般不具有挂起状态,因为线程共享进程的资源,包括存储空间,如果挂起一个进程,其所属的全部进程必将被挂起。而单独挂起某进程中的一个线程,必然会影响同一进程中的其它线程的执行,这是没有任何意义的
一个进程可以创建和撤消一个或多个线程,同一进程中的多个线程可以并发执行。

1.3 对线程的操作

A.派生(Spawn),当系统创建一个进程时,同时也为该进程派生一个线程,同一进程中的线程可以再派生其它线程。
B.阻塞(Block),当线程需要等待某事件时,它将被阻塞,释放处理机执行其它线程。【注意,线程阻塞不一定会引起整个进程的阻塞,否则,引入线程带来的并发性就不会提高】
C.解除阻塞(Unblock),当线程的阻塞事件发生,其状态转换为就绪,并插入到就绪队列,等待调度执行。
D.结束(Finish),当线程执行完毕,释放其私有资源。

2.比较进程与线程

传统操作系统中,一个进程可以创建一个线程, 如MS DOS就是一个单用户、单进程、单线程的操作系统,UNIX是一个多用户、多进程、单线程的操作系统。
现代操作系统和软件设计大多支持多线程运行。例如,Java虚拟机是一个单进程、多线程的运行环境,Windows系列操作系统和Linux操作系统都采用了多进程、多线程技术。

2.1 调度情况

传统操作系统中,进程既是拥有资源的基本单位,又是独立调度的基本单位。引入线程的操作系统中,线程是独立调度的基本单位,进程是资源拥有的基本单位,从而可以显著地提高系统的并发程度。同一进程中的线程间切换不会引起进程切换【进程切换会造成大量系统开销(保存进程上下文),而切换线程不会】,但当一个进程中的线程切换到另一进程中的线程时,将会引起进程切换。

2.2 并发

进程之间可以并发执行
同属于一个进程的多个线程之间,亦可并发执行【思考:不同进程的线程是否可以并发进行?】
因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统吞吐量。
例题:在一个未引入线程的单处理机操作系统中,若仅设置一个文件服务进程,当它由于某种原因而被阻塞时,便没有其它的文件服务进程来提供服务。
引入线程以后,可以在一个文件服务进程中设置多个服务线程,当第一个线程阻塞时,文件服务进程中的第二个线程可以继续运行;当第二个线程阻塞时,第三个线程可以继续执行,从而显著地提高了文件服务的质量和系统吞吐量。 

2.3 拥有资源

进程是拥有资源的独立单位,它有权申请系统的各类资源。
线程除了拥有很少的私有资源以外,不能申请系统资源,可以共享其所属进程的资源。即,进程的代码段、数据段以及系统资源,如已打开的文件、I/O设备等,都可被其内的所有线程共享。

2.4 系统开销

操作系统管理进程的开销显著地大于管理线程所需的开销。
进程切换的开销也远大于线程切换的开销。
由于同一进程中的多个线程具有相同的地址空间,使它们之间的同步和通信也比较容易。
有些类型的线程切换、同步和通信都无需操作系统内核的干预。

3.线程的类型

线程可以分为用户级线程和内核级线程。

3.1 用户级线程

由于系统内核不知道用户级线程的存在,其调度针对进程进行。
当某进程被调度执行时,线程库即开始工作,可以调用spawn例程派生一个从属于该进程的新线程,并为之建立相应的数据结构。或者启动线程调度例程,调度该进程中的某个就绪线程执行。当执行线程需要阻塞等待某事件时,线程被中断,需要保护包括用户寄存器内容、程序计数器和栈指针等上下文信息。如果进程的时间片还未用完,线程调度例程继续调度同一进程中的其它就绪线程。如果需要切换进程,其内的所有线程都不再执行。
例1:
用户级线程阻塞是否会引起整个进程阻塞呢?
这要视具体情况而定。当某进程中的一个线程需要等待另一线程的输出数据而阻塞时,整个进程并不会阻塞。即进程保持执行状态,其内的某个线程也是执行状态。当某线程因为I/O阻塞时,内核需要启动系统I/O,控制从用户级转到系统内核级,这时常会引起整个进程阻塞。随即将发生进程切换,进程调度程序重新调度另一个就绪进程执行。 
例2:
用户级线程能节省大量的系统额外开销,并提高程序并发性。为什么?
线程的管理和控制仅在用户级进行,线程切换无须内核干预,没有模式切换,减少了模式切换的开销。调度更灵活。应用程序可以根据需要选用线程库中不同的线程调度算法,而不受系统内核进程调度程序的约束。由于线程库独立于系统内核,可以运行在不同的操作系统之上,使用户级线程可以得到不同操作系统的支持,而无须修改操作系统内核。 
劣势:
由于很多操作系统的系统调用都会引起阻塞,用户级线程中的系统调用常常会引起线程及整个进程阻塞,削弱了线程的并发性。由于系统内核不知用户级线程的存在,可能出现进程切换时,强行中断其内某个执行线程的情况。很难实现不同进程的线程并发。

3.2 内核级线程

内核级线程的管理全由系统内核完成,应用程序无权进行线程切换等操作,系统为应用程序提供了相应的应用程序编程接口API【俗称:手动分线程】。
Windows2000、Linux和OS/2等操作系统即采用内核级线程技术
系统内核负责内核级线程的创建、撤消、切换等操作。应用程序可以设计成多线程程序,多个线程同属于一个进程。系统以线程为调度单位。
进行线程切换时,需要同时保存整个进程的上下文以及线程的上下文信息。这样,当进程中的某个线程阻塞时,内核可以调度另一个就绪线程执行(同一进程或不同进程)。线程切换时需要进行模式切换。 

[OS复习]进程管理5相关推荐

  1. [OS复习]进程管理2

    问题:多个进程竞争内存资源 1.解决方法 方案一:采用交换技术,换出一部分进程到外存,以腾出内存空间 方案二:采用虚拟存储技术,每个进程只能装入一部分程序和数据(存储管理部分) 2.对换技术(交换技术 ...

  2. [OS复习]进程管理4

    进程调度算法(Short-Term) 1.先来先服务(FCFS) 该方法按照进程到达的先后顺序排队,每次调度队首的进程(就像超市中购物付款一样). FCFS算法属于非剥夺调度方式,实现简单,看似公平. ...

  3. [OS复习]进程管理3

    进程调度方式及类型 1.进程调度方式 根据执行进程的处理机是由进程自己释放,还是被强行剥夺,可以将进程调度方式分为非剥夺方式和剥夺方式两种. 1.1非剥夺方式 执行进程只有在执行完毕,或因申请I/O阻 ...

  4. OS X进程管理之launchctl

    OS X进程管理之launchctl Apple官方文档 如果 Mac 无法完成启动,请尝试安全模式 如果 Mac 无法开机应如何处理 在 Mac OS X 中设置固件密码保护 如何重置 Mac 上的 ...

  5. python中的os abort_Python::OS 模块 -- 进程管理

    这里我们介绍os模块中的进程管理相关的操作. os模块提供给了我们访问操作系统功能的接口,我们可以通过os模块提供给我们的进程管理接口,编写多进程程序,这对编写高效.并发的程序提供了方便. 下面是一个 ...

  6. python os模块进程管理

    2019独角兽企业重金招聘Python工程师标准>>> 有两种方式来实现并发性,一种方式是让每个"任务"或"进程"在单独的内在空间中工作,每个 ...

  7. Python之OS模块进程管理介绍--os.fork()

    转自:http://davidbj.blog.51cto.com/4159484/1240586 有两种方式来实现并发性,一种方式是让每个"任务"或"进程"在单 ...

  8. [OS复习]进程互斥与同步2

    互斥与同步的解决策略 当前,利用软件方法.硬件方法.信号量方法.管程方法.消息传递方法都可以有效地解决进程间的互斥与同步,其中信号量的方法更具有优势(目前已经通用). 1. 软件方法: 软件方法是指由 ...

  9. [OS复习]进程互斥与同步1

    进程互斥与同步 1.引言:多道程序设计存在的问题? 采用多道程序设计技术的操作系统,允许多个进程同时驻留内存并发执行.思考: A.如何协调多个进程对系统资源,如内存空间.外部设备等的竞争和共享? B. ...

最新文章

  1. 一份传世典文:十年编程(Teach Yourself Programming in Ten Years)
  2. What to bring in UK?
  3. 数组洗牌算法-shuffle
  4. struts2加入自定义的actionValidatorManager实现类
  5. vim设置默认utf-8编码
  6. 增强for中操作集合元素的误区---java.util.ConcurrentModificationException
  7. Hibernate之多对多映射
  8. 谷歌账号在谷歌浏览器无法登录,提示此浏览器或应用可能不安全的一种解决办法
  9. R语言批量生成CaseWhen的解决方案
  10. 分布式搜索引擎es原理
  11. 什么是API接口?给大家举例说明
  12. 截止频率计算公式wc_已知低通滤波器的传递函数是G(s)=(G0*Wc)/(s+Wc),截止频率不超过2HZ,怎么求?...
  13. linux下优盘格式化,linux下格式化u盘
  14. 教程 | 扁平物体的摄影测量重建方案
  15. 信噪比(一些概念,公式推导,实验分析)
  16. 股票/期货分仓系统都能实现什么功能?
  17. 网络工程师配置安全设备,防火墙基本配置管理
  18. Mapbox 加载自定义 WMS 数据源
  19. gem是什么证书_珠宝鉴定:EGL证书到底是一个什么样的证书?
  20. ASEMI整流桥MB10M参数,MB10M大小,MB10M特性

热门文章

  1. 第二次冲刺------第三天
  2. IBM公司扩展云平台 计划推出SmartCloud
  3. (转)使用XmlDocument类完成对XML的查、删、添、改
  4. hdu 3303(线段树+抽屉原理)
  5. hihocoder #1078 : 线段树的区间修改
  6. 目标检测之RCNN,SPP-NET,Fast-RCNN,Faster-RCNN
  7. [LGP4707] 重返现世
  8. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 离散化】
  9. 解决tensorflow在训练的时候权重是nan问题
  10. CentOS7 systemctl tomcat常用配置