1.面向对象和面向过程的区别
2.面向对象的三大特性
封装:
继承:
多态:
3.多态在C#中的表现
1.多态:指不同的对象收到相同的消息产生不同的行为
2.三种形式:1)虚方法virtual
虚方法的子类可以不改写
class Program
{
static void Main(string[] args)
{
Employee employee = new Employee();
employee.Daka();
Employee manager = new Manager();
manager.Daka();
Employee programer = new Programer();
programer.Daka();
}
}
class Employee
{
public virtual void Daka()
{
Console.WriteLine("Daka!");
}
}
class Manager: Employee
{
public override void Daka()
{
Console.WriteLine("Employee Daka!");
}
}
2)抽象类abstract
abstract class Employee
{
public abstract void Daka();
}
class manager: employee
{
public override void Daka()
{
Console.WriteLine("manager Daka!");
}
}
3)接口interface
interface employee
{
void Daka();
}
class manager:employee
{
public void Daka()
{
Console.WriteLine("manager Daka!");
}
}
4.操作系统对进程如何进行内存分配
1. 进程的三种基本状态:
a> 就绪状态:进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
b> 运行状态:进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以 执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
c> 阻塞状态:由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生 前即使把处理机分配给该进程,也无法运行。
2.进程的内存分配
操作系统内核区 | - | 用户不可见 |
操作系统用户区 | 用户栈 | 从上往下,先进后出,局部变量, 中断中保留现场 |
- | 动态堆 | 从下往上,先进先出,动态分配 |
- | 静态区(data/bss) | 存储全局变量和静态变量存放在data, 未初始化的存放在相邻的bss区域 |
- | 文字常量区(只读数据) | 常量字符串 |
- | 代码区 | 函数体的二进制代码 |
- | 保留 | - |
5.计算机为什么要用线程?
线程是线程中执行运算的最小单位,线程不拥有资源,线程共享进程的堆和方法区资源
1)易于调度
2)提高并发性:进程可以创建多个线程来并发执行同一程序的不同步骤,在没有线程的传统机制中只能进程间并发
3)开销少:线程是轻量级进程,切换环境时不用切换进程的堆和方法区资源,所以切换线程比进程开销少,
多线程:单核CPU中线程实行并发,多核CPU中线程实行并行
协程:通过自主调度实现支持并发的多(用户态)对多(内核态)的模型
6.讲述了解的页面置换算法
1.调度:按某种算法来决定处理任务的顺序
2.CPU调度算法的评价指标:
3.进程调度(低级调度):从就绪队列中选取一个进程,将处理机分配给进程。
进程切换:一个进程让出处理机,另一个进程占用处理机
进程调度可以是调度刚刚被暂停执行的进程
进程调度方式:非抢占式方式,抢占式方法
4.内存调度(中级调度):决定将哪个处于挂起状态的进程重新调入内存。
引入虚拟存储技术后。可以将暂时不能运行的进程调至外存等待,等它具备了运行条件且内存空闲,再调入内存。
挂起:进程将暂时调到外存等待处理机的状态;
挂起时PCB不会调回外存而是常驻内存,操作系统还需要管理进程的信息
挂起和阻塞的区别:都不能获得CPU,但挂起状态进程被调到外存,而阻塞时进程还在内存
5.作业调度(高级调度):从外存处于后备队列的作业挑选一个,分配资源,建立进程(PCB),以使它们获得竞争处理机的权利。
调入的时机需要操作系统确定,调出的时机是作业运行结束
6.CPU调度算法:
1)先来先服务:作业调度/进程调度
2)
6.页面置换算法:
7.虚拟内存的原理是什么
1.解决的问题:传统存储中作业一次性装入内存后才能运行,导致内存利用率不高。
2.特性:多次性(允许一个作业多次调入内存),对换性(作业运行时可进行调换),虚拟性
3.虚拟内存:在程序执行过程中,当访问的信息不在内存时。由操作系统负责将所需信息从外存调入内存。(请求调页功能)
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出外存,在用户看来内存会比实际内存大的多。(页面置换功能)
4.虚拟内存需要建立在离散分配的内存管理方式基础上:
5.虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)决定的
虚拟内存的实际容量是由内存和外存容量之和,CPU寻址范围最小值决定
6.分页和分段:
1)页是出于内存利用率提出的离散分配机制
2)段是出于用户考虑,用于数据保护、数据隔离等用途的管理机制
3)页的大小固定,由操作系统决定
段的大小不确定,由用户程序决定
7.讲述计算机网络中的TCP/IP层次结构
8.TCP和UDP的区别;TCP用什么保证安全
·TCP和UDP都是传输层的协议,传输层提供进程到进程之间的逻辑通信
·传输层对收到的报文进行差错检测
·分用和复用
·套接字:在网络中采用发送方和接收方的套接字组合来识别端口,套接字唯一标识了网络中的一个主机和他的一个进程
TCP面向连接的传输控制协议:
1)面向连接
2)点对点的传输,不能广播
3)可靠的
4)全双工通信
·序号:序号是本报文段发送的第一个字节的编号,TCP堆每个传输的字节都进行了编号,序号是可靠传输的关键
·确认号:TCP的接收方每成功接收到一个报文段就返回一个ACK,每个ACK对应指明下一个期待收到的字节序号,并表示该序号之前的数据都正确收到
·数据偏移:首部长度
·校验和:检验首部+数据
·伪首部:在发送端和接收端校验差错时添加,传输过程中不存在
·TCP实现可靠传输:
1)校验(和UDP一致:检验首部+数据)
2)序号
3)确认(超时重传)
4)重传(超时重传、冗余ACK快速重传)
·TCP流量控制:发送速率过快会使接收方来不及接收
接收方根据接收缓存大小,动态地调整发送方的发送窗口大小
发送窗口=Min{接收窗口,拥塞窗口}
接收窗口:接收方根据自身缓存量设置,发送给发送方(接收能力)
拥塞窗口:发送方根据估算的网络拥塞程度设定的窗口值 (网络情况)
·TCP拥塞控制:
拥塞控制是网络中避免网络各个客户端发送数据拥塞 流量控制是避免发送端发送速率过快
UDP无连接的用户数据报协议:
1)无连接:提供接收端IP+port就可以发送
2)不可靠:没有确认、重传机制,如果校验和出错,直接丢弃该报文
·校验值:检查整个UDP数据报文是否有错,有错就丢弃
·伪首部
TCP | UDP |
传输前建立连接,传输后释放连接 | 传输前不需要建立连接,传输后也不需要确认 |
开销大:确认、流量控制、计时器及连接管理,适用大文件 | 开销小:不可靠,适用小文件 |
时延大 | 无拥塞控制:时延小,适合实时应用 |
面向字节流: | 面向报文:不拆分应用层报文直接传输,适合传输少量数据的进程 |
9.TCP的三次握手?没有第三次握手会发生什么?
客户端和服务端可以同时作为数据的发送方和接收方,即TCP是全双工连接,如果没有第三次握手即服务端无法保证发送到客户端的数据是正常的,需要第三次握手客户端的ACK确认。
第三次握手可以携带数据
9.链路层是可靠的吗
是的
10.你认为哪两种是最基本的数据结构?数据和链表的区别
11.创建一个变量被分配在内存哪个位置?动态创建呢?创建static变量呢?
1.堆和栈的区别
栈 | 堆 | |
内存 | 由操作系统自动分配和释放 例:int a; | 由程序员分配和释放(若程序原不释放则程序结束后操作系统根据垃圾回收算法释放) 例:int *a=malloc(sizeof(int)); object obj =new Object(); |
存放参数值、局部变量 | 存放对象(包括数组) | |
数据结构 | 先进后出的线性表 | 是特殊的完全二叉树(所有节点不小于或不大于其父节点) |
优缺点 | 1.自动分配,速度较快 2.是连续的内存区域,空间有限 | 1.空间由开发者指明大小,速度较慢 2.若开发者不释放会导致内存泄漏 3.不连续的内存空间,空间很大,比较灵活 4.频繁分配会导致不同大小的堆空间产生内存碎片 |
2.内存分配的三种方式:
1)静态存储区:(static)数据在程序编译时已经被分配,包括全局变量和静态数据
2)栈:(int...)函数执行时局部变量被分配,当函数调用完成后,变量被释放
3)堆:(malloc/new)由程序员手动申请内存并手动释放
3.值类型和引用类型
12.讲述一下快速排序以及时间复杂度
13.开放题:七个质量相同的球和一个质量较重的放在一起,用一个天平如何最快找出质量重的