操作系统基础知识之————单线程(Thread)与多线程的区别

单线程(Thread)与多线程的区别

(一)首先了解一下cpu:

       随着主频(cpu内核工作时钟频率,表示在CPU内数字脉冲信号震荡的速度,等于外频(系统基本时间)乘倍频)的不断攀升,X86构架的硬件逐渐成为瓶颈,最高为4G,事实上目前3.6G主频的CPU已经接近顶峰。

       多线程编程的目的,就是"最大限度地利用CPU资源",当某一线程的处理不需要占用 CPU 而只和 I/O , OEM BIOS 等资源打交道时,让需要占用 CPU 资源的其它线程有机会获得CPU资源。

       每个程序执行时都会产生一个进程,而每一个进程至少要有一个主线程。

       这个线程其实是进程执行的一条线索,除了主线程外你还可以给进程增加其它的线程,也即增加其它的执行线索,由此在某种程度上可以看成是给一个应用程序增加了多任务功能。

       当程序运行后,您可以根据各种条件挂起或运行这些线程,尤其在多CPU的环境中,这些线程是并发运行的。多线程就是在一个进程内有多个线程。从而使一个应用程序有了多任务的功能。

       多进程技术也可以实现这一点,但是创建进程的高消耗(每个进程都有独立的数据和代码空间),进程之间通信的不方便(消息机制),进程切换的时间太长,这些导致了多线程的提出,对于单CPU来说(没有开启超线程),在同一时间只能执行一个线程,所以如果想实现多任务,那么就只能每个进程或线程获得一个时间片,在某个时间片内,只能一个线程执行,然后按照某种策略换其他线程执行。由于时间片很短,这样给用户的感觉是同时有好多线程在执行。但是线程切换是有代价的,如果出现时间较长,就出现程序假死状态,出现程序无响应等症状。

      因此如果采用多进程,那么就需要将线程所隶属的该进程所需要的内存进行切换,这时间代价是很多的。而线程切换代价就很少,线程是可以共享内存的。所以采用多线程在切换上花费的比多进程少得多。

      但是,线程切换还是需要时间消耗的,所以采用一个拥有两个线程的进程执行所需要的时间,要比一个线程的进程执行两次任务所需要的时间要多一些。

      即采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。

     上述结果只是针对单 CPU,如果对于多 CPU 或者 CPU 采用超线程技术的话,采用多线程技术还是会提高程序的执行速度的。因为单线程只会映射到一个CPU上,而多线程会映射到多个CPU上,超线程技术本质是多线程硬件化,所以也会加快程序的执行速度。

     以上文档引用“douglax”的观点:http://blog.csdn.net/douglax/article/details/1532258

下面这个简单的应用实例是一个多线程过程

private void button1_Click(object sender,Eventargs e)
{
Thread t=new Thread(new ThreadStart(ThreadProc));
    t.Start();
   Thread.Sleep(0);
   t.Join();
}
public static void ThreadProc()
{
          string threa="在这里获取UDP传递的流,其类型为byte[]";
         Thread.Sleep(0);
}

1)程序的窗口运行在主线程上;
2) Thread t=new Thread(new ThreadStart(ThreadProc)) 又启动了另外一个线程

 

时间: 2025-01-31 07:47:41

操作系统基础知识之————单线程(Thread)与多线程的区别的相关文章

Java核心技术卷I基础知识1.2.10 多线程

1.2.10 多线程 多线程可以带来更好的交互响应和实时行为. 如今,我们非常关注并发性,因为摩尔定律行将完结.我们不再追求更快的处理器,而是着眼于获得更多的 处理器,而且要让它们一直保持工作.不过,可以看到,大多数编程语言对于这个问题并没有显示出足够的 重视. Java在当时很超前.它是第一个支持并发程序设计的主流语言.从白皮书中可以看到,它的出发点稍有些不 同.当时,多核处理器还很神秘,而Web编程才刚刚起步,处理器要花很长时间等待服务器响应,需要并发 程序设计来确保用户界面不会"冻住&qu

Linux操作系统基础知识之八:文件系统

