一、进程管理
1、进程与线程有什么区别
进程是程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU 调度和分配的基本单位,线程基本上不拥有系统资源。
区别如下:
a、一个线程必定属于也只能属于一个进程;而一个进程可以拥有多个线程并且至少拥有一个线程。
b、属于一个进程的所有线程共享该线程的所有资源,包括打开的文件、创建的Socket 等。不同的进程互相独立。
c、线程又称为轻量级进程。
d、进程是程序的一次执行,线程可以理解为程序中一段程序片段的执行。
e、每个进程拥有独立的内存空间,而线程共享其所属进程的内存空间。
2、线程同步有哪些机制?
现在流行的进程线程同步互斥的控制机制,其实是由最原始、最基本的4 种方法:临界区、互斥量、信号量和事件。
3、内核线程和用户线程的区别
根据操作系统内核是否对线程可感知,可以把线程分为内核线程和用户线程。
内核线程建立和销毁都是由操作系统负责、通过系统调用完成的,操作系统在调度时,参考各进程内的线程运行情况作出调度决定。
用户进程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,用户进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
二、内存管理
1、内存管理有哪几种方式
常见的内存管理方式有块式管理、页式管理、段式管理、段页式管理。
2、分段和分页的区别是什么?
页是信息的物理单位,分页是为了实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说分页仅仅是由于系统管理需要,而不是用户的需要。
段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
分页的作业地址空间是唯一的,即单一的线性空间,表示一地址;分段的作业地址空间是二维的,程序员在标识一个地址时,既需要给出段名,又需要给出段内地址。
3、什么是虚拟内存?
虚拟内存简称虚存,是计算机系统内存管理的一种技术。它是相对物理地址而言的,可以理解为“假的“内存。
它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),允许程序员编写并运行比实际系统拥有的内存大得多的程序,这使得许多大型软件项目能够在具有有限内存资源的系统上实现。而实际上,它通常被分割成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
虚存比实存有以下好处:
a、扩大地址空间
b、内存保护
c、公平分配内存
d、当进程需要通信时,可采用虚存共享的方式实现
4、什么是内存碎片?什么是内碎片?什么是外碎片?
内存碎片是由于多次进行内存分配造成的。当进行内存分配时,内存格式一般为(用户使用段)(空白段)(用户使用段),当空白段很小的时候可能不能提供给用户足够多的空间时,这些很小的空隙叫碎片。
内碎片:分配给程序的存储空间没用完,有一部分是程序不使用,但其他程序也没法使用的空间。
外碎片:由于空间太小,小到无法给任何程序分配(不属于任何进程)的存储空间。
5、虚拟地址、逻辑地址、线性地址、物理地址有什么区别?
虚拟地址:是指由程序产生的有段选择符和段内偏移地址组成的地址。
逻辑地址:指由程序产生的段内偏移地址。有时直接把逻辑地址当成虚拟地址,两者并没有明确的界限。
线性地址:指虚拟地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中的地址。
物理地址:是指现在CPU 外部地址总线上寻址物理内存的地址信号,是地址变换的最终结果。
6、Cache 替换算法有哪些?
Cache 替换算法有随机算法、FIFO算法、近期最少使用算法(Least Recently Used,LRU算法)、LFU算法(近期最少访问算法)、OPT算法(最优替换算法)
三、用户编程接口
1、库函数调用与系统调用有什么不同?
库函数调用时语言或应用程序的一部分,它是高层的,完全运行在用户空间,为程序员提供调用真正的在幕后完成实际事务的系统调用接口;
而系统函数是内核提供给应用程序的接口,属于系统的一部分。函数库调用是语言或应用程序的一部分,而系统调用时操作系统的一部分。
2、静态链接与动态链接有什么区别?
静态链接是指把要调用的函数或者过程直接链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的嗲吗就在程序的exe文件中,该文件包含了运行时所需要的全部代码。静态链接的缺点就是当多个程序都调用相同函数时,内存中就会出现这个函数的多个拷贝,造成内存的浪费。
动态链接是相对静态链接而言的,动态链接所调用的函数并没有被复制到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的动态链接库(dynamic link library ,dll)之间建立链接关系。
3、静态链接库与动态链接库有什么区别?
静态链接库就是使用.lib 文件,库中的代码最后需要链接到可执行文件中去,所以静态链接的可执行文件一般比较大一些。
动态链接库是一个包含可由多个程序同时使用的代码和数据的库,它包含函数和数据结构的模块的集合。程序文件在运行时才会加载这些模块。
它们的相同点是它们都实现了代码的共享。
不同点是静态链接库 lib 中的代码被包含在调用的exe 文件中,该lib 中不能再包含其他动态链接库或者静态链接库了。而动态链接库dll 可以被调用的exe 动态的”引用“ 和 “卸载”,该 dll 中可以包含其他动态链接库或者静态链接库。
4、用户态和核心态有什么区别?
用户态与核心态势操作系统的两种运行级别,它用于区分不同程序的不同权利。
核心态就是拥有资源多的状态,或者说访问资源多的状态,也称为特权态。
相对来说用户态状态下访问资源就会受到限制。
Intel CPU提供Ring0 ~Ring 4 4种级别的运行模式。
5、用户栈和内核栈有什么区别?
栈是系统运行在内核态的时候使用的栈,用户栈是系统运行在用户态时候使用的栈。
当进程由于中断进入内核态时,系统会把一些用户态的数据信息保存到内核栈中,当返回到用户态时,取出内核栈中得信息恢复出来,返回到程序原来执行的地方。
用户栈就是进程在用户空间时创建的栈,比如一般的函数调用,将会用到用户栈。
内核栈是属于操作系统空间的一块固定区域,可以用于保存中断现场、保存操作系统子程序间相互调用的参数、返回值等。
用户栈是属于用户进程空间的一块区域,用户保存用户进程子程序间的相互调用的参数、返回值等。