• Linux静态链接和动态链接;
(转)静态链接和动态链接
1、静态链接
静态链接方法:#pragma comment(lib, "test.lib") ,静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来。
静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库。
2、动态链接
动态链接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。
3、区别
(1) 动态库:
- 类库的名字一般是 libxxx.so
- 共享:多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可;
- 开发模块好:要求设计者对功能划分的比较好。
- 动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
(2)静态库:- 类库的名字一般是libxxx.a
- 代码的装载速度快,执行速度也比较快,因为编译时它只会把你需要的那部分链接进去。
- 应用程序相对比较大,如果多个应用程序使用的话,会被装载多次,浪费内存。
- 如果静态函数库改变了,那么你的程序必须重新编译。
• 什么是IO多路复用模型(select、poll、epoll);
IO多路复用
通过一种机制,可以监视多个描述符(socket),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
IO多路复用适用场合
1、当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。
2、当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。
3、如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
4、如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。
5、如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。
(转)IO多路复用之select总结
(转)IO多路复用之poll总结
(转)IO多路复用之epoll总结
(转)select、poll、epoll之间区别
• Linux中的grep管道用处?Linux的常用命令?
grep命令的作用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
(转)grep命令用法
(转)Linux常用命令
• 操作系统中虚拟地址、逻辑地址、线性地址、物理地址的概念及区别;
虚拟地址
指由程序产生的由段选择符和段内偏移地址组成的地址。
逻辑地址
指由程序产生的段内偏移。有时候直接把逻辑地址当做虚拟地址。
线性地址
指虚拟地址到物理地址变换的中间层,是处理器可寻址的内存空间中的地址。程序代码会产生逻辑地址,也就是段中的偏移地址,加上相应的段基址就成了线性地址。如果开启了分页机制,那么线性地址需要再经过变换,转为为物理地址。如果无分页机制,那么线性地址就是物理地址。
物理地址
指CPU外部地址总线上寻址物理内存的地址信号,是地址变换的最终结果。
• 内存的页面置换算法;
概念
进程运行时,若其访问的页面不在内存而需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区中。通常,将选择调出页面的算法称为页面置换算法。置换算法的好坏将直接影响操作系统的性能。
(转)页面置换算法详解
页面置换算法
1、最佳置换算法(OPT)
最佳(Optimal, OPT)置换算法所选择的被淘汰页面是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们无法预知进程页面未来的使用情况,因而该算法无法实现。最佳置换算法是根据各页以后的使用情况,是“向后看”的。
2、先进先出(FIFO)页面置换算法
优先淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问。
FIFO算法还会产生当所分配的物理块数增大而页故障数不减反增的异常现象,这是由 Belady于1969年发现,故称为Belady异常。只有FIFO算法可能出现Belady 异常。
3、最近最久未使用(LRU)置换算法
选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。LRU算法根据各页以前的情况,是“向前看”的。
4、时钟(Clock)置换算法
简单的Clock算法是给每一页设置一个访问位,再将内存中所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置1。置换算法在选择一页淘汰时,只需要检查页的访问位。若是0,则将该页换出;若是1,则重新将它置为0,暂时不换出,给该页二次驻留内存的机会,接着按照FIFO的算法检查下一个页面。当检查到队列中最后一个页面时,其访问位仍为1,则再放回队首区检查下一个页面。由于该算法循环地检查各页面的情况,故称为Clock算法,又称为最近未用(Not Recently Used, NRU)算法。
改进型的Clock置换算法在使用位(A)基础上,再增加一个修改位(M)。这样每页都处于以下四种情况之一:
- 最近未被访问,也未被修改(A=0, M=0)。
- 最近被访问,但未被修改(A=1, M=0)。
- 最近未被访问,但被修改(A=0, M=1)。
- 最近被访问,被修改(A=1, M=1)。
改进算法执行步骤:- 从指针的当前位置开始,扫描循环队列。在这次扫描过程中,对使用位不做任何修改。选择遇到的第一个(A=0, M=0)页,则进行置换。
- 如果第1步失败,则重新扫描,查找(A=0, M=1)页。选择遇到的第一个这样的页则置换。在这个扫描过程中,对每个跳过的页,把它的使用位设置成0。
- 如果第2步失败,指针将回到它的最初位置,并且集合中所有页的使用位均为0。重复第1步,并且如果有必要,重复第2步。这样将可以找到供置换的页。
改进型的Clock算法优于简单Clock算法之处在于:替换时首选没有变化的页。由于修改过的页在被替换之前必须写回,因而这样做会节省时间。
• 进程调度算法,操作系统是如何调度进程的;
进程调度算法
1、时间片轮转调度算法(RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。
2、先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短作业。
3、优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。
4、多级反馈队列调度算法 :将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。
5、高响应比优先调度算法:根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。
• 父子进程、孤儿进程、僵尸进程等概念;
父子进程:正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。