Q1.        Linux目录树结构是怎样的?它与Windows的目录树结构有什么区别?为什么Linux的文件系统采用固定的目录形式? A:文件是一个抽象的概念,它是存放一切数据或信息的仓库: 1)        Linux的目录树结构为:根目录(/)在上,其它的平行在下: 2)        Windows操作系统也是采用树型结构,但其树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,它们之间的关系式并列的:而在Linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个:

Linux操作系统基础知识之六:系统调用

Q1.        什么是系统调用?为什么要引入系统调用? A: 1)        操作系统为用户态的进程与硬件设备(如CPU.磁盘和打印机等)之间的交互提供了一组接口,这些接口使得程序更具有可移植性,因为不同的操作系统只要所提供的一组接口相同,那么在这些操作系统之上就可以正确地编译和执行相同的程序,这组接口就是所谓的"系统调用": 2)        引入系统调用的原因有: A.      这使得编程更加容易: B.       这极大地提高了系统的安全性: C.      最重

Linux操作系统基础知识之二:内存寻址

Q1.        什么是物理地址?什么是虚地址?什么是线性地址? A: 1)        将主板上的物理内存条所提供的内存空间定义为物理内存空间,其中每个内存单元的实际地址就是物理地址: 2)        将应用程序员看到的内存空间定义为虚拟地址空间(或地址空间),其中的地址就叫做虚拟地址(或虚地址),一般用"段:偏移量"的形式来描述,如A815:CF2D: 3)        线性地址空间是指一段连续的.不分段的.范围为0~4GB的地址空间,一个线性地址就是线性地址空间的一个

Linux操作系统基础知识之一:Linux操作系统概述

 Q1.        什么是GNU?Linux与GNU有什么关系? A: 1)        GNU是GNU is Not Unix的递归缩写,是自由软件基金会(Free Software Foundation,FSF)的一个项目,该项目已经开发了许多高质量的编程工具,包括emacs编辑器.著名的GNU C和C++编译器(gcc和g++): 2)        Linux的开发使用了许多GNU工具,Linux系统上用于实现POSIX.2标准的工具几乎都是由GNU项目开发的:Linux内核.GN

Linux操作系统基础知识之三:进程

Q1.        程序与进程的概念分别是什么?为什么要引入"进程"的概念? A: 1)        程序是一个普通文件,是机器代码指令和数据的集合,这些指令和数据存储在磁盘上的一个可执行映像中,可执行映像(executable image)就是一个可执行文件的内容: 2)        进程代表程序的执行过程,它是一个动态的实体,随着程序中指令的执行而不断地变化,在某个时刻进程的内容被称为进程映像(process image): 3)        程序的执行过程可以说是一个执行

Linux操作系统基础知识之七:内核中的同步

Q1.        什么是临界区?什么是竞争状态?什么是同步? A: 1)        临界区(critical regions)就是访问和操作共享数据的代码段,多个内核任务并发访问同一个资源通常是不安全的: 2)        如果两个内核任务可能处于同一个临界区,就是一种错误现象:如果确实发生了这种情况,就称它为竞争状态: 3)        避免并发和防止竞争状态称为同步(synchronization).   Q2.        简要介绍一下死锁及避免死锁的方法. 答:死锁包括自死

Linux操作系统基础知识之九:设备驱动

Q1.        为什么把设备分为"块设备"和"字符设备"两大类? A: 1)        Linux将设备看成文件,具有三方面的含义:第一,每个设备都对应一个文件名,在内核中也就对应一个索引节点:第二,对文件操作的系统调用大都适用于设备文件:第三,从应用程序的角度看,设备文件的逻辑空间是一个线性空间:对于同一个具体的设备而言,文件操作和设备驱动是同一个事物的不同层次,概念上可以将一个系统划分为应用.文件系统和设备驱动三个层次: 2)        Linux

在JavaScript中操作时间之getYear()方法的使用教程_基础知识

 javascript Date.getYear()方法返回按照通用时间在指定日期的年份.getYear不再使用,已使用getFullYear方法取代. 通过了getYear返回的值是当前年份减去1900(在JavaScript1.2)及返回或者是2位或4位数字的年份,例如,如果年份是2026年,返回的值是2026所以测试此函数之前,请确保JavaScript的版本.语法 Date.getYear() 这里是参数的细节:     NA 返回值: 按照通用时间返回指定日期的年份.例子: <html