操作系统问题总结

1.如何理解用户态和内核态

用户态的权限比较低,内核态的权限比较高,内核态下,CPU可以执行所有的指令访问所有的硬件资源,用户态只能访问有限的资源执行有限的指令。

打一个比方,好比你去银行取钱,它不会让你去金库里直接去,而是银行开放对应的接口,你访问接口,接口帮你去取钱。

2.进程和线程的区别是什么

程序计数器就是当前调度单位执行到哪个代码了

进程就是PCB,创建一个进程就是创建一个PCB,进程是资源分配的基本单位,如何理解,你创建一个进程,内核创建一个PCB,为它设置内存管理,进程管理,文件描述符表等,线程是CPU调度的基本单位,创建一个线程只是有对应的堆栈和上下文,一个进程下的线程共享文件描述符表和虚拟空间等资源,开销小。

如果要说区别,就从本质,进程是资源分配的基本单位,线程是调度的基本单位。

开销上,进程的开销小,进程切换你要切换页表,也就是虚拟到物理的映射关系,你的CPU缓存也要换,CPU缓存就是你在一定时间内,会频繁访问某个内存,快表也要换,快表会把常用的虚拟到物理的转化存下来,不用每次都去找MMU,快,如果进程换,你这些都需要换,开销大,但是线程不需要,线程这些东西都是共享的,进程下的多个线程共享一个页表,有相同的虚拟地址到物理地址的转化关系。

3.为什么进程崩溃不会影响其他的进程,线程崩溃,该进程下的所有线程都会崩掉

进程是具有独立性的,线程没有,每个进程是资源分配的基本单位,你一个进程的崩溃不会影响其他进程啊,但是线程你一个进程下面一个线程出问题,你的线程之间的空间可是共享的,你错误的修改了其他线程的数据会导致错误,操作系统为了安全,直接干掉你整个进程。

4.为什么有了进程还要设计线程

从进程和线程的特性来看

每个进程有自己的虚拟空间页表,也有自己的文件描述符表登,进程之间的资源不共享都是隔离的,但是线程不一样,一个进程下的线程页表文件都是共享的,所以天然的,进程的隔离性好,线程很容易可以访问共享资源,单核CPU下,我们任务一般是并发执行,不希望你串行执行,线程是CPU调度的基本单位,而且由于资源共享,多个线程可以协同的完成任务,改变串行执行的方式,改为并发执行。

5.多线程和单线程的优势和劣势

多个线程的开销比单线程大,多个线程可以让任务并发执行,但是多线程需要通过加锁来保证线程安全,锁的开销就有,而且创建线程本身也会占用一定的资源,只是资源比较少。

单线程无法并发的执行,任务执行是串行的,但是它不用加锁,访问速度更快。

6.多线程是不是越多越好

当然不是,线程过多会增加系统的负荷,而且线程过多可能会造成死锁问题。

7.进程切换和线程切换的区别

进程切换,首先页表你得切,因为每一个进程从虚拟到物理的映射关系不同。

你还得切CPU的缓存,进程切换你的CPU缓存失效,快表你也得切。

线程切换只是切线程的堆栈,寄存器,程序计数器

主要的原因就是进程切换你要把页表切掉,虚拟到物理全部的映射关系需要被换掉,TLB全部失效。

8.线程切换为什么比进程切换消耗的资源少

因为你大头没切,进程切换和线程切换最主要的开销就是页表的切换,因为页表的切换,虚拟和物理映射关系的改变,导致你CPU缓存的快表全部失效,这是切换的最主要开销

9.线程切换的详细过程,

上下文保存在哪里线程切换把硬件上下文保存到线程里,然后进行下一个调度,切换到新线程开始执行

10.进程的状态(阻塞,运行,挂起)

运行队列就是随时准备运行的队列,当你这个代码里面有IO,设计从内存到磁盘的交换,就会把你放到阻塞队列里,等你好了,你发起中断,再把你从阻塞拿到运行队列,挂起就是当内存资源紧张,把阻塞队列里的线程先换到磁盘里,如果还是不行,就从运行队列开始,把里面的线程拿到磁盘里。

