学习MultithreadingAppInWin32的FAQ[此随笔不更新了]

用于记录和解答MultithreadingAppInWin32的FAQ

01、合作型Cooperative多任务与抢先式preemptive多任务有何不同?
[http://wiki.networkdictionary.cn/index.php/%E5%8D%8F%E4%BD%9C%E5%BC%8F%E5%A4%9A%E4%BB%BB%E5%8A%A1%EF%BC%88Cooperative_multitasking%EF%BC%89]
协作式多任务(Cooperative multitasking),也叫做非优先权多任务,是一种形式的多任务,在那里它负责当前的运行任务来放弃处理器允许其它任务运行。这与有优先权多任务形成对照,在那里任务调度程序周期性地延缓运行任务和重启另一个。协作的多任务有使操作系统设计更加简化的优势,但是它也让稳定性降低因为一个设计不好的应用程序可能协作不好,而这经常引起系统死机

[http://blog.chinaunix.net/u/21948/showart_218244.html]
并发与多任务的基础概念
 
并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制。大致上有这么两种多任务技术,一种是抢占式多任务 (preemptive multitasking),它让操作系统来决定何时执行哪个任务。另外一种就是协作式多任务(cooperative multitasking),它把决定权交给任务,让它们在自己认为合适的时候自愿放弃执行。这两种多任务方式各有优缺点,前者固有的同步问题使得程序经常有不可预知的行为,而后者则要求任务具备相当的自律精神。
 
Preemptive Multitasking(先占式多任务处理,也可以译为抢占式多任务处理)所有程序代码的执行以Thread(执行绪)为单位,由操作系统统一排程与管理所有的Thread。分配的执行时间结束时,操作系统会主动中断Thread的执行,强制收回CPU的椌制权,但会以一组Thread Context记下Thread被中断时的状态,以备下次再轮到该Thread执行时,Thread能继续执行下去,完全感受不到自己曾被中断过。
 
Cooperative Multitasking(协调式多任务处理),也称为Non-Preemptive Multitasking(非先占式多任务处理,也可以译为非抢占式多任务处理)所有并行的程序们必须有良好的自律与公德心,在执行一段时间之后,自愿将CPU的控制权释出,依一定的排程规则交给其它程序轮流执行。可以想见的,如果其中一只程序设计不良或是出了问题,发了疯似的绕循环而迟迟不将CPU控制权交给下一只程序,整个操作系统就被拖垮了。
 
[本人理解]
Cooperative Multitasking在于并行程序本身自愿释放CPU的控制权
Preemptive Multitasking在于操作系统对并行程序的CPU控制权的收回,并记录当前Thread的状态以方便再次执行的时候以“无缝方式”来响应该Thread的继续执行

02、我可以在Win32s中使用多个线程吗?[此问题可以过期了,呵呵]
Win32 API被移植到Windows 3.1上,称谓Win32s。不支持抢先式多任务也不支持多线程

03、线程和进程有何不同?
进程就是一大堆拥有权(ownership)的集合。进程拥有地址空间(由memory context 决定)、动态配置而来的内存、文件、执行线程、一系列的模块。------同理,进程本身并能够执行,仅仅提供一个安置内存和线程的地方。
线程是指程序的一个指令执行序列
执行线程是什么?进程主要表达「拥有权」的观念,执行线程则主要表达模块中的程序代码的「执行事实」
最初,进程是以一个执行线程(称为主执行线程,primary thread)做为开始。如果需要,进程可以产生更多的执行线程(利用CreateThread),让CPU 在同一时间执行不同段落的代码。

[注意,下面是Unix下的定义,和Windows下的定义有一定区别;但也相通。Unix进程的定义和windows下的主线程是相同的]
[http://blog.chinaunix.net/u/8793/showart_211318.html]
截取部分放着:
关于进程较实质的定义:
1. 进程是程序的一次执行;
2. 进程是可以和别的计算器并发执行的计算;
3. 可定义为一个数据结构及能在其上进行操作的一个程序;
4. 一个程序及其数据在处理机上顺序执行时所发生的活动;
5. 是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。
综合定义为:可并发执行的程序在一个数据集合上的运行过程。

线程:比进程更小的能独立运行的基本单位。

——————
补充一个:
书中32页阐述了“为什么不使用多个进程?”的问题

04、线程在操作系统中携带多少“行李”?
[个人理解],所谓“行李”指的是线程在下一个执行中如何还原到上次被中断的状态,故主要携带“任何时刻下的状态”,这些状态被定义在进程的某个内存中,以及CPU寄存器上。

05、Context Switch是怎么发生的?
要切换不同的线程,操作系统应先切换该线程所隶属之进程的内存,然后恢复该线程放在CONTEXT结构中的寄存器值。这整个过程称为context switch

原文地址:https://www.cnblogs.com/GoGoagg/p/1285102.html