操作系统疑问?

[TOC]

线程组成?

一个标准的线程由线程id,当前指令指针(pc),寄存器集合和堆栈组成

进程切换发生哪些事情?

  • 保存CPU的上下文环境,包括程序计数器和寄存器,处理具体的中断、异常
  • 调整被中断进程的PCB信息,比如进程状态
  • 把进程移入相应的队列,比如就绪或者阻塞队列
  • 选择另一个进程执行并更新其PCB
  • 恢复CPU的上下文

为什么进程切换慢,线程切换快?

  • 进程切换涉及到虚拟地址空间的切换而线程切换则不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用TLB(Translation Lookaside Buffer)来缓存页地址,用来加速页表查找。当进程切换后页表也要进行切换,页表切换后TLB就失效了,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。

  • 而且保存CPU的上下文环境

进程切换的时机?

其中主动放弃处理器的场景是

  1. 进程正常结束,主动放弃。

  2. 进程在执行时发生了异常。

被动放弃处理器的场景是

  1. 进程在执行时有个更紧急的任务(比如IO操作)

  2. 遇到有更高优先级的进程

  3. 进程的时间片过期

中断一定会引起进程切换吗?

不一定

有一些中断/异常不会引起进程状态转换,不会引起进程切换,只是在处理完成后把控制权交还给被中断进程。

以下是处理流程:

1、(中断/异常等触发)正向模式切换并压入PSW/PC 。

2、保存被中断进程的现场信息。

3、处理具体中断、异常。

4、恢复被中断进程的现场信息。

5、(中断返回指令触发)逆向模式转换并弹出PSW/PC。

进程中打开文件其他线程可以直接读写那个文件吗?

1.两个进程中分别产生生成两个独立的fd

2.两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性
3.进程可以通过系统调用对文件加锁,从而实现对文件内容的保护
4.
任何一个进程删除该文件时,另外一个进程不会立即出现读写失败

5.两个进程可以分别读取文件的不同部分而不会相互影响

6.一个进程对文件长度和内容的修改另外一个进程可以立即感知

内核中,对应于每个进程都有一个文件描述符表,表示这个进程打开的所有文件。文件描述表中每一项都是一个指针,指向一个用 于描述打开的文件的数据块———file对象,file对象中描述了文件的打开模式,读写位置等重要信息,当进程打开一个文件时,内核就会创建一个新的file对象。

img

为什么要设计成三级缓存?

1、一级缓存基本上都是内置在cpu的内部和cpu一个速度进行运行,能有效的提升cpu的工作效率。一级缓存越多,cpu的工作效率就会越来越高,是cpu的内部结构限制了一级缓存的容量大小,使一级缓存的容量都是很小的。
2、二级缓存主要作用是协调一级缓存和内存之间的工作效率。cpu首先用的是一级内存,当cpu的速度慢慢提升之后,一级缓存就不够cpu的使用量了,这就需要用到二级内存。
3、CPU三级缓存,就是指CPU的第三层级的高速缓存,其作用是进一步降低内存的延迟,同时提升海量数据量计算时的性能。和一级缓存、二级缓存不同的是,三级缓存是核心共享的,能够将容量做的很大。

Linux的buffer内存和cache内存

  • Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。合并这里似乎和大数据生态中的Hadoop组件中的小文件合并有相似。
  • Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。

操作系统除了堆,栈还包括哪些段呢?

代码段 数据段