[八股]操作系统八股


进程和线程的区别

进程和线程是计算机操作系统中的两个基本概念,进程是操作系统分配资源的基本单位。每个进程都有自己的内存空间和系统资源(如文件句柄、网络连接等)。线程是进程中的一个执行单元,也是操作系统调度的基本单位。一个进程可以包含多个线程,它们共享进程的内存和资源。

  • 内存空间 进程之间有独立的内存空间,一个进程无法直接访问另一个进程的内存。同一进程中的线程共享相同的内存空间和系统资源,这使得线程之间的数据共享和通信更加容易和高效。
  • 资源开销 进程的创建和切换的开销较大,因为需要分配独立的内存空间和系统资源。线程的创建和切换的开销较小,因为线程共享进程的资源和内存空间。
  • 稳定性个进程的崩溃不会影响到其他进程,因为它们有独立的内存空间。而一个线程的崩溃可能会导致整个进程的崩溃,因为它们共享相同的内存空间。
  • 通信 进程之间的通信比较复杂,需要使用管道、消息队列、共享内存等机制。线程之间的通信(如变量共享)非常方便,因为它们共享相同的内存空间。

总的来说,进程有独立的内存空间,高资源开销,稳定性好,通信复杂。线程则是共享的内存空间,低资源开销,稳定性差,通信简单。使用场景上,高并发并且任务之间相对独立,可能更适合使用进程,而如果需要高效的数据共享和低开销的任务切换,则更适合使用线程。


线程和协程的区别

线程和协程是两种不同的并发执行方式,线程是操作系统调度的基本单位,属于进程中的一个执行路径。一个进程可以包含多个线程,线程之间共享进程的内存和资源。协程是一种用户态的轻量级线程,也被称为纤程,协程在用户空间进行调度,可以在单个线程内实现多任务协作。

  • 控制/管理 线程由操作系统内核管理,线程的创建、销毁和切换都由操作系统负责。协程由用户程序管理,协程的切换和调度由用户代码显式控制
  • 并行执行 多个线程可以真正并行执行(在多核处理器上),多个线程可以同时运行。协程通过在单个线程内交替执行来实现并发(异步),不能真正并行执行(即不能同时在多个核心上运行)。
  • 切换开销 线程切换由操作系统内核完成,开销较大,因为需要进行上下文切换。协程切换开销很小,因为不涉及内核态的上下文切换,只需保存和恢复少量寄存器。因此协程数量的上限比线程大一个数量级。
  • 阻塞状态 一个线程的阻塞(如IO操作)会导致整个线程被挂起,但不会影响同一进程中的其他线程。协程在等待某些操作(如IO操作)完成时,可以主动让出控制权,不会阻塞整个线程,同一时间其实只有一个协程拥有运行权,相当于单线程的能力。

线程适用于需要充分利用多核CPU进行并行计算的场景,例如多线程服务器、计算密集型任务等,协程适用于需要大量并发但每个任务占用时间很短的场景,例如高并发的网络服务器、异步IO操作等。


常用的 Linux 命令

  • ls:列出目录内容
ls -l  # 详细列表格式
ls -a  # 列出所有文件,包括隐藏文件
  • cd:改变目录
cd /path/to/directory  # 切换到指定目录
cd ..  # 返回上一级目录
  • pwd:显示当前工作目录
pwd
  • mkdir:创建目录
mkdir new_directory  # 创建新目录
  • rm:删除文件或目录
rm file  # 删除文件
rm -r directory  # 递归删除目录及其内容
  • cp:复制文件或目录
cp source_file destination_file  # 复制文件
cp -r source_directory destination_directory  # 递归复制目录
  • cat:连接并显示文件内容
cat file  # 显示文件内容
  • ps:显示当前进程信息
ps aux  # 显示所有进程信息
  • ping:测试网络连接
ping google.com  # 测试与 google.com 的连接
  • ip:显示或配置网络接口(替代 ifconfig 的较新命令)
ip addr show  # 显示网络接口地址
  • ssh:通过 SSH 连接远程主机
ssh user@hostname  # 连接到远程主机
  • zip:压缩文件
zip archive.zip file1 file2  # 压缩文件

进程调度算法有哪些

