Skip to content
返回

计算机基础

目录

点击展开

计算机基础

计算机基础在校招中考核较为常见,尤其是大厂,不可忽视。

进程和线程的区别

参考答案

::: details

进程是操作系统中一个正在运行的程序,每个进程都有自己的地址空间、内存、文件描述符等资源。

线程是进程中的一个执行单元,是 cpu 调度的最小单元,共享进程的资源,但有自己的独立执行流。

二者的区别

举例

:::

进程间的通信

参考答案

::: details

进程间通信(Inter-Process Communication,IPC)是指在操作系统中,不同进程之间交换信息和数据的过程,常见的进程通信方式包括:

线程间通信与进程间通信类似,但由于线程之间共享进程的资源,线程间通信通常比进程间通信更高效

:::

单核 CPU 如何实现并发

参考答案

::: details

单核CPU 主要是通过时间片轮转和上下文切换来实现并发

时间片轮转

上下文切换

在任意时刻,CPU只能执行一个任务,由于切换速度非常快,给用户的感觉就像是在同时运行多个程序,所以这种机制被称为“伪并发”,若线程过多也不好,频繁的上下文切换会带来一定的性能开销,所以过多的线程反而会带来性能下降的问题

:::

CPU 调度算法有哪些?

参考答案

::: details

:::

linux 如何查找你的进程占用的那个端口

参考答案

::: details

使用 netstat 命令

# 查看所有端口占用情况
netstat -tunlp
# 查看特定端口,比如 8080
netstat -tunlp | grep 8080

使用 lsof 命令

# 查看特定端口,比如 8080
lsof -i :8080

:::

单核服务器连接数超载了怎么办

参考答案

::: details

:::

请简述一个编译器的执行过程。前端有哪些常见的编译工具?

参考答案

::: details

编译器的执行过程

  1. 词法分析
    • 将源代码转换为一系列的标记(tokens),这些标记是编程语言的基本语法单位
  2. 语法分析
    • 根据语言的语法规则,将标记序列转换为语法书(parse tree),也称为抽象语法树(AST)
  3. 语义分析
    • 检查语法树是否符合语言的语义规则,例如类型检查,作用域检查等
  4. 中间代码生成
    • 将语法树转换为中间代码,这种代码通常独立于机器
  5. 代码优化
    • 对中间代码进行优化,以提高程序的执行效率
  6. 目标代码生成
    • 将中间代码转换为目标机器代码
  7. 代码生成后优化 - 对生成的目标代码进行进一步优化

    编译器的目的是将我们编写的源码转换为机器码(目标代码),以便计算机能够读懂执行

前端常见的编译工具

:::

什么是编译型语言和解释型语言,他们有什么区别?

参考答案

::: details

高级编程语言分为解释型语言和编译型语言

编译型语言

解释型语言

编译型语言和解释型语言的区别

举个🌰:读一门外文著作,编译型语言就是给你将这本著作翻译成中文,然后你就可以直接看中文了。解释型语言就是给你一个翻译,一边看一边翻译,下次看仍需要翻译

JIT(Just-In-Time)编译

为了结合编译型和解释型语言的优点,JIT 随之诞生,可以理解为“即时编译”

:::

简述 JS 垃圾回收的过程。用什么算法?

参考答案

::: details

垃圾回收(Garbage Collection, GC)是自动管理内存的过程。JavaScript 引擎会自动检测不再使用的对象,并释放它们所占用的内存。常用的垃圾回收算法是标记-清除(Mark-and-Sweep)算法。

垃圾回收过程

  1. 标记阶段
  1. 清除阶段

常用算法

:::

参考资料

::: details

:::

什么是内存泄漏?如何排查?JS 内存泄漏的常见原因?

参考答案

::: details

内存泄露是指在程序运行过程中,程序未能释放不再使用的内存空间,导致内存资源被浪费。

