分享

虚存管理与任务调度 | 兮软

 herowuking 2015-08-17

进程中的虚存管理与任务调度
保护模式下的分段分页机制解决了地址映射与转换方面的事情,完成了“转换地址,从逻辑到线性,从线性到物理”,“形成线性任务空间”这样的诸如此类的任务,这就是说,它完成的是建造一个个“隔离了的任务空间”的任务,然而(这主要指CPU的功能和策略), 并没有上升到完成负责建造具体任务的事的层次.因为此时我们还没有谈到任务,还没有谈到任何关于它在软件上的意义(任务是OS的概念,而OS代表软件平台).比如,什么是任务空间,以及任务怎么样利用这些隔离了的空间。

也即,线性空间并非指任务空间,而是指CPU的一种机制,它使保护模式下的可用空间达到4g(CPU在保护模式的引导下,可以看到4g的内存,为形成一个soft pc成为可能),——- 只不过是索引的4g .而具体的内存分配与管理与“形成进程空间”,其实是另外一回事.(这些必须要在脑海里明白)

呆会我们将会看到它们是在OS中完成的,这一切,就是操作系统技术中的进程技术要解决的事情。并实现在OS kernel中。

进程实现在os kernel中。是支持OS作为软件上的机器的意义首先要解决的事。即虚拟硬件为软件上可用的东西。

这可以从虚拟硬件执行环境中的内存和寄存器开始。本书正是按这个顺序来讲解整个OS原理的。

由于保护模式的CPU已经支持受保护了的任务空间和跳转机制了,所以这并不同于普通的会编环境中的硬件执行环境,如果在其上展开会编,将会是一种高级的会编。

进程

进程是一套实现操作系统任务,多任务的软件技术的统称。简言之,任务是一种使代表soft machine意义的os kernel首先完成的visual machine的整套机制。其形态有普通进程和线程二种。

任务空间与虚拟存储

首先,对于任务,在硬件级是分段分页机制和门的跳转保护机制,在os core级,可以封装它们,最终表现出一个个“隔离了的线性任务空间”和受保护的代码执行环境和IO环境。。

进程和线程作为任务,模拟了内存和CPU时间这二者(没有CPU或没有内存都不足于构成一个软件的任务,线程要偏向于CPU时间一点),是人们分裂一台计算机的处理能力,为多台计算机的手段.,故称VM。进程“使一个程序独享内存1

这里有必要再次提到4g空间作为线性空间与任务空间的区别,前者主要是指CPU的机制,这里是指进程的机制(而进程已经有软件的意义了),4G的虚存空间只是映射,这里有alu和mmu的作用(即页式内存管理),如果可以,还可以加上段式的作用,其实,进程空间是不存在的,更真正的称法是“进程空间”,它是个概念上的映射,故内核内间,用户空间,只是4G的“进程空间”(这里称为进程空间似乎不妥,任务空间,应称为工作空间,“可供映射空间”)
将进程空间分为系统空间与用户空间,它主要是强调:CPU从系统空间进入用户空间(此时,CPU正在一个受限的局域活动)时易,用户空间进入系统空间时(此时,CPU可执行作何特权指令)难,必须要通过OS提供的自陷或中断,方可进入os kernel,进入OS kernel所在代码(在那里,可以执行特权代码,os kernel本身就是优于用户进程代码的特权代码)
先映射系统所在页面(通过内存管理作用),这些页面和这个概念上的空间是不被置换的,用户空间会被进程切换刷新其(对于物理页面的)映射。

虚拟寄存器环境

进程使计算机成为vm,它有自己的寄存器环境(这绝不仅仅是一句空话,这句话是指,计算机成为一台VM,所有VM共享PC整个执行硬件,以它为基础形成保护模式,并形成任务)和内存(用线性空间成就的任务空间)
进程不光有一套自己的虚存空间,也有自己的一套reg环境,这里涉及到大量的保护模式下的段式转换等知识,需要讲解
前提是,我们是在一个4G里讨论问题。有一个正统的称法叫线性空间 这里介绍一下堆栈机,内核栈,用户栈,

进程调度不仅是为了多任务而准备的,单任务内部也需要调度。这就是门所规范的任务代码跳转机制。

程序能不能访问硬件,这要视开发该程序所有的语言和程序运行的环境而定,相比高级语言,会编是可以控制计算机做任何事情的语言,可是假如计算机booting,init进入os,比如windows或linux,那么该程序可能导致错误(而它可能在DOS这样的环境下或者没有DOS的环境下就不会)

比如,多任务环境下,这么多程序共用一套寄存器,硬件资源是它们的公用设施,这会不会造成寄存器混乱呢,不会,因为每个程序的进程都可以为它们保存副本(每个进程都是四GB,有自己的内核栈).而进程调度,即那些保证进程对硬件资源访问的逻辑,是由系统核心来保障的.

内核中的进程

内核管理进程,进程管理线程,线程是时间单位的一个函数(由进程调度来协调产生或同步) 内核线程不可中断,内核所在页面也不可置换
用户线程与内核线程是二个不一样的东西,如果用户进程用了内核线程,那么它就是内核线程,反之,如果一个用户进程的实现,没有用到任何内核线程的支持,那么,它就是posix兼容的用户线程.

虚存管理与调度

虚拟内存不仅指页面文件(不是每个系统都有MMU单元),它其实是一个很大的基础概念,是PC分解它自身只有一个CPU和主存而产生的“虚拟化CPU时间”,和“虚拟化主存空间”的二者之一,它作为底层服务于caching,mm,内存保护,等上层建筑.(是典型的C/S结构,所以,在OS的设计中,windows大量采用管理器之类的概念,而这,也导致了微内核的产生),理解虚拟内存的关键是理解“存储器抽象”和“mm”这二种概念实际上是一上一下的二大抽象体系.即解决硬件抽象层的问题,和关于任务中对于内存,的初级系统逻辑.

其次,软件平台要作为一个能运行多任务的soft vm,进程就需要被调度,故是实现多任务(此时不能说成多进程2,多线程什么的)的基础.它首先完成任务调度(此时它并不一定跟多线程多进程同时运行有关3,大凡内核,总要处理任务间的切换,对CPU,IO的使用,此时,就需要调度),再完成并发调度(基于调度的并发),线程原来也叫进程.调度是OS的灵魂,它是将“一个CPU”以“进程”为单位分成“多个CPU”的手段(是一种时间上的划分,由定时设备发出有规则划分的信号).
因为进程环境由虚存空间和寄存环境CPU(它们代表一台进程VM的时间和空间二方面)组成,因此OS要在内核实现中提供对它们的管理。

