MySQL view, MERGE, TEMPTABLE

MySQL view, MERGE, TEMPTABLE 数据库视图 数据库视图的创建是基于SQL SELECT query和JOIN的。视图和表很相似,它也包含行和列,所以可以直接对它进行查询操作。另外大多数的数据库同样允许进行UPADTE操作,但必须满足一定的条件。 MySQL View MySQL从5.x版本支持视图,并且基本符合SQL: 2003标准。 MySQL中执行查询视图的方式有一下两种: MySQL会合并输入的查询语句和视图的查询声明然后执行合并后的语句并返回结果。 MySQL会基于视图的查询声明创建一个temporary table, 当执行查询语句时会查询这张temporary table 如果创建视图的时候并未指定查询方式,MySQL会默认优先使用第一种,但如果视图的查询声明中的SELECT使用了聚合函数(MIN, MAX, SUM, COUNT, AVG, etc., or DISTINCT, GROUP BY, HAVING, LIMIT, UNION, UNION ALL, subquery.),那么视图查询会使用第二种方式。 Create View 创建MySQL视图可以使用CREATE VIEW声明: CREATE [ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}] VIEW [database_name].[view_name] AS [SELECT statement] ALGORITHM: MySQL有三种视图执行策略, 分别是MERGE, TEMPTABLE, UNDEFINED. 使用MERGE策略,MySQL会先将输入的查询语句和视图的声明语句进行合并,然后执行合并后的语句并返回。但是如果输入的查询语句中不允许包含一些聚合函数如: MIN, MAX, SUM, COUNT, AVG, etc., or DISTINCT, GROUP BY, HAVING, LIMIT, UNION, UNION ALL, subquery。同样如果视图声明没有指向任何数据表,也是不允许的。如果出现以上任意情况, MySQL默认会使用UNDEFINED策略。 ...

2018-02-11 · 1 min · 157 words · -

extundelete linux 数据恢复

extundelete linux 数据恢复 http://blog.51cto.com/ixdba/1566856 Linux下高效数据恢复软件extundelete应用实战 推荐 原创南非蚂蚁2014-10-22 17:58:11评论(8)11866人阅读 推荐: 10年技术力作: 《高性能Linux服务器构建实战Ⅱ》全网发行,附试读章节和全书实例源码下载! 作为一名运维人员,保证数据的安全是根本职责,所以在维护系统的时候,要慎之又慎,但是有时难免会出现数据被误删除的情况,在这个时候改如何快速、有效地恢复数据呢?本文我们就来介绍一下Linux系统下常用的几个数据恢复工具。 一、如何使用"rm -rf"命令 在Linux系统下,通过命令"rm -rf"可以将任何数据直接从硬盘删除,并且没有任何提示,同时Linux下也没有与Windows下回收站类似的功能,也就意味着,数据在删除后通过常规的手段是无法恢复的,因此使用这个命令要非常慎重。在使用rm命令的时候,比较稳妥的方法是把命令参数放到后面,这样有一个提醒的作用。其实还有一个方法,那就是将要删除的东西通过mv命令移动到系统下的/tmp目录下,然后写个脚本定期执行清除操作,这样做可以在一定程度上降低误删除数据的危险性。 其实保证数据安全最好的方法是做好备份,虽然备份不是万能的,但是没有备份是万万不行的。任何数据恢复工具都有一定局限性,都不能保证完整地恢复出所有数据,因此,把备份作为核心,把数据恢复工具作为辅助是运维人员必须坚持的一个准则。 二、extundelete与ext3grep的异同 在Linux下,基于开源的数据恢复工具有很多,常见的有debugfs、R-Linux、ext3grep、extundelete等,比较常用的有ext3grep和extundelete,这两个工具的恢复原理基本一样,只是extundelete功能更加强大,本文重点介绍extundelete的使用。 三、extundelete的恢复原理 在介绍使用extundelete进行恢复数据之前,简单介绍下关于inode的知识。在Linux下可以通过"ls –id"命令来查看某个文件或者目录的inode值,例如查看根目录的inode值,可以输入: [root@cloud1 ~]# ls -id / 2 / 由此可知,根目录的inode值为2。 在利用extundelete恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息 (根目录的inode一般为2) 来获得当前文件系统下所有文件的信息,包括存在的和已经删除的文件,这些信息包括文件名和inode。然后利用inode信息结合日志去查询该inode所在的block位置,包括直接块,间接块等信息。最后利用dd命令将这些信息备份出来,从而恢复数据文件。 四、 安装extundelete extundelete的官方网站是http://extundelete.sourceforge.net/ ,其目前的稳定版本是extundelete-0.2.4。,在安装extundelete之前需要安装e2fsprogs和e2fsprogs-libs两个依赖包。 e2fsprogs和e2fsprogs-libs安装非常简单,这里不做介绍。下面是extundelete的编译安装过程: [root@cloud1 app]#tar jxvf extundelete-0.2.4.tar.bz2 [root@cloud1 app]#cd extundelete-0.2.4 [root@cloud1 extundelete-0.2.4]#./configure [root@cloud1 extundelete-0.2.4]#make [root@cloud1 extundelete-0.2.4]#make install 成功安装extundelete后,会在系统中生成一个extundelete可执行文件。extundelete的使用非常简单,读者可以通过"extundelete -help"获得此软件的使用方法。 五、extundelete 用法详解 extundelete安装完成后,就可以执行数据恢复操作了,本节详细介绍下extundelete每个参数的含义。extundelete用法如下: extundelete -help 命令格式: extundelete [options] [action] device-file 其中参数 (options) 有: -version, -[vV],显示软件版本号。 -help,显示软件帮助信息。 -superblock, 显示超级块信息。 ...