首先,进程调度算法是操作系统用来管理进程执行顺序的规则和方法,主要讨论的是谁先谁后的次序问题。从最简单的先来先服务,到各种优先执行,再到多级反馈,随着场景的复杂而不断改进。下面就介绍这些算法。

  • 先来先服务 按进程到达的顺序进行调度,先到先服务。问题是可能导致长时间的等待(即“等待时间过长”问题),尤其是在短进程排在长进程后面时。
  • 短作业优先 优先调度估计运行时间最短的进程,这样最小化平均等待时间,但是引入了预知每个进程的运行时间的开销,可能导致“饥饿”现象(长作业可能一直得不到调度)。
  • 最短剩余时间优先 调度剩余执行时间最短的进程,是短作业优先的抢占式版本。进一步缩短了平均等待时间,但短作业优先的缺点仍然存在。
  • 时间片轮转 每个进程分配一个固定时间片,时间片用完后,进程被挂起,轮到下一个进程执行。优点是响应时间快,适用于时间共享系统。缺陷在于时间片的大小选择,过大时退化为先来先服务,过小时导致频繁的上下文切换,增加系统开销。
  • 多级队列调度 将进程分成多个队列,每个队列有不同的调度算法和优先级。队列之间也有调度规则。适用于具有不同优先级和服务要求的进程,但是可能需要复杂的规则来管理队列之间的调度。
  • 多级反馈队列调度 拥有多个队列,每个队列有不同的优先级和时间片长度,进程可以在不同优先级队列之间移动,根据其执行情况调整优先级,同时为了防止进程饥饿(长时间得不到执行),系统会定期将某些长时间未被调度的进程提升到更高优先级的队列。多级反馈队列调度优点是灵活,可以动态调整以适应进程的执行行为,较好地平衡了响应时间和吞吐量,但也导致了复杂度高,难以调整和优化的问题。

谈谈孤儿进程和僵尸进程

  • 孤儿进程是指在计算机操作系统中,其父进程已经终止,但它本身仍然在运行的进程。操作系统会将孤儿进程重新分配给一个特殊的进程,通常是init进程(在现代Linux系统中是systemd)。init进程的进程ID为1,是系统启动后第一个启动的用户进程。它会负责接管所有孤儿进程,确保它们能够正常终止。孤儿进程一般不会产生任何危害。

  • 僵尸进程,又称为死进程,是指已经终止执行但仍然在进程表中占据一个条目的进程。僵尸进程保留了其退出状态和资源使用信息,以便父进程在调用wait或waitpid函数时可以读取这些信息。处理僵尸进程的正确方法是让父进程应通过wait或waitpid函数处理内核的SIGCHLD信号,清理僵尸进程,以避免系统资源浪费。


线程的通信方式

首先,因为线程间可以共享一份全局内存区域,所以线程间无需特别的手段进行通信,只需要将数据复制到共享(全局或堆)变量中即可,这种通信需要注意同步机制,也可以采取消息传递机制等其他通信机制。

线程共享进程的内存空间,线程之间可以通过共享变量进行通信。这种方式的主要挑战是确保对共享数据的访问是安全的,通常需要使用同步机制来避免数据竞争和不一致。常见的同步机制有:

  • 互斥锁 同一时间只有一个线程可以访问共享资源。
  • 读写锁 允许多个线程同时读取共享资源,但在写入时必须独占访问。
  • 自旋锁 一种忙等待锁,线程在获取锁时不停地检查锁状态,适用于锁持有时间很短的情况。
  • 条件变量 让线程等待某个条件发生,常与互斥锁一起使用,适用于需要线程等待特定事件的场景。
  • 信号量 用于控制对资源的访问,类似于计数器,可以用来限制同时访问资源的线程数。

线程之间通过发送和接收消息进行通信,这种方式避免了共享内存的复杂性,特别适用于分布式系统和多进程通信。常见的消息传递机制有:

  • 消息队列 线程通过消息队列发送和接收消息,消息队列可以保证消息的有序性。
  • 管道 一种单向通信机制,一个线程写入数据到管道,另一个线程读取数据。
  • 套接字(Socket) 通常用于网络通信,但也可以用于本地线程间通信,通过套接字发送和接收数据,提供TCP(流)和UDP(数据报)两种传输方式。
  • 事件 一种信号机制,一个线程可以设置事件,其他线程可以等待事件发生。

线程通信方式主要包括共享内存和消息传递。共享内存需要使用同步机制确保数据安全,而消息传递通过发送和接收消息实现通信。


虚拟内存与物理内存

虚拟内存和物理内存是操作系统内存管理中的两个概念。

  • 物理内存是计算机硬件中的实际内存,即随机存取存储器(RAM)。它是存储数据和代码的地方,供CPU直接访问。物理内存的大小由计算机的硬件决定。
  • 虚拟内存是操作系统提供的一种内存管理技术,它为应用程序提供了一个统一的、抽象的内存视图。虚拟内存的大小通常比物理内存大,通过使用硬盘空间来扩展实际的内存容量。

虚拟内存的主要作用有扩展内存容量,内存保护,内存共享。

  • 扩展内存容量 虚拟内存允许系统运行超过物理内存容量的程序和数据。通过将不常用的数据存储在硬盘上的交换文件(或分页文件),虚拟内存可以有效地扩展内存容量。
  • 内存保护 虚拟内存提供进程隔离,确保一个进程不能访问另一个进程的内存空间,从而提高系统的稳定性和安全性。
  • 内存共享 不同的进程可以共享同一块物理内存中的代码和数据,提高内存利用率。