排查内存泄露

  1. 使用内存分析工具
    • 浏览器开发者工具:Chrome 的 DevTools 提供了内存分析工具 Memory,可以监控内存使用情况
    • 也可以结合 setInterval 使用 console.memory 查看内存使用的快照
  2. 代码审查
    • 检查代码中是否有未释放的事件监听器,定时器,全局变量,确保不再需要某对象时,即使解除引用
  3. 性能监控
    • 监控应用程序的内存使用情况,观察是否有持续增长的趋势
    • 使用日志记录内存使用情况,帮助识别内存泄露的模式

JS 内存泄露的常见原因

  1. 意外的全局变量
    • 忘记使用 var,let,const 声明变量时,变量会被挂载到全局对象上
  2. 闭包
    • 闭包中引用了不再需要的外部变量,导致这些变量无法被垃圾回收
  3. 未清理的 DOM 引用
    • 删除 DOM 元素时,未能清理相关的事件监听器或引用
  4. 定时器和回调
    • 未能清理不再需要的 setInterval 或 setTimeout 回调

:::

简述 JS 运行时的堆栈内存模型?

参考答案

::: details

在 JS 运行时,内存管理主要依赖于堆(Heap)和栈(Stack)两种数据结构

栈(Stack)

堆(Heap)

这里用一段 js 代码画图举例

let a = 1
let obj = {
  name: 'Heap',
}

function foo() {
  let b = 2
  console.log(b)
  function bar() {
    let c = 3
    console.trace()
    console.log(c)
  }
  bar()
}

foo()

:::

冯·诺依曼架构是什么?

参考答案

::: details

冯·诺依曼架构确定了现代计算机结构中的五大部件:

  1. 输入设备: 键盘,鼠标,摄像头等
  2. 输出设备: 显示器,打印机,扬声器等
  3. 存储器: 计算机的记忆装置,主要存放数据和程序。分为内部存储器(内存/主存储器)和外部存储器(硬盘,光盘,U盘等)
    • 内存:也称之为主存储器,又分为随机存储器(RAM)和只读存储器(ROM)
      • RAM 存放的是计算机在通电运行的过程中即时的数据,计算机的内存容量就是指的 RAM 的容量。RAM 可读,可写,断电会数据丢失
      • ROM 存放的是每次计算机开机都需要处理的,固定不变的程序和数据,比如 BIOS 程序。ROM 可读,不可写,断电不会丢失
    • 外存:外存是硬盘,是计算机的辅助存储器,可以长期保存数据,断电不会丢失。当计算机需要从外存读取数据时,需要将数据从外存读取到内存中,然后才能下一步处理。根据介质不同,外存可分为软盘,硬盘,光盘。硬盘最为常见,硬盘又分为机械硬盘(HD)和固态硬盘(SSD)。
  4. 运算器: 算术逻辑单元(ALU),负责执行算术和逻辑运算
  5. 控制器: 控制整个计算机系统的工作流程,包括指令的执行顺序,数据传输等,运算器和控制器通常集成在一起,就是我们熟知的 CPU

图中的箭头流向是数据流向。数据从输入设备进入到计算机,存放在存储器中,控制器负责控制运算器对存储器中的数据进行运算,运算的结果再次放入存储器中,通过控制器将存储器中的计算结果输出到输出设备。

:::

计算机内部为何使用二进制?

参考答案

::: details

:::

二进制如何表示负数和小数?

参考答案

::: details

表示负数 下面用 8 位二进制数 -2 举例

  1. 求补码
  - 2 的原码0000 0010 // 原码就是最简单的表示方法
  - 2 的反码1111 1101 // 反码是原码的反向
  - 2 的补码1111 1110 // 补码是反码加 1

1111 1110 就是 -2 的二进制

  1. 模减
  -2 ^ 8 = 256
  - 256 - 2 = 254

254 的二进制就是 -2 的二进制 1111 1110

