赞
踩
进程是操作系统资源分配和系统调度的基本单位。
线程是操作系统系统调度的最小单位。线程是进程的子任务,一个进程继续包含线程,一个进程可以处理多个线程,这些线程之间共享同一片内存块。
进程调度算法是操作系统中用来管理和调度进程(也称为任务或作业)执行的方法。这些算法决定了在多任务环境下,系统如何为每个进程分配CPU时间,以实现公平性、高吞吐量、低延迟等不同的调度目标。
死锁是指两个或多个资源在争夺系统资源时,由于互相等待对方释放的资源而无法继续执行的状态。
死锁的条件(四个条件必须同时满足才能发生死锁):
只需要破坏上面一个条件就可以避免死锁
虚拟内存在每一个进程创建加载过程中,为进程分配一段连续的地址空间,这个地址空间不是真实存在的,而是通过映射使得虚拟内存与实际地址空间对应。使得每一个进程都看似拥有一个独立的连续内存空间,并允许程序可以访问比实际物理内存RAM更大的空间,使得每一个程序都认为自己有足够的内存来运行。
内存分段是指把一个程序的内部空间分成不同大小的逻辑段,每一个段代表程序的一个功能模块或数据类型,比如代码段、栈段、数据段等,这些段之间都有自己的大小和权限。
内存分页是指把整个虚拟内存和物理内存分成固定大小的页,这些页是连续且尺寸固定的内存空间。
分页: 内存空间利用率高。不会产生外部碎片,只会产生少量的页内碎片。但是不方便按照逻辑对内存进行分块,不方便进行信息的共享和保护。
分段:方便按照逻辑实现对信息的共享和保护,但是如果分段过大,会很难分配连续的地址空间,容易产生外部碎片。
用户态和核心态是操作系统中两种不同的执行模式,用于控制进程或程序访问硬件资源的权限和操作范围。
用户态:
在用户态下,进程或程序只能访问受限的资源和受限的操作集合,不能访问操作系统的核心,也不能访问硬件资源,CPU不是独占的,也就是说CPU可以被其他进程抢占。
核心态:
核心态是操作系统的特权级别,允许进程或程序执行特权指令和访问操作系统的核心部分。在核心态下,进程可以直接访问硬件资源,执行系统调用,管理内存、文件系统等操作。处于内核态的CPU可以从一个程序切换到另外一个程序,并且占用CPU不会发生抢占情况,一般处于特权级0的状态我们称之为内核态。
当页面发生缺页中断时,如果物理内存中没有空闲的物理页面可用的话,操作系统就必须将物理内存中的一个页面淘汰出去,这样就可以腾出新的空间来加载新的页面了。用来选择淘汰哪一个物理页的规则叫做页面置换算法。页缺失太频繁会非常影响性能,一个好的页面置换算法应该是可以减少页缺失出现的次数。
常⻅⻚⾯置换算法有最佳置换算法(OPT)、先进先出(FIFO)、最近最久未使⽤算法(LRU)、时钟算法(Clock):
进程同步是指多个并发的进程之间协调和管理它们的执行顺序,以确保它们按照一定的顺序或时间间隔执行。
互斥指的是在某一时刻只允许一个进程访问某个共享资源。当一个进程正在使用共享资源时,其他进程不能同时访问该资源。
解决进程同步和互斥的问题有很多方法,其中一种常见的方法是使用信号量和PV操作。信号量是一种特殊的变量,它表示系统中某种资源的数量或者状态。PV操作是一种对信号量进行增加或者减少的操作,它们可以用来控制进程之间的同步或者互斥。
举个例⼦,假设有⼀个信号量 s 表示⼀个祭坛是否可⽤,初始值为 1。如果 s 的值为 1,表示祭坛空闲;如果 s 的值为 0,表示祭坛被占⽤;如果 s 的值为 -1,表示有⼀个⼈在等待使⽤祭坛。那么我们可以⽤ PV 操作来实现对祭坛的互斥访问:
如果你想要使⽤祭坛,你就执⾏ P(s) 操作,将 s 的值减 1。如果结果为 0 或者正数,表示你可以使⽤祭坛;如果结果为负数,表示有⼈在使⽤祭坛,你就必须等待。
如果你使⽤完了祭坛,你就执⾏ V(s) 操作,将 s 的值加 1。如果结果为正数或者 0 ,表示没有⼈在等待使⽤祭坛;如果结果为负数,表示有⼈在等待使⽤祭坛,你就需要唤醒他们中的⼀个。
这样就可以保证每次只有⼀个⼈能够使⽤祭坛,实现了进程互斥。
除此之外,下面的方法也可以解决进程同步和互斥问题:
条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,所以互斥锁和条件变量通常一起使用
当条件满足的时候,线程通常解锁并等待该条件发生变化,一旦另一个线程修改了环境变量,就会通知相应的环境变量唤醒一个或者多个被这个条件变量阻塞的线程。这些被唤醒的线程将重新上锁,并测试条件是否满足。一般来说条件变量被用于线程间的同步;当条件不满足的时候,允许其中的一个执行流挂起和等待
中断和异常是两个不同的事件,它们都会导致CPU暂停当前的进程转而去执行一个特定的处理程序。
CPU在执行过程中收到某个中断信号,转而去执行预先设定好的代码,然后再返回原指令流中继续执行,这就是中断机制。
两个基本的锁:
互斥锁:互斥锁是一种常见的锁类型,用于实现互斥访问共享资源。即在任何时刻,只有一个线程可以持有互斥锁,其他线程必须等待锁释放。这确保了同一时间只有一个线程可以访问被保护的资源。
自旋锁:自旋锁是一种基于忙等待的锁,即线程在尝试获取锁的过程中会不断轮询,直到锁被释放。
其他的锁都是基于这两个锁的:
读写锁:允许多个线程读共享资源,单只允许一个线程进行写操作。分为读(共享)和写(排他)两种状态。
悲观锁:认为多线程同时修改共享资源的概率比较高,所以访问共享资源的时候要上锁。
乐观锁:先不管,修改了共享资源再说,如果出现了同时修改的情况,再放弃本次操作。
读取频繁使用乐观锁,写入频繁使用悲观锁。
线程同步机制是指在多线程编程中,为了保证线程间互不干扰,而采用的一种机制。常见的线程同步机制:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。