其通过以下几个关键技术实现:

  • 分页 将虚拟内存划分为固定大小的块,称为页,而物理内存划分为相同大小的块,称为页框。虚拟地址通过页表映射到物理地址。
  • 页面置换 当物理内存已满时,操作系统需要将某些页面移到硬盘的交换区,以腾出空间加载新的页面。常用的页面置换算法包括LRU(最近最少使用)、FIFO(先进先出)等。
  • 交换区 硬盘上的一块区域,用于存储从物理内存中移出的页面。交换区使得虚拟内存的容量可以大于物理内存。

虚拟内存地址通过地址转换机制(通常由内存管理单元(MMU)实现)转换为物理内存地址。这个过程有三步骤:

  1. 虚拟地址划分 虚拟地址分为页号和页内偏移
  2. 页表查找 根据页号页表中查找对应的页框号
  3. 形成物理地址 将页框号与页内偏移组合,形成物理地址。

虚拟内存是一种重要的内存管理技术,通过扩展内存容量、提供内存保护和共享,显著提高了系统的稳定性和性能。


说说写时拷贝

写时拷贝是一种计算机程序设计中的优化策略,主要用于高效地管理内存和资源。其核心思想是,多个进程在需要共享同一份资源时,如果该资源没有被修改,就可以共享同一份副本;只有在资源被修改时,才真正进行拷贝


死锁的原因和预防

死锁是计算机系统中多个进程或线程相互等待资源释放,导致系统进入永久等待状态的一种现象。死锁的产生必须满足四个条件:

  • 互斥条件 资源不能被多个进程同时使用,即资源是独占的。
  • 占有并等待条件 一个进程已经持有至少一个资源,并且正在等待获取额外的资源,而这些资源被其他进程占有。
  • 不剥夺条件 资源不能被强制从持有它的进程中剥夺,只有持有资源的进程可以主动释放资源。
  • 循环等待条件 存在一个进程集合{P1, P2, …, Pn},其中每个进程都在等待被下一个进程占有的资源,即形成一个循环等待链,成环。

对于死锁的预防,可以从破坏上述四个必要条件入手。

  • 破坏互斥条件 尽可能减少资源的独占性,允许资源被多个进程共享,使用读写锁,虚拟化或资源池化来提高效率。
  • 破坏占有并等待条件 实现资源预分配策略,确保进程启动前已经获得了所有所需资源。
  • 破坏不剥夺条件 允许操作系统强制剥夺进程持有的资源。
  • 破坏循环等待条件 确保系统中不存在循环等待链。比如对所有资源进行统一编号,并规定进程必须按资源编号的顺序请求资源,这样单调性保证不会出现环。

死锁是多任务系统中的常见问题,理解其产生原因和预防策略至关重要。通过破坏死锁的必要条件,使用死锁避免算法,或实现检测与恢复机制,可以有效地防止和处理死锁问题,从而提高系统的可靠性和效率。


很枯燥,这就是八股文 :(

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux操作系统是一款开源的操作系统,具有稳定性、安全性和灵活性等特点。下面是关于Linux操作系统八股文: 一、Linux操作系统的历史 Linux操作系统最早由Linus Torvalds于1991年发布,起初是作为一个个人项目开始的。随着社区的发展壮大和开源精神的传播,Linux逐渐成为一款受欢迎的操作系统。 二、Linux操作系统的架构 Linux操作系统采用了分层架构,包括内核层、系统调用层、库层、应用层等。其中,内核层是Linux操作系统的核心,负责处理硬件和软件之间的交互。 三、Linux操作系统的特点 1. 开源:Linux操作系统的源代码对所有人开放,任何人都可以查看、修改和分发。 2. 多用户、多任务:Linux支持多用户同时登录,并且可以同时执行多个任务。 3. 稳定性:Linux操作系统具有出色的稳定性,长时间运行不易崩溃或死机。 4. 安全性:Linux操作系统具有强大的安全机制,可以有效防止恶意软件和攻击。 5. 灵活性:Linux操作系统支持广泛的硬件平台和软件应用,具有高度的灵活性。 四、Linux操作系统的应用领域 Linux操作系统广泛应用于各个领域,包括服务器、嵌入式系统、超级计算机等。在服务器领域,Linux操作系统是最常用的操作系统之一,被用于搭建各种类型的服务器。 五、Linux操作系统的发行版 Linux操作系统有许多不同的发行版,如Ubuntu、Red Hat、CentOS等。这些发行版在内核基础上添加了不同的软件包,并提供了不同的用户界面和配置工具。 六、Linux操作系统的学习和使用 学习和使用Linux操作系统可以通过阅读相关文档和教程,参与开源社区的讨论和贡献,以及使用虚拟机或云服务器进行实践操作等方式。 七、Linux操作系统的未来发展 随着开源社区的不断发展和技术的不断创新,Linux操作系统将继续迎来新的发展机遇和挑战。未来,Linux操作系统有望在更多领域得到应用和推广。 以上是关于Linux操作系统八股文,希望对您有所帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑机超频

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值