Linux及计算机体系结构
文章平均质量分 64
UKey_
勿以浮沙筑高台
展开
-
linux学习笔记:linux常用命令
首先要明白,linux中大多数命令的构成为:命令名称 [命令参数] [命令对象] 1.查看帮助的命令:man [命令]。 下面介绍的命令有些参数较多,由于只是简单介绍Linux常用命令,所以就不详细说明了,可以使用man命令自行查看或者百度等。 介绍一个很好的Linux资料:http://www.linuxprobe.com很适合入门 2.查看系统时间的命令:date。这个命令有许多参数,太原创 2016-09-24 11:53:03 · 1812 阅读 · 0 评论 -
linux0.11-高速缓冲区(buffer)底层原理
文件系统-高速缓冲区:首先我们为什么需要高速缓冲区而不是直接访问块设备中的数据。这是因为,IO设备的读写速度和CPU的处理速度差距太大,而高速缓冲区就起了一个中间过程的作用。需要读取磁盘上的数据时,先把数据写在缓冲区中,然后内核再来操作,如果要存入数据,也是先经过缓冲区,再存入磁盘。高速缓冲区在整个物理内存中的位置处于内核区和主内存区之间。这里引用《linux0.11代码完全注释》中的图。 在原创 2017-03-19 13:44:44 · 2326 阅读 · 0 评论 -
文件描述符、文件表项、v节点表项的联系
最近在阅读linux0.11源码,看到了文件系统,觉得文件描述符表和文件表项以及v节点表项概念有点混淆,于是翻了翻了万能的APUE和unix/linux编程实践,现在差不多弄懂了,就写篇博文分享给大家。以前只知道文件描述符只是一个索引,指向了pcb中的struct file *filp[],即文件描述符表,但是后面的就不知道了。今天终于明白了之后的内容了,原来文件描述符只是结构体数组的下标。。。。先原创 2017-03-14 20:40:28 · 2059 阅读 · 0 评论 -
从实模式到保护模式
计算机启动之后,BIOS会初始化计算机,然后计算机开始自动读取磁盘,磁盘读取一个扇区(512字节),当读到某个磁盘0磁道1扇区扇区的最后的结束地址是0xaa55,BIOS就会认为它是一个引导扇区,然后就会把这512字节的内容装载到内存地址0000:7c00处,然后跳转到0000:7c00处将控制权交给这段引导代码,这样BIOS的任务就结束了,操作系统也成功被引导起来了。作为一个引导扇区,它至少有这样原创 2017-02-22 08:27:46 · 1729 阅读 · 1 评论 -
逻辑地址、虚拟地址、线性地址、物理地址
逻辑地址、虚拟地址、线性地址、物理地址的区别:虚拟地址:在保护模式下,虚拟地址由段选择子+段内偏移量组成。利用段选择子可以获取到段描述符,再从段描述符中取得段的基地址。也就是说虚拟地址就是xxxx:yyyy yyyy这玩意儿。而在实模式下,也是这样,只是对应的xxxx的意义发生了改变,xxxx就代表了段基址,而不需要再经过刚才的过程去获取。(如果对该过程感兴趣请参考上一篇博文)物理地址:物理地址代表原创 2017-02-25 17:20:16 · 1223 阅读 · 0 评论 -
unix/linux下几种常见的IO模型
unix/linux下几种常见的I/O模型:(以下图片均引用自UNP一书)阻塞式I/O:顾名思义就是当进行I/O时,数据还没有准备好,就会阻塞在I/O上。 下面配合代码进行讲解:#include <string.h>#include <stdio.h>#include <unistd.h>#include <arpa/inet.h>#define SERV_PORT 8000int ma原创 2017-05-12 17:01:05 · 1336 阅读 · 0 评论 -
深入dup2的内部细节
基础信息:所需头文件:#include <unistd.h>函数原型:int dup2(int oldfd, int newfd);返回值:成功返回新的文件描述符,失败返回-1功能:将oldfd描述符复制给newfd深入理解:当我们把oldfd和newfd传入到dup2时,到底发生了什么呢? 这里需要用到有关文件方面的知识了,作一个简要的说明(具体请参考我之前的博客http://blog原创 2017-05-23 19:15:12 · 915 阅读 · 0 评论 -
epoll比select和poll高效的原因
我们通过比较select、poll和epoll处理I/O的过程来剖析其中的原因:1. 用户态将文件描述符传入内核的方式:select:创建3个文件描述符集并拷贝到内核中,分别监听读、写、异常动作。这里受到单个进程可以打开的fd数量限制,默认是1024。 poll:将传入的struct pollfd结构体数组拷贝到内核中进行监听。 epoll:执行epoll_create会在内核的高速原创 2017-05-12 22:21:39 · 2415 阅读 · 1 评论 -
epoll的边缘触发(ET)和水平触发(LT)
epoll的边缘触发和水平触发:epoll的默认模式是水平触发。 先大概了解一下这两种触发模式有什么不同: 水平触发(Level Trigger,也称条件触发):只要满足条件,就触发一个事件(只要有数据还未读完,就会一直触发) 边缘触发(Edge Trigger):每当状态发生变化时就触发一个事件。可能概念不容易理解,这里举一个例子大概就能明白两者的区别了:比如某个人让你去买几袋酱油,你只买了原创 2017-05-13 11:30:14 · 3700 阅读 · 1 评论 -
linux内存管理---伙伴系统算法
伙伴系统算法:该算法用于分配内存,一个合理的分配内存算法应当拥有这两部分:分配内存释放内存符合以下三个要求的就算是伙伴:两个块的大小相同两个块的地址连续两个块必须是从同一个大块分离出来的原理:linux把每个zone分成MAX_ORDER个free_area,每个free_are的大小是2的幂次方。MAX_ORDER的值为11,第0组大小为2^0个页,第1组大小为2^1个页,依次类推,原创 2017-05-07 21:37:55 · 1717 阅读 · 0 评论 -
谨防fork与锁之间的深坑
fork之后应当谨慎使用锁:这是因为fork有一个特点,那就是子进程只会保留调用fork的那个线程,父进程中其他的线程在子进程中都会消失。但是fork之后,除了文件锁以外,其他的锁都会被继承。这就导致了,如果在子进程中,对某个已经在父进程中加了锁的锁继续加锁,就会导致死锁发生。并且我们无法对该锁进行解锁,因为在子进程中,该锁的持有者并不存在。 下面给一个例子:#include <stdio.h>原创 2017-06-21 12:27:29 · 2871 阅读 · 3 评论 -
Unix文件系统原理简介
文件系统在磁盘中大致分为三个区域:1.超级块 2.i-节点表 3.数据区1. 超级块:作用是存放文件系统本身的结构信息,比如每个区域的大小以及有哪些空余的磁盘块信息 2. i-节点表:存储文件的属性,比如大小以及所有者之类的。每个i-节点结构的大小一致,而且访问的方式就和数组类似,比如要访问i-节点号为9的i-节点结构,就对应i-节点表中的第10个位置。 3. 数据区:文件的内容就保存在这个区域原创 2017-03-19 23:41:48 · 2525 阅读 · 0 评论 -
历史上线程的3种实现模型
原文链接一.概述 这里以Linux为例。Linux历史上,最开始使用的线程是LinuxThreads,但LinuxThreads有些方面受限于内核的特性,从而违背了SUSV3 Pthreads标准。即它要根据内核的特性来实现线程,有些地方没有遵循统一的标准。后来IBM开发了NGP转载 2017-11-23 15:55:11 · 985 阅读 · 0 评论 -
linux memalign、valloc函数
转载出处:http://blog.csdn.net/shisiye15/article/details/7827716在GNU系统中,malloc或realloc返回的内存块地址都是8的倍数(如果是64位系统,则为16的倍数)。如果你需要更大的粒度,请使用memalign或valloc。这些函数在头文件“stdlib.h”中声明。 在GNU库中,可以使用函数free释放memal转载 2018-01-02 10:12:14 · 1218 阅读 · 0 评论 -
SMP、NUMA、MPP模型介绍
转载出处:https://www.cnblogs.com/yubo/archive/2010/04/23/1718810.html从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构 (SMP : Symmetric Multi-Processor) ,非一致存储访问结构 (NUMA : Non-Uniform Memory Access) ,以及海量并行处理结构 (MPP转载 2018-01-04 18:06:58 · 2039 阅读 · 0 评论 -
bss段不占据磁盘空间的理解
elf文件中.bss段: 存放未初始化的全局变量,将.data和.bss分开的理由是为了节约磁盘空间,.bss不占实际的磁盘空间。这句话该怎么理解呢? 可以看下面的例子:#include <stdio.h>int a[1000];int b[1000] = {1};int main(){ printf("123\n"); return 0;}这里编写了一个test.c原创 2017-04-05 19:23:51 · 8005 阅读 · 3 评论 -
高速缓存(cache)存储器
高速缓存(cache)存储器:这里先说明一下(高速缓存)cache和(高速缓冲)buffer的区别: buffer主要作用是在一定程度上减少对IO设备访问的次数,可以起到流量整形的作用,也提升了系统的性能,毕竟IO操作和内存和cpu的处理速度差距还是很大的,比如下载一个文件,是积攒到一定量才写回磁盘,而不是下载一个字节写回一个字节,这样过不了多久,磁盘就损坏了。 cache主要作用是缓解处理数据原创 2017-03-30 16:06:02 · 19839 阅读 · 7 评论 -
浮点数在计算机中存储的方式
浮点数在计算机中的存储1996年6月4日,欧洲最新的无人驾驶火箭Ariane5初次航行时,发射后仅37秒,火箭偏离了它的飞行路径,解体并且爆炸。火箭上载有价值5亿美元的通信卫星。科学家们进行调查之后,原来只是因为小小的浮点数导致这场灾难性的后果,白白地损失了5亿美元。 作为这场事故的肇事者浮点数,它转换成整数时发生了溢出。在Ariane5的控制惯性导航系统的计算机向控制引擎喷嘴的计算机发送了一个无原创 2016-10-16 23:45:26 · 2274 阅读 · 0 评论 -
linux0.11源码研究---exit.c
exit.c程序中实现的大致实现的是进程终止和退出等方面如何处理的相关函数,包含kill()函数系统调用的内部实现、exit()函数系统调用的内部实现、waitpid()函数的系统调用的实现,以及一些更底层的函数的实现。要想看懂这些函数,需要对会话以及进程、进程组有一定的了解,并且对pcb里面的一些成员的了解。主要包括有这八个函数:void release(struct task_struct *原创 2017-03-07 15:45:44 · 967 阅读 · 0 评论 -
深入研究signal和sigaction
信号通常使用一个无符号长整数(32位)中的比特位表示各种不同的信号。因此最多可以表示32个不同的信号。signal()和sigaction()的功能比较类似,都是更改信号原处理句柄(handler,或称为处理程序)。但signal()就是内核操作上述传统信号的方式,在某些特殊时刻可能会造成信号丢失。之前介绍过signal()函数,signal()函数的返回值是一个无返回值且具有一个整型参数的函数指针原创 2017-03-06 19:55:39 · 1690 阅读 · 0 评论 -
linux如何把普通用户添加到sudo组
linux下把普通用户添加到sudo组的方式。 1. 先cd到/etc/sudoers目录下 2. 由于sudoers文件为只读权限,所以需要添加写入权限,chmod u+w sudoers 3. vim sudoers 4. 找到root ALL = (ALL) ALL这一行,在下一行加入username ALL = (ALL) ALL。username指代你想加入sudo组的用户名。原创 2016-10-12 23:59:42 · 10507 阅读 · 1 评论 -
RedHat7配置yum源
RedHat7配置yum源: 由于在默认情况下,RedHat7的Yum没有源,并且RedHat的Yum源只对注册的用户生效。如果不使用Yum的话,很多软件的彼此依赖关系的确让人心累,所以手动改成Centos的Yum源就行了。 第一步: 先删除RedHat的yum,RedHat原本的Yum没注册是用不了的。 输入命令:rpm -aq|grep yum|xargs rpm -e原创 2016-10-23 16:53:47 · 2169 阅读 · 0 评论 -
Linux系统编程-文件IO(一)
最近在在实验楼上学Linux,做点笔记。上面的课程对于学习linux还不错,有兴趣可以看看。 文件IO: Linux提供给了用户程序一些接口,用来调用执行相关的功能。大多数Linux文件I\O只需要用到5个函数:open,read,write,lseek和close 文件描述符: 文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当写一个文件时,用原创 2016-11-09 20:26:39 · 555 阅读 · 0 评论 -
gdb的基本使用命令清单
GDB调试: 在linux环境中,GDB是主要的调试工具,用来调试C/C++程序。 如果要调试程序,需要在gcc编译时加上-g参数,比如gcc -g -o test test.c 进入gdb调试:gdb test 退出gdb调试:quit gdb常用命令: 命令 简写 功能 run 无 开始运行程序(如果没有断点,会直接运行完) list l 查看源代原创 2016-11-11 16:28:42 · 536 阅读 · 0 评论 -
Linux系统编程之模拟命令cp
最近在学习linux环境编程,用学到的文件编程写了一个模拟命令 cp的代码,当然有很多不足之处,但是基本功能都实现了。 文件编程用到的函数不明白的可以百度。其实学这个也只是为了加深对Linux系统的理解。代码有什么问题请回复,方便大家交流学习。#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <dirent.h>#inc原创 2016-11-12 21:31:02 · 2018 阅读 · 0 评论 -
Unix多进程编程-wait和waitpid
wait()函数所需头文件:#include <sys/types.h> #include<sys/wait.h> 函数原型:pid_t wait(int *status) 作用:wait()函数会暂停当前进程的执行,直到有子进程的结束,此时wait()函数会返回子进程结束状态值,由status接收,如果对这个子进程是如何结束的并不关心,那么这个参数也可以设为NULL。如果执行成功会返回子进程的原创 2016-11-19 14:15:01 · 738 阅读 · 0 评论 -
linux下vmware12不能3D加速解决方法
最近终于舍弃了Winodws,装了个Centos7。以前用虚拟机运行Linux的时候,用字符界面也卡起卡起的,这下终于爽了。 在centos7上安装vmware12还算比较顺利,但是运行在虚拟机上运行windows7的时候,提示"No 3D support is available from the host",大概意思就是在虚拟机上你不能启用3D加速等等,也就是玩需要点好点的界面的游戏基原创 2016-12-27 21:05:56 · 11910 阅读 · 3 评论 -
centos7安装Python3.5
第一步:先安装可能需要的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel 第二步:在官网上下载python3.5并解压 https://www.python.org/downloads/release/python-351/ 哪个包都行。tgz格式的解压命令是原创 2016-12-27 20:39:40 · 1125 阅读 · 0 评论 -
Centos7安装XMind
第一步:在官网http://www.xmind.net/download/linux/ 下载XMind(想吐槽下)网上找的大部分教程都说的下载的是deb包,然后解压了会有两个压缩包之类的。然而官网上下载下来的是zip。。。。。第二步:解压unzip xmind-8-update1-linux.zip -d ~/Xmind。-d参数可以让你选定解压的目录。(如果提示没有unzip该命令,yum安装一下原创 2016-12-29 10:34:15 · 3494 阅读 · 2 评论 -
进程间通信的方式(一):管道
管道(一).通信方式:进程间通信又称IPC(Inter Process Communication),它可以通过文件 管道 有名管道 共享内存 消息队列 信号量 套接字这几个方式进行通信,但是文件这种以及消息队列基本已被淘汰。 所以常用的通信方式有: 1.管道 2.信号 3.共享映射区 4.本地套接字(二).管道基本概念:而其中的管道机制,是属于最简单的一种通信方式。它适用于有血缘关系的进原创 2017-01-15 23:31:52 · 734 阅读 · 0 评论 -
线程同步(互斥锁、读写锁、条件变量、信号量)
线程同步:线程同步指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。保证了数据的一致性。举个简单的例子就是,当一个线程将全局变量var=100加上10,另外一个线程时将var乘以2,这样最后得出的结果因为cpu不同的调度策略导致不同的结果,可能是220也可能是210还可能是110或者200,220和210可以理解,无非就是一个先操作一个后操原创 2017-02-16 22:29:25 · 2849 阅读 · 0 评论 -
进程间通信的方式(二):共享映射区
进程间通信方式(二)共享映射区(一).通信方式:进程间通信又称IPC(Inter Process Communication),它可以通过文件 管道 有名管道 共享内存 消息队列 信号量 套接字这几个方式进行通信,但是文件这种以及消息队列基本已被淘汰。 所以常用的通信方式有: 1.管道 2.信号 3.共享映射区 4.本地套接字(二).共享映射区基本概念:通过mmap系统调用,把普通文件映射原创 2017-01-18 00:28:30 · 951 阅读 · 0 评论 -
进程组、会话、守护进程
(一).进程组进程组,也称为作业,代表一个或多个进程的集合。并且每个进程都属于一个进程组。当我们调用fork()函数创建子进程时,默认子进程与父进程属于同一个进程组,并且进程组ID等于组长进程ID,默认第一个进程是组长ID。进程组组长可以创建一个进程组以及创建该组的进程,只要该进程组中还有进程存在,那这个进程组就存在,不管组长进程有没有终止。相关函数:1.获取当前进程的组ID: 函数原型:pid_原创 2017-02-14 18:08:10 · 896 阅读 · 0 评论 -
Unix信号机制(下)
信号(下)(一)时序竞态在信号(上)里面讲解了信号基础的用法。但是考虑一下这样的场景,比如我用alarm函数定时3秒,但是在定时完成后,cpu调度去执行其它的进程了,过了4秒,才回到之前执行到的地方,但是alarm定时的时间已经过了,那么还没等到执行下一条语句,信号就先被处理了,可能导致程序的逻辑出现问题。这里用一个例子说明。 首先介绍一个函数 函数原型:int pause(void) 返回值原创 2017-02-14 16:14:29 · 667 阅读 · 0 评论 -
Unix信号机制(上)
(一).信号基本概念相关概念:信号是软件中断,它提供了一种处理异步事件的方法。当A和B进行通信时,B收到了信号,不管程序执行到了哪,都会暂停去处理信号。并且每个进程收到的所有信号,都是内核负责发送和处理,而我们捕捉到信号编写的处理函数,只是相当于内核处理的时候调用的一个函数。在头文件signal.h中,信号名都被定义为正整数变量(信号编号),在linux下,可以使用kill -l查看。信号产生方法:原创 2017-02-13 22:42:57 · 1151 阅读 · 0 评论 -
Unix线程概念、控制原语、属性
线程:线程基础概念:线程在Linux中又称轻量级进程。并且它和进程都有PCB(进程控制块),但是区别是进程的虚拟地址空间是独享的,也就是每个进程都有自己的虚拟地址空间,但是线程的PCB是共享的,在同一个虚拟地址空间里面,每个线程有自己的PCB。虽然每个线程都有自己的PCB,但是从内核的角度来看,进程和线程是一样的,这是因为同一个虚拟地址空间里面的每个线程的PCB指向的内存资源的三级页表是相同的。在L原创 2017-02-15 23:36:11 · 1647 阅读 · 0 评论 -
GDT、GDTR、LDT、LDTR
全局描述符表GDT(Global Descriptor Table):在整个系统中,全局描述符表只有一张(一个处理器对应一个GDT),GDT可以被放在内存中的任意位置,但CPU必须知道GDT的入口,也就是基地址在哪。作用:根据GDT的名字就可以得出它是专门用来存描述符的,每个描述符都对应了一个段。GDTR:之前说了CPU必须直到GDT的基地址,所以寄存器GDTR就是用来干这件事的。它的结构如图,32原创 2017-02-24 21:42:02 · 1313 阅读 · 0 评论 -
Sicp第1章学习总结
这个博客仅仅记录了学了一定阶段写下的看法和总结,如果有错误的地方请指正,大家一起学习交流,毕竟巫书还是比较抽象的。。。。。 先安利一个不会的习题我就去看答案的地方,里面也给出了测试代码的环境。http://sicp.readthedocs.io/en/latest/index.html第一章 构造过程抽象第1章主要是介绍了lisp基本的语法和怎样一步一步把一些过程抽象出来,主要是以一些常见的数学问原创 2017-01-19 21:43:57 · 637 阅读 · 0 评论