进程和线程

1.什么是进程?什么是线程?区别是什么?

  • 进程:进程是操作系统进行资源分配的最小单位,指计算机中正在运行的一个程序实例,比如:微信、QQ

  • 线程:线程隶属于进程,是操作系统进行任务调度的最小单位。

注意:一个进程可以有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程都有自己的程序计数器、虚拟机栈和本地方法栈。基本上各进程是相互独立的,但是线程不一定,同一进程中的线程极有可能会相互影响。

2.说一下为什么要引入线程?

因为线程更加的轻量级,一个进程可以创建多个线程;进程的切换开销很大,但线程的切换相对成本较低;而且多个线程可以同时处理不同的任务,大大提高了效率;同一进程内的线程共享内存和文件,这使得它们之间的通信方便快捷。

3.为什么使用多线程?

  • 提升响应速度。

  • 多个线程同时处理不同的任务,大大提升了效率。

  • 利用了CPU的多核,充分利用CPU。

4.说一下线程间的同步方式?

面对两个或多个共享关键资源的线程并发执行,应该同步线程以避免关键的资源使用冲突,常见的同步方式有互斥锁、读写锁、信号量来解决。

  • 互斥锁:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized和Lock锁。

  • 读写锁:允许多个线程同时读取共享资源,但只有一个线程可以对共享资源进行写操作。

  • 信号量(Semaphore):它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。

5.PCB是什么?包含哪些信息?

PCB全称进程控制块,是用来管理和跟踪进程的数据结构,每个进程都对应着一个独立的PCB。当操作系统创建一个新进程时,会为该进程分配一个唯一的进程ID,并且为该进程创建一个对应的进程控制块。进程执行过程中,PCB中的信息会不断的变化。

PCB中主要包括的内容:

  • 进程的描述信息,包括进程的名称、标识符等。

  • 进程的状态信息,包括进程的状态、优先级等。

  • 进程的占用情况,包括内存空间、CPU时间等。

  • 处理及状态信息,包括指令计数器、程序状态字PSW、通用寄存器等。

6.说一下进程的五种状态?

进程有五种状态,分别为:创建、就绪、运行、阻塞、结束。

进程和线程_第1张图片

7.进程间的通信方式有哪些?

管道、信号量、消息队列、共享内存、套接字(socket)....

8.进程的调度算法有哪些?

为了确定首先执行哪个进程以及最后执行哪个进程以实现CPU的最大利用率,定义了一些算法:

  • 先来先服务调度算法:最先进入队列的进程先分配CPU资源,一直执行完成或者发生阻塞放弃占用才考虑下一个进程。

  • 短作业优先调度算法:从队列中选取一个运行时间最短的进程为其分配CPU资源,一直执行完成或者发生阻塞放弃占用才考虑其他进程。

  • 时间片轮转调度算法:每一个进程分配一个固定的时间片运行,简单公平。

  • 多级反馈队列调度算法:使高优先级的作业得到响应又能使短作业(进程)迅速完成。因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。

    首先会创建多个独立的队列,这些队列可以按照进程的特征划分,如优先级、IO需求、计算需求等划分,当一个新进程到达时,系统按其特性将其放入适当的队列中,每个队列都有自己的调度算法,如果进程在执行过程中发生了变化,系统可能会将其进程从一个队列迁移到另一个队列。

  • 优先级调度算法:为每个进程分配优先级,优先级高的进程最先执行。

9.什么是僵尸进程和孤儿进程?

一个子进程调用exit()结束自己的生命时,内核会释放该进程的所有资源,但是该进程对应的PCB依然存在于系统中,这些信息只有在父进程调用wait()或waitpid()时才会被释放,以便让父进程得到子进程的状态信息。

  • 僵尸进程子进程已经终止,但是其父进程仍在运行,且父进程没有调用 wait()或 waitpid()等系统调用来获取子进程的状态信息,释放子进程占用的资源,导致子进程的 PCB 依然存在于系统中,但无法被进一步使用。这种情况下,子进程被称为“僵尸进程”。避免僵尸进程的产生,父进程需要及时调用 wait()或 waitpid()系统调用来回收子进程。

  • 孤儿进程一个子进程的父进程已经终止或者不存在,但是该子进程仍在运行。这种情况下,该子进程就是孤儿进程。孤儿进程通常是由于父进程意外终止或未及时调用 wait()或 waitpid()等系统调用来回收子进程导致的。为了避免孤儿进程占用系统资源,操作系统会将孤儿进程的父进程设置为 init 进程(进程号为 1),由 init 进程来回收孤儿进程的资源。

init进程:init进程是系统启动后内核创建的第一个进程,打一个进程终止时,内核会检查它的所有子进程,将这些子进程的父进程id改为1,这样init进程就成为了这些孤儿进程的新父进程,init()进程会周期性的调用wait()来回收这些孤儿进程的资源。

10.如何查看是否有僵尸进程?

Linux 下可以使用 Top 命令查找,zombie 值表示僵尸进程的数量,为 0 则代表没有僵尸进程。

 

你可能感兴趣的:(操作系统,java,面试,jvm,linux,ubuntu,windows,gnu)