• 操作系统八股文背诵版


    什么是操作系统?请简要概述一下

    操作系统是管理计算机硬件和软件资源的计算机程序,提供一个计算机用户与计算机硬件系统之间的接口。

    向上对用户程序提供接口,向下接管硬件资源。

    操作系统本质上也是一个软件,作为最接近硬件的系统软件,负责处理器管理、存储器管理、设备管理、文件管理和提供用户接口。

    操作系统有哪些分类?

    操作系统常规可分为批处理操作系统、分时操作系统、实时操作系统。

    若一个操作系统兼顾批操作和分时的功能,则称该系统为通用操作系统。

    常见的通用操作系统有:Windows、Linux、MacOS等。

    什么是内核态和用户态?

    为了避免操作系统和关键数据被用户程序破坏,将处理器的执行状态分为内核态和用户态。

    内核态是操作系统管理程序执行时所处的状态,能够执行包含特权指令在内的一切指令,能够访问系统内所有的存储空间。

    用户态是用户程序执行时处理器所处的状态,不能执行特权指令,只能访问用户地址空间。

    用户程序运行在用户态,操作系统内核运行在内核态。

    如何实现内核态和用户态的切换?

    处理器从用户态切换到内核态的方法有三种:系统调用、异常和外部中断。

    1. 系统调用是操作系统的最小功能单位,是操作系统提供的用户接口,系统调用本身是一种软中断。

    2. 异常,也叫做内中断,是由错误引起的,如文件损坏、缺页故障等。

    3. 外部中断,是通过两根信号线来通知处理器外设的状态变化,是硬中断。

    并发和并行的区别

    1. 并发(concurrency):指宏观上看起来两个程序在同时运行,比如说在单核cpu上的多任务。但是从微观上看两个程序的指令是交织着运行的,指令之间交错执行,在单个周期内只运行了一个指令。这种并发并不能提高计算机的性能,只能提高效率(如降低某个进程的相应时间)。

    2. 并行(parallelism):指严格物理意义上的同时运行,比如多核cpu,两个程序分别运行在两个核上,两者之间互不影响,单个周期内每个程序都运行了自己的指令,也就是运行了两条指令。这样说来并行的确提高了计算机的效率。所以现在的cpu都是往多核方面发展。

    什么是进程?

    进程是操作系统中最重要的抽象概念之一,是资源分配的基本单位,是独立运行的基本单位。

    进程的经典定义就是一个执行中程序的实例。系统中的每个程序都运行在某个进程的上下文(context)中。

    上下文是由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。

    进程一般由以下的部分组成:

    1. 进程控制块PCB,是进程存在的唯一标志,包含进程标识符PID,进程当前状态,程序和数据地址,进程优先级、CPU现场保护区(用于进程切换),占有的资源清单等。

    2. 程序段

    3. 数据段

    进程的基本操作

    以Unix系统举例:

    1. 进程的创建:fork()。新创建的子进程几乎但不完全与父进程相同。子进程得到与父进程用户级虚拟地址空间相同的(但是独立的)一份副本,包括代码和数据段、堆、共享库以及用户栈。子进程还获得与父进程任何打开文件描述符相同的副本,这就意味着当父进程调用 fork 时,子进程可以读写父进程中打开的任何文件。父进程和新创建的子进程之间最大的区别在于它们有不同的 PID。fork函数是有趣的(也常常令人迷惑), 因为它只被调用一次,却会返回两次:一次是在调用进程(父进程)中,一次是在新创建的子进程中。在父进程中,fork 返回子进程的 PID。在子进程中,fork 返回 0。因为子进程的 PID 总是为非零,返回值就提供一个明 确的方法来分辨程序是在父进程还是在子进程中执行。

      pid_t fork(void);
      
    2. 回收子进程:当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除。相反,进程被保持在一种已终止的状态中,直到被它的父进程回收(reaped)。当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程。一个进程可以通过调用 waitpid 函数来等待它的子进程终止或者停止。

      pid_t waitpid(pid_t pid, int *statusp, int options);
      
    3. 加载并运行程序:execve 函数在当前进程的上下文中加载并运行一个新程序。

      int execve(const char *filename, const char *argv[], const char *envp[]);
      
    4. 进程终止:

      void exit(int status);
      

    简述进程间通信方法

    每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

    不同进程间的通信本质:进程之间可以看到一份公共资源;而提供这份资源的形式或者提供者不同,造成了通信方式不同。

    进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。

    进程如何通过管道进行通信

    管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:

    1. 其本质是一个伪文件(实为内核缓冲区)

    2. 由两个文件描述符引用,一个表示读端,一个表示写端。

    3. 规定数据从管道的写端流入管道,从读端流出。

    管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区实现。

    管道的局限性:

    1. 数据自己读不能自己写。

    2. 数据一旦被读走,便不在管道中存在,不可反复读取。

    3. 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。

    4. 只能在有公共祖先的进

  • 相关阅读:
    crypto:Quoted-printable
    教程六 在Go中使用Energy创建跨平台GUI - 应用下载事件
    codemirror怎么高亮指定文本
    A New Image Contrast Enhancement Algorithmusing Exposure Fusion Framework
    1455 检查单词是否为句中其他单词的前缀——Leetcode天天刷(2022.8.21)【双指针】
    SQL编程 Task05.SQL高级处理
    Flink CDC 菜鸟教程-工具概念篇
    【鸿蒙HarmonyOS开发笔记】如何自定义弹窗
    智谱AI版Sora开源!首个可商用,在线可玩,5小时GitHub狂揽3.7K星
    为什么网络安全缺口很大,而招聘却很少?学网络安全真的没有前途吗?
  • 原文地址:https://blog.csdn.net/weixin_70730532/article/details/126875082