<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
      <title>jcheng 的小窝</title>
      <link>https://hyperv0id.github.io/quartz</link>
      <description>Last 10 notes on jcheng 的小窝</description>
      <generator>Quartz -- quartz.jzhao.xyz</generator>
      <item>
    <title>02-SQL</title>
    <link>https://hyperv0id.github.io/quartz/system/information-system/02-SQL</link>
    <guid>https://hyperv0id.github.io/quartz/system/information-system/02-SQL</guid>
    <description>常见命令 § 查看所有数据库 show database; -- 查看所有数据库 打开指定数据库 use &lt;name&gt;; -- 打开指定数据库 显示库中所有表 show tables; -- 显示库中所有表 指定库中所有表 show tables from &lt;name&gt;; -- 指定库中所有表 创建表 -- 创建表 create table &#039;表名&#039;( &lt;字段名&gt; &lt;字段类型&gt; &lt;约束&gt;, &lt;字段名&gt; &lt;字段类型&gt; &lt;约束&gt; primary key &lt;字段名&gt;); 查看指定表的结构 desc &lt;表名&gt;; -- 查看指定表的结构 显示表中的所有数据 select * from &lt;表名&gt;; -- 显示表中的所有数据 DQL（Data Query Language） § DQL（Data Query Language）：数据查询语言 DQL也称为“数据检索语句”，从数据中提取到需要的信息，SELECT使用最为频繁； 1 - 基础查询 § SELECT 要查询的东西 FROM 表名; 通过select查询完的结果 ，是一个虚拟的表格，不是真实存在 要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数 2 - 条件查询 § 条件查询：根据条件过滤原始表的数据，查询到想要的数据 select 要查询的字段|表达式|常量值|函数 from 表 where 条件 ; 条件表达式 salary &gt; 1000; name != &#039;cjj&#039;; salary &lt;= 1000 &amp;&amp; age &gt;= 18; 模糊条件 last_name like &#039;a%&#039; 3 - 排序查询 § 语法 select 要查询的东西 from 表 where 条件 -- 排序部分 order by 排序的字段|表达式|函数|别名 【asc|desc】 4 - 常见函数 § 4.</description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item><item>
    <title>Linux</title>
    <link>https://hyperv0id.github.io/quartz/system/os/Linux/Linux</link>
    <guid>https://hyperv0id.github.io/quartz/system/os/Linux/Linux</guid>
    <description>简介与基本概念 § 开源 一切皆文件 多任务、多用户 交互性非常好 终端 GUI也支持 网络功能强大 多平台 支持多处理器 shell是什么 § cli：command line interface，命令行 terminal：终端，人与计算机交互的接口，早期终端是需要连接计算机上的外设 console：控制台，系统管理员的终端 shell：终端模拟器（现在都不用terminal和concole了） Linux用户管理 § 新建用户 § sudo useradd [options] [username] 常用选项： -d：指定用户主目录 -g：用户所在的用户组 -G：用户附加组 -s：用户登陆的shell 切换用户 § su [username] # 不输入就是超级用户 不设密码不能su 设置密码 § passwd [options] # 修改别人的需要超级用户 修改用户 § 如果用户组或者文件夹设置错了，可以改 sudo usermod [options] [username] Linux文件管理 § 常用Shell命令 § 查看帮助 § man [命令名字] 当前文件夹信息 § ls 当前文件夹下所有文件信息 § tree 切换目录 § cd [PATH] 查找文件 § find [options] -path：在哪个目录下找 -exec：找到后怎么执行 -name：文件名，-iname会忽略大小写 -amin [n]：过去几分钟内使用过 -type：文件类型，有dfl 查找命令 § whereis [command] 创建文件 § touch name # touch命令 &gt; name # 使用管道 查看CPU占用 § top # q退出 查看进程 § ps 重定向 § 管道 § 将两个或者多个命令连接到一起，一个程序的输出可以作为下一个程序的输入 ls | grep 1 # 找文件名带1的 cat 1.</description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item><item>
    <title>Lec01-Introduction and Examples</title>
    <link>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec01-Introduction-and-Examples</link>
    <guid>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec01-Introduction-and-Examples</guid>
    <description> OS 设计：怎么运行的 xv6小型操作系统：实践经验 目标： 对硬件抽象 在许多应用程序中复用硬件（multiplexing） 进程隔离（并发 共享文件 安全系统/权限系统 不会阻碍应用程序的性能 结构 § FS：文件系统 访问控制 内核-API： § 内核态：操作系统启动后会一直执行的部分，比如文件访问 用户态：操作系统启动后，操作系统之上的程序执行的部分。比如qq，微信，浏览器 系统调用 打开文件：open(&quot;filename&quot;， 1)，系统会获取到open的参数，执行一些实现了open的内核代码 创建一个新线程：pid = fork() … why hard and interesting § QEMU: 硬件模拟器 操作系统的困难： 解决一系列矛盾 高性能、高度抽象 责任重大（powerful）、易于使用（simple api） 灵活接口、安全的接口 有趣的点： 靠近计算机运行原理 靠近基础架构 便于你解决上层应用程序的bug，因为可能与操作系统特性有关 unix系统调用简介 § 系统调用时操作系统提供服务的接口 课程使用xv6并运行在RISC-V处理器上，不过这里使用QEMU模拟 read, write, exit § 这个简单的程序使用了三个系统调用： read： 接受三个参数：文件描述符、指向内存的指针、读取最大长度 文件描述符：0代表console的输入，1代表console的输出 返回值：读取到的字节数 write： 接受参数和read相同，只不过是向console输出 exit：程序返回，告诉操作系统自己的状态，并让操作系统杀死自己。 open调用 § open调用会创建新的文件描述符。如果建立成功，会建立唯一的文件到设备的访问路径。调用失败会返回-1并设置全局变量errno指明失败原因。 open 调用必须指定以下文件访问模式之一： O_RDONLY：以只读方式打开； O_WRONLY：以只写方式打开； O_RDWR ：以读写方式打开。 另外，还有以下几种可选模式的组合（ 用按位或 || 来操作 ）： O_APPEND：把写入数据追加在文件的末尾； O_TRUNC：把文件长度设置为零，丢弃已有的内容； O_CREAT：如果需要，就按照参数 mode 中给出的访问模式创建文件； O_EXCL：与 O_CREAT 一起使用，确保调用者创建出文件。使用这个模式可以防止两个程序同时创建同一个文件，如果文件已经存在，open 调用将失败。 Shell § fork调用 § 就是复制一份程序，执行后会有两个完全一样的进程，包括寄存器、内存，唯一的区别的进程编号pid。 fork后OS会选择一个执行，但创建新线程会产生额外的开销，所以概率上会先执行父线程。 fork后因为需要复制内存，所以会产生开销，但是可能不会使用这些内存，这产生了很多浪费，所以操作系统可能会在程序访问时创建内存。 在Shell中，shell会创建一个子线程处理，比如ls，mkdir，然后在子线程中调用exec系统调用执行。 exec § 系统调用exec是以新的进程去代替原来的进程，原来的线程不复存在了，但程序的pid不变。可以理解成程序跑去执行另一个程序了，除非exec失败，后面的代码都不会执行。 在shell中不会使用exec执行，因为这会关闭shell，shell会fork一个子线程然后在子线程中执行exec。 wait § wait会让父线程等待子线程执行，会查看自己的子线程，只要有一个子线程运行结束了，父线程才会执行后面的代码。 如果存在多个子线程，即fork过多次，那么父线程需要wait多次。 IO 重定向 § echo hello &gt; out 上面代码的功能是将echo程序执行的结果输出到out文件中 cat &lt; out 这个代码的功能是从out中读取然后让cat输出 图片中close(1)只会在子线程中执行，会将输出重定向，此时程序执行后会将内容写到output.</description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item><item>
    <title>Lec03</title>
    <link>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec03</link>
    <guid>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec03</guid>
    <description>3.1 - OS的隔离性 § 我们希望各个程序之间互不干扰，一个程序崩溃不会导致另外的程序错误。比如说echo炸了不会导致shell错误，这在没有OS的单片机程序上是不可能的。 OS会让每一个程序运行一段时间，一段时间后交给另外的程序运行，这样程序就看起来一起运行了 3.1.1 - 内存隔离 § 内存隔离：一个程序不会覆盖另外的程序 在复用时，我们需要强隔离性 Unix接口抽象了硬件，可以方便的实现复用和物理内存方面的强隔离 不直接操作CPU，不再将CPU分配到某个程序 3.</description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item><item>
    <title>Lec04</title>
    <link>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec04</link>
    <guid>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec04</guid>
    <description>Page Tables § [TOC] 对虚拟内存的印象： § 一个表将虚拟地址映射到物理地址 A：偏移来表示地址 间接地表示物理地址，44为映射到64位地址 每个地址有代理的地址空间，虚拟地址的地位是相同的 允许保护每个进程的地址 是隔离的基础，每个进程都可以假装自己有空间可用 有一种某个形式的映射，可以帮助实现隔离 Address Spaces § 地址空间 § 使用虚拟内存可用获得隔离 目标：一个程序挂了不会影响操作系统或其他程序 默认情况：没有隔离，直接在硬件上写 我们想要某种机制，能够将不同程序之间的内存隔离开来，cat就不会影响到sh。一种实现方式是地址空间（Address Spaces）。 现在当我们运行cat后，他的地址空间从0开始，到某个值结束，而sh的地址也从0开始，到某个值结束。 所以cat越界写入时，os会阻止他。 所以现在的问题就是如何在物理内存上创建不同的地址空间 Q&amp;A： 物理内存与虚拟内存大小关系 没有大小关系，虚拟内存可比物理内存大，反之亦然。page table 使用十分灵活 太多进程使用虚拟内存，物理内存会耗尽吗？ 有可能，如果每个程序都有大的虚拟内存，在某个时间内存就耗尽了。xv6中kalloc返回空余page列表，OS会告知程序是他没有内存了还是整个机器都没有内存了 页表 § 最常见，硬件支持 由处理器的内存管理单元（MMU） 当应用程序访问地址 10 时，OS会将地址10 放入内存映射寄存器（SATP）中，CPU告诉内存管理单元到哪里吧虚拟地址转换为物理地址。 Q&amp;A： MMU只读取内存并转换，不用保存映射 stap寄存器的值由内核保护 64位的寄存器会有 264 个内存地址，所以不能对每一个地址分配映射，而是对一个页面 Paging hardware(RISC-V) § xv6 虚拟内存代码 § 内核地址空间布局 § 用户地址空间布局 §.</description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item><item>
    <title>Lec10</title>
    <link>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec10</link>
    <guid>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec10</guid>
    <description></description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item><item>
    <title>Lec11</title>
    <link>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec11</link>
    <guid>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec11</guid>
    <description></description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item><item>
    <title>Lec12</title>
    <link>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec12</link>
    <guid>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec12</guid>
    <description></description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item><item>
    <title>Lec13</title>
    <link>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec13</link>
    <guid>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec13</guid>
    <description></description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item><item>
    <title>Lec14</title>
    <link>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec14</link>
    <guid>https://hyperv0id.github.io/quartz/system/os/mit6s081/Lec14</guid>
    <description></description>
    <pubDate>Sun, 26 Nov 2023 16:01:12 GMT</pubDate>
  </item>
    </channel>
  </rss>