欢迎大家来到IT世界,在知识的湖畔探索吧!
多线程
为了提高CPU的使用效率,将一些需要耗时较多的任务或者涉及到大量I/O操作的程序采用多进程运行,可以提高程序的运行效率。
多线程的概念
- 程序:指尚未被加载到内存的代码
- 进程 (Process) : 指正在执行的程序,Operating System (OS) 会分配其所需要的资源,至少存在一个或多个线程,主要包含: Code, Data, Heap, Stack。
Code 存储程序执行的代码
Data可以分为global variable和static variable
Heap 动态分配内存空间给变量和函数
Stack 存储临时性的数据(local variable,function)
- 线程 (Thread) : 指 OS 分配 CPU 进行运算的基本单位,存在于 Process中。一旦CPU开始执行程序,就会至少有一个Thread运作。
- 多线程(Multithreading) : 指将一个程序中的任务分配给不同的线程,各个线程平行运作,不互相影响,并且在同一个程序的线程共享内存(shared memory)
不同的程序间没办法共享内存,若有需要互相通讯,唯有依赖特别的设计才能拥有共享内存。
多线程的优点跟缺点
多线程的优点
- 提高CPU的使用效率
- 当一个线程必须停下来等待与服务器连接或者是需要占据长时间处理的程序,可以放在后台处理,其它线程还是可以继续运行,可以提高处理效率。
多线程的缺点
- 如果存在大量的线程就会影响其效能,因为系统需要在它们之间做上下文切换(Context Switch)
- 大量的线程需要很多的内存空间
- 因为数据是多个线程共享的,因此可能会发生Race Condition的情况
多线程核心机制
上下文切换 (Context Switch) : 指当 CPU 要从一个线程切换至另一个线程时,需要先保存当前线程的状态,再读回将要执行的线程状态。在切换的过程中,需要花费一些时间
Context Switch 的发生的时机 : 因为一颗 CPU 同时只能处理一项程序,OS 就会利用时间轮转的方式,让使用者感觉这些程序都是同时运行。当CPU 认为某线程执行的时间够久時候,就会发出一個中断 (Interrupt) 信号,切换至另一线程去运行
竞争危害 (Race Condition) : 指当一个Thread 修改动作执行到一半时被切换,而另一个 Thread 也正好执行修改同一个地方时,可能会导致内存泄漏 (memory leak)
Race Condition 的发生时机 : 因为程序有时间排程的问题 (发生 Context Switch),在多个线程的情況下,当两个Thread 同时修改一个数据时,可能造成变量的值错误,形成不可预期的结果,便造成了 Race Condition, 解決 Race Condition 的方法就是使用 Critical Section
临界区段 (Critical Section) : 通过对线程的串行化来访问公共资源或一段代码,速度快、适合控制数据的访问。是保证某一时刻只有一个线程访问数据的简便方法。在任何时刻只允许一个线程对共有的资源进行访问。如果有多个线程试图同时访问临界区,那么 在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操 作共享资源的目的
当线程进入临界区域时,必须使用一些同步机制在临界区域的进入点与离开点实现,以确保这些线程的安全。
- 同步机制 (Synchronized)有以下集中 : 互斥锁 (Mutex), 信号量 (Semaphore), 条件变量 (Condition Variable), 原子变量 (Atomic), 队列 (Queue), 事件 (Event)
⚠ 但是当這些锁定机制用得不好时,有可能会产生 Deadlock 的状况,所以要特别注意使用
- 死锁 (Deadlock) : 当两个以上的 Thread,都在互相等待双方停止执行并释放资源,造成循环等待的情況
一旦发生 Deadlock 时,一般没有好的办法可以处理,很多时候只能重启,所以要尽量避免 Deadlock 的状况发生 。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/88667.html