1. 操作系统的几大模块
    处理机管理:主要控制和管理CPU的工作。(CPU管理)
    存储管理:主要进行内存的分配和管理 (内存管理)
    内存分配、地址映射、内存保护与共享、虚拟内存等。
    设备管理:主要管理基本的输入输出设备 (IO管理)
    完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。
    主要包括缓冲管理、设备分配、设备处理、虛拟设备等。
    文件管理:负责对计算机文件的组织、存储、操作和保护等。 (文件管理)
    文件存储空间的管理、目录管理、文件读写管理和保护等。
    进程管理:也称为作业管理,是指对计算机所进行的操作进行管理。 (作业管理或者进程管理)
    进程控制、进程同步、进程通信、死锁处理、处理机调度等。
  • CPU的调度
  • 物理、虚拟内存的管理
  • 文件系统的管理
  • 中断和设备驱动(I/O)

shell + kernel
shell指的是面向用户的外壳,比如windows gui。kernel是操作系统的核心管理模块。

  1. 操作系统kernel的特点
  • 并发
  • 共享
  • 虚拟
  • 异步

monolithic kernel宏内核:宏内核的特征是系统内核的所有模块,比如进程调度、内存管理、文件系统、设备驱动等,都运行在内核态
micro kernel 微内核:微内核架构的内核只保留最基本的能力,比如进程调度、虚拟机内存、中断等,把一些应用放到了用户空间,比如驱动程序、文件系统等。这样服务与服务之间是隔离的,单个服务出现故障或者完全攻击,也不会导致整个操作系统挂掉,提高了操作系统的稳定性和可靠性。

hibird混合内核:宏内核和微内核的结合

3.操作系统启动
操作系统的代码存放在Disk中,系统启动首先需要上电自检(POST,寻找显示驱动和执行BIOS),自检完成将系统代码load到内存中。将控制权交给操作系统。
这里涉及到上电初始化自检的关键模块:

  • BIOS:基本IO系统。负责上电后的外设检查,然后将bootloader(一般在硬盘的第一个扇区512字节)放入到内存中。

加载bootloader后,bootloader再从硬盘中将OS加载到内存。

系统中断:外设事件触发;异步async
异常:意想不到的行为导致错误;同步sync
系统调用:程序请求;异步或同步

内存管理

基本概念

  • 程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address)
  • 存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)
  • 操作系统引入了虚拟内存,进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存

程序的分段:代码段、数据段、栈、堆
虚拟地址如何映射到实际的物理段地址:通过段表,段基址 + 段内偏移地址

内存碎片
外部内存碎片,也就是产生了多个不连续的小物理内存,导致新的程序无法被装载;
内部内存碎片,程序所有的内存都被装载到了物理内存,但是这个程序有部分的内存可能并不是很常使用,这也会导致内存的浪费

外部内存碎片可以通过内存交换解决,就是将当前部分程序放到硬盘,然后再拷贝回内存中的连续部分。但是内存交换(内存与硬盘)效率往往不高,特别是内存占用比较大的程序。

内存分页:

是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,我们叫页(Page)。在 Linux 下,每一页的大小为 4KB。
虚拟地址与物理地址之间通过页表来映射。

分页是怎么解决分段的内存碎片、内存交换效率低的问题?

由于内存空间都是预先划分好的,也就不会像分段会产生间隙非常小的内存,这正是分段会产生内存碎片的原因。而采用了分页,那么释放的内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存。就是说,分段像挤牙膏,分页像查字典。

如果内存空间不够,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉,也就是暂时写在硬盘上,称为换出(Swap Out)。一旦需要的时候,再加载进来,称为换入(Swap In)。所以,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高。更进一步地,分页的方式使得我们在加载程序的时候,不再需要一次性都把程序加载到物理内存中。我们完全可以在进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存里,而是只有在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存里面去。

页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址。

多级页表是如何解决简单页表页表占用内存过大的问题的?

简单页表存在这个问题的本质是需要事先将所有物理地址的虚拟地址映射表全部建立。而多级页表则只需要事先建立部分级别的表项。在有需要时,建立下一级别的表项。

如何解决多级页表引入的地址转换时间增加问题?