2018-02-08 · 3 min · 476 words · -

install cloud9 ide on debian/ubuntu

install cloud9 ide on debian/ubuntu https://github.com/c9 git clone https://github.com/c9/core sdk cd sdk/ ./scripts/install-sdk.sh node server.js -p 8181 -l 0.0.0.0 -w /our/project/directory/-a : https://www.vultr.com/docs/install-the-cloud9-ide-on-debian-wheezy

2018-02-07 · 1 min · 23 words · -

AES

AES AES算法简介 AES的全称是Advanced Encryption Standard,意思是高级加密标准。它的出现主要是为了取代DES加密算法的,因为我们都知道DES算法的密钥长度是56Bit,因此算法的理论安全强度是2的56次方。但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,虽然出现了3DES的加密方法,但由于它的加密时间是DES算法的3倍多,64Bit的分组大小相对较小,所以还是不能满足人们对安全性的要求。于是1997年1月2号,美国国家标准技术研究所宣布希望征集高级加密标准,用以取代DES。AES也得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮: Rijndael,Serpent,Twofish,RC6和MARS。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael算法获胜。 在密码标准征集中,所有AES候选提交方案都必须满足以下标准: 分组大小为128位的分组密码。 必须支持三种密码标准: 128位、192位和256位。 比提交的其他算法更安全。 在软件和硬件实现上都很高效。 AES密码与分组密码Rijndael基本上完全一致, Rijndael 分组大小和密钥大小都可以为128位、192位和256位。然而AES只要求分组大小为128位,因此只有分组长度为128Bit的Rijndael才称为AES算法。本文只对分组大小128位,密钥长度也为128位的Rijndael算法进行分析。密钥长度为192位和256位的处理方式和128位的处理方式类似,只不过密钥长度每增加64位,算法的循环次数就增加2轮,128位循环10轮、192位循环12轮、256位循环14轮。 ECB模式 (电子密码本模式: Electronic codebook) ECB是最简单的块密码加密模式,加密前根据加密块大小 (如AES为128位) 分成若干块,之后将每块使用相同的密钥单独加密,解密同理。 CBC模式 (密码分组链接: Cipher-block chaining) CBC模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。第一个明文块与一个叫初始化向量的数据块异或。 CBC模式相比ECB有更高的保密性,但由于对每个数据块的加密依赖与前一个数据块的加密所以加密无法并行。与ECB一样在加密前需要对数据进行填充,不是很适合对流数据进行加密。 CFB模式(密文反馈:Cipher feedback) 与ECB和CBC模式只能够加密块数据不同,CFB能够将块密文 (Block Cipher) 转换为流密文 (Stream Cipher) 。 注意:CFB、OFB和CTR模式中解密也都是用的加密器而非解密器。 CFB的加密工作分为两部分: 将一前段加密得到的密文再加密; 将第1步加密得到的数据与当前段的明文异或。 由于加密流程和解密流程中被块加密器加密的数据是前一段密文,因此即使明文数据的长度不是加密块大小的整数倍也是不需要填充的,这保证了数据长度在加密前后是相同的。 OFB模式 (输出反馈: Output feedback) OFB是先用块加密器生成密钥流 (Keystream) ,然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全一样的。 http://blog.csdn.net/songdeitao/article/details/17267443 https://blog.csdn.net/qq_28205153/article/details/55798628 import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class AESCodec { public static byte[] encrypt(String key, byte[] value) { try { SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/Nopadding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); return cipher.doFinal(value); } catch (Exception ex) { ex.printStackTrace(); } return null; } public static byte[] decrypt(String key, byte[] encrypted) { try { SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/Nopadding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] original = cipher.doFinal(encrypted); return original; } catch (Exception ex) { ex.printStackTrace(); } return null; } } https://blog.poxiao.me/p/advanced-encryption-standard-and-block-cipher-mode/ ...

