字长与数据类型长度

字长指CPU在同一时间能够处理二进制数据的位数,是由其外接数据总线(地址总线决定了CPU的寻址空间,如16位微型机的地址总线为20位,其可寻址空间为220 = 1MB)的条数决定的。早期的微机字长一般是8位或16位,目前市面上的计算机的处理器大部分已达到64位。但大多数计算机均支持变字长运算,即机内可实现半字长、全字长(或单字长)、双倍字长运算。ANSI C/C++ 定义了基本数据类型长度,而操作系统字长可能与物理机器实际字长不一致,编译器是根据操作系统字长和ANSI C/C++ 标准来决定数据类型长度的,比如long类型在64位系统上占用8字节,在32位系统上占用4字节。因此64位系统比32位系统代码更长,占用更多的内存空间也就好理解了。

页、块(簇)与扇区

  • 扇区是磁道的一个分区,扇区的大小是固定的512B,是磁盘读写的基本单位。
  • 块(Block,Windows中称簇Cluster)是文件分配磁盘空间的基本单位(也可以说是系统读写磁盘的基本单位),每个块可以包括2n个扇区(文件系统可支持的块数量有上限,FAT16簇总数只有216个,FAT32簇总数有232个)。
    一个文件通常存放在一个或多个块里,两个文件不能存放在同一个块中。比如,有1024个文件,大小为1字节,这些文件在硬盘上占用的空间不是1B而是1024个块,如果一个块为8 * 512B = 4K,那么就占了4M的空间。块越大,磁盘碎片就越少,硬盘的速度就越快,但对小文件而言,硬盘的使用效率就会越小。磁盘如果主要存放电影等大文件设置大块,如果主要存放很小的文件设置小块。
    
    磁盘碎片:指文件被分散保存到磁盘的不同地方,而不是连续的块。造成该问题的根本原因可能是文件内容长度的增加。有人认为,虚拟内存空间(硬盘的特定区域,Linux中称swap空间)中的临时交换文件频繁读写,是产生硬盘碎片的主要原因。我对这种说法是存疑的,既是临时文件,其内容在系统重启后就会失效,当然服务器一般是不会经常重启的;因此并不需要对PC机频繁进行磁盘碎片的整理,对服务器而言,若是虚拟内存空间中的内容频繁改变,进行磁盘碎片整理意义不大。Windows pagefile.sys文件一旦创建则长度固定,其占用的连续簇形式就固定下来,读写并不改变pagefile.sys的大小,当该文件告罄后系统创建temppf.sys依旧占用连续的一块区域(当然temppf.sys与pagefile.sys可能不在一个毗邻连续的区域)。Linux 虚拟内存空间位于单独的swap分区中,不影响其他分区文件。
  • 页(Page)指内存分页存储管理中将一个进程空间划分成多个大小相等的片,并给以编号0、1、2等,是页置换(通过页面置换算法来实现)的基本单位。相应地,也把内存空间分成与页面相同大小的若干个块,称为(物理)块或页框(Frame),块或页框是内存空间分配的最小单位,也同样加以编号。页大小是2n个扇区大小,通常为512 B~8 KB。系统是通过页表来维护页到块的映射关系的。页置换可解决空闲物理内存空间不足的问题。常见页面置换算法有如下几种:

    1)先进先出法FIFO;
    2)最佳置换法OPT:选择将来不再使用或在最远的将来才被访问的页调换出去;
    3)最近最久未使用LRU:选择在最近一段时间里最久没有使用过的页面予以淘汰;
    4)Clock置换算法(LRU算法的近似实现);
    5)最少使用(LFU)置换算法;
    6)页面缓冲置换算法。

管道(Pipe) 、命名管道(FIFO) 与 IPC Socket

  • 管道用于有亲缘关系的进程间通信,是内核管理的一个缓冲区,是一段环形数据结构,可循环利用。其一端连接一个进程的输出,用于向管道中放入信息,若已将管道填满则等待另一端读出;另一端连接一个进程的输入,用于从管道中取出信息,若未读到信息则等待另一端放入。
  • 命名管道(Named PIPE)在Linux文件系统中是一种特殊文件类型(p),客服了无名管道的限制,能用于无亲缘关系的进程间通信。当一个进程以读方式打开该文件,而另一个进程以写方式打开该文件时,内核就会在这两个进程之间建立管道。其之所以叫FIFO,是因为管道本质上是一个先进先出的队列数据结构,最早放入的数据被最先读出来,从而保证信息交流的顺序。
    cenze@kylin:~$ mkfifo mypipe
    
    #先写或先读命名管道都将被阻塞
    cenze@kylin:~$ ls -l mypipe > mypipe
    
    #多个用户同时读,只有一个可以获得数据
    #所以命名管道可以理解成抢占式的,而非订阅式的
    cenze@kylin:~$ cat mypipe
    prw-rw-r--  cenze cenze  2月    : mypipe
  • UNIX Domain Socket(IPC Socket)是在网络Socket框架上发展出的一种IPC机制,实现了在本机上把数据从一个进程拷贝到另一个进程,比网络Socket更有效率(无需网络协议栈打包拆包、计算校验和、维护序号和应答等)。IPC Socket也采用类似FIFO文件(p)的形式通过一个指定的文件(s)对应内核的一条通道,相互通信的两个进程读写该文件实际是读写内核通道。下边这段来自 wikipedia:
    Like named pipes, Unix domain sockets support transmission of a reliable stream of bytes (SOCK_STREAM,compare to TCP). In addition, they support ordered and reliable transmission of datagrams (SOCK_SEQPACKET,compare to SCTP), or unordered and unreliable transmission of datagrams (SOCK_DGRAM, compare to UDP). The Unix domain socket facility is a standard component of POSIX operating systems.