在OS级,CPU与内存如何发生联系被称为CPU的存储管理机制 – 这个存储,专指主存,页如何被实际分配,并形成一个进程空间.即,就是“进程地址空间的形成”, 这才是指OS的事。

就是“具体的内存分配与管理”,即页式内存分配逻辑(这主要指CPU对内存的策略),这二者都是存诸管理机的二个阶段.
进程管理和调度实际上是os kenerl的应用层,进程间通信,才是进程管理的server,进程管理使用它。进程通信是os kernel中的kernel,进程管理是os kernel中的application,因此微内核主张,只有进程通信才配进入os kenel,其它如进程管理,使用到进程通信的还有文件系统,设备驱动等,这些,应做到os kernel的下一层次,比如进程的非os kenerl的非kernel层次。

进程是OS Kernel的,它维护一个就绪表和一个关于进程的条件队列,在有了系统的原生并发的支持下,在应用程序层,编程可以通过共享存储器或消息传递机制实现某种并发, 对于共享存储,大约可以分为忙等待和基于调度的方式,又可与“互斥机制”和“条件同步”组合分类,,于是有四种并发机制.

从这里开始,出现了关于进程的很多很多子问题. 比如进程的用户 进程的IO位图 进程上下文 任务状态.任务切换.优先级 内核同步 内存映射和mmap(),malloc() – malloc的背后是一个内存沲,是由C运行时提供的,都会扩展一个进程的线性空间,,这些属于存储管理的内容,而不是进程及进程调度的.

伙伴系统,是动态内存的手段,还有一个slab,,是关于对内核数据结构的内存分配的..

解决了这二个问题,即解决了任务问题,然后是解决外部子组件

这些问题跟任务机制也有交集,这产生了其它问题内核同步进程的IO位图,等等,

在内核中的每一大小问题的解决,都有其相似性(就跟解决任务问题中所看到的那样),比如,用相关的数据结构表示和算法支持,有相关的系统

前面分别介绍了os kernel和进程(由于cpu和进程间的联系),但没有介绍二者之间的关系,进程管理是OS kenel对进程的作用,进程间通信是必要的,它需要“进程间同步”机制,以保证通信的正常化(有一种是报文小消息的传递),进程间同步也是进程间通信,但它又是低级的进程间通信,因此一般把它跟进程间通信分开来说。

多任务

首先,一个现代的OS必定是需要支持多任务的,对多任务的管理,被实现在OS内核中。

在单CPU上采取多线程策略的情况下,不会提高程序的真实速度,因为CPU只是采取时间片轮分的方法.但是可以得到“界面高速反应”这样的效果,这跟提不提高速度,是二回事并不矛盾.

计算机运行并完全计算的基本单位是靠一个个的“进程”来组织的,由是多任务要么是多进程,要么是多线程。

线程可以是进程,比如轻量级进程,这样多线程的本质还是多进程,当线程不再是进程时,问题会变成另外一个形式,此时,存在着二种任务,即进程任务,和线程任务,线程任务只需要CPU时间,而没有虚存空间。

典型的用户层线程是用协程建立起来的

解决了如何表示多任务的问题之后,下一步就是解决如何同步它们了。

于是多进程就有内存间互不干扰的假像,但实际上他们正是靠正面协作来达到这个假像的,线程的真正意义是“使一份执行流(程序的一部分)”独享CPU.当然,于是多线程就有了多CPU的假像,这二者都是模拟的.
并发问题源于图灵模型与需要开发处理的现实问题之间的矛盾,图灵模式是控制主导数据(机器的底层问题都是IO问题),这使得这种IO动作必须被协调.又因为用于开发系统的语言一般是C语言,C语言本身并非某种并发和线程安全语言,所以必须在内核层提供一套同步机制.

解决多线程的问题是多解的,,源于解决方法的高层模式各有不同4,有不同的相关概念,,比如锁,,,就不需要用到信号量.

不要把线程想像为:它是进程依赖的,其实,它跟任何一个进程一样,是直接面向整个VM和运行环境的,只有VM才负责为它可供访问的资源和这种提供同步机制.进程不能. 线程首先是作为OS的任务机制,应首先讨论它的这层意义,再讨论它用于并发的那些意义。即线程先是任务里面的概念,然后才是并发里面的概念。

多线程中的quene,用设置一个“单行道”的方式来避免并发带来的矛盾. 阻塞式同步,也就是基于调度的并发,,跟基于忙等待和锁的并发(蛮干算法)对应..

多任务通讯

多CPU要协调好共享资源的处理,多线程也要做一样的同步工作(虽然它也可以完全不做).

在顺序语言里,一般用共享存储(就是用某个存储在公共区的值作为条件,判断通过就不用再等待)或消息传递的方式进行线程间的通信(最终是希望得到某种同步和要达到的并行性能的折中,即不能同步过度,必要的同步)

多进程需要被调度,多线程也一样,要注意三个东西,

参与并发的各个主体,线程,或进程, 并发的数据结构,比如锁,互斥体,等, 调度机制与调度条件.

可用忙等待(一直等待的意思)的spin lock或阻塞式同步(基于调度的同步,线程间自愿让出CPU)完成.记住这个说法,被阻塞是为了同步,阻塞不是出了问题,只有发生deadlock的时候,才是出了问题.互斥是为了同步,是同步的一种机制,跟同步不是矛盾的概念(同步是为了解决多进程不同步问题的大概念大方向,互斥只是一种同步机制和解决问题的方法之一). (自愿阻塞的调度方式下)阻塞可能是一个线程自动让出同步数据结构,比如锁(比如在这个线程中调用了sleep,或input等待输入),而此时,它还在运行(没被终止,甚至没被中止),一个进程被阴塞时不是指它没被运行(它只是因自愿或某种调度被迫而放弃了同步设施而挂起,挂起的意思仅指它不再受到并发保护的影响,其实,因等待输入等条件引起的挂起是很自然的原因),只是指它不受到并发的保护,只要有机会,它可以由别的进程唤醒(因调度获得同步设施),

正在运行的线程可能是前一秒运行过,现在(测试时)发现刚刚就被阻塞了的线程

什么是阻塞,阻塞即线程因得不到而等待资源的过程.是OS的调度里面的概念 阻塞就是以线程为单位独占用CPU时间引用的事情(sleep函数就是根据这个原理来的,此时它要等到时间过了这个事件被发生,才会停止sleep),比如一个read()线程在程序中等待输入,而这个输入因为网络迟没有及时到达,这个线程就一直占用着CPU时间(因为线程所处在的系统,本质上只有一个CPU),使得其它线程也一并被卡掉(比如界面上一个关闭按钮无法响应使用户认为这个程序死了).

