6 为幸福写歌

尚未进行身份认证

热爱编程

等级
TA的排名 2w+

怎样通俗的理解操作系统中内存管理分页和分段

要理解分段和分页,那么得理解为什么会出现分段和分页的技术。首先,这两个技术都是为了利用和管理好计算机的资源--内存。在分段这个技术还没有出现之前,程序运行是需要从内存中分配出足够多的连续的内存,然后把整个程序装载进去。举个例子,某个程序大小是10M,然后,就需要有连续的10M内存空间才能把这个程序装载到内存里面。如果无法找到连续的10M内存,就无法把这个程序装载进内存里面,程序也就无法得到...

2019-06-07 12:11:37

C语言内联函数

引入内联函数的目的是为了解决程序中函数调用的效率问题。函数是一种更高级的抽象。它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现;函数的引入可以减少程序的目标代码,实现程序代码和数据的共享。但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去...

2019-06-06 17:19:41

基于virtio-serial的虚拟机和主机数据传输机制

virtio是Linux虚拟机平台上统一的虚拟IO接口驱动。通常主机为了让客户机像在真实环境中一样运行,需要为客户机创建各式各样的虚拟设备,如磁盘,网卡,显卡,时钟,USB 等。这些虚拟设备大大降低了客户机的性能。使用virtio虚拟机guest不用关注如何创建各种虚拟硬件设备(如磁盘,网卡,显卡等),可以用统一的虚拟设备,因此大大提高虚拟机的性能,这个统一的虚拟设备就是virtio。本文会...

2018-08-14 10:42:17

Xen使用console进入hvm虚拟机

HVM虚拟机默认不支持 xl console,需要使用图形界面安装好虚拟机后修改一些配置文件,让其支持xm/xl console 的连接方式。1. 在Dom0修改虚拟机的配置文件,添加:serial='pty'2. 修改虚拟机内部的 /boot/grub/menu.lst 或者 /boot/grub/grub.conf 文件,添加:serial --unit=0 --speed...

2018-07-30 21:18:34

CentOS 6配置Bonding多网卡

1. 关闭和停止NetworkManager服务# service NetworkManager stop# chkconfig NetworkManager off2、加载bonding模块# modprobe --first-time bonding没有提示说明加载成功, 如果出现modprobe: ERROR: could not insert 'bonding':...

2018-07-18 21:25:01

KVM设置克隆虚拟机的网络

KVM克隆虚拟机后,需要设置虚拟机的网络,进入虚拟机后会发现没有eth0网卡,是因为虚拟机还使用原来的mac地址,需要修改之。编辑/etc/udev/rules.d/70-persistent-net.rules文件,把NAME="eth0"的那行配置注释掉或者删掉,把NAME="eth1"的修改成NAME="eth0",修改后如下:# vi /etc/udev/rules.d/70-p...

2018-07-18 18:03:57

KVM使用Pass-through和SR-IOV