2018-02-07 · 1 min · 134 words · -

jest

jest https://stackoverflow.com/questions/68956636/how-to-use-esm-tests-with-jest package.json use es module { "type": "module", "devDependencies": { "jest": "^29.7.0" }, "scripts": { "test": "node --experimental-vm-modules ./node_modules/.bin/jest" } } # run all test npm run test # run one test npm run test -- infoq.test.js

2018-02-07 · 1 min · 38 words · -

linux test disk io

linux test disk io time dd if=/dev/zero of=test.dbf bs=8k count=300000 oflag=direct http://blog.csdn.net/zqtsx/article/details/25487185

2018-02-07 · 1 min · 12 words · -

pixelbook, chromeos, developer mode, crouton

pixelbook, chromeos, developer mode, crouton developer mode https://www.theverge.com/2017/11/16/16656420/google-pixelbook-chromebook-development-linux-crouton-how-to hold the Esc, Refresh, and power button for a little while and the laptop reboots into Recovery Mode. Once you’re there, you hit Ctrl-D to boot into Developer Mode. 同时按esc refresh, poeer button, 直到出现 recovery mode, 就是提示插入u盘的界面, 这个时候按ctrl-d(不需要插入u盘, 插入u盘会自动进入恢复模式。) 开启开发者模式会清空数据。 crouton https://github.com/dnschneid/crouton sudo crouton -r list sudo cronton -t list sudo crouton -t xfce # ubuntu 16.4 sudo crouton -r xenial -t xfce sudo startxfce4 sudo enter-chroot startxfce4 sudo delete-chroot -a chromeos ubuntu 切换 ctrl+shift+alt+back ...

2018-02-04 · 1 min · 107 words · -

Java string hashing in Go

Java string hashing in Go https://www.manniwood.com/2016_03_20/fun_with_java_string_hashing.html func ActualHash(s string) int32 { var h int32 for i := 0; i < len(s); i++ { h = 31*h + int32(s[i]) } return h }

2018-01-31 · 1 min · 32 words · -

docker basic, commands

docker basic, commands commands # Docker images by tag docker rmi $(docker images --filter=reference="tag_name_0" -q) # Docker查看容器完整的容器 ID 和镜像 ID docker ps -a --no-trunc docker exec nexus3 cat /nexus-data/admin.password docker ps --filter"name=test-nginx" docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}" docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.Status}}\t{{.Names}}" docker ps --format "table {{.ID}}\t{{.IMAGE}}\t{{.CREATED}}\t{{.STATUS}}\t{{.NAMES}}" docker inspect xxx docker container update --restart=no <containername> # 修改 docker 容器为开机启动 docker container update --restart=always container_0 # 查看 volume 目录 docker info | grep "Docker Root Dir" 批量删除镜像 docker rmi $(docker images | grep "name0" | awk '{print $3}') docker rmi -f $(docker images | grep "name0" | awk '{print $3}') docker restart foo # 列出所有的容器 ID docker ps -aq # 停止所有的容器 docker stop $(docker ps -aq) # 删除所有的容器 docker image ls docker rm $(docker ps -aq) # 删除所有的镜像 docker rmi $(docker images -q) # 复制文件 docker cp mycontainer:/opt/file.txt /opt/local/ docker cp /opt/local/file.txt mycontainer:/opt/ docker port docker port :列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。 ...

2018-01-27 · 6 min · 1129 words · -

ansible create file

ansible create file - name: ensure file exists copy: content: "" dest: /etc/nologin force: no group: sys owner: root mode: 0555 https://stackoverflow.com/questions/28347717/how-to-create-an-empty-file-with-ansible

2018-01-25 · 1 min · 22 words · -

linux network

linux network https://segmentfault.com/a/1190000008836467 https://segmentfault.com/a/1190000008926093 https://segmentfault.com/a/1190000009249039

2018-01-22 · 1 min · 5 words · -

REST

REST REST Representational State Transfer

2018-01-22 · 1 min · 5 words · -

隧道协议

隧道协议 隧道技术的实质是用一种网络层的协议来传输另一种网络层协议,其基本功能是封装和加密,主要利用网络隧道来实现。 https://en.wikipedia.org/wiki/Tunneling_protocol https://baike.baidu.com/item/%E9%9A%A7%E9%81%93%E5%8D%8F%E8%AE%AE/5927649