11.进程的上下文保存在哪里

进程创建就是创建PCB,你说进程的上下文保存在哪里?当然是保存在PCB里了。

一个进程切换到另一个进程,就是进程上下文的切换。

我们先来说一下CPU上下文切换,CPU的上下文有CPU寄存器和程序计数器,程序计数器存的是当前执行的是哪个指令,CPU寄存器保存了当前执行指令和数据。这些是进程运行所必须得。

进程切换需要把CPU上下文保存然后进行切换,当再次切换回来的时候,CPU加载这些上下文,就好像看起来是没有切换过似得。

12.进程通信的方式

管道,匿名管道,命名管道,消息队列,共享内存,socket编程,信号,信号量

为什么信号是进程的通信方式呢,因为信号可以由一个进程向另外一个进程发出。

信号量可以通过共享内存进行共享,实现同步。

13.管道(匿名管道和命名管道)

匿名管道用于父子关系的通信,OS为会这个管道创建一块内核缓冲区,往这个内核缓冲区读和写可以实现通信。

命名管道就是创建了一个-p文件来用于通信了,不同的进程可以往这个文件里读和写实现通信。

14.信号和信号量

信号就是一个通知,PCB里有一张关于信号的表,一个进程可以发信号给别的进程,也可以给自己发信号。

信号量一般用于实现同步的操作,P拿到资源,V归还资源

15.共享内存的实现方式

通过让虚拟内存映射到同一块相同的物理内存实现通信,但是需要考虑安全问题,当多个进程同时对这块内存进行写,很容易出现问题。

16.线程通信

线程通信,不知道,线程通信不是天然的吗?

17.锁的种类,互斥锁还有什么,作用是什么

互斥锁,读写锁,自旋锁,条件变量,信号量

互斥锁就是当一个线程拿到这个锁,其它线程都不可以拿到这个锁,直到持有锁的线程把锁释放掉。

读写锁,就是读锁可以被多个线程持有,同时进行读,但是写锁只能被一个线程持有。

条件变量通常和互斥锁搭配使用,当申请不到锁就会被列入条件变量的等待队列,条件满足就会被唤醒。

这里有一个概念是互斥锁,如果线程没竞争到锁,也会被列入阻塞队列,等锁空闲了会被唤醒。

但是条件变量不一样,条件变量是你拿到锁你也要满足条件,比如在生产者消费者模型下面,如果队列里面没有生产号的产品,你即使拿到锁了,你也得再次进入等待队列

信号量就是PV操作,P是拿一个,V是换回来,如果sem设置为一,就是互斥锁

18.进程调度算法

大O(1)调度算法

19.为什么并发执行线程要加锁

当多个线程如果不加锁访问公有资源,会出现数据错乱

20.自旋锁是什么?哪些场景要用

自旋锁是忙等待锁,互斥锁是拿不到锁就会进入阻塞队列,但是自旋锁不,自旋锁拿不到一直要

21.死锁发生的条件

一个线程出现死锁就是持有锁申请锁。

多个线程就是互相持有对方需要的锁

22.如何避免死锁

线程申请锁的顺序保持一致

23.乐观锁和悲观锁

乐观锁认为资源不会过多的被竞争,先修改再看

悲观锁认为竞争激烈,先拿到锁再修改

24.操作系统的内存管理

操作系统会给每个进程画一张饼,告诉每个进程你拥有很大的空间,这个空间叫虚拟空间,你访问内存需要通过页表虚拟转物理去访问。

25.虚拟内存和物理内存

26.页表,段表

27.虚拟内存转物理内存

28.程序的内存布局

29.堆和栈

30.fork()会复制哪些

31.写实拷贝

32.malloc1kb,malloc1mb区别

33.brk,mmap

34.操作系统内存不足会怎么办

35.页面置换算法

36.什么是中断

37.中断的类型

38.中断的过程

39.中断的作用

40.io模型

41.服务器处理请求的方式

42.io多路转接

43.select,poll,epoll

44.epoll水平和边缘

45.零拷贝是什么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值