多线程是为了使得多个线程并行的工作以完成多项任务,
以提高系统的效率。
线
程是在同一时间需要完成多项任务的时候被实现的。
使用线程的好处有以下几点:
·
使用线程可以把占据长时间的程序中的任务放到后台去处理
·
用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处
理,可以d出一个进度条来显示处理的进度
·
程序的运行速度可能加快
·
在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比
较游泳了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
====
■
什么是多进程:
进程是程序在计算机上的一次执行活动。
当你运行一个程序,
你就启动了一个进
程。显然,程序是死的
(
静态的
)
,进程是活的
(
动态的
)
。进程可以分为系统进程
和用户进程。
凡是用于完成 *** 作系统的各种功能的进程就是系统进程,
它们就是
处于运行状态下的 *** 作系统本身;
用户进程就不必我多讲了吧,
所有由你启动的
进程都是用户进程。进程是 *** 作系统进行资源分配的单位。
在
Windows
下,进程又被细化为线程,也就是一个进程下有多个能独立运行的
更小的单位。
在同一个时间里,
同一个计算机系统中如果允许两个或两个以上的进程处于运行
状态,
这便是多任务。
现代的 *** 作系统几乎都是多任务 *** 作系统,
能够同时管理
多个进程的运行。
多任务带来的好处是明显的,比如你可以塌答边听
mp3
边上网,
与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。
那么这里就涉及到并行的问题,
俗话说,
一心不能二用,这对计算机也一样,
原
则上一个
CPU
只能分配给一个进程,以便运行这个进程。我们通常使用的计算
机中只有一个
CPU
,也就是说只有一颗心,要让它一心多用,同时运行多个进
程,就必须使用并发技术。实现并发技术相当复杂,最容易理解的是
“
时间片轮
转进程调度算法
”
,它的思想简单介绍如下:在 *** 作系统的管理下,所有正在运
行的进程轮流使用
CPU
,
每个进程允许占用
CPU
的时间非常短
(
比如
10
毫秒
)
,
这样用户根本感觉不出来
CPU
是在轮流为多个进程服务,就好象所有的进程都
在不间断地运行一样。
但实际上在任何一个时间内有且仅有一个进程占有
CPU
。
如果一台计算机有多个
CPU
,
情况就不同了,
如果进程数小于
CPU
数,
则不同
的进程可以分配给不同的
CPU
来运行,这样,多个进程就是真正同时运行的,
这便是并行。但如果进程数大于
CPU
数,则仍然需要使用并发技术。
在
Windows
中,进行
CPU
分配是以线程为单位的,一个进程可能由多个线程
组成,这时情况更加复杂,但简单地说,有如下关系:
总线程数
<= CPU
数量:并行运行
总线程数
>CPU
数量:并发运行
并行运团氏慧行的效率显然高于并发运行,所以在多
CPU
的计算机中,多任务的效率
比较高。但是,如果在多
CPU
计算机中只运行一个进程
(
线程
)
,就不能发挥多
CPU
的优势。
这里涉及到多任务 *** 作系统的问题,
多任务 *** 作系统
(
如
Windows)
的基本原理是
:
*** 作系统将
CPU
的时间片分配给多个线程
,
每个线程在 *** 作系统指定的时间片内
完成
(
注意
,
这里的多个线程是分属于不同进程的
).
*** 作系统不断的从一个线程
的执行切换到另一个线程的执行
,
如此往复
,
宏观上看来
,
就好像是多个线程在一
起执行
.
由于这多个线程分属于不同的进程核运
,
因此在我们看来
,
就好像是多个进程
在同时执行
,
这样就实现了多任务
.Whoops
,真绕口
.
首先强调一点:你这里有主线程和和新建线程,它们都存在于你这个程序的进程里,这个问题没涉及主进程、子进程什么的,进程和线世物程的概念千万别弄混。即使新建线程没用Sleep函数,界面照样不能即时响应新建线程更新界面的 *** 作。Windows的线程可分为UI线程和工作线程,主线程是UI线程,负责一切响应用户输入和绘制窗口界面的人机交互工作,新建的线程是工作线程,只负责运算,不处理人机交互。所以何时响应界面的更新绘制是由你的主线程决定的,如果主线程还在执行某个函数而没有回到消息循环,就不能更新界面,啥时候那个函数执行完了就可以更新界面了。
防止线程被打断,是线程同步问题,与这里的问题没啥关系。Windows提供了一系列的线程同步API,你可以使用像自旋锁、临界区、Slim读写锁、条件变量这样的用户级线程同步API,也可以使用事件、信号量、互斥量这样的内核同步对象。具体的原理和使用方法不是三言两语能说清楚的,你可以阅读 *** 作系统教纯举材和《Windows核心编程》中讲解多线程的搜裤液章节。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)