多线程与多进程的比较

多线程与多进程的比较,第1张

什么是多线程

多线程是为了使得多个线程并行的工作以完成多项任务,

以提高系统的效率。

线

程是在同一时间需要完成多项任务的时候被实现的。

使用线程的好处有以下几点:

·

使用线程可以把占据长时间的程序中的任务放到后台去处理

·

用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处

理,可以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核心编程》中讲解多线程的搜裤液章节。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12478544.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存