本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
在上文《Java并发编程:硬件上的并发上篇》,我们了解到了CPU的结构,以及计算机的内存结构。而讲到并发,肯定必不可少的要讲到进程与线程,本文将为大家讲解这部分内容。
进程与线程
进程在日常开发中经常看到,比如操作系统上的各个Java进程、Redis进程等。它是操作系统进行资源分配的基本单元,我们每次启动进程的时候,操作系统都会为其分配独立的内存空间,也就是PCB。而进程,让操作系统的并发成为了可能,毕竟一个操作系统上面可以同时运行很多进程。
而从上图,我们也可以知道,线程是存在与进程中的,是在进程中运行的,同时,它也是系统调度的基本单元。
进程与线程的区别
- 在系统资源上,进程间相互独立,各自只能操作自己被分配到的资源。而同一进程中的线程之间资源是共享的。同时,进程内的线程,对其它进程是不可见的。
- 在通信方面,进程间的通信很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制;而线程直接则可通过进程数据段(如全局变量)进行通信。
- 进程的上下文切换代价比线程要大得多。
- 在多线程操作系统中,进程不是一个可执行的实体。
父子进程
在进程中,有一种概念叫做父子进程。其原理是从一个进程fork出另外一个内容完全一样的进程,这个进程就被称为子进程,而源进程则为父进程。子进程拥有自己独立的PCB,其初始内容是从父进程中复制出来的一个副本,子进程创建完成后,父子进程的PCB就完全隔离,各自维护。
而在一些特殊情况下,父子进程会演变成一些特殊进程,具体如下:
- 僵尸进程
子进程已结束,但是子进程的PCB未被主进程回收,这个子进程就被称为僵尸进程。
- 孤儿进程
子进程还在,而父进程已经结束,这个子进程就被称为孤儿进程。
后言
既然看到这里了,感觉有所收获的朋友,不妨来个大大的点赞吧~~~