以前在学校的时候,推导过挺多算法,也总结到个人公众号上面去啦。在实习工作之中,也能用到部分算法,使用起来也是很得心应手。但对于刚实习或工作的同学来说(就是我),吓人的技术可能略懂,但工程方面的知识却是很浅薄。就拿最简单的进程、线程问题来说,代码实现过程中也会遇到很多问题,所以在这儿总结一下,加深自己理解。重点:基础真的很重要。操作系统、网络原理、数据结构,这些知识要认真学习呢。
首先通俗例子解释下什么是进程和线程的关系。比如你开启一个QQ,就开启了一个进程。开启了微信,就开启了另外一个进程。在QQ这个进程里,传输文字是一个线程、传输语音是一个线程、弹出对话框是一个线程。也就是说,进程可以包含多个线程。
1.进程
- 进程:进程是正在执行程序的实例,是资源分配最小的单位,每个进程都有自己单独的资源区域。进程在一定的环境下,把静态的程序代码运行起来,通过使用不同的资源,来完成一定的任务。进程的环境包括环境变量,进程所掌控的资源,有中央处理器,有内存,打开的文件,映射的网络端口等。
- 守护进程:运行在后台的进程,用于执行特定的系统任务。
- 进程的状态:只介绍进程基本状态。
- 就绪态:进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
- 运行态:进程已获得CPU,其程序正在执行。
- 阻塞态:正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态。致使进程阻塞的典型事件有:请求I/O,申请缓冲空间等。通常将这种处于阻塞状态的进程也排成一个队列。阻塞状态的进程,除非某种外部时间发生,否则进程不能运行。
- 进程状态的转换:进程在运行期间,不断地从一种状态转换到另一种状态,它可以多次处于就绪状态和运行状态,也可以多次处于阻塞状态。
- 就绪→运行:处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成运行状态。
- 运行→就绪:处于运行状态的进程在其运行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从运行状态转变成就绪状态。
- 运行→阻塞:正在运行的进程因等待某种事件发生而无法继续运行时,便从运行状态变成阻塞状态。
- 阻塞→就绪:处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。
- 进程表:为实现进程模型,每个进程占用一个进程表项,该进程表项包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配状况、所打开文件的状态、帐号和调度信息等。
2.线程
- 线程:cpu调度的最小单位。线程共享进程的资源,多个线程可以共享同一地址空间和其他资源,比如共享全局变量。线程作为进程的一部分,扮演的角色就是怎么利用中央处理器去运行代码。线程关注的是中央处理器的运行,而不是内存等资源的管理。同一时刻只有一个线程占用cpu,但高速切换给人带来并行的假象。
- 线程状态及转换:只介绍线程基本状态。
- 就绪状态:线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。处于就绪状态的线程,随时可能被CPU调度执行。
- 运行状态: 线程已获得CPU,正在运行。
- 阻塞状态: 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
- 为什么多线程?
- 线程比进程更加轻量级,线程更容易、快捷的创建和销毁。
- 多CPU系统中,使用线程提高CPU利用率。
- 耗时的操作使用线程,提高应用程序响应。拥有多个线程允许活动彼此重叠进行,从而会加快应用程序执行速度。
- 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
- 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
- 并行实体共享同一个地址空间和所有可用数据的能力。
3.线程和进程的对比
-
调度:在引入线程的操作系统中,线程是调度和分配的基本单位 ,进程是资源拥有的基本单位 。把传统进程的两个属性分开,线程便能轻装运行,从而可显著地提高系统的并发程度。 在同一进程中,线程的切换不会引起进程的切换,在由一个进程中的线程切换到另一个进程中的线程时,才会引起进程的切换。
<