程序加载到内存里运行,就是一个进程(运行中的QQ)
-
并发与操作系统的生命历程息息相关。进程的出现,使得程序状态的保存变为现实,为进程间的切换提供了可能,实现了操作系统的并发,大大提高资源利用率。
虽然进程的出现解决了操作系统的并发问题,但人们对实时性又有了更高的要求。由于一个进程由若干个子任务组成,所以人们就发明了线程,让每个线程负责一个独立的子任务,提高程序的响应灵敏度。
一个进程虽然包括多个线程,但是这些线程是共同享有进程占有的资源和地址空间的。因此,虽然多线程提高了资源利用率,保证了实时性,但同时也带来了包括安全性、活跃性和性能等问题。
总的来说,进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。 -
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对PCB 的操作。
-
QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件
-
若一个进程同一时间 并行执行多个线程,就是支持多线程的
-
一个进程中的多个线程共享相同的内存单元/内存地址空间 ->它们从同一堆中分配对象,可以访问相同的变量和对象。这就使得线程间通信更简便、高效。但多个线程操作共享的系统资源可能就会带来安全的隐患
单核CPU和多核CPU的理解
- 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。
例如:虽然有多车道,但是收费站只有一个工作人员在收费,只有收了费 才能通过,那么CPU就好比收费人员。如果有某个人不想交钱,那么收费人员可以 把他“挂起”(晾着他,等他想通了,准备好了钱,再去收费)。但是因为CPU时间单元特别短,因此感觉不出来。
或【一个厨师在同时炒好几个锅的菜】 - 如果是多核的话(多个人),才能更好的发挥多线程的效率。(现在的服务器都是多核的)
一个Java应用程序java.exe,其实至少有三个线程:main()主线程,gc() 垃圾回收线程,异常处理线程。当然如果发生异常,会影响主线程。
并行与并发
并行:多个CPU同时执行多个任务。比如:多个人同时做不同的事
并发:一个CPU(采用时间片)同时执行多个任务。比如:秒杀、多个人做同一件事
背景:以单核CPU为例,只使用单个线程先后完成多个任务(调用多个方 法),肯定比用多个线程来完成用的时间更短,为何仍需多线程呢?
多线程 程序的优点:
- 提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
- 提高计算机系统CPU的利用率
- 改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和 修改
何时需要多线程
程序需要同时执行两个或多个任务。
程序需要实现一些需要等待的任务时,如用户输入、文件读写,操作、网络操作、搜索等。
需要一些后台运行的程序时
异步:
当正在执行的进程提出某种资源请求时,如打印机请求,而此时打印机正在为其他的进程打印。由于打印机是临界资源,因此正在执行的进程必须等待,并且要放弃处理机。直到打印机空闲,并再次把处理机分配给该进程时,该进程才能继续执行。由于资源等因素的限制,进程的执行通常都不是“一气呵成”,而是以"停停走走"的方式运行。