线程与进程_内容充实&实例讲解&详细汇总 ❥ 内容借鉴:青灯夜游、囧辉、zhouchunyue 【操作系统】相关原创:《操作系统之进程管理——生产者&消费者实现线程同步&互斥【详细代码&原理解析】》 操作系统之进程管理–生产者&消费者实现线程同步&互斥【详细代码&原理解析】_夏旭的博客-CSDN博客 线程 线程的概念: 线程是操作系统能够进行独立运行调度的最小单位,包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程可以并发多个线程,每条线程并行执行不同的任务。线程是独立调度和分派的基本单位。线程可以作为操作系统内核调度的内核线程,如Win32线程;或者是由用户进行自行调度的用户线程,如Linux平台的POSIX Thread;或由内核与用户进程,如Win7的线程,进行混合调度。同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 线程的特点(四大属性): 在多线程OS中,通常是一个进程中包含多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体,线程有以下四个属性:轻型实体:线程中的实体基本上不拥有系统资源,只是拥有一点必不可少的、能保证独立运行的资源。线程的实体包括程序、数据和TCB(Thread Control Block)。线程是动态概念,它的动态特性由线程控制块TCB描述。独立调度和分派的基本单位:在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故切换非常迅速且开销小(同一进程中的)。可并发执行:…甚至允许一个进程中所有线程都能并发执行;不同进程中的线程也能并发执行,充分利用和发挥了 处理机与外围设备并行工作的能力。共享进程资源:在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。 多线程 多线程的概念: 线程是操作系统能够进行运算调度的最小单位;它被包含在进程之中,是进程中的实际运作单位。多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。简单来说:线程是程序中一个单一的顺序控制流程;而多线程就是在单个程序中同时运行多个线程来完成不同的工作。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。多线程是在同一时间需要完成多项任务的时候实现的。 多线程的优点: 多线程技术可以加快程序的运行速度,使程序的响应速度更快,因为用户界面可以在进行其它工作的同时一直处于活动状态可以把占据长时间的程序中的任务放到后台去处理,同时执行其他操作,提高效率当前没有进行处理的任务时可以将处理器时间让给其它任务可以让同一个程序的不同部分并发执行,释放一些珍贵的资源如内存占用等等可以随时停止任务可以分别设置各个任务的优先级以优化性能 多线程的缺点: 因为多线程需要开辟内存,而且线程切换需要时间因此会很消耗系统内存。线程的终止会对程序产生影响由于多个线程之间存在共享数据,因此容易出现线程死锁的情况对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。 cpu的多线程的用处 让同一个处理器上的多个线程同步执行并共享处理器的执行资源;可最大限度地实现宽发射、乱序的超标量处理;提高处理器运算部件的利用率;缓和由于数据相关或Cache未命中带来的访问内存延时。 处理器多线程的作用 可以为高速的运算核心准备更多的待处理数据,减少运算核心的闲置时间;解决了负载均衡问题,充分利用了CPU资源,提高CPU的使用率;可以同时完成几件事情而不互相干扰,缩短了处理大量的IO操作时或处理的情况需要花费的大量时间。 CPU又称中央管理器,是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。CPU的主要组成包括了运算器和控制器。 中断是指计算机由于异常事件,或者一些随机发生需要马上处理的事件,引起CPU暂时停止现在程序的执行,转向另一服务程序去处理这一事件,处理完毕再返回原程序的过程。 cpu主要性能指标 一、主频 也就是CPU的时钟频率,简单地说也就是CPU的工作频率。 一般说来,一个时钟周期完成的指令数是固定的,所以主频越高,CPU的速度也就越快了。不过由于 各种CPU的内部结构也不尽相同,所以并不能完全用主频来概括CPU的性能。 主频和实际的运算速度是有关的,只能说主频仅仅是CPU性能表现的一个方面,而不代表CPU的整体性能。 二、外频 外频是CPU的基准频率,单位是MHz。CPU的外频决定着整块主板的运行速度。通俗地说,在 台式机中,所说的超频,都是超CPU的外频 (当然一般情况下,CPU的倍频都是被锁住的) 相信这点是很好理解的。 但对于服务器CPU来讲,超频是绝对不允许的。前面说到CPU外频决定着主板的运行速度,两者是同步运行的,如果把服务器CPU超频了,改变了外频,会产生异步运行,这样会造成整个服务器系统的不稳定。 三、前端总线FSB频率 前端总线(FSB)频率,即总线频率,是直接影响CPU与内存直接数据交换速度。有一条公式可以计算,即:数据带宽=(总线频率×数据带宽)/8,数据传输最大带宽取决于所有同时传输的数据的宽度和传输频率。 四、CPU的位和字长 位:在数字电路和电脑技术中采用二进制,代码只有“0”和“1”,其中无论是“0”或是“1”,在CPU中都是一“位”。 字长:电脑技术中对CPU在单位时间内 (同一时间) 能一次处理的二进制数的位数叫字长。 所以能处理字长为8位数据的CPU通常就叫8位的CPU。同理32位的CPU就能在单位时间内处理字长为32位的二进制数据。 8位的CPU一次只能处理一个字节,而32位的CPU一次就能处理4个字节,同理字长为64位的CPU一次可以处理8个字节。 五、倍频系数 倍频系数是指CPU主频与外频之间的相对比例关系。在相同的外频下,倍频越高CPU的频率也越高。但实际上,在相同外频的前提下,高倍频的CPU本身意义并不大。 这是因为CPU与系统之间数据传输速度是有限的,一味追求高倍频而得到高主频的CPU就会出现明显的“瓶颈”效应——CPU从系统中得到数据的极限速度不能够满足CPU运算的速度。 六、缓存 缓存大小也是CPU的重要指标之一,而且缓存的结构和大小对CPU速度的影响非常大,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。 实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内存或者硬盘上寻找,以此提高系统性能。但是由于CPU芯片面积和成本的因素来考虑,缓存都很小。 七、超线程 可以同时执行多重线程,就能够让CPU发挥更大效率,那就是超线程(Hyper-Threading) 技术,超线程技术减少了系统资源的浪费,可以把一颗CPU模拟成两颗CPU使用,在同时间内更有效地利用资源来提高性能。 八、制程技术 制程越小发热量越小,这样就可以集成更多的晶体管,CPU效率也就更高。 提升cpu性能的方法 关闭没用的程序;超频或升级CPU;清理系统垃圾;提高CPU的时钟频率和增加缓存容量;通过超频来使得CPU频率变强等等。 线程之间的通信方式 一、消息队列 最常用,也最灵活,通过自定义数据结构,可以传输复杂和简单的数据结构。 在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信sendMessage,postMessage。 定义消息#define WM_THREAD_SENDMSG=WM_USER+20; 添加消息函数声明afx_msg int OnTSendmsg(); 添加消息映射ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM) 添加OnTSM()的实现函数; 在线程函数中添加PostMessage消息Post函数 二、使用全局变量 进程中的线程间内存共享,这是比较常用的通信方式和交互方式。 【注】:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。 三、使用事件CEvent类 Event 对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。1) 创建一个 CEvent类 的对象:CEvent threadStart;它默认处在未通信状态;2) threadStart.SetEvent(); 使其处于通信状态;3) 调用 WaitForSingleObject() 来监视 CEvent对象。 线程安全与不安全 概念: 线程安全: 就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全: 就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。 运用: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码,如果每次运行结果和单线程运行结果一样的话,而且其他变量的值也会和预期一样,就是线程安全的。 假如你有两个一摸一样的银行卡,卡上有1000块钱,而你和朋友在同一时间取钱。如果是线程不安全的情况下,两人都能取出1000。而如果线程安全的话,只能一个人同时操作一个账户,当这个账户正在被操作时,是被锁起来的,不给别人动的,只能你自己动,你动完了别人才能动。 为什么会有线程安全问题: 线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量,静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。 例子: 一个ArrayList类,在添加一个素的时候,它可能会有两步来完成:1.在items[Size]的位置存放此素;2.增大Size的值。在单线程运行的情况下,如果Size=0,添加一个素后,此素在位置0,而且Size=1;而如果是在多线程的情况下,比如有两个线程,线程A先将素存放在位置0。但是此时CPU调度线程A暂停,线程B得到运行的机会。线程B也向此ArrayList添加素,因为此时Size仍然等于0(这里注意,我们假设的是添加一个素是两个步骤,而线程A仅仅完成了步骤1),所以线程B也将素存放在位置0.然后线程A和线程B都继续运行,都增加Size的值。那好,我们来看看ArrayList的情况,素实际上只有一个,存放在位置0,而Size却等于2.这就是线程不安全了。 线程兼容和线程对立 线程兼容 线程兼容类不是线程安全的,但是可以通过正确使用同步而在并发环境中安全地使用。这可能意味着用一个 synchronized 块包围每一个方法调用,或者创建一个包装器对象,其中每一个方法都是同步的(就像 Collections.synchronizedList() 一样);也可能意味着用 synchronized 块包围某些操作序列。为了最大程度地利用线程兼容类,如果所有调用都使用同一个块,那么就不应该要求调用者对该块同步。这样做会使线程兼容的对象作为变量实例包含在其他线程安全的对象中,从而可以利用其所有者对象的同步。许多常见的类是线程兼容的,如集合类 ArrayList 和 HashMap 、 java.text.SimpleDateFormat 、或者 JDBC 类 Connection 和 ResultSet 。 线程对立 线程对立类是那些不管是否调用了外部同步都不能在并发使用时安全地呈现的类。线程对立很少见,当类修改静态数据,而静态数据会影响在其他线程中执行的其他类的行为,这时通常会出现线程对立。线程对立类的一个例子是调用 System.setOut() 的类。 线程池 如果我们在方法中直接new一个线程来处理,当这个方法被调用频繁时就会创建很多线程,不仅会消耗系统资源,还会降低系统的稳定性。 默认情况下,即使是核心线程也只能在新任务到达时才创建和启动。但是我们可以使用 prestartCoreThread(启动一个核心线程)或 prestartAllCoreThreads(启动全部核心线程)方法来提前启动核心线程。


2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/40312.html