赞
踩
实话说,写操作系统相关博客我是很没有头绪的,思路列了又删,复述书上的内容感觉不到任何好处;还是作罢;
搞起知识点记载,总算是与面试八股相关了;
一.进程和线程相关问题
说到操作系统,必须要了解的就是进程和线程,就像是最小构成一般,非常多的进程和线程才让操作系统这个庞然大物运转起来;
接下来会记录几个必会的问题;
即
详细的来说:
进程的概念起源于操作系统的设计,它允许多个程序同时在计算机系统中运行,每个程序都被视为一个独立的进程。操作系统通过进程调度算法来决定哪些进程应该在何时执行,从而实现了系统资源的合理分配和利用。进程间可以通过进程间通信(IPC)机制进行数据交换和协作,从而完成复杂的任务和应用场景。
线程(Thread)是进程内的一个执行单元,是操作系统调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源,包括内存空间、文件描述符、打开的文件等。每个线程拥有独立的执行流程,可以独立执行任务,但它们共享同一进程的地址空间和资源。
与进程相比,线程的创建、销毁和切换开销更小,因为它们共享进程的资源。多线程编程可以提高程序的并发性和效率,在多核处理器上能够更好地利用硬件资源。线程间的通信更加简单直接,因为它们可以直接共享内存空间,可以通过共享变量等方式进行通信和同步。
总的来说,线程是进程内的执行流程,是操作系统调度的基本单位,它们共享进程的资源,可以独立执行任务。多线程编程可以提高程序的并发性和效率,但也需要注意线程安全性和资源竞争等问题,以确保程序的正确性和稳定性。
名词:
线程安全性指的是在多线程编程中,当多个线程同时访问共享资源时,程序仍然能够正确地执行,并且不会产生不确定的结果或者破坏数据的一致性。换句话说,线程安全性保证了程序在并发执行时的正确性和稳定性。
在多线程环境中,如果多个线程同时访问共享资源,而没有进行适当的同步措施,就可能会出现竞态条件(Race Condition)和数据竞争(Data Race)等问题。这些问题可能导致数据的不一致性、程序的崩溃或者死锁等情况,从而影响程序的正确性和可靠性。
为了确保线程安全性,需要采取适当的同步机制和线程安全的编程技术,例如互斥锁(Mutex)、信号量(Semaphore)、读写锁(ReadWrite Lock)等。这些同步机制可以确保在同一时间只有一个线程能够访问共享资源,从而避免竞态条件和数据竞争等问题。
资源竞争(Resource contention)指的是在多线程或多进程环境中,多个线程或进程同时竞争共享资源而导致的问题。这种竞争可能会导致数据的不一致性、程序的异常行为或性能下降等情况。
资源竞争通常发生在多个线程或进程试图同时访问共享资源时,这些资源可以是内存中的变量、文件、网络连接、设备等。当多个线程或进程同时修改同一个共享资源时,就可能出现竞态条件(Race Condition)或数据竞争(Data Race)等问题。
竞态条件是指程序的执行结果依赖于不同线程或进程执行操作的具体顺序,如果操作的执行顺序不同,可能会导致不同的结果。数据竞争则是指多个线程或进程同时访问共享数据,并且其中至少有一个线程进行写操作,而没有进行适当的同步,从而导致数据的不一致性或未定义的行为。
避免方法同上;
还是还是理解不了,呢推荐去看一下:
进程与线程的一个简单解释 - 阮一峰的网络日志 (ruanyifeng.com)
再回来看文字,应该就一目了然了;
线程同步是指在多线程编程中,通过各种技术手段确保多个线程之间的协作和数据一致性。
同样,也会有进程同步
进程间通信(Inter-Process Communication,IPC)是指不同进程之间进行数据交换和共享信息的方式。在操作系统中,进程间通信是必不可少的,因为不同进程可能需要共享资源、协调工作或者传递数据。
名词:
设计模式是在软件工程中常用的一种解决常见问题的模式化解决方案,它们提供了经过验证和可重用的设计思路。
其实必考的就单例模式,工厂模式也较为重要
单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式在需要确保只有一个对象实例的情况下非常有用,比如数据库连接池、线程池、日志记录器等。
以下是单例模式的详细说明:
工厂模式是一种创建型设计模式,其目的是定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂模式将对象的实例化过程延迟到其子类,从而使得一个类的实例化与其子类解耦,提高了代码的灵活性和可维护性。
工厂模式通常包含以下几个要素:
工厂模式可以分为三种常见的形式:
工厂模式适用于需要在运行时选择创建哪个具体类的情况,或者需要根据条件来选择不同的类。它提供了一种灵活的方式来创建对象,避免了直接实例化具体类带来的耦合性,同时也提高了代码的可扩展性和可维护性。
更详细点的以及其他模式会在其他文章中说明。
既然说了进程和线程,再提一嘴go中的协程
在 Go 语言中,协程(Goroutine)是一种轻量级的线程(Thread)实现,它由 Go 运行时环境管理。协程是一种用户态线程,由 Go 语言的运行时环境调度和管理,而不是由操作系统内核调度。因此,与传统的线程相比,协程的创建、销毁和切换开销更小,可以高效地支持大量的并发执行。
协程与传统的操作系统线程(Thread)相比有几个显著的优势:
虽然协程实际上是在操作系统线程上执行的,但由于其轻量级和灵活性,使得协程在处理并发任务时比传统的线程更具优势。因此,许多现代编程语言和框架都提供了对协程的支持,以简化并发编程并提高性能。
而我们平常讨论的三种基本状态:就绪状态,运行状态,阻塞状态
一个进程在运行期间,不断地从一种状态转换到另一种状态,它可以多次处于就绪状态和执行状态,也可以多次处于阻塞状态。
(1) 就绪→执行
处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
例: 当前运行进程阻塞,调度程序选一个优先权最高的进程占有处理机;
(2) 执行→就绪
处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
例: 当前运行进程时间片用完;
(3) 执行→阻塞
正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
例:当前运行进程等待键盘输入,进入了睡眠状态。
(4) 阻塞→就绪
处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。
例:I/O操作完成,被中断处理程序唤醒。
先来先服务
先来先服务(First Come, First Served,FCFS)调度算法是最简单的进程调度算法之一,其原则是按照进程到达的先后顺序进行调度。当一个进程到达时,它就被放入就绪队列的末尾,等待CPU执行。一旦CPU空闲,操作系统就会选择队列中的第一个进程进行执行。
短作业优先调度算法
短作业优先(Shortest Job First,SJF)调度算法是一种按照预计执行时间最短的顺序来调度进程的算法。它的核心思想是优先选择执行时间最短的进程,以最小化平均等待时间,并提高系统的吞吐量。
高优先权优先调度算法
高优先权优先调度算法是一种按照进程优先级来选择下一个要执行的进程的算法。此算法常被用于批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度算法,还可用于实时系统中。当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程,这时,又可进一步把该算法分成如下两种。
高响应比优先调度算法
高响应比优先调度算法是一种用于操作系统中的进程调度算法,旨在提高系统对用户请求的响应速度。该算法根据进程的等待时间和服务时间来计算响应比,然后选择具有最高响应比的进程优先执行,以确保长时间等待的进程能够及时得到服务。
时间片轮转法
时间片轮转法(Round Robin Scheduling)是一种常见的调度算法,通常用于操作系统中对进程进行调度。它的基本原理是每个进程被分配一个小的时间片(如10毫秒),在该时间片内执行,然后被挂起,等待下一个时间片执行。如果进程在时间片用完之前没有完成,它将被暂停,并放到就绪队列的末尾,等待下一次调度。
多级反馈队列调度算法
多级反馈队列调度算法(Multilevel Feedback Queue Scheduling)是一种综合了多种调度策略的进程调度算法。它将就绪队列划分为多个队列,每个队列具有不同的优先级,通常是由高到低,每个队列都采用先来先服务(FCFS)的调度策略。
在多级反馈队列调度算法中,进程首先进入最高优先级的队列,如果一个进程的时间片用完了但仍然没有完成,它将被移到下一个较低优先级的队列中等待执行。如果进程在一个较低优先级队列中等待的时间太久,系统可能会将其提升到一个较高优先级的队列,以提高其执行的机会。
这种调度算法的优点是能够灵活地应对不同类型的进程和不同的工作负载,同时可以避免长时间运行的进程占用CPU资源,提高了系统的响应速度。然而,多级反馈队列调度算法也需要维护多个队列,增加了系统的复杂度。
更详细的可以查看:操作系统进程调度策略
进程同步是指在多进程或多线程环境中,协调它们的执行顺序和共享资源的访问,以避免出现竞态条件(Race Condition)、死锁(Deadlock)等并发编程中常见的问题。以下是几种常见的进程同步机制:
有锁的出现就会有死锁
死锁(Deadlock)是指在多个进程或线程之间,彼此持有对方所需资源而无法继续执行的情况,导致所有参与者都陷入了无法解脱的僵局状态。在死锁中,每个进程都在等待其他进程释放资源,而无法释放自己所持有的资源,从而导致所有进程都无法向前推进。
死锁产生的四个必要条件是:
当以上四个条件同时满足时,就会导致死锁的发生。为了避免死锁,需要破坏其中一个或多个必要条件,或者采取预防、避免、检测和恢复等死锁处理策略。
选择适当的死锁处理策略取决于系统的特点、对性能的要求以及实现的复杂性。通常情况下,预防和避免死锁是首选,因为它们可以在设计阶段或者运行时减少死锁的发生,而检测和恢复死锁是一种备用的解决方案,用于处理无法避免的死锁情况。
今天就分享到这里,之后会持续间断更新的;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。