1.静态链接库和动态链接库
静态链接库:参与编译,把(lib)文件中用到的函数代码直接链接到可执行程序中,在可执行文件生成以后,静态链接库.lib文件可以不用。
动态链接库:把调用的函数所在模块(DLL)和调用函数在文件中的位置等信息链接进可执行文件。程序在运行时再从DLL中查找相关函数代码,因此需要DLL文件支持。
注意:静态链接库不能再包含其他动态或静态链接库,但是动态链接库可以包含其他动态库或静态库。
动态链接库相对静态链接库的优点:
1)动态链接库可以更新而不需要重新编译链接,便于扩展。
2)动态链接库允许多个进程同时使用动态链接库。
3)节省内存空间。
缺点:运行时需要依赖DLL文件,且运行速度比静态慢。
2.什么是临界区?临界区和互斥量的区别?临界区怎样解决冲突?
1)每个进程中对共享变量进行访问的片段称为临界区,每次只允许一个进程进入临界区。
2)区别:
a.互斥量可以用于线程和进程间的同步,而临界区只能用于进程间同步。
b.互斥量属于内核对象,所以速度较快;临界区不属于内核对象,速度较慢。
(内核对象是操作系统为一些系统级对象(如进程、线程、信号量)维护的数据结构。)
3)解决冲突方法如下:
a.不能有2个进程同时处于临界区。
b.临界区外的进程不得阻塞其他进程。
c.不能假设CPU的速度和数量。
d.不能让进程无限等待进入临界区。
3.说说分段和分页。
windows内存管理的方式:段式管理、页式管理、段页式管理。
分页:将各个进程的虚拟空间分成若干个大小相等的页,然后把页式虚拟地址与内存地址建立一一对应的页表,不用将程序的所有页装入内存,只需使用合适的页面置换算法调入需要的页面。优点是没有碎片,缺点是需要相应的硬件支持。
分段:把程序按内容或过程函数分成段,每段有自己的名字。以段为单位分配内存,通过段号和段内地址把虚拟地址转为实际内存的物理地址。优点是可以分别编写和编译,对不同类型的段采用不同的保护,缺点是会产生碎片。
4.说说硬链接和软链接。
硬链接:就是一个文件使用了多个别名,硬链接是有着相同的inode号仅文件名不一样的文件,因此删除一个硬链接并不影响其他有着相同inode号的文件。
软链接:又叫符号链接,软链接文件的实际内容包含了该软链接所指向的文件的名字。
区别:
1)软链接可对文件或目录创建,硬链接只能对文件创建。
2)若软连接指向的文件被删除,则软链接不可以访问,硬链接指向的文件删除,硬链接还可以访问。
3)软链接可以跨越磁盘分区,硬链接不能。
补充:
硬链接创建用link或者ln
link oldfile newfile
ln oldfile newfile
软链接创建加-s
ln -s old.file soft.link
ln -s old.dir soft.link.dir
5.说说程序的内存分配方式(堆和栈区别)。
一个C/C++程序占用的内存分为下面几个部分:
栈区:由编译器自动分配和释放,存放函数的参数值,局部变量的值等。
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
全局区(静态区):存放全局变量和静态变量,初始化的全局变量和初始化的静态变量放在一块,未初始化的全局变量和为初始化的静态变量放在相邻的两块区域,程序结束后由操作系统回收。
文字常量区:存放常量字符串,程序结束由系统回收。
程序代码区:存放函数的二进制文件。
bss段:用来存放未初始化的全局变量和静态变量的区域。bss段属于静态内存分配。
data段:用来存放已经初始化的全局变量。
text段:用来存放程序执行代码的区域,也存放一些只读的常量。
6.多进程和多线程的优缺点
多进程优点:
1)每个进程相互独立,不影响主程序的稳定性,子进程崩溃没关系;
2)通过增加CPU,就可以扩充性能;
3)可以尽量减少线程加锁/解锁的影响,极大提高性能;
4)每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。
多进程缺点:
1)逻辑控制复杂,需要和主程序交互;
2)需要跨进程边界,如果有大数据量传送,就不太好;
3)多进程调度开销比较大。
多线程优点:
1)无需跨进程边界;
2)程序逻辑和控制方式简单;
3)所有线程可以共享内存和变量等;
4)线程销毁总资源方式比进程好。
多线程缺点:
1)每个线程与主程序共用地址空间,受限于2GB地址空间;
2)线程之间的同步和加锁比较麻烦;
3)一个线程崩溃可能影响整个程序的稳定性;
4)到达一定的线程数后,即使再增加CPU也无法提高性能。
进程和程序的区别:
1)程序是永存的,进程是暂时的;
2)程序是静态的,进程是动态的;
3)进程具有并发性,而程序没有;
4)进程是计算机资源分配的基本单位,而程序不是;
5)多个进程可执行同一程序,一个进程可以执行多个程序。
7.malloc申请得到的内存后,再free释放它的时候,操作系统会立即回收那块内存吗?
不会,如果每次free掉一些小内存给操作系统,那么内存就会弄得不连续,里面有很多gap。为了避免这种情况,内存管理系统会有一个free block list,free掉的东西就放在这里。如果释放一些散乱的内存过来,这里会尝试合并这些散乱的block。malloc首先也是在block free list里面查找,如果没合适的,再从OS申请新的内存。
8.对一个内存free多次问题:
1)如果一个非空指针free多次,结果未定义,编译时不会报错,可能出现运行时错误;
2)对空指针free多次,不会报错。
所以:养成良好习惯,将一个指针指向的内存free后,就要将指针值空,这样即使再次free也不回出现错误。
9.内存分配算法及优缺点
1)首次适应算法:从空闲分区链首开始查找,直至找到一个能够满足其大小的空闲分区。优点:保留了高地址部分的大空闲区,为以后分配大的内存空间创造了条件;缺点:低地址部分不断被划分,留下许多难以利用、非常小的空闲区,而每次又从低地址开始查找,增加查找开销。
2)循环首次适应算法:不再每次从链首开始查找,而是从上次找到的空闲分区开始查找,直至找到一个能满足需求的空闲分区。优点:空闲区的内存分布更加均匀;缺点:缺乏较大的空闲分区。
3)最佳适应算法:总是找到最接近的空闲分区来分配内存。优点:保留了较大的空闲区,避免造成内存随意分割;缺点:每次分配后要重新排序,增加开销,而且会留下许多难以利用的小分区。
4)最差适应算法:按大小递减的顺序形成空闲链,分配时从第一个空闲区分配。优点:避免留下许多小碎片;缺点:保留大的空闲区的可能性减小了,而且排序增加开销。
下面补充一种算法:
伙伴算法:把内存分配成8/16/32/64/128等大小的链表。分配内存时,首先找到合适的链表,然后分配内存。如果内存空间不够,再往高一级链表申请。
10.堆和栈的区别
堆栈空间分配的区别:
1)堆区:是由程序员分配和释放,若程序员不释放,程序退出时由操作系统回收,分配方式类似于链表;
2)栈区:由操作系统分配和释放,存放函数的参数,局部变量等值,其操作方式类似于数据结构中的栈。
堆栈缓存方式区别:
1)堆存放在二级缓存中:其生命期由虚拟机的垃圾回收算法决定;
2)栈存放在一级缓存中:他们通常被使用时处于存储空间中,调用完成后立即释放。
堆栈数据结构的区别:
1)栈是一种先进后出的数据结构;
2)堆可以被看做一棵树。
11.什么是死锁?死锁的必要条件?死锁的解决方法?
死锁:两个或以上的进程在执行过程中,因争夺资源而互相等待的现象,若无外力作用,他们都将无法推进下去。
死锁的必要条件:
1)互斥条件:一个资源每次只能被一个进程占用。
2)请求和保持条件:一个进程因请求资源而发生阻塞时,对已经占用的资源不释放。
3)不可剥夺条件:进程已经获得的资源,在未使用完成之前,不能被强行剥夺。
4)循环等待条件:若干进程形成首尾相接循环等待资源的关系。
死锁解决方法:
1)预防死锁:资源一次分配(请求和保持条件),可剥夺资源(即当某进程新的资源请求未满足时,可以释放占用的资源),资源有序分配法(系统给每类资源赋予一个编号,每个进程按编号递增的顺序请求资源,破坏循环等待条件)。
2)避免死锁:银行家算法。
3)解除死锁:剥夺资源(从其他进程剥夺足够数量的资源给死锁进程,以解除死锁),撤销进程(可以直接撤除死锁进程或代价最小的进程,直至有足够多的资源用)
12.sleep和wait的区别
sleep(100L)的意思是:线程占着CPU,休眠100ms
wait(100L)的意思是:线程不占用CPU,等待100ms
13.linux下跟进程有关的接口函数
1)int fork(void);
返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1.
2)int vfork(void);
fork不对父子进程的执行次序进行任何限制,而在vfork中,子进程先运行,直到子进程调用了exec或exit后,父子进程的顺序才没有限制。
3)exec函数族
在fork后的子进程中使用exec函数族,可以装入和运行其他程序。
4)pid_t wait(int *status);
先判断子进程是否存在,如果不存在,返回-1;如果存在,wait()将父进程挂起,直到子进程结束,并返回子进程结束时的状态和PID。
下面补充一些知识点:
14.linux下跟线程有关的接口函数
1)线程创建函数:pthread_create
2)等待线程结束函数:pthread_join
3)线程终止函数:pthread_exit
4)线程取消函数:pthread_cancel
操作系统的作用:1.管理系统中的各种资源。2.为用户提供友好的界面。
操作系统的定义:操作系统是位于硬件之上、所有其他系统软件层之下的一个系统软件,使得管理系统中的各种软件和硬件资源得以充分利用,方便用户使用计算机系统。
操作系统的特性:1.并发性 2.共享性 3.异步性 4虚拟性
进程的引入:在多道程序系统中运行的程序需要一个保存断点现场信息的区域,而这区域不是程序的组成部分,因此就要一个能够更准确地描述多道程序系统中执行的术语
进程状态:运行态 (相互) 就绪态 等待态 (其他顺时针)
进程组成:控制块:断点现场保存区域,进程存在的标志(数据结构)程序:1.代码 2.数据
进程: 进程是具有一定独立功能的程序关于一个数据集合的一次运行活动。
进程与程序的连系与差别:进程存在的目的是执行其所对应的程序,程序是进程的组成部分
差别:1.进程是动态。有生命周期,创建存在,撤销消亡。一个进程对应一个程序
2. 程序是静态。可以写在纸上或在某种存储介质上长期保存。一个程序可以对应多个进程
线程: 是进程内的一个相对独立的执行流,CPU调度的基本单位
线程优点:1.上下文切换快 2.系统开销小 3通信容易
中断:程序在运行过程中出现某种紧急事件,必须终止当前正在运行的程序,转去处理此事件,然后在恢复原来运行的程序。
中断装置:1. 识别中断源 2.保存现场 3.引出中断处理程序
共享变量:多个进程均需访问的变量
临界区:访问共享变量的程序
临界资源:一次允许一个进程使用的资源
进程互斥:两个或两个以上是进程不能同时进入关于同一组共享变量的临界区,否则可能发生与时间有关的错误。(进程之间的间接性相互作用)
独占型资源:1.互斥性 2.进展性 3.有限等待性
进程同步:一组进程,为了协调其推进速度,在某些点处需要相互等待或者唤醒,进程之间这种互相制约的关系称为进程同步。(有逻辑关系的作用)
死锁:一组进程中每一个进程均等待此组进程中其他进程所占有的.因而永远无法得到资源
死锁条件:1.资源独占 2.不可剥夺 3.保持申请
死锁的处理: 1。死锁预防 2. 死锁避免
进程饥饿:等待时间给进程的推进和响应带来明显的影响时
饿死:饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义。
活锁:在忙式等待条件下发生的饥饿
存储管理方式:1。单一连续区存储管理:内存空间划分:动态异长。 进程空间划分:连续。 对应关系:一个进程在内存中占有一个连续的区域
2.页式存储管理: 内存空间划分: 被静态的划分为等长区域 进程空间划分:被静态的划分为等长区域 对应关系:进程的逻辑页面是连续的,但页框不一定连续。
3.段式存储管理:内存空间划分:被动态的划分为长度各异的区域。 进程空间划分:静态长度各异的区域。对应关系:一个进程的多个逻辑段可存放与内存中不相连的物理段中。
4.段页式存储管理: 内存空间划分:被划分静态等长的区域。进程空间划分;静态不等长的段,每段静态等长 对应关系: 同一段内的逻辑页面是连续的,页框未必连续。缓冲:处理数据到达速度与离去速度不一致而采用的技术