阻塞,怎么会跟线程有关呢?因为有 锁机制在做怪,它在协调活动的线程.如果没有用线程实现的并发(此种并发在单CPU上并非为了加速,而是为了分流协调),就不需要用到锁,因此,就不需要靠阻塞一方的方式来协调.因此,在获得锁方面,就有主动获得锁和主动让步锁的情形存在.
信号量,事件,旗语,都是用于进程间同步和通信的设施(在用c实现的windows,这些东西都被称为对象,实际上,是一系列结构和函数的统称)。进程间会在彼此的空间里交互这些对象,以实现同步和通信。比如互斥量,它锁定了共享资源,得到互斥量的当前进程除非释放它,否则另外的进程不能获得它,进而获得对共享资源的访问.

任务与并发

OS对于解决多任务和解决多任务之间的同步是一前一后的。并发问题是随着计算机制造和计算机软件系统制造而产生的那类问题(为了分时就必须协调同步),所以,它产生了一整个系统编程的流派

同步

所谓同步,其实并不是什么大不了的概念,它不过就是解决可能会出现“不同步,影响通信”的诸多矛盾的一切手段的统称,在OS中,这些手段就表现为软件上的抽象,被实现在OS kernel中。
既然冯氏机本来就是一台顺序确定执行指令的机器,为什么要搞得那么复杂呢?这是因为人们需要更复杂的东西(而软件级可以通过扩展硬件做到),那又为什么在提供了并发之后,还会涉及到同步问题呢? ,这是因为简单的事情弄复杂了,就肯定要付出相关的代价,比如同步(有了多线程就要同步),这就跟说谎一样,需要谎谎相圆。
在代码中,可以将代码的一块用一个线程包装起来,这样,它就拥有一个自己的“CPU“,比如,程序有一个GUI界面,它有一个背后逻辑,在界面上又要响应用户输入,实际上,多线程的一个实用之处就是使这样的界面更反应灵敏一点. 并发并不是什么新鲜的事

在操作系统和应用程序的逻辑中都会涉及到并发逻辑(特别是数据库系统中),并发逻辑可以多线程也可多进程,甚至多线程多进程的方式进行,当然,单核环境下的并发永远是一种对并发的模拟机制.

当然,有时你用的语言提供了并发的支持,,而且有时候,操作系统的并发逻辑会影响到你选用一种更有效的相容于操作系统的并发模型