很好理解,简单页表一查就查到了,多级页表如果没有下一级还需要建立。TLB Cache被用来存放最常用的页表项,加速访问。在 CPU 芯片里面,封装了内存管理单元(Memory Management Unit)芯片,它用来完成地址转换和 TLB 的访问与交互。

只有在访问已分配的虚拟地址空间的时候,操作系统通过查找页表,发现虚拟内存对应的页没有在物理内存中,就会触发缺页中断,然后操作系统会建立虚拟内存和物理内存之间的映射关系

标题段页式内存管理实现的方式:

先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;
接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页;
这样,地址结构就由段号、段内页号和页内位移三部分组成。

标题内核空间与用户空间的区别:

进程在用户态时,只能访问用户空间内存;
只有进入内核态后,才可以访问内核空间的内存;

动态内存分配相关问题

C为例,malloc与free。malloc有两种内存申请的函数:brk和mmap。brk申请小内存,mmap申请大内存,两种方式有一个阈值进行自动的切换,和相关的库文件有关。申请的内存块首部有一小块内存存放分配的内存信息,free函数根据首地址找到这块信息可以对整个内存块进行管理。brk申请的内存通常不会被立即释放,mmap的会。brk可能造成内存碎片。但是频繁的mmap方式增加系统调用次数,增加CPU消耗。

进程管理相关问题

进程的基本概念

所谓的进程大白话讲就是正执行的程序,它会占用一定的系统资源。严谨一点的话就是:

