进程中的虚存管理与任务调度 也即,线性空间并非指任务空间,而是指CPU的一种机制,它使保护模式下的可用空间达到4g(CPU在保护模式的引导下,可以看到4g的内存,为形成一个soft pc成为可能),——- 只不过是索引的4g .而具体的内存分配与管理与“形成进程空间”,其实是另外一回事.(这些必须要在脑海里明白) 呆会我们将会看到它们是在OS中完成的,这一切,就是操作系统技术中的进程技术要解决的事情。并实现在OS kernel中。
进程进程是一套实现操作系统任务,多任务的软件技术的统称。简言之,任务是一种使代表soft machine意义的os kernel首先完成的visual machine的整套机制。其形态有普通进程和线程二种。 任务空间与虚拟存储首先,对于任务,在硬件级是分段分页机制和门的跳转保护机制,在os core级,可以封装它们,最终表现出一个个“隔离了的线性任务空间”和受保护的代码执行环境和IO环境。。 进程和线程作为任务,模拟了内存和CPU时间这二者(没有CPU或没有内存都不足于构成一个软件的任务,线程要偏向于CPU时间一点),是人们分裂一台计算机的处理能力,为多台计算机的手段.,故称VM。进程“使一个程序独享内存1 这里有必要再次提到4g空间作为线性空间与任务空间的区别,前者主要是指CPU的机制,这里是指进程的机制(而进程已经有软件的意义了),4G的虚存空间只是映射,这里有alu和mmu的作用(即页式内存管理),如果可以,还可以加上段式的作用,其实,进程空间是不存在的,更真正的称法是“进程空间”,它是个概念上的映射,故内核内间,用户空间,只是4G的“进程空间”(这里称为进程空间似乎不妥,任务空间,应称为工作空间,“可供映射空间”) 虚拟寄存器环境进程使计算机成为vm,它有自己的寄存器环境(这绝不仅仅是一句空话,这句话是指,计算机成为一台VM,所有VM共享PC整个执行硬件,以它为基础形成保护模式,并形成任务)和内存(用线性空间成就的任务空间)
虚存管理与调度 虚拟内存不仅指页面文件(不是每个系统都有MMU单元),它其实是一个很大的基础概念,是PC分解它自身只有一个CPU和主存而产生的“虚拟化CPU时间”,和“虚拟化主存空间”的二者之一,它作为底层服务于caching,mm,内存保护,等上层建筑.(是典型的C/S结构,所以,在OS的设计中,windows大量采用管理器之类的概念,而这,也导致了微内核的产生),理解虚拟内存的关键是理解“存储器抽象”和“mm”这二种概念实际上是一上一下的二大抽象体系.即解决硬件抽象层的问题,和关于任务中对于内存,的初级系统逻辑. 其次,软件平台要作为一个能运行多任务的soft vm,进程就需要被调度,故是实现多任务(此时不能说成多进程2,多线程什么的)的基础.它首先完成任务调度(此时它并不一定跟多线程多进程同时运行有关3,大凡内核,总要处理任务间的切换,对CPU,IO的使用,此时,就需要调度),再完成并发调度(基于调度的并发),线程原来也叫进程.调度是OS的灵魂,它是将“一个CPU”以“进程”为单位分成“多个CPU”的手段(是一种时间上的划分,由定时设备发出有规则划分的信号). 在OS级,CPU与内存如何发生联系被称为CPU的存储管理机制 – 这个存储,专指主存,页如何被实际分配,并形成一个进程空间.即,就是“进程地址空间的形成”, 这才是指OS的事。 就是“具体的内存分配与管理”,即页式内存分配逻辑(这主要指CPU对内存的策略),这二者都是存诸管理机的二个阶段. 进程是OS Kernel的,它维护一个就绪表和一个关于进程的条件队列,在有了系统的原生并发的支持下,在应用程序层,编程可以通过共享存储器或消息传递机制实现某种并发, 对于共享存储,大约可以分为忙等待和基于调度的方式,又可与“互斥机制”和“条件同步”组合分类,,于是有四种并发机制.
多任务首先,一个现代的OS必定是需要支持多任务的,对多任务的管理,被实现在OS内核中。 在单CPU上采取多线程策略的情况下,不会提高程序的真实速度,因为CPU只是采取时间片轮分的方法.但是可以得到“界面高速反应”这样的效果,这跟提不提高速度,是二回事并不矛盾. 计算机运行并完全计算的基本单位是靠一个个的“进程”来组织的,由是多任务要么是多进程,要么是多线程。
解决了如何表示多任务的问题之后,下一步就是解决如何同步它们了。 于是多进程就有内存间互不干扰的假像,但实际上他们正是靠正面协作来达到这个假像的,线程的真正意义是“使一份执行流(程序的一部分)”独享CPU.当然,于是多线程就有了多CPU的假像,这二者都是模拟的. 解决多线程的问题是多解的,,源于解决方法的高层模式各有不同4,有不同的相关概念,,比如锁,,,就不需要用到信号量. 不要把线程想像为:它是进程依赖的,其实,它跟任何一个进程一样,是直接面向整个VM和运行环境的,只有VM才负责为它可供访问的资源和这种提供同步机制.进程不能. 线程首先是作为OS的任务机制,应首先讨论它的这层意义,再讨论它用于并发的那些意义。即线程先是任务里面的概念,然后才是并发里面的概念。 多线程中的quene,用设置一个“单行道”的方式来避免并发带来的矛盾. 阻塞式同步,也就是基于调度的并发,,跟基于忙等待和锁的并发(蛮干算法)对应.. 多任务通讯多CPU要协调好共享资源的处理,多线程也要做一样的同步工作(虽然它也可以完全不做). 在顺序语言里,一般用共享存储(就是用某个存储在公共区的值作为条件,判断通过就不用再等待)或消息传递的方式进行线程间的通信(最终是希望得到某种同步和要达到的并行性能的折中,即不能同步过度,必要的同步) 多进程需要被调度,多线程也一样,要注意三个东西, 参与并发的各个主体,线程,或进程, 并发的数据结构,比如锁,互斥体,等, 调度机制与调度条件. 可用忙等待(一直等待的意思)的spin lock或阻塞式同步(基于调度的同步,线程间自愿让出CPU)完成.记住这个说法,被阻塞是为了同步,阻塞不是出了问题,只有发生deadlock的时候,才是出了问题.互斥是为了同步,是同步的一种机制,跟同步不是矛盾的概念(同步是为了解决多进程不同步问题的大概念大方向,互斥只是一种同步机制和解决问题的方法之一). (自愿阻塞的调度方式下)阻塞可能是一个线程自动让出同步数据结构,比如锁(比如在这个线程中调用了sleep,或input等待输入),而此时,它还在运行(没被终止,甚至没被中止),一个进程被阴塞时不是指它没被运行(它只是因自愿或某种调度被迫而放弃了同步设施而挂起,挂起的意思仅指它不再受到并发保护的影响,其实,因等待输入等条件引起的挂起是很自然的原因),只是指它不受到并发的保护,只要有机会,它可以由别的进程唤醒(因调度获得同步设施), 正在运行的线程可能是前一秒运行过,现在(测试时)发现刚刚就被阻塞了的线程 什么是阻塞,阻塞即线程因得不到而等待资源的过程.是OS的调度里面的概念 阻塞就是以线程为单位独占用CPU时间引用的事情(sleep函数就是根据这个原理来的,此时它要等到时间过了这个事件被发生,才会停止sleep),比如一个read()线程在程序中等待输入,而这个输入因为网络迟没有及时到达,这个线程就一直占用着CPU时间(因为线程所处在的系统,本质上只有一个CPU),使得其它线程也一并被卡掉(比如界面上一个关闭按钮无法响应使用户认为这个程序死了). 阻塞,怎么会跟线程有关呢?因为有 锁机制在做怪,它在协调活动的线程.如果没有用线程实现的并发(此种并发在单CPU上并非为了加速,而是为了分流协调),就不需要用到锁,因此,就不需要靠阻塞一方的方式来协调.因此,在获得锁方面,就有主动获得锁和主动让步锁的情形存在. 任务与并发OS对于解决多任务和解决多任务之间的同步是一前一后的。并发问题是随着计算机制造和计算机软件系统制造而产生的那类问题(为了分时就必须协调同步),所以,它产生了一整个系统编程的流派 同步所谓同步,其实并不是什么大不了的概念,它不过就是解决可能会出现“不同步,影响通信”的诸多矛盾的一切手段的统称,在OS中,这些手段就表现为软件上的抽象,被实现在OS kernel中。
并发5首先发生的大背景是PC6,假设我们是对单处理器的PC编程,因此每个时刻,都只有一个活动执行上文行存在(CPU在任何时候,当前只有一个活动的执行路径-肯定是某个进程7,在被CPU执行并处在这个执行路径中,Windows可以允许多用户多进程,但是因为所谓多进程,其实正是CPU轮流给每个进程分配了CPU时间所以在单CPU的环境下,不真正存在多任务,多进程和多线程都不能真正给程序提速,它只能达到一种“分流”的效果,使得界面响应快捷(这主要依赖调度,它能迅速地把不需要CPU时间的当前线程 – 比如一个等待用户输入的线程,阻塞掉,复活另外一个需要CPU时间的线程,然后调度再在其中监视新情况的出现并不断地作此类分流性质的调度,以使不需要CPU时间的线程让步CPU时间给需要CPU的线程 – 可见,并发并不是什么高高在上的东西,而是随着可见的那一类问题的需求而出现的,当然,这需要为每个工作流设置一个控制,即一个“控制线程”,thread of control=thread,而这,正是并发要被提出和它要解决的问题),或其它一些效果. —————————————-
保护模式下的分段分页机制解决了地址映射与转换方面的事情,完成了“转换地址,从逻辑到线性,从线性到物理”,“形成线性任务空间”这样的诸如此类的任务,这就是说,它完成的是建造一个个“隔离了的任务空间”的任务,然而(这主要指CPU的功能和策略), 并没有上升到完成负责建造具体任务的事的层次.因为此时我们还没有谈到任务,还没有谈到任何关于它在软件上的意义(任务是OS的概念,而OS代表软件平台).比如,什么是任务空间,以及任务怎么样利用这些隔离了的空间。 也即,线性空间并非指任务空间,而是指CPU的一种机制,它使保护模式下的可用空间达到4g(CPU在保护模式的引导下,可以看到4g的内存,为形成一个soft pc成为可能),——- 只不过是索引的4g .而具体的内存分配与管理与“形成进程空间”,其实是另外一回事.(这些必须要在脑海里明白) 呆会我们将会看到它们是在OS中完成的,这一切,就是操作系统技术中的进程技术要解决的事情。并实现在OS kernel中。
进程进程是一套实现操作系统任务,多任务的软件技术的统称。简言之,任务是一种使代表soft machine意义的os kernel首先完成的visual machine的整套机制。其形态有普通进程和线程二种。 任务空间与虚拟存储首先,对于任务,在硬件级是分段分页机制和门的跳转保护机制,在os core级,可以封装它们,最终表现出一个个“隔离了的线性任务空间”和受保护的代码执行环境和IO环境。。 进程和线程作为任务,模拟了内存和CPU时间这二者(没有CPU或没有内存都不足于构成一个软件的任务,线程要偏向于CPU时间一点),是人们分裂一台计算机的处理能力,为多台计算机的手段.,故称VM。进程“使一个程序独享内存1 这里有必要再次提到4g空间作为线性空间与任务空间的区别,前者主要是指CPU的机制,这里是指进程的机制(而进程已经有软件的意义了),4G的虚存空间只是映射,这里有alu和mmu的作用(即页式内存管理),如果可以,还可以加上段式的作用,其实,进程空间是不存在的,更真正的称法是“进程空间”,它是个概念上的映射,故内核内间,用户空间,只是4G的“进程空间”(这里称为进程空间似乎不妥,任务空间,应称为工作空间,“可供映射空间”) 虚拟寄存器环境进程使计算机成为vm,它有自己的寄存器环境(这绝不仅仅是一句空话,这句话是指,计算机成为一台VM,所有VM共享PC整个执行硬件,以它为基础形成保护模式,并形成任务)和内存(用线性空间成就的任务空间)
虚存管理与调度 虚拟内存不仅指页面文件(不是每个系统都有MMU单元),它其实是一个很大的基础概念,是PC分解它自身只有一个CPU和主存而产生的“虚拟化CPU时间”,和“虚拟化主存空间”的二者之一,它作为底层服务于caching,mm,内存保护,等上层建筑.(是典型的C/S结构,所以,在OS的设计中,windows大量采用管理器之类的概念,而这,也导致了微内核的产生),理解虚拟内存的关键是理解“存储器抽象”和“mm”这二种概念实际上是一上一下的二大抽象体系.即解决硬件抽象层的问题,和关于任务中对于内存,的初级系统逻辑. 其次,软件平台要作为一个能运行多任务的soft vm,进程就需要被调度,故是实现多任务(此时不能说成多进程2,多线程什么的)的基础.它首先完成任务调度(此时它并不一定跟多线程多进程同时运行有关3,大凡内核,总要处理任务间的切换,对CPU,IO的使用,此时,就需要调度),再完成并发调度(基于调度的并发),线程原来也叫进程.调度是OS的灵魂,它是将“一个CPU”以“进程”为单位分成“多个CPU”的手段(是一种时间上的划分,由定时设备发出有规则划分的信号). 在OS级,CPU与内存如何发生联系被称为CPU的存储管理机制 – 这个存储,专指主存,页如何被实际分配,并形成一个进程空间.即,就是“进程地址空间的形成”, 这才是指OS的事。 就是“具体的内存分配与管理”,即页式内存分配逻辑(这主要指CPU对内存的策略),这二者都是存诸管理机的二个阶段. 进程是OS Kernel的,它维护一个就绪表和一个关于进程的条件队列,在有了系统的原生并发的支持下,在应用程序层,编程可以通过共享存储器或消息传递机制实现某种并发, 对于共享存储,大约可以分为忙等待和基于调度的方式,又可与“互斥机制”和“条件同步”组合分类,,于是有四种并发机制.
多任务首先,一个现代的OS必定是需要支持多任务的,对多任务的管理,被实现在OS内核中。 在单CPU上采取多线程策略的情况下,不会提高程序的真实速度,因为CPU只是采取时间片轮分的方法.但是可以得到“界面高速反应”这样的效果,这跟提不提高速度,是二回事并不矛盾. 计算机运行并完全计算的基本单位是靠一个个的“进程”来组织的,由是多任务要么是多进程,要么是多线程。
解决了如何表示多任务的问题之后,下一步就是解决如何同步它们了。 于是多进程就有内存间互不干扰的假像,但实际上他们正是靠正面协作来达到这个假像的,线程的真正意义是“使一份执行流(程序的一部分)”独享CPU.当然,于是多线程就有了多CPU的假像,这二者都是模拟的. 解决多线程的问题是多解的,,源于解决方法的高层模式各有不同4,有不同的相关概念,,比如锁,,,就不需要用到信号量. 不要把线程想像为:它是进程依赖的,其实,它跟任何一个进程一样,是直接面向整个VM和运行环境的,只有VM才负责为它可供访问的资源和这种提供同步机制.进程不能. 线程首先是作为OS的任务机制,应首先讨论它的这层意义,再讨论它用于并发的那些意义。即线程先是任务里面的概念,然后才是并发里面的概念。 多线程中的quene,用设置一个“单行道”的方式来避免并发带来的矛盾. 阻塞式同步,也就是基于调度的并发,,跟基于忙等待和锁的并发(蛮干算法)对应.. 多任务通讯多CPU要协调好共享资源的处理,多线程也要做一样的同步工作(虽然它也可以完全不做). 在顺序语言里,一般用共享存储(就是用某个存储在公共区的值作为条件,判断通过就不用再等待)或消息传递的方式进行线程间的通信(最终是希望得到某种同步和要达到的并行性能的折中,即不能同步过度,必要的同步) 多进程需要被调度,多线程也一样,要注意三个东西, 参与并发的各个主体,线程,或进程, 并发的数据结构,比如锁,互斥体,等, 调度机制与调度条件. 可用忙等待(一直等待的意思)的spin lock或阻塞式同步(基于调度的同步,线程间自愿让出CPU)完成.记住这个说法,被阻塞是为了同步,阻塞不是出了问题,只有发生deadlock的时候,才是出了问题.互斥是为了同步,是同步的一种机制,跟同步不是矛盾的概念(同步是为了解决多进程不同步问题的大概念大方向,互斥只是一种同步机制和解决问题的方法之一). (自愿阻塞的调度方式下)阻塞可能是一个线程自动让出同步数据结构,比如锁(比如在这个线程中调用了sleep,或input等待输入),而此时,它还在运行(没被终止,甚至没被中止),一个进程被阴塞时不是指它没被运行(它只是因自愿或某种调度被迫而放弃了同步设施而挂起,挂起的意思仅指它不再受到并发保护的影响,其实,因等待输入等条件引起的挂起是很自然的原因),只是指它不受到并发的保护,只要有机会,它可以由别的进程唤醒(因调度获得同步设施), 正在运行的线程可能是前一秒运行过,现在(测试时)发现刚刚就被阻塞了的线程 什么是阻塞,阻塞即线程因得不到而等待资源的过程.是OS的调度里面的概念 阻塞就是以线程为单位独占用CPU时间引用的事情(sleep函数就是根据这个原理来的,此时它要等到时间过了这个事件被发生,才会停止sleep),比如一个read()线程在程序中等待输入,而这个输入因为网络迟没有及时到达,这个线程就一直占用着CPU时间(因为线程所处在的系统,本质上只有一个CPU),使得其它线程也一并被卡掉(比如界面上一个关闭按钮无法响应使用户认为这个程序死了). 阻塞,怎么会跟线程有关呢?因为有 锁机制在做怪,它在协调活动的线程.如果没有用线程实现的并发(此种并发在单CPU上并非为了加速,而是为了分流协调),就不需要用到锁,因此,就不需要靠阻塞一方的方式来协调.因此,在获得锁方面,就有主动获得锁和主动让步锁的情形存在. 任务与并发OS对于解决多任务和解决多任务之间的同步是一前一后的。并发问题是随着计算机制造和计算机软件系统制造而产生的那类问题(为了分时就必须协调同步),所以,它产生了一整个系统编程的流派 同步所谓同步,其实并不是什么大不了的概念,它不过就是解决可能会出现“不同步,影响通信”的诸多矛盾的一切手段的统称,在OS中,这些手段就表现为软件上的抽象,被实现在OS kernel中。
并发5首先发生的大背景是PC6,假设我们是对单处理器的PC编程,因此每个时刻,都只有一个活动执行上文行存在(CPU在任何时候,当前只有一个活动的执行路径-肯定是某个进程7,在被CPU执行并处在这个执行路径中,Windows可以允许多用户多进程,但是因为所谓多进程,其实正是CPU轮流给每个进程分配了CPU时间所以在单CPU的环境下,不真正存在多任务,多进程和多线程都不能真正给程序提速,它只能达到一种“分流”的效果,使得界面响应快捷(这主要依赖调度,它能迅速地把不需要CPU时间的当前线程 – 比如一个等待用户输入的线程,阻塞掉,复活另外一个需要CPU时间的线程,然后调度再在其中监视新情况的出现并不断地作此类分流性质的调度,以使不需要CPU时间的线程让步CPU时间给需要CPU的线程 – 可见,并发并不是什么高高在上的东西,而是随着可见的那一类问题的需求而出现的,当然,这需要为每个工作流设置一个控制,即一个“控制线程”,thread of control=thread,而这,正是并发要被提出和它要解决的问题),或其它一些效果. —————————————-
保护模式下的分段分页机制解决了地址映射与转换方面的事情,完成了“转换地址,从逻辑到线性,从线性到物理”,“形成线性任务空间”这样的诸如此类的任务,这就是说,它完成的是建造一个个“隔离了的任务空间”的任务,然而(这主要指CPU的功能和策略), 并没有上升到完成负责建造具体任务的事的层次.因为此时我们还没有谈到任务,还没有谈到任何关于它在软件上的意义(任务是OS的概念,而OS代表软件平台).比如,什么是任务空间,以及任务怎么样利用这些隔离了的空间。 也即,线性空间并非指任务空间,而是指CPU的一种机制,它使保护模式下的可用空间达到4g(CPU在保护模式的引导下,可以看到4g的内存,为形成一个soft pc成为可能),——- 只不过是索引的4g .而具体的内存分配与管理与“形成进程空间”,其实是另外一回事.(这些必须要在脑海里明白) 呆会我们将会看到它们是在OS中完成的,这一切,就是操作系统技术中的进程技术要解决的事情。并实现在OS kernel中。
进程进程是一套实现操作系统任务,多任务的软件技术的统称。简言之,任务是一种使代表soft machine意义的os kernel首先完成的visual machine的整套机制。其形态有普通进程和线程二种。 任务空间与虚拟存储首先,对于任务,在硬件级是分段分页机制和门的跳转保护机制,在os core级,可以封装它们,最终表现出一个个“隔离了的线性任务空间”和受保护的代码执行环境和IO环境。。 进程和线程作为任务,模拟了内存和CPU时间这二者(没有CPU或没有内存都不足于构成一个软件的任务,线程要偏向于CPU时间一点),是人们分裂一台计算机的处理能力,为多台计算机的手段.,故称VM。进程“使一个程序独享内存1 这里有必要再次提到4g空间作为线性空间与任务空间的区别,前者主要是指CPU的机制,这里是指进程的机制(而进程已经有软件的意义了),4G的虚存空间只是映射,这里有alu和mmu的作用(即页式内存管理),如果可以,还可以加上段式的作用,其实,进程空间是不存在的,更真正的称法是“进程空间”,它是个概念上的映射,故内核内间,用户空间,只是4G的“进程空间”(这里称为进程空间似乎不妥,任务空间,应称为工作空间,“可供映射空间”) 虚拟寄存器环境进程使计算机成为vm,它有自己的寄存器环境(这绝不仅仅是一句空话,这句话是指,计算机成为一台VM,所有VM共享PC整个执行硬件,以它为基础形成保护模式,并形成任务)和内存(用线性空间成就的任务空间)
虚存管理与调度 虚拟内存不仅指页面文件(不是每个系统都有MMU单元),它其实是一个很大的基础概念,是PC分解它自身只有一个CPU和主存而产生的“虚拟化CPU时间”,和“虚拟化主存空间”的二者之一,它作为底层服务于caching,mm,内存保护,等上层建筑.(是典型的C/S结构,所以,在OS的设计中,windows大量采用管理器之类的概念,而这,也导致了微内核的产生),理解虚拟内存的关键是理解“存储器抽象”和“mm”这二种概念实际上是一上一下的二大抽象体系.即解决硬件抽象层的问题,和关于任务中对于内存,的初级系统逻辑. 其次,软件平台要作为一个能运行多任务的soft vm,进程就需要被调度,故是实现多任务(此时不能说成多进程2,多线程什么的)的基础.它首先完成任务调度(此时它并不一定跟多线程多进程同时运行有关3,大凡内核,总要处理任务间的切换,对CPU,IO的使用,此时,就需要调度),再完成并发调度(基于调度的并发),线程原来也叫进程.调度是OS的灵魂,它是将“一个CPU”以“进程”为单位分成“多个CPU”的手段(是一种时间上的划分,由定时设备发出有规则划分的信号). 在OS级,CPU与内存如何发生联系被称为CPU的存储管理机制 – 这个存储,专指主存,页如何被实际分配,并形成一个进程空间.即,就是“进程地址空间的形成”, 这才是指OS的事。 就是“具体的内存分配与管理”,即页式内存分配逻辑(这主要指CPU对内存的策略),这二者都是存诸管理机的二个阶段. 进程是OS Kernel的,它维护一个就绪表和一个关于进程的条件队列,在有了系统的原生并发的支持下,在应用程序层,编程可以通过共享存储器或消息传递机制实现某种并发, 对于共享存储,大约可以分为忙等待和基于调度的方式,又可与“互斥机制”和“条件同步”组合分类,,于是有四种并发机制.
多任务首先,一个现代的OS必定是需要支持多任务的,对多任务的管理,被实现在OS内核中。 在单CPU上采取多线程策略的情况下,不会提高程序的真实速度,因为CPU只是采取时间片轮分的方法.但是可以得到“界面高速反应”这样的效果,这跟提不提高速度,是二回事并不矛盾. 计算机运行并完全计算的基本单位是靠一个个的“进程”来组织的,由是多任务要么是多进程,要么是多线程。
解决了如何表示多任务的问题之后,下一步就是解决如何同步它们了。 于是多进程就有内存间互不干扰的假像,但实际上他们正是靠正面协作来达到这个假像的,线程的真正意义是“使一份执行流(程序的一部分)”独享CPU.当然,于是多线程就有了多CPU的假像,这二者都是模拟的. 解决多线程的问题是多解的,,源于解决方法的高层模式各有不同4,有不同的相关概念,,比如锁,,,就不需要用到信号量. 不要把线程想像为:它是进程依赖的,其实,它跟任何一个进程一样,是直接面向整个VM和运行环境的,只有VM才负责为它可供访问的资源和这种提供同步机制.进程不能. 线程首先是作为OS的任务机制,应首先讨论它的这层意义,再讨论它用于并发的那些意义。即线程先是任务里面的概念,然后才是并发里面的概念。 多线程中的quene,用设置一个“单行道”的方式来避免并发带来的矛盾. 阻塞式同步,也就是基于调度的并发,,跟基于忙等待和锁的并发(蛮干算法)对应.. 多任务通讯多CPU要协调好共享资源的处理,多线程也要做一样的同步工作(虽然它也可以完全不做). 在顺序语言里,一般用共享存储(就是用某个存储在公共区的值作为条件,判断通过就不用再等待)或消息传递的方式进行线程间的通信(最终是希望得到某种同步和要达到的并行性能的折中,即不能同步过度,必要的同步) 多进程需要被调度,多线程也一样,要注意三个东西, 参与并发的各个主体,线程,或进程, 并发的数据结构,比如锁,互斥体,等, 调度机制与调度条件. 可用忙等待(一直等待的意思)的spin lock或阻塞式同步(基于调度的同步,线程间自愿让出CPU)完成.记住这个说法,被阻塞是为了同步,阻塞不是出了问题,只有发生deadlock的时候,才是出了问题.互斥是为了同步,是同步的一种机制,跟同步不是矛盾的概念(同步是为了解决多进程不同步问题的大概念大方向,互斥只是一种同步机制和解决问题的方法之一). (自愿阻塞的调度方式下)阻塞可能是一个线程自动让出同步数据结构,比如锁(比如在这个线程中调用了sleep,或input等待输入),而此时,它还在运行(没被终止,甚至没被中止),一个进程被阴塞时不是指它没被运行(它只是因自愿或某种调度被迫而放弃了同步设施而挂起,挂起的意思仅指它不再受到并发保护的影响,其实,因等待输入等条件引起的挂起是很自然的原因),只是指它不受到并发的保护,只要有机会,它可以由别的进程唤醒(因调度获得同步设施), 正在运行的线程可能是前一秒运行过,现在(测试时)发现刚刚就被阻塞了的线程 什么是阻塞,阻塞即线程因得不到而等待资源的过程.是OS的调度里面的概念 阻塞就是以线程为单位独占用CPU时间引用的事情(sleep函数就是根据这个原理来的,此时它要等到时间过了这个事件被发生,才会停止sleep),比如一个read()线程在程序中等待输入,而这个输入因为网络迟没有及时到达,这个线程就一直占用着CPU时间(因为线程所处在的系统,本质上只有一个CPU),使得其它线程也一并被卡掉(比如界面上一个关闭按钮无法响应使用户认为这个程序死了). 阻塞,怎么会跟线程有关呢?因为有 锁机制在做怪,它在协调活动的线程.如果没有用线程实现的并发(此种并发在单CPU上并非为了加速,而是为了分流协调),就不需要用到锁,因此,就不需要靠阻塞一方的方式来协调.因此,在获得锁方面,就有主动获得锁和主动让步锁的情形存在. 任务与并发OS对于解决多任务和解决多任务之间的同步是一前一后的。并发问题是随着计算机制造和计算机软件系统制造而产生的那类问题(为了分时就必须协调同步),所以,它产生了一整个系统编程的流派 同步所谓同步,其实并不是什么大不了的概念,它不过就是解决可能会出现“不同步,影响通信”的诸多矛盾的一切手段的统称,在OS中,这些手段就表现为软件上的抽象,被实现在OS kernel中。
并发5首先发生的大背景是PC6,假设我们是对单处理器的PC编程,因此每个时刻,都只有一个活动执行上文行存在(CPU在任何时候,当前只有一个活动的执行路径-肯定是某个进程7,在被CPU执行并处在这个执行路径中,Windows可以允许多用户多进程,但是因为所谓多进程,其实正是CPU轮流给每个进程分配了CPU时间所以在单CPU的环境下,不真正存在多任务,多进程和多线程都不能真正给程序提速,它只能达到一种“分流”的效果,使得界面响应快捷(这主要依赖调度,它能迅速地把不需要CPU时间的当前线程 – 比如一个等待用户输入的线程,阻塞掉,复活另外一个需要CPU时间的线程,然后调度再在其中监视新情况的出现并不断地作此类分流性质的调度,以使不需要CPU时间的线程让步CPU时间给需要CPU的线程 – 可见,并发并不是什么高高在上的东西,而是随着可见的那一类问题的需求而出现的,当然,这需要为每个工作流设置一个控制,即一个“控制线程”,thread of control=thread,而这,正是并发要被提出和它要解决的问题),或其它一些效果. —————————————-
|
|
来自: herowuking > 《Cracker》