进程、线程、协程
进程是程序中资源分配的最小单位,线程是运行调度的最小单位,一个进程可以包含多个线程,并且这些线程可以共享所在进程中的资源。协程是用户态的轻量级线程,它不受操作系统的调度,是由程序员或者库来控制,协程可以在一个线程中切换执行多个任务,从而实现异步编程的效果。另外,协程的创建和销毁都是在用户态中操作的,并且协程的调度是不需要进行上下文之间的切换,所以协程的开销非常小。
三者之间的区别
开销大小:进程开销最大,线程次之,协程最小
资源分配上:进程是资源分配的单位,线程和协程是资源调度的单位,线程共享所在进程中的资源,协程共享所在线程中的资源
地址空间:进程有独立的地址空间,线程共享进程的地址空间,协程也共享线程所在的地址空间
调度方式:进程和线程由操作系统调度,协程是由用户或库调度
内核态与用户态
内核态与用户态是操作系统中两种不同的运行模式。内核态是一种特权模式,在该状态下,操作系统具有访问硬件资源、修改关键数据等权利;用户态是普通应用程序的模式,该状态下,应用程序只能访问部分资源并且没有修改资源的权利。用户态相比于内核态它的访问、运行时间以及占用资源要比内核态小得多。
并发与并行
并发:指的是多个任务在同一时间段交替进行,通过不断切换上下文来实现执行的效果
并行:指的是多个任务在同一时间段内同时执行,并利用多个处理器或多核CPU的并行计算机能力来加速任务的完成
进程间的通信方式有哪些
1.管道(Pipe):管道是一种单向通信方式,可以在进程间传输数据,管道只能用于父子进程之间或者兄弟进程之间的通信,而命名管道(Named Pipe)命名管道可以用于任意进程之间的通信
2.共享内存:共享内存是一种通过共享内存块的方式进行进程间通信,多个进程可以访问同一个共享内存区域,并可以在该区域中进行数据读写
3.信号:信号是一种异步通信方式,进程可以通过发送信号来通知其他进程或者处理特定事件
4.套接字(Socket):套接字是一种通过网络进行进程间通信的方式,进程可以通过套接字进行数据的发送和接受
5.消息队列:消息队列是一种通过消息传递的方式进行进程间通信的方式,多个进程可以通过消息队列来发送和接受消息
进程是如何调度的
进程的调度主要分为两种方式,非剥夺调度(非抢占调度)和剥夺调度(抢占调度)
非抢占式调度:只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或者主动要求进入阻塞状态
抢占式调度:当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程
非抢占式调度主要有:
1.先来先服务调度:每次从就绪队列选择最先进入队列的进程,然后一直运行,直到进程退出或被阻塞,才会继续从队列中选择第一个进程接着运行。(实现简单,但不利于短作业以及I/O密集型进程)
2.短作业优先调度:按照执行时间最短的进程先执行。该算法可以减少平均等待时间,但是要预先知道进程的执行时间。(容易长作业饥饿,实现困难)
3.高度响应比优先调度:响应比为:等待时间/服务时间,响应比高的先执行,可以避免饥饿现象(平衡了前两种方式)
抢占式调度主要有:
1.最短剩余时间优先调度(SPTN):当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较,如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待
2.时间片轮转调度:给每一个进程都分配一个时间片,时间片实行完毕就会切换进程,执行下一个进程,依次循环。此算法容易频繁的切换进程,浪费系统资源
3.多级反馈队列调度:多级反馈队列调度算法是对其他算法的一个折中权衡,是【时间片轮转算法】和【最高优先级算法】的综合和发展
优先级调度既有抢占式也有非抢占式:他是按照设定优先级执行,抢占式是动态调整优先级,如按照运行时间调整优先级。非抢占式是创建进程就设定了(适用实时系统,对低级优先级进程不利)
进程饥饿状态、孤儿进程、僵尸进程、守护进程
-
进程饥饿状态:指进程长时间无法获取所需要的资源而无法执行的现象。这些进程可能被一只推迟或者无法完成,即使5它们本身可能是最高优先级的进程也是如此,在非抢占式调度中的短作业优先调度容易出现饥饿进程
-
孤儿进程:指父进程已经终止或不再运行的子进程,父进程已经提前结束,但是子进程仍在运行,此时子进程会被操作系统接管,处理它们的终止状态,防止成为僵尸进程。
-
僵尸进程:指已经终止执行的子进程,但其父进程没有回收掉该子进程所占的资源。僵尸进程不再执行任何代码,但会仍存在于系统进程表中,占用了一些系统资源。
-
守护进程:守护进程是一种在操作系统后台运行的特殊类型的进程,通常用于执行系统任务或服务。它们不受用户登录或注销的影响,独立于用户会话运行,并且通常不与用户直接交互。守护进程通常在系统启动时启动,并在系统关闭时终止。它们的特点包括脱离终端控制、在后台运行、重定向标准输入输出、执行系统任务或服务等。
什么是死锁、如何解决死锁?
死锁是指多个进程(线程)之间,每个进程都占用某些资源,而它们又在等在其他进程释放它们所需要的资源,从而导致所有进程都不能执行下一步任务的状态
避免死锁的策略主要有以下几种;
-
预防死锁:通过合理的资源分配,避免循环依赖等方式,尽可能地预防死锁发生
-
避免死锁:通过安全序列等方式,避免死锁的产生
-
检测死锁:可以通过资源分配图等方式检测死锁是否已经发生
-
解除死锁:当发现死锁已经发生时,可以采取中断某个进程、回收某个进程占用的资源等方式解除死锁