计算机基础理论知识梳理篇(一):数据类型长度、内存页、IPC的更多相关文章

  1. 计算机基础理论知识梳理篇(三):VLAN与VLAN网卡相关概念

    VLAN(Virtual Local Area Network) 虚拟局域网(VLAN,802.1Q)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能.部门及应用等因素将它们 ...

  2. JQuery基础知识梳理篇

    这周没事,优化线上项目,因为前端都在赶项目,我又若菜.于是前端数据展示也要自己来.看javascript看到吐,决定梳理一下Jquery基础知识.敲黑板) 闲扯结束,进入正题. 选择器 介绍 jque ...

  3. python基础知识梳理----3基本数据类型,int,bool,str ,for 循环,迭代

    一:python的基本类型 1.int  -----整数,主要进行数学运算 2.str  -----字符串,可以保存少量数据,并进行相关操作, 3. bool ---布尔类型,判断真假 4.list ...

  4. python基础知识梳理-----4基本数据类型,list ,tuple 操作 ,增删该查,以及其他功能函数

    一:列表的增加 1: append() lis = ['张三','李四','王二码子','李鹏智障'] lis.append('赵武')      # 这种加法是放在最后 print(lis) 输出  ...

  5. java基础知识梳理

    java基础知识梳理 1 基本数据类型

  6. [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

  7. Oracle知识梳理(三)操作篇:SQL基础操作汇总

    Oracle知识梳理(三)操作篇:SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式:       CREATE TABLE  table_name ( col_ ...

  8. Jmeter 接口测试知识梳理——应用基础篇

    Jmeter 使用也有很长时间了,但是一直没有做一下知识梳理,近期会对公司同事做一下这方面的培训,借此机会,把使用过程中应用到的知识,或是遇到的问题,整理出来,方便大家学习! Jmeter 接口测试知 ...

  9. Jmeter 接口测试知识梳理——持续集成篇

    Jmeter 使用也有很长时间了,但是一直没有做一下知识梳理,近期会对公司同事做一下这方面的培训,借此机会,把使用过程中应用到的知识,或是遇到的问题,整理出来,方便大家学习! Jmeter + Ant ...

随机推荐

  1. Linux压缩打包tar命令总结

      命令简介   在Linux系统的维护.管理中,tar命令是一个使用频率很高的命令,tar命令的功能主要是将众多文件打包成一个tar文件并压缩,并且能保持文件的权限属性.tar其实最开始是用来做磁带 ...

  2. python实例二

    https://www.cnblogs.com/evablogs/p/6754974.html 题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于 ...

  3. PGSQL-通过SQL语句来计算两个日期相差的天数

    这是本人第一次写的~我在某次需求中遇到一个问题,如何在SQL语句中计算出两个日期的天数,然后用那个结果来进行数据的筛选呢?通过网上查阅了资料发现 date_part('day', cast(time1 ...

  4. 固态+机械双硬盘分别安装Win10和Ubuntu16.04双系统

    博主的笔记本是256G固态+1T机械,固态事先已经安装好了Win10系统,想着把机械硬盘分出500G用来安装Ubuntu16.04,剩余的继续用作Win下的资料盘.这里不介绍安装Win10过程,也不记 ...

  5. JetBrains 注册码

    C40PF37RR0-eyJsaWNlbnNlSWQiOiJDNDBQRjM3UlIwIiwibGljZW5zZWVOYW1lIjoiemhhbmcgeW9uZyIsImFzc2lnbmVlTmFtZ ...

  6. 有效的字母异位词的golang实现

    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 输入: s = "anagram", t = "nagaram" 输出: ...

  7. php使用root用户启动

    一般情况下,肯定是不推荐使用root用户启动php的 但是在某些服务器管理想使用WEB的方式来控制操作的话,那么就必须要使用root用户才有权限操作 1.修改配置文件php-fpm.conf的启动用户 ...

  8. idea maven无法热布署exploded

    (原) 有时,你的idea可能会偶尔出现点小问题,特别是在用maven的时候,以前可以用的热布署发现没有了.就像这样: 少了一个选项,并且下面会有一个提示,no artifacts configure ...

  9. python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...

  10. day21(1)---python的内存管理

    垃圾回收机制: 不能被程序访问到的数据,就称之为垃圾. 引用计数:引用计数是用来记录值的内存地址被记录的次数的 每一次对值地址的引用都可以使得该值的引用计数+1 每一次对值地址的释放都可以使得该值的引 ...