关于多任务和多线程

多任务是操作系统可以执行多个程序的能力。操作系统使用硬件时钟为每个程序配置时间片段。Windows 16位版本支持有限度的多任务,Windows 32位版本支持真正的多任务,还有多线程。

多线程是在程序内部实现“多任务”。

DOS 系统对多任务没多大帮助,DOS 的主要版本是基于 8086 和 8088 芯片的能力而设计的,而这些芯片的并非为多任务而设计,部分原因是内存管理不够强。而当启动和结束多个程序时,多任务操作系统需要移动内存块以收集空闲内存。不过有创意的程序员还是找到了一些办法,大多使用常驻程序,如背景打印队列程序,通过拦截硬件时钟中断来执行真正的背景处理。

Windows 1.0 已可以在物理内存中移动内存块,这是多任务的前提,虽然移动方法尚未完全对应用程序透明,但已可忍受。早期的 Windows 多任务还是非优先权式的多任务,工作切换都发生在程序完成对消息的处理后将控制权返回给 Windows 时。这也被称为“合作式的多任务”,因为它要求应用程序方面的一些合作,一个 Windows 程序可以占用整个系统,如果它要花很长时间来处理消息的话。

32位版本的 Windows 支持非序列化的消息队列,这可以避免让一个应用程序占用整个系统。(这点我也没看懂)

在多线程中,程序可以把自己分割成同时执行的片段(即执行绪)。

一个线程简单地表示为可以呼叫程序中其它函数的函数。程序从其主线程开始执行,这个主执行绪是在传统的 C 程序中叫作 main 的函数,在 Windows 中是 WinMain。一旦执行起来,程序可以通过 CreateThead 创建新线程,线程间优先权式切换。

一种多线程架构:主线程处理使用者输入消息,并建立其它线程, 这些附加的线程只进行一些背景处理,除了和主线程通讯,不和使用者交流。就像老板和职员,老板把大的工作丢给职员处理,自己保持和外界的联系。

线程共享程序的内存,所以它们共享静态变量。但它们都有自己的堆栈,因此动态变量对每个栈程是唯一的。每个线程还有自己的处理器状态,这个状态在线程切换期间被储存和恢复。

正确地设计一个复杂的多线程应用程序是 Windows 程序员可能遇到的最困难的工作, 因为优先权式多任务可以在任何时刻中断一个线程,切换控制权到另一个线程中。

多线程中一个常见的错误是“竞争状态”,为了帮助协调线程的活动,操作系统要求各种形式的同步,一种是同步信号(semaphore),它允许在程序代码某一点阻止一个线程的执行,直到另一个执行绪发信号让它继续,还有一种是临界区域(critical section),它是程序代码中不可中断的部分。

同步信号还可能产生死锁,两个线程互相阻止对方执行。

参考资料:

1、Charles Petzold. 《Windows程序设计》

时间: 2024-10-10 00:28:53

关于多任务和多线程的相关文章

.NET多线程编程(1)——多任务和多线程

在.NET多线程编程这个系列我们讲一起来探讨多线程编程的各个方面.首先我将在本篇文章的开始向大家介绍多线程的有关概念以及多线程编程的基础知识;在接下来的文章中,我将逐一讲述.NET平台上多线程编程的知识,诸如System.Threading命名空间的重要类以及方法,并就一些例子程序来作说明. 引言 早期的计算硬件十分复杂,但是操作系统执行的功能确十分的简单.那个时候的操作系统在任一时间点只能执行一个任务,也就是同一时间只能执行一个程序.多个任务的执行必须得轮流执行,在系统里面进行排队等候.由于计

第20章 多任务和多线程(2)

20.3 线程的同步 20.3.1 产生同步问题的原因 (1)线程的只能是在两条指令之间被打断,不可能在一条指令执行到一半被打断,因为指令是CPU最小的执行单位. (2)线程的切换是无法预测的,他无法知道自己的什么时候自己的时间片会结束,也无法知道下一个时间片被分配给哪一个线程.线程可以在任何地方被Windows打断. (3)各线程可能要读写同一内享区,如果不加保护就会出现错误. 20.3.2 各种用于线程间同步的对象 (1)使用临界区(Critical Section) ①使用方法 A.CRI

多线程编程学习笔记