2018-01-20 · 1 min · 4 words · -

内核态, 用户态

内核态, 用户态 用户态 Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段 (TSS) 中I/O许可位图 (I/O Permission Bitmap) 中规定的可访问端口进行直接访问。 内核态 Ring0 在处理器的存储保护中, 核心态 ,或者特权态 (与之相对应的是用户态) ,是操作系统内核所运行的模式。运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问。 内核态和用户态 核心态和用户态是操作系统两种运行级别。 核心态就是拥有资源较多的状态,或者说访问资源多的状态,也称之为特权态;相对来说,用户态就是非特权态,访问资源将受到限制。 核心态下CPU可执行任何指令,而用户态下CPU只能执行非特权指令。当CPU处于核心态时可随意进入用户态;而处于用户态时,切换到核心态只有在系统调用和中断时才能发生。一般程序一开始都是运行与用户态,当程序需要系统资源时,就必须通过中断进入核心态。 用户态切换到内核态的3种方式 系统调用 这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。 异常 当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。 外围设备的中断 当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。 这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。 核心态和用户态各有优势: 运行在核心态的程序可访问的资源多,但可靠性、安全性要求高,维护管理比较复杂。一个程序运行在哪取决于其对资源和效率的需求。 用户栈和内核栈 内核在创建进程的时候, 会为进程创建对应的堆栈. 每个进程有两个栈, 一个用户栈, 存在于用户空间; 一个内核栈,存在于内核空间。当进程运行在用户态时,CPU堆栈指针寄存器里的内容是用户堆栈地址,使用用户栈;在核心态时, 同理。 当进程因为中断或系统调用而进入内核态时,进程所使用的堆栈也要有用户栈转到内核栈。进程陷入内核态后,先把用户堆栈的地址保存到内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址;当恢复到用户态时,把内核栈中保存的用户栈的地址恢复到堆栈指针寄存器即可。 进程从用户态转到内核态时,进程的内核栈总是空的,所以进程陷入内核的时候,直接把栈顶地址给堆栈指针寄存器即可。 http://www.cnblogs.com/balingybj/p/4783119.html http://www.cnblogs.com/Allen-rg/p/7171105.html http://blog.csdn.net/xifeijian/article/details/9080895 https://www.zhihu.com/question/40147261 https://www.jianshu.com/p/255c6c7603d0 https://zhuanlan.zhihu.com/p/279354447

2018-01-19 · 1 min · 48 words · -

filebeat

filebeat elasticsearch output 配置索引 vim /etc/filebeat/filebeat.yml setup.template.name: "filebeat-" setup.template.pattern: "filebeat-*" output.elasticsearch: hosts: ["http://192.168.6.8:9200"] index: "filebeat-%{+yyyy.MM.dd}" sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch Create a file with a .repo extension (for example, elastic.repo) in your /etc/yum.repos.d/ directory and add the following lines: [elastic-6.x] name=Elastic repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md Your repository is ready to use. For example, you can install Filebeat by running: sudo yum install filebeat To configure the Beat to start automatically during boot, run: ...

2018-01-19 · 1 min · 82 words · -

logstash

logstash /etc/logstash/conf.d/logstash.conf input { redis { id => "system-log" data_type=>"list" host=>"127.0.0.1" port=>"6379" key=>"system-log" } redis { id => "app-log" data_type=>"list" host=>"127.0.0.1" port=>"6379" key=>"app-log" } } output { if "app-log" in [tags] { elasticsearch { id => "elk-es-app" hosts => "127.0.0.1:9200" index => "logstash-app-log-%{+YYYY.MM.dd}" } }else{ elasticsearch { id => "elk-es-sys" hosts => "127.0.0.1:9200" index => "logstash-sys-log-%{+YYYY.MM.dd}" } } }

2018-01-18 · 1 min · 59 words · -

chrome standalone 离线安装

chrome standalone 离线安装 https://www.google.com/chrome/browser/thankyou.html?standalone=1&platform=win&installdataindex=defaultbrowser standalone=1 : 确认下载离线安装包 platform=win : 适用平台为windows installdataindex=defaultbrowser : 安装后设chrome为当前默认浏览器 extra=stablechannel : 指定版本为稳定版 (候选列表同上) 作者: DevNull 链接: https://www.zhihu.com/question/19981495/answer/83273865 来源: 知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2018-01-18 · 1 min · 24 words · -

golang git server, gogs, gitea