表示小数 下面用 10.625 转换为二进制举例

  1. 整数部分
  - 10 / 2 = 5 0
  - 5 / 2 = 2 1
  - 2 / 2 = 1 0
  - 1 / 2 = 0 1

逆序排列:1010

  1. 小数部分
  - 0.625 * 2 = 1.25 取整 1
  - 0.25 * 2 = 0.5 取整 0
  - 0.5 * 2 = 1 取整 1

顺序排列:0.101

10.625 的二进制就是 1010.101

:::

什么是虚拟内存,为何要使用虚拟内存?

参考答案

::: details

什么是虚拟内存?

虚拟内存相对物理内存,它是一种计算机内存管理技术,它为每个进程提供了一个连续的地址空间,使得进程可以认为自己拥有一个完整的,连续的内存空间,而实际上,这个空间可能是分散的,并且部分可以存储在外存中

为什么使用虚拟内存?

  1. 扩展内存容量:虚拟内存允许计算机使用硬盘空间来扩展物理内存的容量,即使物理内存不足,程序也可以运行,因为不常用的数据可以被交换到磁盘上
  2. 内存保护:每个进程都有自己的虚拟地址空间,防止一个进程访问另一个进程的内存,提供了内存保护
  3. 简化内存管理:程序员不需要担心物理内存的分配和管理,操作系统负责将虚拟地址映射到物理地址
  4. 多任务处理:通过虚拟内存,多个进程可以同时运行,操作系统可以在它们之间切换,提供多任务处理能力
  5. 程序加载和执行的灵活性:程序可以被分成多个部分,只有需要的部分才会被加载到内存中,减少了内存的使用

:::

什么是 Unicode 编码?它和常见的 UTF-8 有什么关系?

参考答案

::: details

:::

简述计算机网络的 OSI 模型

参考答案

::: details

OSI(开放系统互联)模型是一个用于理解和实现网络协议的七层概念框架。每一层都有特定的功能,并与其直接上下的层进行通信。

  1. 物理层(Physical Layer):这是OSI模型的最低层,负责设备之间的物理连接,包括通过物理介质传输原始比特流。它涉及硬件组件,如电缆、交换机和网络接口卡。

  2. 数据链路层(Data Link Layer):负责节点到节点的数据传输以及错误检测和纠正,确保数据在物理链路上的可靠传输。它分为两个子层:媒体访问控制(MAC)层和逻辑链路控制(LLC)层。

  3. 网络层(Network Layer):负责数据的路由、转发和寻址,确定数据到达目的地的最佳物理路径。像IP(互联网协议)这样的协议在这一层运行。

  4. 传输层(Transport Layer):为应用程序提供端到端的通信服务,负责错误恢复、流量控制和确保完整的数据传输。像TCP(传输控制协议)和UDP(用户数据报协议)这样的协议在这一层运行。

  5. 会话层(Session Layer):管理应用程序之间的会话,建立、维护和终止应用程序之间的连接,负责会话的检查点和恢复。

  6. 表示层(Presentation Layer):负责数据的翻译、加密和压缩,确保数据以可用的格式呈现给应用层,充当网络和应用之间的翻译器。

  7. 应用层(Application Layer):这是OSI模型的最高层,直接为终端用户应用程序提供网络服务,负责电子邮件、文件传输和网页浏览等网络服务。像HTTP、FTP和SMTP这样的协议在这一层运行。

OSI 模型

:::

一个域名对应一个 ip 吗

参考答案

::: details

一个域名不一定只对应一个 IP 地址,具体情况如下:

因此,域名和 IP 地址之间的关系可以是多对多的,具体取决于网络架构和配置。

:::

UDP 和 TCP 协议的区别?有什么应用场景

参考答案

::: details

UDP(User Datagram Protocol,用户数据报协议)

TCP(Transmission Control Protocol,传输控制协议)

:::

数组和链表有什么区别?从内存结构上来说

参考答案

::: details

:::


Share this post on:

上一篇文章
JS 基础知识
下一篇文章
JS 读代码