一、什么是线程安全?什么是线程不安全?

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读/写完,其他线程才可使用。不会出现数据不一致或者数据污染。

线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

StringBuffer/HashTable StringBuilder/HashMap
支持并发操 不支持并发操作
线性安全 线性不安全
适合多线程中使用  不适合多线程中使用
在单线程中的性能比StringBuffer高

如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;如果要保证线程安全,自然是StringBuffer。

二、什么是原子操作?

所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何context switch (切 换到另一个线程)。

三、并发和并行的区别

并发:多个线程不同时操纵同一数据
并行:多个线程同时操作同一数据
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

四、进程和线程

1.进程和线程的区别?

进程:一个进程是一 个独立的计算机任务,有操作系统分配的独立的内存空间,包含一 个或多个线程。简单的讲,一个程序开始运行时,就启动了一个进程。
线程:不能独立的存在,它必须是进程的一部分。一个进程一直运行, 直到所有的非守护线程都结束运行后才能结束。
进程是资源分配的最小单位,线程是CPU调度的最小单位
做个简单的比喻:进程=火车,线程=车厢

  • 线程在进程下行进(单纯的车厢无法运行)
  • 一个进程可以包含多个线程(一辆火车可以有多个车厢)
  • 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
  • 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
  • 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
  • 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
  • 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
  • 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-”互斥锁”
  • 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”

    2.进程间的通信方式?线程间的同步方式?

    进程通信:

  • 套接字

  • 管道
  • 共享内存
  • 消息队列
  • 信号量

线程同步:
互斥量:(Mutex)
信号量:synchronized关键字
事件:Wait/Notify

3.进程和线程有哪几种状态?

创建—》就绪—》运行—》阻塞—》结束

4.进程调度算法?

  • 先来先服务
  • 短作业优先
  • 优先级调度
  • 时间片轮转

    五、系统概念

    1.什么是操作系统?

    是用来管理计算机硬件和软件都一种软件,相当于操作人员通过操作系统间接控制硬件。

    2.什么是系统调用?

    用户态调用系统态的东西就需要用到了系统调用。比如调用内存管理,文件管理,进程管理等。

    六、内存管理

    1、内存管理单元主要干啥?

    主要负责内存的分配和释放以及把逻辑地址转换为物理地址等。

    2、四种内存管理机制?

    块式存储:远古计算机时代使用,把内存分配成一块一块固定大小的小内存,容易造成资源浪费。
    页式存储:更小细度的拆分,减少了资源浪费。
    段式存储:动态分配系统内存。
    段页式存储:既有固定的页式存储,又有动态的段式存储

    3、页式管理中解决了哪两大问题?

    1.从逻辑地址到物理地址的转换速度要快,即快表(时间维度)
    2.在内存中也表不能占有太大的内存,所以典型的拿时间换空间,即多级页表(空间维度)

4、分页和分段管理的异同点?

同:
1.段页内存分配都是不连续的,但是段页内部的内存分配都是连续的
2.都提高了内存的利用率
异:
1.分段是分页的更小粒度划分
2.页的大小是固定的,段的大小不固定,取决于当前运行程序的大小
3.分页仅仅是为了更好满足操作系统的要求,没有实际意义。而分段则是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需要。

5、逻辑地址和物理地址区别?

逻辑地址:比如c语言里的指针,都是逻辑地址,平时大多数都是在跟逻辑地址打交道
物理地址:存在寄存器里真实的地址

七、虚拟内存

1、虚拟内存主要干啥?

很多时候我们使用点开了很多占内存的软件,这些软件占用的内存可能已经远远超出了我们电脑本身具有的物理内存。虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,并且 把内存扩展到硬盘空间。因为程序运行具有局部性原理,可以利用局部性原理,使内存只运行程序所需要的部分体积,达到虚拟扩大内存容量

2、如何实现的扩大内存?

内存+硬盘,需要用到硬盘里的数据时把硬盘里的数据调度到内存里

3、局部性原理?

正是因为程序运行具有局部性原理,才可以只装入部分程序到内存就开始运行。

4、页面置换算法?

地址映射过程中,若在页面中发现所要访问的页面不在内存中,则发生缺页中断 。

  • OPT 页面置换算法(最佳页面置换算法) :最佳(Optimal, OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。一般作为衡量其他置换算法的方法。
  • FIFO(First In First Out) 页面置换算法(先进先出页面置换算法) : 总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。
  • LRU (Least Currently Used)页面置换算法(最近最久未使用页面置换算法) :LRU算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。
  • LFU (Least Frequently Used)页面置换算法(最少使用页面置换算法) : 该置换算法选择在之前时期使用最少的页面作为淘汰页。