并发5首先发生的大背景是PC6,假设我们是对单处理器的PC编程,因此每个时刻,都只有一个活动执行上文行存在(CPU在任何时候,当前只有一个活动的执行路径-肯定是某个进程7,在被CPU执行并处在这个执行路径中,Windows可以允许多用户多进程,但是因为所谓多进程,其实正是CPU轮流给每个进程分配了CPU时间所以在单CPU的环境下,不真正存在多任务,多进程和多线程都不能真正给程序提速,它只能达到一种“分流”的效果,使得界面响应快捷(这主要依赖调度,它能迅速地把不需要CPU时间的当前线程 – 比如一个等待用户输入的线程,阻塞掉,复活另外一个需要CPU时间的线程,然后调度再在其中监视新情况的出现并不断地作此类分流性质的调度,以使不需要CPU时间的线程让步CPU时间给需要CPU的线程 – 可见,并发并不是什么高高在上的东西,而是随着可见的那一类问题的需求而出现的,当然,这需要为每个工作流设置一个控制,即一个“控制线程”,thread of control=thread,而这,正是并发要被提出和它要解决的问题),或其它一些效果.

—————————————-
  1. 在这个意义上,一个一个的进程并不代表一个一个的软件上的PC(或VM),它们只是代表VM的一部分。
    真正的OS在软件上只有公共的一份4g供所有进程共享,4GB中的相当一部分映射着一个公共的os core, 存储管理首先要解决任务与任务之间在分享存储之间的需要,这就是虚拟存储,(注意,我们并没有谈存储管理)。 ?
  2. 多进程,指的是“多任务并存”的存储管理法,而非“多进程并发”的多进程 ?
  3. 注意,多进程从这三个字眼中我们并不能看出它是并发,只能看出它需要被“同步”,而如果是“多进程同时进行”,这样才有了并发的含义.更需要被“同步” ?
  4. 也即,从开发的眼光来看,它首先是一个设计问题 ?
  5. 完整的并发说法是这样的:进程上的并发,或线程上的并发, 线程,thread of control.一个单程序中不同的被并发执行的部分 ?
  6. 本书一开头就假设是对PC编程 ?
  7. 此时我们尚不能确定这个进程里是否有线程,所以,更复杂的情况要呆会再讲 ?
Share进程中的虚存管理与任务调度

保护模式下的分段分页机制解决了地址映射与转换方面的事情,完成了“转换地址,从逻辑到线性,从线性到物理”,“形成线性任务空间”这样的诸如此类的任务,这就是说,它完成的是建造一个个“隔离了的任务空间”的任务,然而(这主要指CPU的功能和策略), 并没有上升到完成负责建造具体任务的事的层次.因为此时我们还没有谈到任务,还没有谈到任何关于它在软件上的意义(任务是OS的概念,而OS代表软件平台).比如,什么是任务空间,以及任务怎么样利用这些隔离了的空间。

也即,线性空间并非指任务空间,而是指CPU的一种机制,它使保护模式下的可用空间达到4g(CPU在保护模式的引导下,可以看到4g的内存,为形成一个soft pc成为可能),——- 只不过是索引的4g .而具体的内存分配与管理与“形成进程空间”,其实是另外一回事.(这些必须要在脑海里明白)

呆会我们将会看到它们是在OS中完成的,这一切,就是操作系统技术中的进程技术要解决的事情。并实现在OS kernel中。

进程实现在os kernel中。是支持OS作为软件上的机器的意义首先要解决的事。即虚拟硬件为软件上可用的东西。

这可以从虚拟硬件执行环境中的内存和寄存器开始。本书正是按这个顺序来讲解整个OS原理的。

由于保护模式的CPU已经支持受保护了的任务空间和跳转机制了,所以这并不同于普通的会编环境中的硬件执行环境,如果在其上展开会编,将会是一种高级的会编。

进程

进程是一套实现操作系统任务,多任务的软件技术的统称。简言之,任务是一种使代表soft machine意义的os kernel首先完成的visual machine的整套机制。其形态有普通进程和线程二种。

任务空间与虚拟存储

首先,对于任务,在硬件级是分段分页机制和门的跳转保护机制,在os core级,可以封装它们,最终表现出一个个“隔离了的线性任务空间”和受保护的代码执行环境和IO环境。。

进程和线程作为任务,模拟了内存和CPU时间这二者(没有CPU或没有内存都不足于构成一个软件的任务,线程要偏向于CPU时间一点),是人们分裂一台计算机的处理能力,为多台计算机的手段.,故称VM。进程“使一个程序独享内存1

这里有必要再次提到4g空间作为线性空间与任务空间的区别,前者主要是指CPU的机制,这里是指进程的机制(而进程已经有软件的意义了),4G的虚存空间只是映射,这里有alu和mmu的作用(即页式内存管理),如果可以,还可以加上段式的作用,其实,进程空间是不存在的,更真正的称法是“进程空间”,它是个概念上的映射,故内核内间,用户空间,只是4G的“进程空间”(这里称为进程空间似乎不妥,任务空间,应称为工作空间,“可供映射空间”)
将进程空间分为系统空间与用户空间,它主要是强调:CPU从系统空间进入用户空间(此时,CPU正在一个受限的局域活动)时易,用户空间进入系统空间时(此时,CPU可执行作何特权指令)难,必须要通过OS提供的自陷或中断,方可进入os kernel,进入OS kernel所在代码(在那里,可以执行特权代码,os kernel本身就是优于用户进程代码的特权代码)
先映射系统所在页面(通过内存管理作用),这些页面和这个概念上的空间是不被置换的,用户空间会被进程切换刷新其(对于物理页面的)映射。

虚拟寄存器环境

进程使计算机成为vm,它有自己的寄存器环境(这绝不仅仅是一句空话,这句话是指,计算机成为一台VM,所有VM共享PC整个执行硬件,以它为基础形成保护模式,并形成任务)和内存(用线性空间成就的任务空间)
进程不光有一套自己的虚存空间,也有自己的一套reg环境,这里涉及到大量的保护模式下的段式转换等知识,需要讲解
前提是,我们是在一个4G里讨论问题。有一个正统的称法叫线性空间 这里介绍一下堆栈机,内核栈,用户栈,

进程调度不仅是为了多任务而准备的,单任务内部也需要调度。这就是门所规范的任务代码跳转机制。

程序能不能访问硬件,这要视开发该程序所有的语言和程序运行的环境而定,相比高级语言,会编是可以控制计算机做任何事情的语言,可是假如计算机booting,init进入os,比如windows或linux,那么该程序可能导致错误(而它可能在DOS这样的环境下或者没有DOS的环境下就不会)

比如,多任务环境下,这么多程序共用一套寄存器,硬件资源是它们的公用设施,这会不会造成寄存器混乱呢,不会,因为每个程序的进程都可以为它们保存副本(每个进程都是四GB,有自己的内核栈).而进程调度,即那些保证进程对硬件资源访问的逻辑,是由系统核心来保障的.

内核中的进程

内核管理进程,进程管理线程,线程是时间单位的一个函数(由进程调度来协调产生或同步) 内核线程不可中断,内核所在页面也不可置换
用户线程与内核线程是二个不一样的东西,如果用户进程用了内核线程,那么它就是内核线程,反之,如果一个用户进程的实现,没有用到任何内核线程的支持,那么,它就是posix兼容的用户线程.

虚存管理与调度

虚拟内存不仅指页面文件(不是每个系统都有MMU单元),它其实是一个很大的基础概念,是PC分解它自身只有一个CPU和主存而产生的“虚拟化CPU时间”,和“虚拟化主存空间”的二者之一,它作为底层服务于caching,mm,内存保护,等上层建筑.(是典型的C/S结构,所以,在OS的设计中,windows大量采用管理器之类的概念,而这,也导致了微内核的产生),理解虚拟内存的关键是理解“存储器抽象”和“mm”这二种概念实际上是一上一下的二大抽象体系.即解决硬件抽象层的问题,和关于任务中对于内存,的初级系统逻辑.

其次,软件平台要作为一个能运行多任务的soft vm,进程就需要被调度,故是实现多任务(此时不能说成多进程2,多线程什么的)的基础.它首先完成任务调度(此时它并不一定跟多线程多进程同时运行有关3,大凡内核,总要处理任务间的切换,对CPU,IO的使用,此时,就需要调度),再完成并发调度(基于调度的并发),线程原来也叫进程.调度是OS的灵魂,它是将“一个CPU”以“进程”为单位分成“多个CPU”的手段(是一种时间上的划分,由定时设备发出有规则划分的信号).
因为进程环境由虚存空间和寄存环境CPU(它们代表一台进程VM的时间和空间二方面)组成,因此OS要在内核实现中提供对它们的管理。

在OS级,CPU与内存如何发生联系被称为CPU的存储管理机制 – 这个存储,专指主存,页如何被实际分配,并形成一个进程空间.即,就是“进程地址空间的形成”, 这才是指OS的事。

就是“具体的内存分配与管理”,即页式内存分配逻辑(这主要指CPU对内存的策略),这二者都是存诸管理机的二个阶段.
进程管理和调度实际上是os kenerl的应用层,进程间通信,才是进程管理的server,进程管理使用它。进程通信是os kernel中的kernel,进程管理是os kernel中的application,因此微内核主张,只有进程通信才配进入os kenel,其它如进程管理,使用到进程通信的还有文件系统,设备驱动等,这些,应做到os kernel的下一层次,比如进程的非os kenerl的非kernel层次。

进程是OS Kernel的,它维护一个就绪表和一个关于进程的条件队列,在有了系统的原生并发的支持下,在应用程序层,编程可以通过共享存储器或消息传递机制实现某种并发, 对于共享存储,大约可以分为忙等待和基于调度的方式,又可与“互斥机制”和“条件同步”组合分类,,于是有四种并发机制.

从这里开始,出现了关于进程的很多很多子问题. 比如进程的用户 进程的IO位图 进程上下文 任务状态.任务切换.优先级 内核同步 内存映射和mmap(),malloc() – malloc的背后是一个内存沲,是由C运行时提供的,都会扩展一个进程的线性空间,,这些属于存储管理的内容,而不是进程及进程调度的.

伙伴系统,是动态内存的手段,还有一个slab,,是关于对内核数据结构的内存分配的..

解决了这二个问题,即解决了任务问题,然后是解决外部子组件

这些问题跟任务机制也有交集,这产生了其它问题内核同步进程的IO位图,等等,

在内核中的每一大小问题的解决,都有其相似性(就跟解决任务问题中所看到的那样),比如,用相关的数据结构表示和算法支持,有相关的系统

前面分别介绍了os kernel和进程(由于cpu和进程间的联系),但没有介绍二者之间的关系,进程管理是OS kenel对进程的作用,进程间通信是必要的,它需要“进程间同步”机制,以保证通信的正常化(有一种是报文小消息的传递),进程间同步也是进程间通信,但它又是低级的进程间通信,因此一般把它跟进程间通信分开来说。

多任务

首先,一个现代的OS必定是需要支持多任务的,对多任务的管理,被实现在OS内核中。

在单CPU上采取多线程策略的情况下,不会提高程序的真实速度,因为CPU只是采取时间片轮分的方法.但是可以得到“界面高速反应”这样的效果,这跟提不提高速度,是二回事并不矛盾.

计算机运行并完全计算的基本单位是靠一个个的“进程”来组织的,由是多任务要么是多进程,要么是多线程。

线程可以是进程,比如轻量级进程,这样多线程的本质还是多进程,当线程不再是进程时,问题会变成另外一个形式,此时,存在着二种任务,即进程任务,和线程任务,线程任务只需要CPU时间,而没有虚存空间。

典型的用户层线程是用协程建立起来的

解决了如何表示多任务的问题之后,下一步就是解决如何同步它们了。

于是多进程就有内存间互不干扰的假像,但实际上他们正是靠正面协作来达到这个假像的,线程的真正意义是“使一份执行流(程序的一部分)”独享CPU.当然,于是多线程就有了多CPU的假像,这二者都是模拟的.
并发问题源于图灵模型与需要开发处理的现实问题之间的矛盾,图灵模式是控制主导数据(机器的底层问题都是IO问题),这使得这种IO动作必须被协调.又因为用于开发系统的语言一般是C语言,C语言本身并非某种并发和线程安全语言,所以必须在内核层提供一套同步机制.

解决多线程的问题是多解的,,源于解决方法的高层模式各有不同4,有不同的相关概念,,比如锁,,,就不需要用到信号量.

不要把线程想像为:它是进程依赖的,其实,它跟任何一个进程一样,是直接面向整个VM和运行环境的,只有VM才负责为它可供访问的资源和这种提供同步机制.进程不能. 线程首先是作为OS的任务机制,应首先讨论它的这层意义,再讨论它用于并发的那些意义。即线程先是任务里面的概念,然后才是并发里面的概念。

多线程中的quene,用设置一个“单行道”的方式来避免并发带来的矛盾. 阻塞式同步,也就是基于调度的并发,,跟基于忙等待和锁的并发(蛮干算法)对应..

多任务通讯

多CPU要协调好共享资源的处理,多线程也要做一样的同步工作(虽然它也可以完全不做).

在顺序语言里,一般用共享存储(就是用某个存储在公共区的值作为条件,判断通过就不用再等待)或消息传递的方式进行线程间的通信(最终是希望得到某种同步和要达到的并行性能的折中,即不能同步过度,必要的同步)

多进程需要被调度,多线程也一样,要注意三个东西,

参与并发的各个主体,线程,或进程, 并发的数据结构,比如锁,互斥体,等, 调度机制与调度条件.

可用忙等待(一直等待的意思)的spin lock或阻塞式同步(基于调度的同步,线程间自愿让出CPU)完成.记住这个说法,被阻塞是为了同步,阻塞不是出了问题,只有发生deadlock的时候,才是出了问题.互斥是为了同步,是同步的一种机制,跟同步不是矛盾的概念(同步是为了解决多进程不同步问题的大概念大方向,互斥只是一种同步机制和解决问题的方法之一). (自愿阻塞的调度方式下)阻塞可能是一个线程自动让出同步数据结构,比如锁(比如在这个线程中调用了sleep,或input等待输入),而此时,它还在运行(没被终止,甚至没被中止),一个进程被阴塞时不是指它没被运行(它只是因自愿或某种调度被迫而放弃了同步设施而挂起,挂起的意思仅指它不再受到并发保护的影响,其实,因等待输入等条件引起的挂起是很自然的原因),只是指它不受到并发的保护,只要有机会,它可以由别的进程唤醒(因调度获得同步设施),

正在运行的线程可能是前一秒运行过,现在(测试时)发现刚刚就被阻塞了的线程

什么是阻塞,阻塞即线程因得不到而等待资源的过程.是OS的调度里面的概念 阻塞就是以线程为单位独占用CPU时间引用的事情(sleep函数就是根据这个原理来的,此时它要等到时间过了这个事件被发生,才会停止sleep),比如一个read()线程在程序中等待输入,而这个输入因为网络迟没有及时到达,这个线程就一直占用着CPU时间(因为线程所处在的系统,本质上只有一个CPU),使得其它线程也一并被卡掉(比如界面上一个关闭按钮无法响应使用户认为这个程序死了).

阻塞,怎么会跟线程有关呢?因为有 锁机制在做怪,它在协调活动的线程.如果没有用线程实现的并发(此种并发在单CPU上并非为了加速,而是为了分流协调),就不需要用到锁,因此,就不需要靠阻塞一方的方式来协调.因此,在获得锁方面,就有主动获得锁和主动让步锁的情形存在.
信号量,事件,旗语,都是用于进程间同步和通信的设施(在用c实现的windows,这些东西都被称为对象,实际上,是一系列结构和函数的统称)。进程间会在彼此的空间里交互这些对象,以实现同步和通信。比如互斥量,它锁定了共享资源,得到互斥量的当前进程除非释放它,否则另外的进程不能获得它,进而获得对共享资源的访问.

任务与并发

OS对于解决多任务和解决多任务之间的同步是一前一后的。并发问题是随着计算机制造和计算机软件系统制造而产生的那类问题(为了分时就必须协调同步),所以,它产生了一整个系统编程的流派

同步

所谓同步,其实并不是什么大不了的概念,它不过就是解决可能会出现“不同步,影响通信”的诸多矛盾的一切手段的统称,在OS中,这些手段就表现为软件上的抽象,被实现在OS kernel中。
既然冯氏机本来就是一台顺序确定执行指令的机器,为什么要搞得那么复杂呢?这是因为人们需要更复杂的东西(而软件级可以通过扩展硬件做到),那又为什么在提供了并发之后,还会涉及到同步问题呢? ,这是因为简单的事情弄复杂了,就肯定要付出相关的代价,比如同步(有了多线程就要同步),这就跟说谎一样,需要谎谎相圆。
在代码中,可以将代码的一块用一个线程包装起来,这样,它就拥有一个自己的“CPU“,比如,程序有一个GUI界面,它有一个背后逻辑,在界面上又要响应用户输入,实际上,多线程的一个实用之处就是使这样的界面更反应灵敏一点. 并发并不是什么新鲜的事

在操作系统和应用程序的逻辑中都会涉及到并发逻辑(特别是数据库系统中),并发逻辑可以多线程也可多进程,甚至多线程多进程的方式进行,当然,单核环境下的并发永远是一种对并发的模拟机制.

当然,有时你用的语言提供了并发的支持,,而且有时候,操作系统的并发逻辑会影响到你选用一种更有效的相容于操作系统的并发模型

并发5首先发生的大背景是PC6,假设我们是对单处理器的PC编程,因此每个时刻,都只有一个活动执行上文行存在(CPU在任何时候,当前只有一个活动的执行路径-肯定是某个进程7,在被CPU执行并处在这个执行路径中,Windows可以允许多用户多进程,但是因为所谓多进程,其实正是CPU轮流给每个进程分配了CPU时间所以在单CPU的环境下,不真正存在多任务,多进程和多线程都不能真正给程序提速,它只能达到一种“分流”的效果,使得界面响应快捷(这主要依赖调度,它能迅速地把不需要CPU时间的当前线程 – 比如一个等待用户输入的线程,阻塞掉,复活另外一个需要CPU时间的线程,然后调度再在其中监视新情况的出现并不断地作此类分流性质的调度,以使不需要CPU时间的线程让步CPU时间给需要CPU的线程 – 可见,并发并不是什么高高在上的东西,而是随着可见的那一类问题的需求而出现的,当然,这需要为每个工作流设置一个控制,即一个“控制线程”,thread of control=thread,而这,正是并发要被提出和它要解决的问题),或其它一些效果.

—————————————-
  1. 在这个意义上,一个一个的进程并不代表一个一个的软件上的PC(或VM),它们只是代表VM的一部分。
    真正的OS在软件上只有公共的一份4g供所有进程共享,4GB中的相当一部分映射着一个公共的os core, 存储管理首先要解决任务与任务之间在分享存储之间的需要,这就是虚拟存储,(注意,我们并没有谈存储管理)。 ?
  2. 多进程,指的是“多任务并存”的存储管理法,而非“多进程并发”的多进程 ?
  3. 注意,多进程从这三个字眼中我们并不能看出它是并发,只能看出它需要被“同步”,而如果是“多进程同时进行”,这样才有了并发的含义.更需要被“同步” ?
  4. 也即,从开发的眼光来看,它首先是一个设计问题 ?
  5. 完整的并发说法是这样的:进程上的并发,或线程上的并发, 线程,thread of control.一个单程序中不同的被并发执行的部分 ?
  6. 本书一开头就假设是对PC编程 ?
  7. 此时我们尚不能确定这个进程里是否有线程,所以,更复杂的情况要呆会再讲 ?
Share进程中的虚存管理与任务调度

保护模式下的分段分页机制解决了地址映射与转换方面的事情,完成了“转换地址,从逻辑到线性,从线性到物理”,“形成线性任务空间”这样的诸如此类的任务,这就是说,它完成的是建造一个个“隔离了的任务空间”的任务,然而(这主要指CPU的功能和策略), 并没有上升到完成负责建造具体任务的事的层次.因为此时我们还没有谈到任务,还没有谈到任何关于它在软件上的意义(任务是OS的概念,而OS代表软件平台).比如,什么是任务空间,以及任务怎么样利用这些隔离了的空间。

也即,线性空间并非指任务空间,而是指CPU的一种机制,它使保护模式下的可用空间达到4g(CPU在保护模式的引导下,可以看到4g的内存,为形成一个soft pc成为可能),——- 只不过是索引的4g .而具体的内存分配与管理与“形成进程空间”,其实是另外一回事.(这些必须要在脑海里明白)

呆会我们将会看到它们是在OS中完成的,这一切,就是操作系统技术中的进程技术要解决的事情。并实现在OS kernel中。

进程实现在os kernel中。是支持OS作为软件上的机器的意义首先要解决的事。即虚拟硬件为软件上可用的东西。

这可以从虚拟硬件执行环境中的内存和寄存器开始。本书正是按这个顺序来讲解整个OS原理的。

由于保护模式的CPU已经支持受保护了的任务空间和跳转机制了,所以这并不同于普通的会编环境中的硬件执行环境,如果在其上展开会编,将会是一种高级的会编。

进程

进程是一套实现操作系统任务,多任务的软件技术的统称。简言之,任务是一种使代表soft machine意义的os kernel首先完成的visual machine的整套机制。其形态有普通进程和线程二种。

任务空间与虚拟存储

首先,对于任务,在硬件级是分段分页机制和门的跳转保护机制,在os core级,可以封装它们,最终表现出一个个“隔离了的线性任务空间”和受保护的代码执行环境和IO环境。。

进程和线程作为任务,模拟了内存和CPU时间这二者(没有CPU或没有内存都不足于构成一个软件的任务,线程要偏向于CPU时间一点),是人们分裂一台计算机的处理能力,为多台计算机的手段.,故称VM。进程“使一个程序独享内存1

这里有必要再次提到4g空间作为线性空间与任务空间的区别,前者主要是指CPU的机制,这里是指进程的机制(而进程已经有软件的意义了),4G的虚存空间只是映射,这里有alu和mmu的作用(即页式内存管理),如果可以,还可以加上段式的作用,其实,进程空间是不存在的,更真正的称法是“进程空间”,它是个概念上的映射,故内核内间,用户空间,只是4G的“进程空间”(这里称为进程空间似乎不妥,任务空间,应称为工作空间,“可供映射空间”)
将进程空间分为系统空间与用户空间,它主要是强调:CPU从系统空间进入用户空间(此时,CPU正在一个受限的局域活动)时易,用户空间进入系统空间时(此时,CPU可执行作何特权指令)难,必须要通过OS提供的自陷或中断,方可进入os kernel,进入OS kernel所在代码(在那里,可以执行特权代码,os kernel本身就是优于用户进程代码的特权代码)
先映射系统所在页面(通过内存管理作用),这些页面和这个概念上的空间是不被置换的,用户空间会被进程切换刷新其(对于物理页面的)映射。

虚拟寄存器环境

进程使计算机成为vm,它有自己的寄存器环境(这绝不仅仅是一句空话,这句话是指,计算机成为一台VM,所有VM共享PC整个执行硬件,以它为基础形成保护模式,并形成任务)和内存(用线性空间成就的任务空间)
进程不光有一套自己的虚存空间,也有自己的一套reg环境,这里涉及到大量的保护模式下的段式转换等知识,需要讲解
前提是,我们是在一个4G里讨论问题。有一个正统的称法叫线性空间 这里介绍一下堆栈机,内核栈,用户栈,

进程调度不仅是为了多任务而准备的,单任务内部也需要调度。这就是门所规范的任务代码跳转机制。

程序能不能访问硬件,这要视开发该程序所有的语言和程序运行的环境而定,相比高级语言,会编是可以控制计算机做任何事情的语言,可是假如计算机booting,init进入os,比如windows或linux,那么该程序可能导致错误(而它可能在DOS这样的环境下或者没有DOS的环境下就不会)

比如,多任务环境下,这么多程序共用一套寄存器,硬件资源是它们的公用设施,这会不会造成寄存器混乱呢,不会,因为每个程序的进程都可以为它们保存副本(每个进程都是四GB,有自己的内核栈).而进程调度,即那些保证进程对硬件资源访问的逻辑,是由系统核心来保障的.

内核中的进程

内核管理进程,进程管理线程,线程是时间单位的一个函数(由进程调度来协调产生或同步) 内核线程不可中断,内核所在页面也不可置换
用户线程与内核线程是二个不一样的东西,如果用户进程用了内核线程,那么它就是内核线程,反之,如果一个用户进程的实现,没有用到任何内核线程的支持,那么,它就是posix兼容的用户线程.

虚存管理与调度

虚拟内存不仅指页面文件(不是每个系统都有MMU单元),它其实是一个很大的基础概念,是PC分解它自身只有一个CPU和主存而产生的“虚拟化CPU时间”,和“虚拟化主存空间”的二者之一,它作为底层服务于caching,mm,内存保护,等上层建筑.(是典型的C/S结构,所以,在OS的设计中,windows大量采用管理器之类的概念,而这,也导致了微内核的产生),理解虚拟内存的关键是理解“存储器抽象”和“mm”这二种概念实际上是一上一下的二大抽象体系.即解决硬件抽象层的问题,和关于任务中对于内存,的初级系统逻辑.

其次,软件平台要作为一个能运行多任务的soft vm,进程就需要被调度,故是实现多任务(此时不能说成多进程2,多线程什么的)的基础.它首先完成任务调度(此时它并不一定跟多线程多进程同时运行有关3,大凡内核,总要处理任务间的切换,对CPU,IO的使用,此时,就需要调度),再完成并发调度(基于调度的并发),线程原来也叫进程.调度是OS的灵魂,它是将“一个CPU”以“进程”为单位分成“多个CPU”的手段(是一种时间上的划分,由定时设备发出有规则划分的信号).
因为进程环境由虚存空间和寄存环境CPU(它们代表一台进程VM的时间和空间二方面)组成,因此OS要在内核实现中提供对它们的管理。

在OS级,CPU与内存如何发生联系被称为CPU的存储管理机制 – 这个存储,专指主存,页如何被实际分配,并形成一个进程空间.即,就是“进程地址空间的形成”, 这才是指OS的事。

就是“具体的内存分配与管理”,即页式内存分配逻辑(这主要指CPU对内存的策略),这二者都是存诸管理机的二个阶段.
进程管理和调度实际上是os kenerl的应用层,进程间通信,才是进程管理的server,进程管理使用它。进程通信是os kernel中的kernel,进程管理是os kernel中的application,因此微内核主张,只有进程通信才配进入os kenel,其它如进程管理,使用到进程通信的还有文件系统,设备驱动等,这些,应做到os kernel的下一层次,比如进程的非os kenerl的非kernel层次。

进程是OS Kernel的,它维护一个就绪表和一个关于进程的条件队列,在有了系统的原生并发的支持下,在应用程序层,编程可以通过共享存储器或消息传递机制实现某种并发, 对于共享存储,大约可以分为忙等待和基于调度的方式,又可与“互斥机制”和“条件同步”组合分类,,于是有四种并发机制.

从这里开始,出现了关于进程的很多很多子问题. 比如进程的用户 进程的IO位图 进程上下文 任务状态.任务切换.优先级 内核同步 内存映射和mmap(),malloc() – malloc的背后是一个内存沲,是由C运行时提供的,都会扩展一个进程的线性空间,,这些属于存储管理的内容,而不是进程及进程调度的.

伙伴系统,是动态内存的手段,还有一个slab,,是关于对内核数据结构的内存分配的..

解决了这二个问题,即解决了任务问题,然后是解决外部子组件

这些问题跟任务机制也有交集,这产生了其它问题内核同步进程的IO位图,等等,

在内核中的每一大小问题的解决,都有其相似性(就跟解决任务问题中所看到的那样),比如,用相关的数据结构表示和算法支持,有相关的系统

前面分别介绍了os kernel和进程(由于cpu和进程间的联系),但没有介绍二者之间的关系,进程管理是OS kenel对进程的作用,进程间通信是必要的,它需要“进程间同步”机制,以保证通信的正常化(有一种是报文小消息的传递),进程间同步也是进程间通信,但它又是低级的进程间通信,因此一般把它跟进程间通信分开来说。

多任务

首先,一个现代的OS必定是需要支持多任务的,对多任务的管理,被实现在OS内核中。

在单CPU上采取多线程策略的情况下,不会提高程序的真实速度,因为CPU只是采取时间片轮分的方法.但是可以得到“界面高速反应”这样的效果,这跟提不提高速度,是二回事并不矛盾.

计算机运行并完全计算的基本单位是靠一个个的“进程”来组织的,由是多任务要么是多进程,要么是多线程。

线程可以是进程,比如轻量级进程,这样多线程的本质还是多进程,当线程不再是进程时,问题会变成另外一个形式,此时,存在着二种任务,即进程任务,和线程任务,线程任务只需要CPU时间,而没有虚存空间。

典型的用户层线程是用协程建立起来的

解决了如何表示多任务的问题之后,下一步就是解决如何同步它们了。

于是多进程就有内存间互不干扰的假像,但实际上他们正是靠正面协作来达到这个假像的,线程的真正意义是“使一份执行流(程序的一部分)”独享CPU.当然,于是多线程就有了多CPU的假像,这二者都是模拟的.
并发问题源于图灵模型与需要开发处理的现实问题之间的矛盾,图灵模式是控制主导数据(机器的底层问题都是IO问题),这使得这种IO动作必须被协调.又因为用于开发系统的语言一般是C语言,C语言本身并非某种并发和线程安全语言,所以必须在内核层提供一套同步机制.

解决多线程的问题是多解的,,源于解决方法的高层模式各有不同4,有不同的相关概念,,比如锁,,,就不需要用到信号量.

不要把线程想像为:它是进程依赖的,其实,它跟任何一个进程一样,是直接面向整个VM和运行环境的,只有VM才负责为它可供访问的资源和这种提供同步机制.进程不能. 线程首先是作为OS的任务机制,应首先讨论它的这层意义,再讨论它用于并发的那些意义。即线程先是任务里面的概念,然后才是并发里面的概念。

多线程中的quene,用设置一个“单行道”的方式来避免并发带来的矛盾. 阻塞式同步,也就是基于调度的并发,,跟基于忙等待和锁的并发(蛮干算法)对应..

多任务通讯

多CPU要协调好共享资源的处理,多线程也要做一样的同步工作(虽然它也可以完全不做).

在顺序语言里,一般用共享存储(就是用某个存储在公共区的值作为条件,判断通过就不用再等待)或消息传递的方式进行线程间的通信(最终是希望得到某种同步和要达到的并行性能的折中,即不能同步过度,必要的同步)

多进程需要被调度,多线程也一样,要注意三个东西,

参与并发的各个主体,线程,或进程, 并发的数据结构,比如锁,互斥体,等, 调度机制与调度条件.

可用忙等待(一直等待的意思)的spin lock或阻塞式同步(基于调度的同步,线程间自愿让出CPU)完成.记住这个说法,被阻塞是为了同步,阻塞不是出了问题,只有发生deadlock的时候,才是出了问题.互斥是为了同步,是同步的一种机制,跟同步不是矛盾的概念(同步是为了解决多进程不同步问题的大概念大方向,互斥只是一种同步机制和解决问题的方法之一). (自愿阻塞的调度方式下)阻塞可能是一个线程自动让出同步数据结构,比如锁(比如在这个线程中调用了sleep,或input等待输入),而此时,它还在运行(没被终止,甚至没被中止),一个进程被阴塞时不是指它没被运行(它只是因自愿或某种调度被迫而放弃了同步设施而挂起,挂起的意思仅指它不再受到并发保护的影响,其实,因等待输入等条件引起的挂起是很自然的原因),只是指它不受到并发的保护,只要有机会,它可以由别的进程唤醒(因调度获得同步设施),

正在运行的线程可能是前一秒运行过,现在(测试时)发现刚刚就被阻塞了的线程

什么是阻塞,阻塞即线程因得不到而等待资源的过程.是OS的调度里面的概念 阻塞就是以线程为单位独占用CPU时间引用的事情(sleep函数就是根据这个原理来的,此时它要等到时间过了这个事件被发生,才会停止sleep),比如一个read()线程在程序中等待输入,而这个输入因为网络迟没有及时到达,这个线程就一直占用着CPU时间(因为线程所处在的系统,本质上只有一个CPU),使得其它线程也一并被卡掉(比如界面上一个关闭按钮无法响应使用户认为这个程序死了).

阻塞,怎么会跟线程有关呢?因为有 锁机制在做怪,它在协调活动的线程.如果没有用线程实现的并发(此种并发在单CPU上并非为了加速,而是为了分流协调),就不需要用到锁,因此,就不需要靠阻塞一方的方式来协调.因此,在获得锁方面,就有主动获得锁和主动让步锁的情形存在.
信号量,事件,旗语,都是用于进程间同步和通信的设施(在用c实现的windows,这些东西都被称为对象,实际上,是一系列结构和函数的统称)。进程间会在彼此的空间里交互这些对象,以实现同步和通信。比如互斥量,它锁定了共享资源,得到互斥量的当前进程除非释放它,否则另外的进程不能获得它,进而获得对共享资源的访问.

任务与并发

OS对于解决多任务和解决多任务之间的同步是一前一后的。并发问题是随着计算机制造和计算机软件系统制造而产生的那类问题(为了分时就必须协调同步),所以,它产生了一整个系统编程的流派

同步

所谓同步,其实并不是什么大不了的概念,它不过就是解决可能会出现“不同步,影响通信”的诸多矛盾的一切手段的统称,在OS中,这些手段就表现为软件上的抽象,被实现在OS kernel中。
既然冯氏机本来就是一台顺序确定执行指令的机器,为什么要搞得那么复杂呢?这是因为人们需要更复杂的东西(而软件级可以通过扩展硬件做到),那又为什么在提供了并发之后,还会涉及到同步问题呢? ,这是因为简单的事情弄复杂了,就肯定要付出相关的代价,比如同步(有了多线程就要同步),这就跟说谎一样,需要谎谎相圆。
在代码中,可以将代码的一块用一个线程包装起来,这样,它就拥有一个自己的“CPU“,比如,程序有一个GUI界面,它有一个背后逻辑,在界面上又要响应用户输入,实际上,多线程的一个实用之处就是使这样的界面更反应灵敏一点. 并发并不是什么新鲜的事

在操作系统和应用程序的逻辑中都会涉及到并发逻辑(特别是数据库系统中),并发逻辑可以多线程也可多进程,甚至多线程多进程的方式进行,当然,单核环境下的并发永远是一种对并发的模拟机制.

当然,有时你用的语言提供了并发的支持,,而且有时候,操作系统的并发逻辑会影响到你选用一种更有效的相容于操作系统的并发模型

并发5首先发生的大背景是PC6,假设我们是对单处理器的PC编程,因此每个时刻,都只有一个活动执行上文行存在(CPU在任何时候,当前只有一个活动的执行路径-肯定是某个进程7,在被CPU执行并处在这个执行路径中,Windows可以允许多用户多进程,但是因为所谓多进程,其实正是CPU轮流给每个进程分配了CPU时间所以在单CPU的环境下,不真正存在多任务,多进程和多线程都不能真正给程序提速,它只能达到一种“分流”的效果,使得界面响应快捷(这主要依赖调度,它能迅速地把不需要CPU时间的当前线程 – 比如一个等待用户输入的线程,阻塞掉,复活另外一个需要CPU时间的线程,然后调度再在其中监视新情况的出现并不断地作此类分流性质的调度,以使不需要CPU时间的线程让步CPU时间给需要CPU的线程 – 可见,并发并不是什么高高在上的东西,而是随着可见的那一类问题的需求而出现的,当然,这需要为每个工作流设置一个控制,即一个“控制线程”,thread of control=thread,而这,正是并发要被提出和它要解决的问题),或其它一些效果.

—————————————-
  1. 在这个意义上,一个一个的进程并不代表一个一个的软件上的PC(或VM),它们只是代表VM的一部分。
    真正的OS在软件上只有公共的一份4g供所有进程共享,4GB中的相当一部分映射着一个公共的os core, 存储管理首先要解决任务与任务之间在分享存储之间的需要,这就是虚拟存储,(注意,我们并没有谈存储管理)。 ?
  2. 多进程,指的是“多任务并存”的存储管理法,而非“多进程并发”的多进程 ?
  3. 注意,多进程从这三个字眼中我们并不能看出它是并发,只能看出它需要被“同步”,而如果是“多进程同时进行”,这样才有了并发的含义.更需要被“同步” ?
  4. 也即,从开发的眼光来看,它首先是一个设计问题 ?
  5. 完整的并发说法是这样的:进程上的并发,或线程上的并发, 线程,thread of control.一个单程序中不同的被并发执行的部分 ?
  6. 本书一开头就假设是对PC编程 ?
  7. 此时我们尚不能确定这个进程里是否有线程,所以,更复杂的情况要呆会再讲 ?
Share

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多