golang git server, gogs, gitea gitea 的文档 只提到了docker compose的部署方式, 想改成podman 还需要折腾一下, gogs 的文档 更清晰一些方便使用podman podman run --rm --name=gogs -p 10022:22 -p 10880:3000 -v gogs-data:/data gogs/gogs:latest http://192.168.50.13:10880 Database Type: sqlite3 Application Name: pingd Domain: 192.168.50.13 SSH Port: 1022 docker run --name=gogs -p 10022:22 -p 10880:3000 -v /var/gogs:/data gogs/gogs # docker for gogs sudo systemctl status docker sudo systemctl start docker sudo systemctl enable docker sudo docker pull gogs/gogs mkdir -p /data/gogs sudo docker run -name=gogs -p 10022:22 -p 10080:3000 -v /data/gogs:/data gogs/gogs sudo docker start gogs sudo docker stop gogs sudo docker rm gogs Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 所有平台,包括 Linux、Mac OS X、Windows 以及 ARM 平台。 ...

2018-01-17 · 1 min · 135 words · -

linux 内存盘 tmpfs

linux 内存盘 tmpfs # archlinux tmp dir resize sudo mount -o remount,size=10G,noatime /tmp mount tmpfs /tmp -t tmpfs -o size=1024m 把内存当硬盘, 提速你的 linux 系统 场景: 电脑内存太大用不了那么多, 空着浪费, 所以利用起来。内存读写速度高用来缓存或者编译, 甚至存临时文件最好不过了~~ Windows 下有一种叫法叫做内存盘, Linux 自然也有, 看了 Linux 中 ramdisk, tmpfs, ramfs 比较与说明这篇文章后, 决定使用 tmpfs 文件系统。 关于 tmpfs和VM linux 的内存 (VM) ,包括 ram和 swap两部分。 ram 就是你的物理内存, swap 就是在装系统的时候划分的swap分区(在win下叫做页面文件,默认位于C:\pagefiles.sys)。 VM也是程序所能使用的最大内存上限,tmpfs本质上也是VM,tmpfs划出VM的部分页面作为一个文件系统. 关于 tmpfs 和 ramdisk linux 下的 ramdisk 是由内核提供的, 要使用之, mount 命令挂载即可。不需要第三方工具。但因为它会被视为块设备, 所以仍然需要格式化该文件系统。 ramdisk 一旦创建就会占用固定大小的物理内存, tmpfs则是动态分配。 ...

2018-01-16 · 1 min · 121 words · -

微内核 宏内核

微内核 宏内核 微内核 Micro Kernel 微内核: 功能被划分成独立的过程,过程间通过IPC进行通信。模块化程度高,一个服务失效不会影响另外一个服务。 在微内核中,大部分内核都作为独立的进程在特权状态下运行,它们通过消息传递进行通讯。在典型情况下,每个概念模块都有一个进程。因此,如果在设计中有一个系统调用模块,那么就必然有一个相应的进程来接收系统调用,并和能够执行系统调用的其它进程 (或模块) 通讯以完成所需任务。 在这些设计中,微内核部分经常只不过是一个消息转发站: 当系统调用模块要给文件系统模块发送消息时,消息直接通过内核转发。这种方式有助于实现模块间的隔离。 (某些时候,模块也可以直接给其它模块传递消息。) 在一些微内核的设计中,更多的功能,如I/O等,也都被封装在内核中了。但是最根本的思想还是要保持微内核尽量小,这样只需要把微内核本身进行移植就可以完成将整个内核移植到新的平台上。其它模块都只依赖于微内核或其它模块,并不直接直接依赖硬件。 微内核设计的一个优点是在不影响系统其它部分的情况下,用更高效的实现代替现有文件系统模块的工作将会更加容易。我们甚至可以在系统运行时将开发出的新系统模块或者需要替换现有模块的模块直接而且迅速的加入系统。另外一个优点是不需要的模块将不会被加载到内存中,因此微内核就可以更有效的利用内存。 宏内核 Monolithic Kernel / macro kernel 单内核: 也称为宏内核。将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效 单内核是个很大的进程。他的内部又能够被分为若干模块 (或是层次或其他) 。但是在运行的时候,他是个单独的二进制大映象。其模块间的通讯是通过直接调用其他模块中的函数实现的,而不是消息传递。 单内核的支持者声称微内核的消息传递开销引起了效率的损失。微内核的支持者则认为因此而增加的内核设计的灵活性和可维护性能够弥补任何损失。 微内核的系统有WindowNT,Minix,Mach,etc. 宏内核的系统有Unix,Linux,etc. https://www.zhihu.com/question/20314255 http://blog.sciencenet.cn/blog-1225851-807086.html https://segmentfault.com/a/1190000002711544

2018-01-15 · 1 min · 32 words · -