C++面试知识总结-操作系统

1.进程和线程的区别

进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。

线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。

进程(线程+内存+文件/网络句柄):这里的内存是逻辑内存,指的是内存的寻址空间,每个进程的内存是相互独立的。网络/文件句柄是所有进程共有的。

线程(栈+PC+TLS)

栈:

我们通常都是说调用堆栈就是调用栈的意思。我们从主线程的入口main函数,会不断的进行函数调用,每次调用的时候,会把所有的参数和返回地址压入到栈中。

PC:

Program Counter 程序计数器,操作系统真正运行的是一个个的线程,而进程只是它的一个容器。PC就是指向当前的指令,而这个指令是放在内存中。每个线程都有一串自己的指针,去指向自己当前所在内存的指针。计算机绝大部分是存储程序性的,说的就是我们的数据和程序是存储在同一片内存里的,这个内存中既有我们的数据变量又有我们的程序。所以我们的PC指针就是指向我们的内存的。

 缓冲区溢出

例如我们经常听到一个漏洞:缓冲区溢出
例如:我们有个地方要输入用户名,本来是用来存数据的地方。然后黑客把数据输入的特别长。这个长度超出了我们给数据存储的内存区,这时候跑到了我们给程序分配的一部分内存中。黑客就可以通过这种办法将他所要运行的代码写入到用户名框中,来植入进来。我们的解决方法就是,用用户名的长度来限制不要超过用户名的缓冲区的大小来解决。

TLS:

全称:thread local storage
之前我们看到每个进程都有自己独立的内存,这时候我们想,我们的线程有没有一块独立的内存呢?答案是有的,就是TLS。可以用来存储我们线程所独有的数据。可以看到:线程才是我们操作系统所真正去运行的,而进程呢,则是像容器一样他把需要的一些东西放在了一起,而把不需要的东西做了一层隔离。

进程之间通过TCP/IP端口进行通信。线程的通信:有一大块共享的内存,只要大家的指针是同一个就可以看到各自的内存。

1.进程要分配一大部分的内存,而线程只需要分配一部分栈就可以了.
2.一个程序至少有一个进程,一个进程至少有一个线程.
3.进程是资源分配的最小单位,线程是程序执行的最小单位。
4.一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行.

线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

2.虚拟内存的概念 

虚拟内存操作系统虚拟性的一个体现,实际的物理内存大小没有变,只是在逻辑上进行了扩充。

可用虚拟存储技术解决问题
一次性: 作业必须一次性全部装入内存后才能开始运行。这会造成两个问题:
①作业很大时,不能全部装入内存,导致大作业无法运行;
②当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。

驻留性: 一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源

C++面试知识总结-操作系统_第1张图片

 3.静态链接与动态链接的过程

编译分为3步,首先对源文件进行预处理,这个过程主要是处理一些#号定义的命令或语句(如宏、#include、预编译指令#ifdef等),

你可能感兴趣的:(c++,面试,开发语言)