本文介绍了如何在KVM虚拟机平台上使用Pass-through和SR-IOV,至于Pass-through和SR-IOV的原理可以查阅其他文章。所谓Pass-through技术是指可以将PCI/PCIe设备绕过虚拟机平台直接分配给虚拟机使用,而SR-IOV设备除了有一个物理功能(PhysicalFunction,PF)之外,还可以提供许多虚拟功能(VirtualFunction,V...

2018-07-18 10:32:45

KVM复制虚拟机

KVM虚拟机的复制分为两种情况,第一种KVM宿主机上对虚拟机直接克隆,第二种通过复制配置文件与磁盘文件的虚拟机复制克隆(适用于异机的静态迁移)。方法一:KVM宿主机上对虚拟机直接克隆(需要在关机或暂停的状态下操作)1. Suspend the VM to be cloned. This is a requirement since it ensures that all data and ...

2018-07-16 16:52:22

memmove函数的实现

今天百度二面叫我用C语言实现一个memmove函数,我是这样写的:void *memmove(void *dest, const void *src, size_t n) { int i; char * dest_t = (char *)dest; char * src_t = (char *)src; if ( src_t+n > dest_t &...

2018-07-11 20:06:42

大端模式和小端模式以及判别

昨天面试百度,面试官叫我写一个程序来判别大小端模式,我是用数组来判定,随后想了想显然不行,后面才想起来要用联合体。大小端的概念用一个经典的例子可以很好的说明大小端的概念。假如现有一32位int型的数据0x12345678,那么其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78,在CPU内...

2018-07-11 17:58:42

CentOS 7安装KVM并创建虚拟机

本文参考自KVM的安装KVM官网文档<KVM Virtualization in RHEL 7 Made Easy>,这里记录安装和使用KVM的过程,以便后面查阅。准备工作检测是否支持KVM:KVM 是基于 x86 虚拟化扩展(Intel VT 或者 AMD-V) 技术的虚拟机软件,所以查看 CPU 是否支持 VT 技术,就可以判断是否支持KVM。有返回结果,如果结果中有vmx(Int...

2018-07-10 09:28:33

fork函数和vfork函数的区别

fork函数:子进程是父进程的一个拷贝,即子进程从父进程得到数据段和堆、栈段的拷贝,这些需要分配新的内存(不是与父进程共享,而是单独分配内存);而对于只读的代码段,通常使用共享内存的方式访问;fork返回后,子进程和父进程都从调用fork函数的下一条语句开始执行;由于子进程与父进程的运行是无关的,所以,父进程可先于子进程运行,子进程也可以先于父进程运行。vfork函数:vfork创建新进程的主要目...

2018-07-08 23:27:23

进程创建详解与父子进程资源的管理

1. 父子进程执行顺序问题父进程在使用fork函数创建子进程后父进程与子进程互相不关联,以独立身份抢占CPU 资源,具体谁先执行由调度算法决定,用户空间没有办法干预。子进程执行代码的位置是fork/vfork 函数返回的位置。2. 子进程资源申请问题在使用fork函数创建子进程后,子进程重新申请新的物理内存空间,复制父亲进程地址空间所有的信息,子进程复制父亲进程的代码段,数据段,BSS 段,堆,栈...

2018-07-08 23:17:25

从源代码到可执行文件(编译链接全过程解析)

程序的生命周期从一个高级C语言程序开始,这种形式能够被人读懂,却不能被机器读懂,为了在系统上运行这个程序,该源程序需要被其他程序转化为一系列低级机器语言指令,然后将这些指令按照可执行目标程序的格式打包并以二进制磁盘文件形式存储起来。在Linux系统下,可用以下指令完成源程序到目标程序的转化:gcc -o hello hello.c main.cgcc 编译器驱动程序读取源文件hello.c和mai...

2018-07-03 21:49:27

C语言中的可变参数(printf的实现原理)

printf是根据格式化的字符来确定的栈中参数的值,长度。在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数...

2018-07-03 21:30:32

HTTP的长连接和短连接

1. HTTP协议与TCP/IP协议的关系HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。2. 如何理解HTTP协议是无状态的HTTP协...

2018-07-03 21:30:17

笔试题

一. TCP协议如何保证传输的可靠性答:1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。2、数据校验3、数据合理分片和排序:  UDP协议:当IP数据报大于1500字节, 即大于最大传输单元(MTU)时,发送方IP层就需要分片(fragmentation),把数据报分成若干片,使每一片都小于MTU。而接收方IP层则需要进行数据报的重组,这样就会多做许多事情,而更严重...

2018-07-03 21:29:35

静态库与动态库的区别

什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:静态库之所以成为【静态库】,是因为在链接阶段,会将汇...

2018-07-03 21:27:28

二叉树的非递归遍历

二叉树定义的数据结构typedef struct BiNode{ char data; //此处,二叉树中节点值类型为字符型 struct BiNode *lchild,*rchild; //左右孩子节点}BiNode,*BiTree;二叉树的创建先申请根节点的空间,然后赋值,然后分别递归建立其左子树和右子树,按照先序序列输入构建一棵二叉树//按照先序序列输...

2018-07-03 21:25:08

KMP算法

介绍串的普通模式匹配算法大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时模式串向后移动一个字符的位置。一次次的循环,直到匹配成功或者程序结束。"KMP"算法相比于"BF"算法,优势在于:在保证指针 i 不回溯的前提下,当匹配失败时,让模式串向右移动最大的距离;并且可以在O(n+m)的时间数量级...

2018-07-03 21:24:37

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!