百度百科:
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being
executed)。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text
region)、数据区域(data region)和堆栈(stack
region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程

并发概念:进程切换,交替执行。
进程的几个基本状态: 创建,就绪,运行,结束, 挂起,阻塞。
在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态

  • 进程的标识与控制描述:进程控制块,一种数据结构,对进程的一些信息,比如进程名称,创建者,进程切换时的断点、暂存信息等进行描述/暂存。通常是通过链表的方式进行组织,把具有相同状态的进程链在一起,组成各种队列
  • 创建进程:
    为新进程分配一个唯一的进程标识号,并申请一个空白的 PCB,PCB 是有限的,若申请失败则创建失败;
    为进程分配资源,此处如果资源不足,进程就会进入等待状态,以等待资源;
    初始化 PCB
    如果进程的调度队列能够接纳新进程,那就将进程插入到就绪队列,等待被调度运行
  • 终止进程:
    找到对应的PCB,kill掉进程及其子进程。归还资源给父进程或者操作系统,从队列中剔除。
  • 阻塞与唤醒:
    阻塞需要先找到PCB,运行态则保护现场,转入阻塞队列。唤醒则相反,在该事件的阻塞队列中找到相应进程的 PCB;
    将其从阻塞队列中移出,并置其状态为就绪状态
    把该 PCB 插入到就绪队列中,等待调度程序调度。
    进程的上下文切换:上下文指与当前进程相关的一些资源,比如CPU寄存器,程序计数器(下面要执行的指令)等。
    进程是由内核管理和调度的,所以进程的切换只能发生在内核态
    所以,进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。通常,会把交换的信息保存在进程的 PCB,当要运行另外一个进程的时候,我们需要从这个进程的 PCB 取出上下文,然后恢复到 CPU 中,这使得这个进程可以继续执行。
    什么时候会发生进程切换:时间片轮转;外部中断;更高级别的进程需要被执行。资源不足需要等待,sleep等。

线程

线程( Thread ),线程之间可以并发运行且共享相同的地址空间。线程是进程当中的一条执行流程。
同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的
线程是调度的基本单位,而进程则是资源拥有的基本单位。

线程上下文切换的是什么?
这还得看线程是不是属于同一个进程:
当两个线程不是属于同一个进程,则切换的过程就跟进程上下文切换一样;
当两个线程是属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据;

主要有三种线程的实现方式

用户线程(User Thread):在用户空间实现的线程,不是由内核管理的线程,是由用户态的线程库来完成线程的管理;用户线程是基于用户态的线程管理库来实现的,那么线程控制块(Thread Control Block, TCB) 也是在库里面来实现的,对于操作系统而言是看不到这个 TCB 的,它只能看到整个进程的 PCB。
所以,用户线程的整个线程管理和调度,操作系统是不直接参与的,而是由用户级线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度等。
用户线程使得不支持内核线程的系统也能使用线程;用户线程没有用户态和内核态的切换,速度快。缺点则是用户线程系统调用阻塞时,其他用户线程必须等。没法打断当前运行的其他线程,必须等待。

内核线程(Kernel Thread):在内核中实现的线程,是由内核管理的线程;
轻量级进程(LightWeight Process):在内核中来支持用户线程;

调度

抢占式调度和非抢占式调度

非抢占式调度算法挑选一个进程,然后让该进程运行直到被阻塞,或者直到该进程退出,才会调用另外一个进程,也就是说不会理时钟中断这个事情。
抢占式调度算法挑选一个进程,然后让该进程只运行某段时间,如果在该时段结束时,该进程仍然在运行时,则会把它挂起,接着调度程序从就绪队列挑选另外一个进程。这种抢占式调度处理,需要在时间间隔的末端发生时钟中断,以便把
CPU 控制返回给调度程序进行调度,也就是常说的时间片机制

调度原则:尽量提高CPU的利用率,系统的吞吐量,减少就绪等待时间和周转时间,提高响应速度。
调度算法:先来先服务(FCFS),短作业优先(SJF),最高优先级,时间片轮转,多级反馈队列。

进程间通讯

每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核

  • 管道:匿名管道 | 和命名管道;ps auxf | grep mysqlps auxf打印当前的进程,|则表示管道,将信息传递给后面的命令 grep mysql grep表示匹配
    管道的本质:一段内核缓存。管道的双向通信是通过fork文件描述符实现的。管道传输的数据是无格式的字节流数据。
    管道的通信方式是效率低的,因此管道不适合进程间频繁地交换数据:因为通过fork进程文件描述符实现。
  • 消息队列:一个送入队列,另外一个从队列异步取。消息队列是保存在内核中的消息链表。消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销;
  • 共享内存:共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。
  • 信号量:为了防止多进程竞争共享资源,而造成的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被一个进程访问。正好,信号量就实现了这一保护机制。
    信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据P和V两个原子操作。P 操作是用在进入共享资源之前,V 操作是用在离开共享资源之后,这两个操作是必须成对出现的。信号初始化为 1,就代表着是互斥信号量,它可以保证共享内存在任何时刻只有一个进程在访问,这就很好的保护了共享内存。信号初始化为 0,就代表着是同步信号量,它可以保证进程 A 应在进程 B 之前执行
  • 信号:信号是进程间通信机制中唯一的异步通信机制,因为可以在任何时候发送信号给某一进程,一旦有信号产生
  • Socket:跨网络与不同主机上的进程之间通信。domain 参数用来指定协议族,比如 AF_INET 用于 IPV4、AF_INET6 用于 IPV6、AF_LOCAL/AF_UNIX 用于本机;
    type 参数用来指定通信特性,比如 SOCK_STREAM 表示的是字节流,对应 TCP、SOCK_DGRAM 表示的是数据报,对应 UDP、SOCK_RAW 表示的是原始套接字;
    protocal 参数原本是用来指定通信协议的,但现在基本废弃。因为协议已经通过前面两个参数指定完成,protocol 目前一般写成 0 即可

解决多线程冲突

竞争与互斥

由于多线程执行操作共享变量的这段代码可能会导致竞争状态,因此我们将此段代码称为临界区(critical section),它是访问共享资源的代码片段,一定不能给多线程同时执行。

我们希望这段代码是互斥(mutualexclusion)的,也就说保证一个线程在临界区执行时,其他线程应该被阻止进入临界区,说白了,就是这段代码执行过程中,最多只能出现一个线程。

所谓同步,就是并发进程/线程在一些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通信息称为进程/线程同步

为了实现进程/线程间正确的协作,操作系统必须提供实现进程协作的措施和方法,主要的方法有两种:

锁:加锁、解锁操作;
信号量:P、V 操作

原子(atomic)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为"不可中断的一个或一系列操作

测试和置位(Test-and-Set)指令
把 old_ptr 更新为 new 的新值//置位
返回 old_ptr 的旧值;//测试

基于TestAndSet:等待锁(自旋锁),发现锁已经锁上了就一直while等待。无等待锁:用队列将线程加入就绪队列,而不是一直等待,使得可以调度其他程序。

通常信号量表示资源的数量,对应的变量是一个整型(sem)变量。

另外,还有两个原子操作的系统调用函数来控制信号量的,分别是:

P 操作:将 sem 减 1,相减后,如果 sem < 0(资源不够),则进程/线程进入阻塞等待,否则继续,表明 P 操作可能会阻塞;
V 操作:将 sem 加 1,相加后,如果 sem <= 0(表明已经有等待的线程),唤醒一个等待中的进程/线程,表明 V 操作不会阻塞;

互斥信号量1、同步信号量0.

生产-消费问题:

任何时刻,只能有一个生产者或消费者可以访问缓冲区。
生产者-消费者模式实际上是使用多个信号量,进行互斥与同步的控制。首先是需要对缓冲区访问的互斥信号量enter=1。然后是资源计数的empty=N(最大可用资源)和full=0两个用于同步的信号量。简单来说就是PPVV的模式。
对于生产者而言,先看是否还有容量进行生产,所以先执行P(empty),对empty-1,然后看是否能进行缓冲区访问开始生P(enter)。生产完毕,离开缓冲区V(enter), full加1:V(full)。
对于消费者而言,则首先看是否有可以产品已经生产好P(full),然后看是否能进入缓冲区拿产品P(enter),然后离开V(enter), V(empty).

哲学家进餐问题 对于互斥访问有限的竞争问题:每一个哲学家在进餐前使用互斥信号量表示开始用餐。可使用分支模式优化。
读写者问题:读者优先,写者优先,公平方式。

死锁

死锁问题的产生是由两个或者以上线程并行执行的时候,争夺资源而互相等待造成的。

死锁只有同时满足互斥、持有并等待、不可剥夺、环路等待这四个条件的时候才会发生。

所以要避免死锁问题,就是要破坏其中一个条件即可,最常用的方法就是使用**资源有序分配法(不同线程的资源获取顺序一致)**来破坏环路等待条件

锁的种类与特点

  • 互斥锁
  • 自旋锁
  • 悲观锁
  • 乐观锁
  • 读写锁

互斥锁加锁失败后,线程会释放 CPU ,给其他线程;对于互斥锁加锁失败而阻塞的现象,是由操作系统内核实现的。
自旋锁加锁失败后,线程会忙等待,直到它拿到锁;
互斥锁加锁失败时,会从用户态陷入到内核态,让内核帮我们切换线程,虽然简化了使用锁的难度,但是存在一定的性能开销成本。
会有两次线程上下文切换的成本
当线程加锁失败时,内核会把线程的状态从「运行」状态设置为「睡眠」状态,然后把 CPU 切换给其他线程运行;
接着,当锁被释放时,之前「睡眠」状态的线程会变为「就绪」状态,然后内核会在合适的时间,把 CPU 切换给该线程运行。
线程的上下文切换的是什么?当两个线程是属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据。

上下切换的耗时有大佬统计过,大概在几十纳秒到几微秒之间,如果你锁住的代码执行时间比较短,那可能上下文切换的时间都比你锁住的代码执行时间还要长。

所以,如果你能确定被锁住的代码执行时间很短,就不应该用互斥锁,而应该选用自旋锁,否则使用互斥锁

读写锁的工作原理是

当「写锁」没有被线程持有时,多个线程能够并发地持有读锁,这大大提高了共享资源的访问效率,因为「读锁」是用于读取共享资源的场景,所以多个线程同时持有读锁也不会破坏共享资源的数据。
但是,一旦「写锁」被线程持有后,读线程的获取读锁的操作会被阻塞,而且其他写线程的获取写锁的操作也会被阻塞
读写锁在读多写少的场景,能发挥出优势

公平读写锁比较简单的一种方式是:用队列把获取锁的线程排队,不管是写线程还是读线程都按照先进先出的原则加锁即可,这样读线程仍然可以并发,也不会出现「饥饿」的现象

悲观锁做事比较悲观,它认为多线程同时修改共享资源的概率比较高,于是很容易出现冲突,所以访问共享资源前,先要上锁

那相反的,如果多线程同时修改共享资源的概率比较低,就可以采用乐观锁。

乐观锁做事比较乐观,它假定冲突的概率很低,它的工作方式是:先修改完共享资源,再验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作

进程调度

  • 先来先服务调度算法: 每次从就绪队列选择最先进入队列的进程,然后一直运行,直到进程退出或被阻塞,才会继续从队列中选择第一个进程接着运行
  • 最短作业优先调度算法: 最短作业优先(Shortest Job First, SJF)调度算法会优先选择运行时间最短的进程来运行,这有助于提高系统的吞吐量
  • 高响应比优先调度算法Highest Response Ratio Next, HRRN:每次进行进程调度时,先计算「响应比优先级」,然后把「响应比优先级」最高的进程投入运行. 响应比由响应时间和等待时间来计算。 (等待时间 + 响应时间)/ 响应时间。
  • 时间片轮转调度算法:Round Robin, RR: 如果时间片用完,进程还在运行,那么将会把此进程从 CPU 释放出来,并把 CPU 分配另外一个进程;如果该进程在时间片结束前阻塞或结束,则 CPU 立即进行切换;
  • 最高优先级调度算法:从就绪队列中选择最高优先级的进程进行运行,这称为最高优先级(Highest Priority First,HPF)调度算法。静态优先级:创建进程时候,就已经确定了优先级了,然后整个运行时间优先级都不会变化;
    动态优先级:根据进程的动态变化调整优先级,比如如果进程运行时间增加,则降低其优先级,如果进程等待时间(就绪队列的等待时间)增加,则升高其优先级,也就是随着时间的推移增加等待进程的优先级。
  • 多级反馈队列调度算法:「多级」表示有多个队列,每个队列优先级从高到低,同时优先级越高时间片越短。
    「反馈」表示如果有新的进程加入优先级高的队列时,立刻停止当前正在运行的进程,转而去运行优先级高的队列

内存调度

缺页异常:缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件;指的是当软件试图访问已映射在虚拟地址空间中,但是并未被加载在物理内存中的一个分页时,由中央处理器的内存管理单元所发出的中断;
当出现缺页异常需调入新页面而内存已满时,选择被置换的物理页面,也就是说选择一个物理页面换出到磁盘,然后把需要访问的页面换入到物理页。

那其算法目标则是,尽可能减少页面的换入换出的次数,常见的页面置换算法有如下几种:

  • 最佳页面置换算法(OPT):置换在**「未来」最长时间不访问**的页面;但是实际系统中无法实现,因为程序访问页面时是动态的,我们是无法预知每个页面在「下一次」访问前的等待时间。
    所以,最佳页面置换算法作用是为了衡量你的算法的效率,你的算法效率越接近该算法的效率,那么说明你的算法是高效的。
  • 先进先出置换算法(FIFO):每次选择在内存驻留时间最长的页面进行中置换
  • 最近最久未使用的置换算法(LRU):选择最长时间没有被访问的页面进行置换
  • 时钟页面置换算法(Lock):有一个环形链表链接各个页表,通过查找每个页表中的访问位进行选择。
  • 最不常用置换算法(LFU):选择「访问次数」最少的那个页面,并将其淘汰

磁盘调度

调度对磁盘的磁道访问顺序。

  • FIFO
  • 最短距离
  • 扫描
  • 循环扫描

文件系统

Linux 文件系统会为每个文件分配两个数据结构:索引节点(index node)和目录项(directory entry),它们主要用来记录文件的元信息和目录层次结构

文件系统的种类众多,而操作系统希望对用户提供一个统一的接口,于是在用户层与文件系统层引入了中间层,这个中间层就称为虚拟文件系统(Virtual File System,VFS)

文件系统的基本操作单位是数据块

文件分配表(File Allocation Table,FAT)

针对磁盘的空闲空间也是要引入管理的机制,几种常见的方法:

  • 空闲表法
  • 空闲链表法
  • 位图法
    Linux 系统的 ext 文件系统就是采用了哈希表,来保存目录的内容,这种方法的优点是查找非常迅速,插入和删除也较简单,不过需要一些预备措施来避免哈希冲突

硬链接是多个目录项中的「索引节点」指向一个文件
软链接相当于重新创建一个文件,这个文件有独立的 inode,但是这个文件的内容是另外一个文件的路径,所以访问软链接的时候,实际上相当于访问到了另外一个文件,所以软链接是可以跨文件系统的,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。

操作系统面试基础知识点相关推荐

  1. C++面试基础知识点

    C++开发面试基础知识点 1. 语言基础 1.1 const的用法 1)在定义的时候必须进行初始化 2)指针可以是const  指针,也可以是指向const对象的指针 3)定义为const的形参,即在 ...

  2. 【Android 面试基础知识点整理】

    针对Android面试中常见的一些知识点整理,Max 仅仅是个搬运工.感谢本文中引用文章的各位作者,给大家分享了这么多优秀文章.对于当中的解析,是原作者个人见解,有错误和不准确的地方,也请大家积极指正 ...

  3. Java学习---面试基础知识点总结

    Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类.sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程 ...

  4. 操作系统部分基础知识点手动整理

    有道云笔记https://note.youdao.com/s/9gZUOB0J (乱序.自取) 第一章: 1.操作系统定义:管理系统资源.控制程序执行.改善人机界面.提供各种服务,并合理组织计算机工作 ...

  5. Java面试基础知识点简要总结

    目录 Java基础 1. 为什么Java代码可以一次编译,到处运行 2. Java的基本数据类型以及它们的范围 3. 自动装箱和自动拆箱 4. Object类中的方法 5. 说一说hashcode() ...

  6. 自然语言处理算法工程师历史最全资料汇总-基础知识点、面试经验

    2019年秋招已过,零星的招聘任然在继续.本资源适用于NLP算法工程师面试,也适用于算法相关的其他岗位.整理了算法面试需要数学基础知识.编程语言.深度学习.机器学习.计算机理论.统计学习.自然语言处理 ...

  7. 找工作笔试面试那些事儿(13)---操作系统常考知识点总结

    上一节对数据库的知识做了一个小总结,实际找工作过程中,因为公司或单位侧重点不一样,考察的知识也是不尽相同的,但是作为计算机类的学生,操作系统的知识也是必不可少的,去年参加笔试面试的时候,腾讯微软阿里等 ...

  8. mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  9. Java常用基础知识点总结(最全)

    Java基础知识点总结 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 四.Java虚拟机 五.数据库(Sql. ...

最新文章

  1. 运营商认为虚拟化也难快速降低企业OPEX
  2. 2019-11-13 有趣的网站(持续更新)
  3. jquery 点击事件
  4. android sdk 封装html5,Android平台以WebView方式集成HTML5+SDK方法
  5. redis setnx原子性_不支持原子性的 Redis 事务也叫事务吗?
  6. Mybatis+Tomcat使用JNDI配置数据源入门
  7. Java中引入泛型的好处
  8. 软件项目管理期末复习(看这一篇就够了)
  9. 这三款曾红极一时的软件,现已风光不再,而遭嫌弃的它成了香饽饽
  10. oracle密码过期修改
  11. linux全自动备份网站到百度云盘,Linux定时备份数据到百度云盘
  12. 白嫖JetBrains全家桶第二波与第三波
  13. 最短路问题的线性规划模型
  14. Amazon SageMaker简直就是机器学习平台的天花板
  15. WPJAM「网址导航」:最轻便快捷的WordPress网址导航插件
  16. Linux远程管理常用命令(超全超详细)【持续更新】
  17. 基于watermark.js给图片添加水印
  18. PythonChallenge闯关详解
  19. LPspice 电路仿真软件
  20. 当今安全领域面试的几大怪现状

热门文章

  1. TCM和CACHE简述
  2. cloud云技术简介
  3. 如何成为一个软件构架师
  4. WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系
  5. eversync safari_EverSync安卓版
  6. lisp实战文库_lisp编程实例
  7. 学习MySQL-第六章
  8. Kermit文件传输协议
  9. 物质的折射率和光的折射率的关系
  10. 【北邮国院大三上】互联网协议_Internet Protocol_PART A