进程管理
进程控制,进程同步,进程通信和进程调度
内存管理
内存分配,内存保护,地址映射,内存扩充
设备管理
管理所有外围设备,包括完成用户IO请求,为用户进程分配IO设备,提高IO设备利用率,提高IO速度,方便IO使用
文件管理
管理用户文件和系统文件,方便使用的同时保证安全性。包括磁盘存储空间管理,目录管理,文件读写管理以及文件共享及保护
提供用户接口
程序接口(如API)和用户接口(如GUI)
操作系统的主要组成部分:进程和线程的管理、存储管理、设备管理、文件管理
静态链接库是.lib
格式的文件,一般在工程的设置界面加入工程中。程序编译时,会把lib文件代码加入到程序中,因此会增加代码大小。不能手动移除lib代码。
动态链接库是程序运行时动态装入内存的模块,格式为.dll
,在程序运行是可以随意加载和移除,节省内存空间。
此篇博客为我的春招面试题总结,阅读最新最全版本,请关注我的个人网站:zongchengma.github.io,不定期更新各类文章和程序员读书笔记。
线程:抢占式调度
协程:协同式调度,避免了无意义的调度,可以提高性能,但程序员必须要自己承担调度的责任。协程也失去了标准线程使用多CPU的能力。
运行在用户态下的程序,只能受限地访问内存,不允许访问外围设备。占用CPU的能力被剥夺,CPU资源可以被其他程序获取。
运行在内核态下的程序,可以访问内存所有数据,包括外围设备。
用户态切换到内核态的三种方式:
此篇博客为我的春招面试题总结,阅读最新最全版本,请关注我的个人网站:zongchengma.github.io,不定期更新各类文章和程序员读书笔记。
信号量
允许统一时刻多个线程访问同一个资源,但需要控制统一时刻访问此资源的最大线程数量
互斥量
实际上是信号量的一种特殊情况,允许统一时刻只有一个线程访问同一个资源
信号,也叫事件
通过通知操作的方式来保证多线程同步,还可以方便实现多线程优先级的比较操作
互斥锁
保护临界区,确保同一时间,只有一个线程访问数据。
如果互斥量已经上锁,调用线程会阻塞,直到互斥量被解锁
自旋锁
在获取到锁之前,一直处于循环检测保持者是否已经释放了锁。
与互斥锁的区别是,在申请自旋锁时,线程处于忙等状态,而非挂起状态
信号量
一个计数器,用来控制多个进程对共享资源的访问。
互斥锁为信号量的一个特殊情况。
读写锁
高级别锁,区分读和写,符合条件时,允许多个线程访问对象。
处于读锁时,允许其他线程和本线程的读锁,但不允许写锁。
处于写锁时,任何锁操作都会睡眠等待
递归锁
递归锁是互斥锁的一个特殊情况。同样地,只能由一个线程访问该对象,但允许同一个线程在未释放其拥有的锁时,反复对锁进行加锁操作
在两个或者多个并发进程中,如果每个进程持有某种资源,又等待其他进程释放它目前持有的资源,在未改变这种状态之前,都不能向前推进。这一情况被称作死锁。
死锁产生的四个条件:
解决死锁的基本方法:预防死锁,避免死锁,检测死锁,解决死锁
预防死锁:确保死锁发生的四个必要条件中,至少有一个不成立
避免死锁:动态检测资源分配状态,确保循环等待条件不成立,使系统处于安全状态
解决死锁:包括进程终止和资源抢占
管道
分为三种:普通管道PIPE、命名管道NAME_PIPE、流管道S_PIPE
普通管道为半双工,只能单向传输,只能在父子进程间使用
流管道去除了第一种限制,可以双向传输
命名管道去除了第二种限制,可以在许多并不相关的进程之间进行通讯
系统IPC(包括消息队列、信号量、共享内存)
信号量是一个计数器,用来控制多个进程对资源的访问,通常作为一种锁机制
消息队列是消息的链表,存放在内核中并由消息队列标识符标识
信号(也叫事件)是一种比较复杂的通信方式,用于通知接受进程某个事件已经发生
共享内存是映射一段能被其他进程访问的内存,这段共享内存由一个进程创建,但是多个进程可以访问。共享内存是最快的IPC方式
SOCKET
套接口也是一种进程间通信机制,它可用于不同主机间的进程通信
此篇博客为我的春招面试题总结,阅读最新最全版本,请关注我的个人网站:zongchengma.github.io,不定期更新各类文章和程序员读书笔记。
进程的状态转换有四种:
状态 | 含义 |
---|---|
创建 | 还未开始的线程,处于此状态 |
就绪 | 正在Java虚拟机里面执行的线程,处于此状态 |
阻塞 | 该线程阻塞于锁 |
等待 | 进入该状态的线程需要等待其他线程做出一些特定动作,比如通知或中断 |
超时等待 | 该状态不同于等待,在该状态的线程,只会在一个特定时间内等待其他线程执行特定动作。若其他线程一直不执行,它可自行返回 |
终止 | 已经结束的线程,处于此状态 |
先来先服务、短进程优先、优先级、时间片轮转、多级反馈
信号量机制
对信号量使用P和V操作,P将信号量值减一,V将信号量值加一。
当信号量值S大于0时,表示当前可用资源的数量,当S小于0时,表示当前正在等待该资源的进程数
使用PV操作实现进程互斥时,要注意:
使用PV操作实现进程同步时,要注意:
自旋锁管程
会合
分布式系统
此篇博客为我的春招面试题总结,阅读最新最全版本,请关注我的个人网站:zongchengma.github.io,不定期更新各类文章和程序员读书笔记。
每个进程中,访问临界资源的那段程序块被称为临界区。每次只准许一个进程进入临界区,进入后不允许其他进程进入。
中断指的是,在计算机执行期间,系统内发生任何非寻常或非预期的急需处理时间,使得CPU中断当前正在执行的程序,而转去执行相应的事件处理程序。处理完毕后,处理器又返回原来被中断的地方,继续执行或调度新的进程。
轮询指的是,系统定时对各种设备轮流询问一遍是否有处理要求。有要求的,则加以处理。轮询占据了CPU相当一部分处理时间,是一种效率较低的 方式。
中断:容易遗漏一些问题,CPU 利用率高
轮询:效率低,等待时间长,CPU利用率低
Windows 提供了 3 种方法进行内存管理,分别为:
Windows 操纵内存可分为两个层面,分别为:
首次适应算法
空闲分区以地址递增次序链接,分配内存时顺序查找,找到大小能满足要求的第一个空闲分区
最佳适应算法
空闲分区按容量递增的次序链接,找到第一个能满足要求的空闲分区
最坏适应算法
空闲分区以容量递减的次序链接,找到第一个能满足要求的空闲分区,也就是挑选最大的分区
此篇博客为我的春招面试题总结,阅读最新最全版本,请关注我的个人网站:zongchengma.github.io,不定期更新各类文章和程序员读书笔记。
段式存储管理是一种符合用户视角的内存分配管理方案。在段式存储管理中,将程序的地址空间划分为若干段,如代码段、数据段、堆栈段。每个进程有一个二维地址空间,相互独立,互不打扰。
段式存储管理的优点是:没有内碎片,因为段大小可变,可以通过改变段的大小而消除内碎片。但会产生外碎片,比如4K的段换5K的段,会产生1K的外碎片
页式存储管理是一种用户视角内存与物理内存相分离的内存分配管理方案。在页式存储管理中,将程序的逻辑地址划分为固定大小的页,而物理内存划分为同样大小的帧。程序加载时,可将任意一页放入内存中任意一个帧,这些帧不必连续,从而实现了离散分离。
页式存储管理的优点是:没有外碎片,因为页的大小固定,但会产生内碎片,因为一个页可能填充不满
两者的不同点:目大地信内
页表用于记录逻辑地址和实际存储地址之间的映射关系,以实现从页号到物理块号的映射。
访问分页系统中内存数据需要两次的内存访问。
此篇博客为我的春招面试题总结,阅读最新最全版本,请关注我的个人网站:zongchengma.github.io,不定期更新各类文章和程序员读书笔记。
分段内存管理中,地址是二维的,其中一维为段号,另一维是段内地址。每个段的长度不一样,每个段内部都从0开始编址。
段内部为连续内存分配,但段与段之间离散分配,因此有了段表机制,以从一个逻辑地址映射到一个物理地址。
缓冲区溢出指的是,计算机向缓冲区填充数据时,超出了缓冲区本身的容量,溢出的数据覆盖在了合法的数据上。其危害有:
造成缓冲区溢出的主要原因是因为程序中没有仔细检查用户输入。
虚拟内存允许执行进程不必完全在内存中。
每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页。每个页都是一段连续的地址。这些页被映射到物理内存,但并不是所有页都在内存里才能运行程序。
当程序引用到一部分在物理内存中的地址空间时,由硬件进行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,操作系统负责将缺失的部分装入物理内存,并重新执行失败的指令。
虚拟内存的应用与优点
访问虚拟内存时,会访问到 MMU(Memory Management Unit),去匹配对应的物理地址。如果内存已满,还会调用页面置换算法。
程序的内存分配
#include
using namespace std;
int a = 0;//全局初始化区
char *p1;//全局未初始化区
int main()
{
int b;//栈
char s[] = "abc";//栈
char *p2;//栈
char *p3 = "123456";//p3在栈,“123456”在常量区
static int c = 0;//全局初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来的10和20字节在堆区
strcpy(p1, "123456");
//“123456”在常量区,编译器可能会将它与p3所指向的“123456”优化成一个地方
}
此篇博客为我的春招面试题总结,阅读最新最全版本,请关注我的个人网站:zongchengma.github.io,不定期更新各类文章和程序员读书笔记。
RAID 0
RAID 1
RAID 2
RAID 3
RAID 4
RAID 5
RAID 6
此篇博客为我的春招面试题总结,阅读最新最全版本,请关注我的个人网站:zongchengma.github.io,不定期更新各类文章和程序员读书笔记。
操作 | 举例 |
---|---|
显示文件目录ls | ls |
改变当前目录cd | cd /home |
建立子目录mkdir | mkdir xiong |
删除子目录rmdir | rmdir /mnt/cdrom |
删除文件rm | rm /ucdos/fox |
复制文件 | cp /ucdos/fox |
获取帮助信息man | man ls |
显示文件内容 less | less mwm.lx |
重定向与管道type | type readme>>direct(将readme的内容追加到direct文件中去) |
文件类型 | 属主权限 | 属组权限 | 其他用户权限 |
---|---|---|---|
d代表目录,-代表文件,l代表链接文档,b代表可随机存取装置,c代表串行端口设备(一次性读取装置,如键盘、鼠标) | rwx,代表可读可写可执行,若没有某权限则使用-表示 | rwx,代表可读可写可执行,若没有某权限则使用-表示 | rwx,代表可读可写可执行,若没有某权限则使用-表示 |
举例:dr-xr-xr-x
d 此为目录文件
r-x 属主拥有读和执行权限,没有写权限
r-x 属组拥有读和执行权限,没有写权限
r-x 其他用户拥有读和执行权限,没有写权限
此篇博客为我的春招面试题总结,阅读最新最全版本,请关注我的个人网站:zongchengma.github.io,不定期更新各类文章和程序员读书笔记。