多线程编程 目录 线程概述 线程的创建 创建线程程序 线程同步 守护线程 线程之间的相互通讯 线程池和java.util.concurrent包 一.概述 1.相关概念 进程(Process):程序(任务)执行的过程,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程,共享内存,共享文件.比如在Windows系统中,一个运行的exe就是一个进程. 线程(Thread):进程中的一个执行流程,一个进程中可以运行多个线程.线程总是属于某个进程,进程中的多个线程共享进程的内存.现在的操作系

.NET多线程编程

在.NET多线程编程这个系列我们讲一起来探讨多线程编程的各个方面.首先我将在本篇文章的开始向大家介绍多线程的有关概念以及多线程编程的基础知识;在接下来的文章中,我将逐一讲述.NET平台上多线程编程的知识,诸如System.Threading命名空间的重要类以及方法,并就一些例子程序来作说明. 引言 早期的计算硬件十分复杂,但是操作系统执行的功能确十分的简单.那个时候的操作系统在任一时间点只能执行一个任务,也就是同一时间只能执行一个程序.多个任务的执行必须得轮流执行,在系统里面进行排队等候.由于计

Java多线程学习笔记1

1.线程的基本概念 一个关于计算机的简化的视图是: 它有一个执行计算的处理机. 包含处理机所执行的程 序的 ROM(只读存储器). 包含程序所要操作的数据的 RAM(只读存储器).线程,被认为是带有自己的程 序代码和数据的拟处理机的封装.线程的三个部分处理机,代码,数据. 代码可以或不可以由多个线程共享, 这和数据是独立的. 两个线程如果执行同一个类的 实例代码,则它们可以共享相同的代码. 类似地,数据可以或不可以由多个线程共享, 这和代码是独立的. 两个线程如果共享对 一个公共对象的存取,则它

JAVA 多线程和并发学习笔记(四)

1. 多进程 实现并发最直接的方式是在操作系统级别使用进程,进程是运行在它自己的地址空间内的自包容的程序.多任务操作系统可以通过周期性地将CPU从一个进程切换到另一个进程,来实现同时运行多个进程. 尽管对于一个CPU而言,它在某个时间点只能运行一个进程,但CPU可以在多个进程之间进行轮换执行,并且CPU的切换速度极高,使我们无法感知其切换的过程,就好像有多个进程在同时执行. 几乎所有的操作系统都支持进程的概念,所有运行中的任务通常对应一个进程(Process).当一个程序进入内存运行时,即变成一

大数据多线程高效批量处理

工作中遇到的场景,这里写个例子出来,实际应用比此处更为健壮和完善 应用场景: 对一张表10万条数据(或100万或1亿+)进行更新操作或写入操作: 菜鸟是一条一条的执行吧,这显然不行啊 我在实际项目中是这样应用的, 批量更新!当然这显然是不够的 要线程批量更新才对吧! 怎么做呢? 举例1:10万条数据 ,我1000条1000条的处理 就是,10万/1000 = 100  , 这里我就用100个线程同时处理,每个线程负责1000条数据,这里有个关键点,处理的数据不能重复! 给个代码示例吧: 线程池中

[py]你真的了解多核处理器吗? 了解多线程

你真的了解多核处理器吗? 1.双核≠双性能 多核不一定会使你的手机或电脑速度更快,但它将提高你的PC的整体性能,这是一个有所不同的细微的技术特色.多核处理器的性能提升并不是简单CPU核心的倍数,因为受到两(多)个核之间共享资源的拖累.比如双核性能只是单核的1.4-1.8倍,实际情况取决于具体的应用. 一个核拼命干活,拼命转啊转啊,其他核在看,最后温度不断上升然后蓝屏了.... 上图是个笑话,不过你可以用任务管理器可以看到并不是每个核的负载时均匀分配的. 这是为什么一个核转啊转啊,最后蓝屏的原因.

python—多任务版udp聊天机器人

将多任务(多线程)引入到udp聊天机器人,可以实现同时发送消息和接收消息 1 import socket 2 import threading 3 4 5 def udp_send(udp_socket,ip,port): 6 while True: 7 try: 8 # 获取发送的信息 9 data = input('请输入要发送的信息:') 10 udp_socket.sendto(data.encode('gbk'), (ip,port)) 11 12 except Exception a