在早期的计算机中不包含操做系统,从头到尾都只执行一个程序,而且这个程序能访问计算机全部资源。操做系统的出现使得计算机每次能运行多个程序,而且不一样的程序都在单独的进程中运行:操做系统为各个独立执行的进程分配内存、文件句柄、安全证书等。不一样进程之间经过一些粗粒度的通讯机制交换数据,包括:套接字、信号处理器、共享内存、信号量以及文件等。
之因此在计算机中加入操做系统来实现多个程序同时执行,主要基于如下缘由:缓存
资源利用率:在某些状况下,程序若是在等待某个外部操做执行完成的同时,能够运行另外一个程序,那无疑将提升资源的利用率。
公平性:经过粗粒度的时间分片运行方式,使得不一样的用户和程序对于计算机上的资源有着共同的使用权。
便利性:计算多个任务时,编写多个程序,每一个程序执行一个任务并在必要时相互通讯,比之编写一个程序来计算全部任务更容易实现。
这些促使进程出现的因素一样也促使着线程的出现。线程容许同一个进程中同时存在多个程序控制流。线程会共享进程范围内的资源(内存、文件句柄),但每一个线程都有各自的程序计数器、栈、局部变量等。一个程序中的多个线程也能够同时被调度到多个CPU上运行。安全
线程也被称为轻量级进程。现代操做系统中,都是以线程为基本的调度单位,而不是进程。多线程
发挥多处理器的强大能力
建模的简单性
异步事件的简化处理
响应更灵敏的用户界面
安全性问题
多个线程同时访问和修改相同的变量时,会发生没法预料的数据变化,致使线程出现错误并发
活跃性问题
当某个操做没法继续执行下去时:死锁、饥饿、活锁异步
性能问题
多线程程序中不只存在于单线程程序相同的性能问题(服务时间过长、响应不灵敏、吞吐率太低、资源消耗太高、可伸缩行较低等),并且还存在因为使用线程而引入的其余性能问题:性能
在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另外一个线程时,会频繁的出现上下文切换操做(Context
Switch),这种操做将带来极大的开销:保存和恢复执行上下文,丢失局部性,CPU花更多的时间在线程调度而不是线程运行上。
使用同步机制操做共享数据时,会抑制编译器优化,是内存缓存区中的数据无效,以及增长共享内存总线的同步流量优化