计算机操作系统基础十二线程同步之自旋锁

引言本文为第十二篇,线程同步之自旋锁,在上一篇文章介绍了互斥量,通过互斥量解决线程同步的问题。本文是另一个解决线程同步的方法---自旋锁 自旋锁自旋锁的工作原理跟互斥量的工作原理其实是一模一样的,它也是在访问临界资源之前加一个锁,完成之后再将锁给释放掉。但是互斥量和自旋锁还是有一点区别的 自旋锁也是一种多线程同步的变量使用了自旋锁的线程会反复检查锁变量是否可用,如果不可用就会循环反复的检查因此自旋锁不会让出CPU,是一种忙等待状态因此自旋锁其实就是:死循环等待锁被释放 自旋锁好处 自旋锁避免了进程或线程上下文切换的开销(如果这个锁占用的时间不是很长,这个代价还是很小的)操作系统内部很多地方都是使用自旋锁,而不是互斥量自旋锁不适合在单核CPU使用(因为自旋锁在等待的时候并不会释放CPU,如果在单核CPU使用的话会引起其它的进程或线程无法执行)自旋锁和互斥量(锁)的比较 自旋锁是一种非阻塞锁,也就是说,如果某线程需要获取自旋锁,但该锁已经被其他线程占用时,该线程不会被挂起,而是在不断的消耗CPU的时间,不停的试图获取自旋锁互斥量是阻塞锁,当某线程无法获取互斥量时,该线程会被直接挂起,该线程不再消耗CPU时间,当其他线程释放互斥量后,操作系统会激活那个被挂起的线程,让其投入运行两种锁适用的场景 如果是多核处理器,如果预计线程等待锁的时间很短,短到比线程两次上下文切换时间要少的情况下,使用自旋锁是划算的如果是多核处理器,如果预计线程等待锁的时间较长,至少比两次线程上下文切换的时间要长,建议使用互斥量如果是单核处理器,一般建议不要使用自旋锁。因为,在同一时间只有一个线程是处在运行状态,那如果运行线程发现无法获取锁,只能等待解锁,但因为自身不挂起,所以那个获取到锁的线程没有办法进入运行状态,只能等到运行线程把操作系统分给它的时间片用完,才能有机会被调度。这种情况下使用自旋锁的代价很高建议:如果加锁的代码经常被调用,但竞争情况很少发生时,应该优先考虑使用自旋锁,自旋锁的开销比较小,互斥量的开销较大 自旋锁的代码示例 #include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<pthread.h>$include<vector>//自旋锁定义pthread_spinlock_t spin_lock;//临界资源int num=0;//生产者void *producer(void*){ int times = 100000000;//循环一百万次 while(times--){ //加自旋锁 pthread_spin_lock(&spin_lock); num += 1;//每次生产一个产品 //解锁 pthread_spin_unlock(&spin_lock); }}//消费者void *consumer(void*){ int times = 100000000; while(times--){ //加自旋锁 pthread_spin_lock(&spin_lock); num -= 1;//每次消费一个产品 //解锁 pthread_spin_unlock(&spin_lock); }}int main(){ printf("Start in main function."); //初始化自旋锁 pthread_spin_init(&spin_lock, 0); //定义两个线程 pthread_t thread1,thread2; //一个执行生成者逻辑,一个执行消费者逻辑 pthread_create(&thread1, NULL, &producer, NULL); pthread_create(&thread2, NULL, &consumer, NULL); pthread_join(&thread1, NULL); pthread_join(&thread2, NULL); //打印临界资源的值 printf("Print in main function: num = %d\n", num); return 0;}执行结果 ...

July 5, 2020 · 1 min · jiezi

计算机操作系统基础十一线程同步之互斥量

引言本文为第十一篇,线程同步之互斥量,在前边的《计算机操作系统基础(四)---进程管理之进程同步》中提到了进程同步和线程同步的方法,本篇为线程同步方法之一---互斥量。建议重新回顾一下《计算机操作系统基础(四)---进程管理之进程同步》这篇文章,方便理解后边的几篇关于线程同步和进程同步的知识 互斥量在进程同步的那篇文章中有介绍到生产者和消费者模型,该模型中有两个线程,分别充当生产者和消费者的角色,在并发的情况下,这两个线程很有可能同时去操作临界资源,如果同时去操作临界资源就有可能造成线程同步的问题,互斥量就是解决线程同步的方法之一 互斥量是如何解决这种问题的? 互斥量是保证当某一个线程,比如说线程1在操作临界资源时,它就可以阻止其它线程访问临界资源,这个就是互斥量的工作原理 在前边的生产者和消费者模型中,引发线程同步的最根本原因其实就是:这两个线程的指令交叉执行,互斥量可以保证两个线程的指令不会交叉的执行 其实互斥量的效果也称为原子性,互斥量其实就是保证了这些关键指令的原子性。原子性就是: 原子性是指一系列操作不可中断的特性这一系列操作要么全部执行完成,要么全部没有执行不存在部分执行,部分未执行的情况就比如刚才的生产者的操作,生产者的操作分为三条指令,根据原子性的特性,这三条指令要么全部执行完成,要么全部未执行,不存在说执行了其中的一条或两条时CPU被抢走了 互斥量是最简单的线程同步方法互斥量(互斥锁),处于两种状态之一的变量:解锁和加锁两个状态可以保证资源访问的串行(如果说一个资源被加锁了,也就是这个资源被某一个线程所使用了,另外一个线程如果想使用这个资源的话,只能等待正在使用这个资源的线程释放资源,另外一个线程才可以使用这个资源,这样就保证了资源访问的串行)互斥锁的代码示例 未使用互斥量 #include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<pthread.h>$include<vector>//临界资源int num=0;//生产者void *producer(void*){ int times = 100000000;//循环一百万次 while(times--){ num += 1;//每次生产一个产品 }}//消费者void *comsumer(void*){ int times = 100000000; while(times--){ num -= 1;//每次消费一个产品 }}int main(){ printf("Start in main function."); //定义两个线程 pthread_t thread1,thread2; //一个执行生成者逻辑,一个执行消费者逻辑 pthread_create(&thread1, NULL, &producer, NULL); pthread_create(&thread2, NULL, &comsumer, NULL); pthread_join(&thread1, NULL); pthread_join(&thread2, NULL); //打印临界资源的值 printf("Print in main function: num = %d\n", num);}运行结果: 虽然生产者和消费者循环的次数都是一样的,但是num的运行结果却不是0,这就存在生产者和消费者问题。通过互斥量来解决这个问题 使用互斥量 ...

July 4, 2020 · 1 min · jiezi

计算机操作系统基础十存储管理之虚拟内存

引言本文为第十篇,存储管理之虚拟内存,在正式了解之前,有一个问题,一个游戏十几G,物理内存只有4G,那么这个游戏是怎么运行起来的呢?为了解决这个问题,就需要本篇中介绍到的虚拟内存的知识 虚拟内存概述有些进程实际需要的内存很大,超过物理内存的容量多道程序设计,使得每个进程可用物理内存更加稀缺不可能无限增加物理内存,物理内存总有不够的时候这些原因就促使虚拟内存技术的产生 虚拟内存是操作系统内存管理的关键技术使得多道程序运行和大程序运行成为现实把程序使用内存划分,把部分暂时不使用的内存放置在辅存举例: 左边为进程的逻辑空间,红色部分为一个程序需要使用的内存,操作系统会将内存加载到物理内存中去,灰色的部分为暂时不需要使用的内存,这部分会先放到磁盘中,这样可以节省物理内存,把更多的物理内存让给其它进程使用,并且,在这个里边,如果说这个进程的逻辑空间很大的话,这些很大,且暂时不需要的空间都可以放到磁盘里边暂时保管 程序的局部性原理局部性原理指的是CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。这个原理也是使得虚拟内存技术可以实现的一个原因 因为有局部性原理 所以计算机在加载程序时,无需全部逻辑空间装入内存,装载部分即可(需要使用的部分)如果发现所使用的内存不在物理内存中,则发出缺页中断,发起页面置换,把保存在辅存中的页面置换到物理内存中,这样程序又可以继续运行下去了从用户层面看,程序拥有很大的空间,既是虚拟内存虚拟内存实际上是对物理内存的扩充,速度接近于内存,成本接近于辅存 虚拟内存的置换算法先进先出算法(FIFO)最不经常使用算法(LFU)最近最少使用算法(LRU)高速缓存的替换时机 在高速缓存替换的时候,主要发生在CPU需要获取缓存的时候,发现缓存中没有对应的数据,此时就会发生高速缓存的替换,也就是从主存中载入所需数据 主存页面的替换时机 主存缺页的时候,就会去辅存中加载相关数据,这个时候就会发生主存页面替换 对比来看: 替换策略发生在:高速缓存-主存层次、主存-辅存层次高速缓存-主存层次的替换策略主要是为了解决速度问题主存-辅存层次主要是为了解决容量的问题(这也是存储器存储分层的理由)在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践

July 3, 2020 · 1 min · jiezi

计算机操作系统基础九存储管理之段页式存储管理

引言本文为第九篇,存储管理之段页式存储管理,前边的文章介绍到了存储管理的内存分配和回收,从物理的角度了解了存储管理,本文从进程的角度去了解进程的存储管理。也就是操作系统是如何管理进程的空间 页式存储管理在这之前先来了解页面的概念 在计算机组成原理中有字和字块的概念,字块是相对物理设备的定义(像内存条)。而页面是相对逻辑空间的定义(也就是相对进程空间的定义)。字块和页面都指的是大小一样的一块内存 页式存储管理会将进程逻辑空间等分成若干大小的页面相应的也会把物理内存空间分成与页面大小一样的物理块以页面为单位,把进程空间装进物理内存中分散的物理块中这就是也是存储管理,在了解页式存储管理时,通常会和内存碎片一起来理解 下边是一个空闲链表,假设有一个页面比节点1大,比节点2和节点3小,因此在分配页面时,需要将页面分配到节点2节点3这个节点,因此就会有一部分内存没有被使用,就会造成内存碎片的存在 所以如果使用页式存储管理的话,需要: 页面大小适中,过大难以分配,过小内存碎片过多页面大小通常是512B~8K通过页式存储管理,就可以把进程的逻辑空间的每一个页面都放在内存的物理块中去,但是我们怎么知道进程的某一个页面分配到哪一个字块中去呢?因此需要了解页表 页表记录进程逻辑空间与物理空间的映射 左边是进程的逻辑空间,进程的逻辑空间分成了5个页面,这5个页面是分散在主存的分散的物理块中,因此需要页表记录映射关系: 如果直接使用页式存储管理也会遇到一些问题: 如果有一段连续的逻辑分布在多个页面中,将大大降低执行效率 段氏存储管理将进程逻辑空间划分成若干段(非等分)段的长度由连续逻辑的长度决定主函数main、子程序段X、子函数Y等(这个时候就会根据每一个函数的逻辑的长度去分配逻辑空间)段氏存储管理也需要一个表来存储逻辑空间到物理空间的映射,这个就是段表 每一段的长度都是不固定的,因此段表比页表多一个段长 对比两种存储管理的方法: 共同点: 段氏存储和页式存储都离散地管理了进程的逻辑空间 不同点: 页是物理单位,段是逻辑单位分页是为了合理利用空间,分段是为了满足用户要求页的大小由硬件固定,段的长度可以动态的变化页表信息是一维的,段表信息是二维的段页式存储管理采用了前两种存储管理的优点形成的一种存储管理方法 分页可以有效提高内存利用率分段可以更好满足用户需求段页式存储管理 先将逻辑空间按段氏管理分成若干段再把段内空间按页式管理分成若干页 从左到右分别是段页式、页式、段氏的内存分配情况 在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践

July 2, 2020 · 1 min · jiezi

计算机操作系统基础八存储管理之内存分配与回收

引言本文为第八篇,存储管理之内存分配与回收,早期计算机编程并不需要过多的存储管理,随着计算机和程序越来越复杂,存储管理成为必要。本篇主要是了解内存分配的过程和内存回收的过程 存储管理的意义 确保计算机有足够的内存处理数据确保程序可以从可用内存中获取一部分内存使用确保程序可以归还使用后的内存以供其它程序使用内存分配的过程单一连续分配单一连续分配是最简单的内存分配方式只能在单用户、单进程的操作系统中使用它分配的过程就是把内存分为系统区和用户区 系统区指的是系统区所有的内存都给操作系统区使用,用户区指的是用户区所有的内存都给用户区的程序使用(这种已经是过时的方法) 固定分区分配固定分区分配是支持多道程序的最简单存储分配方式内存空间被划分为若干固定大小的区域每一个分区只提供给一个程序所使用,互不干扰将主存分为若干个分区,每一个分区提供给某一个进程所使用,这就是固定分区的分配方法 动态分区分配根据进程实际需要,动态分配内存空间涉及到相关数据结构和具体的一些算法动态分区空闲表数据结构 假设主存中有若干个分区,有些被使用而有些未被使用,这样就需要一个数据结构去存储某一个分区它是否被使用了,此时就需要空闲表数据结构 在表中有若干个分区,每一个分区都有一个标记,0或1,0表示未被使用,1表示被使用。这就是动态分区空闲表数据结构 动态分区空闲链数据结构 这个是使用双向链表来保存动态分区中的空闲区域。将所有分散的空闲区域,通过链表进行首尾相连,组成一个空闲链表,但是,会存在像下图中空闲区2和3是连续的,因此可以将节点2和节点3给合并起来,这样就可以减少空闲链表的节点。因此,每个节点的大小不一样,所以需要在每个节点里边存储记录这个节点可存储的容量。这个就是动态分区空闲链数据结构 动态分区分配算法 首次适应算法(FF算法)最佳适应算法(BF算法)快速适应算法(QF算法)这些算法是实际进行动态内存分配所使用的算法 首次适应算法(FF算法) 每一次进行内存分配时,从开始顺序查找适合内存区(主要使用空闲链的数据结构)若没有合适的空闲区,则该次分配失败,如果找到了,就将该空闲区划分给这个进程使用。每次都是从头部开始,使得头部地址空间不断被划分 最佳适应算法(BF算法) 最佳适应算法要求空闲区链表按照容量大小排序遍历空闲区链表找到最佳空闲区 将空闲区按照大小进行排序,在需要内存的时候,从节点头部开始遍历,寻找最佳的空闲区节点。这种算法的好处就是可以避免一种大材小用的情况,因为它是从小到大遍历这个空闲链表的,所以它匹配到的第一个合适的空闲区,一定是最佳的。 快速适应算法(QF算法) 快速适应算法要求有多个空闲区链表每个空闲区链表存储一种容量的空闲区 将拥有一个空闲区节点的和拥有两个空闲区节点,分成两个链表。当需要内存分配时,就可以快速的找到适合某一个进程的内存区域。 内存回收的过程内存回收过程,可能有以下几种情况: 回收区和一块空闲区相邻,且回收区在空闲区下边回收区和一块空闲区相邻,且空闲区在回收区下边回收区在两块空闲区中间单独的回收区 每种情况的回收过程回收区在空闲区下边使用空闲链表的数据结构来保存空闲区,不需要新建空闲链表节点、只需要将空闲区1的容量增大为空闲区即可(也就是将回收区包含进来) 回收区在空闲区上边将回收区与空闲区合并新的空闲区使用回收区的地址 回收区位于两个空闲区中间将空闲区1、空闲区2和回收区合并新的空闲区使用空闲区1的地址 单独的回收区为回收区创建新的空闲节点插入到相应的空闲区链表中去 在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践

July 1, 2020 · 1 min · jiezi

真棒-20-张图揭开内存管理的迷雾瞬间豁然开朗

每日英语,每天进步一点点 前言之前有不少读者跟我反馈,能不能写图解操作系统? 既然那么多读者想看,我最近就在疯狂的复习操作系统的知识。 操作系统确实是比较难啃的一门课,至少我认为比计算机网络难太多了,但它的重要性就不用我多说了。 学操作系统的时候,主要痛苦的地方,有太多的抽象难以理解的词语或概念,非常容易被劝退。 即使怀着满腔热血的心情开始学操作系统,不过 3 分钟睡意就突然袭来。。。 该啃的还是得啃的,该图解的还是得图解的,万众期待的「图解操作系统」的系列来了。 本篇跟大家说说内存管理,内存管理还是比较重要的一个环节,理解了它,至少对整个操作系统的工作会有一个初步的轮廓,这也难怪面试的时候常问内存管理。 干就完事,本文的提纲: 正文虚拟内存如果你是电子相关专业的,肯定在大学里捣鼓过单片机。 单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来。 另外,单片机的 CPU 是直接操作内存的「物理地址」。 在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是根本行不通的,这两个程序会立刻崩溃。 操作系统是如何解决这个问题呢?这里关键的问题是这两个程序都引用了绝对物理地址,而这正是我们最需要避免的。 我们可以把进程所使用的地址「隔离」开来,即让操作系统为每个进程分配独立的一套「虚拟地址」,人人都有,大家自己玩自己的地址就行,互不干涉。但是有个前提每个进程都不能访问物理地址,至于虚拟地址最终怎么落到物理内存里,对进程来说是透明的,操作系统已经把这些都安排的明明白白了。 操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。 如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。 于是,这里就引出了两种地址的概念: 我们程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address)实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)。操作系统引入了虚拟内存,进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存,如下图所示: 操作系统是如何管理虚拟地址与物理地址之间的关系?主要有两种方式,分别是内存分段和内存分页,分段是比较早提出的,我们先来看看内存分段。 内存分段程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段(Segmentation)的形式把这些段分离出来。 分段机制下,虚拟地址和物理地址是如何映射的?分段机制下的虚拟地址由两部分组成,段选择子和段内偏移量。 段选择子就保存在段寄存器里面。段选择子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。在上面,知道了虚拟地址是通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成 4 个段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址,如下图: 如果要访问段 3 中偏移量 500 的虚拟地址,我们可以计算出物理地址为,段 3 基地址 7000 + 偏移量 500 = 7500。 分段的办法很好,解决了程序本身不需要关心具体的物理内存地址的问题,但它也有一些不足之处: 第一个就是内存碎片的问题。第二个就是内存交换的效率低的问题。接下来,说说为什么会有这两个问题。 我们先来看看,分段为什么会产生内存碎片的问题?我们来看看这样一个例子。假设有 1G 的物理内存,用户执行了多个程序,其中: 游戏占用了 512MB 内存浏览器占用了 128MB 内存音乐占用了 256 MB 内存。这个时候,如果我们关闭了浏览器,则空闲内存还有 1024 - 512 - 256 = 256MB。 ...

June 30, 2020 · 2 min · jiezi

计算机操作系统基础七作业管理之死锁

引言本文为第七篇,作业管理之死锁,死锁是计算机操作系统中非常重要的概念,本文主要介绍什么是死锁以及如何解决死锁 死锁死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程 举个例子: 如果这四辆汽车按照如图的方向行驶,堵在十字路口,相互之间没有退让的话,这四辆汽车就形成了死锁。 死锁的产生竞争资源进程调度顺序不当竞争资源 为什么会出现竞争资源? 共享资源数量不满足各个进程的需求各个进程之间发生资源竞争导致死锁举例: 假设有两个进程:进程1和进程2,进程1需要使用传真机,并且已经获取到了传真机资源。进程2需要获取打印机,并且也获取到了。如果此时进程2还需要传真机的时候,或者进程1还需要打印机的时候,他们都需要等待请求的资源被释放,但他们相互之间所占用的资源又不会被释放,因此就造成了死锁的产生,这个就是由于竞争资源而产生的死锁。如果此时多一个传真机或者打印机资源,就不会出现死锁,本质还是因为资源不够 进程调度顺序不当 还是以上边的进程1和进程2为例,假设进程1申请传真机资源为步骤A,进程2申请打印机资源为步骤B,进程2申请传真机资源为步骤C,进程1申请打印机资源为步骤D。如果这两个进程按照A、B、C、D的顺序申请资源,就会产生死锁。如果程序可以把调度顺序改为A、D、B、C,这个时候就不会出现死锁的情况。因为当进程1先获得了传真机资源,然后在获取打印机资源,完成它的工作之后,进程1就会释放这两个资源。这个时候进程2就可以获得打印机和传真机资源了。这个就是因为进程调度顺序不当导致死锁的产生 死锁的四个必要条件 互斥条件请求保持条件不可剥夺条件环路等待条件如果只满足上边的一个或两个的话,不会产生死锁 互斥条件 进程对资源的使用是排他性的使用某个资源只能由一个进程使用,其它需要使用该资源的进程只能等待,等待资源被释放请求保持条件 进程至少持有一个资源,又提出新的资源请求新资源被占用,请求被阻塞被阻塞的进程不释放自己所持有的资源不可剥夺条件 进程获得的资源在未完成使用前不能被剥夺(程序或操作系统均不可)获得的资源只能由进程自身释放环路等待条件 发生死锁时,必然存在进程-资源环形链 P为进程,R为资源 死锁的处理预防死锁的方法 前边提到了死锁的四个必要条件,只要破坏其中的一个或多个条件,就可以避免死锁的出现 破坏请求保持条件 系统规定进程运行之前,一次性申请所有需要的资源进程在运行期间不会提出资源请求,从而摒弃请求保持条件。也就不可能会因为在运行的时候请求资源而导致等待的情况破坏不可剥夺条件 当一个进程请求新的资源得不到满足时,必须释放占有的资源进程运行时占有的资源可以被释放,意味着可以被剥夺破坏环路等待条件 可用资源线性排序,申请必须按照需要递增申请线性申请不再形成环路,从而摒弃了环路等待条件 假设有A、B、C、D、E这五个资源,按照线性顺序将他们排起来,假设有一个进程需要A和D这两个资源的时候,它必须先申请A,才能申请D,这样就是线性申请 银行家算法银行家算法是一个可操作的著名的避免死锁的算法,以银行借贷系统分配策略为基础的算法 假设客户申请的贷款是有限的,每次申请需要声明最大资金量银行家在能满足贷款时,都应该给客户贷款客户在使用贷款后,能够及时归还贷款上边是银行家算法策略的一个基础,下边是具体过程: 这个算法要求有三个数据结构,分别是已分配资源表、所需资源表、可分配资源表 A、B、C、D为可申请的共享资源,P1、P2、P3、P4为需要申请资源的四个进程 已分配资源表 表中的数值表示的是每个进程它当前拥有的资源(如P1进程已分配了1个C资源和4个D资源) 所需资源表 表中的数值表示的是每个进程所需要各个资源的数量(如P1进程需要6个B资源、5个C资源和6个D资源) 可分配资源表 表中的数值表示的是系统里边还剩下的各种类型资源的数量 有了上边的几个数据结构的表格,就可以进行真实的演练了 (1)所需资源表减已分配资源表 这两个数据结构相减,得到还需分配资源表,然后将还需分配资源表和可分配资源表进行对比 我们会发现,可分配资源表,不满足进程P1的需求,因为P1进程需要6个B资源、4个C资源、2个D资源,而可用的A、B、C、D资源分别只有1、5、2、0个,因此不满足进程PA的需求。后边的P2、P3、P4使用同样的方法对比可发现,可分配资源表中的资源满足P2的需求,不满足P1、P3、P4的需求。因此,系统会把可分配的资源全部分发给P2,那么这个P2进程就可以继续的执行下去,等P2执行完之后,再归还所有的资源,归还之后,又可以将新的资源分配给别的进程。这个就是银行家算法。(P1、P2、P3、P4可以看做贷款的人,数字代表贷款的钱) 在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践

June 30, 2020 · 1 min · jiezi

计算机操作系统基础六作业管理之进程调度

引言本文为第六篇,作业管理之进程调度,本文主要介绍进程调度的概述和进程调度的算法 一、进程调度概述进程调度是指计算机通过决策决定哪个就绪进程可以获得CPU使用权。也就是说,进程调度指的是计算机选择哪一个进程可以使用CPU,前提是这个进程的状态为就绪状态 进程调度有两个步骤: 保留旧进程的运行信息,请出旧进程选择新进程,准备运行环境并分配CPU为了实现进程调度的这两个步骤,就需要了解三种重要的机制: 就绪队列的排队机制选择运行进程的委派机制新老进程的上下文切换机制就绪队列的排队机制(1)就绪队列的排队机制 就绪队列中摆放着所有的就绪状态的进程 就绪队列的排队机制就是为了提高进程调度的效率,事先将就绪进程按照一定的方式排成队列,以便调度程序可以最快找到就绪进程 (2)选择运行进程的委派机制 这个机制就要求可以从就绪队列中选出一个进程,然后让去CPU中进行执行。调度程序以一定的策略选择就绪进程,将CPU资源分配给它 (3)新老进程的上下文切换机制 如果要将新的进程调度到CPU中,就需要将老的进程的CPU环境备份出来,然后将新的进程的CPU环境切换进去。它保存当前进程的上下文信息,装入被委派执行进程的运行上下文 在CPU里面有一个高速缓存,这个机制就是首先将老进程的上下文备份到主存中,接着将新的进程的上下文放入到CPU中,准备环境,让新的进程可以运行起来,这个就是新老进程的上线文切换机制。这三个就是进程调度所需要的三个基本的机制 思考一个问题,如果进行调度的时候,老的进程还没有执行完,这个时候怎么办? 按照老的进程有没有执行完,将进程调度的方法分为两大类: 非抢占式的调度抢占式调度非抢占式的调度 CPU一旦分配给某个进程,就让该进程一直使用下去调度程序不以任何原因抢占正在被使用的CPU直到进程完成工作或因为IO阻塞才会让出CPU抢占式调度 允许调度程序以一定的策略暂停当前运行的进程保存好旧进程的上下文信息,分配CPU给新进程两种方式进行一个对比 进程调度的算法先来先服务调度算法短进程优先调度算法高优先权优先调度算法时间片轮转调度算法先来先服务调度算法在就绪队列中,按照先来先服务的原则,优先选择队列前面的进程进行调度 短进程优先调度算法调度程序优先选择就绪队列中估计运行时间最短的进程短进程优先调度算法不利于长作业进程的执行高优先权优先调度算法这个算法是以优先级为基础的 进程附带优先权,调度程序优先选择权重高的进程高优先权优先调度算法使得紧迫的任务可以优先处理前边文章中有说到,前台进程的优先级要高于后台进程的优先级,因为前台进程是与用户进行交互的,为了保证用户在使用系统的时候不会卡顿,因此前台进程权重就要高于后台进程 时间片轮转调度算法按先来先服务的原则排列就绪进程 每次从队列头部取出待执行进程,分配一个时间片执行(把这个时间片用完了,不管这个进程有没有执行完,都会将这个进程重新的插到队列的尾部。每个进程分配的时间片都是一样的)。是相对公平的调度算法,但不能保证及时响应用户 在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践 站在了巨人的肩膀上学习,向前辈致敬 参考:https://coding.imooc.com/clas...

June 29, 2020 · 1 min · jiezi

计算机操作系统基础五Linux的进程管理

引言本文为第五篇,Linux的进程管理,本文主要介绍Linux进程的相关概念、操作Linux进程的相关命令等。 一、Linux进程的相关概念1、进程的类型 (1)前台进程 前台进程就是具有终端,可以和用户进行交互的进程 下边写了一个死循环计算圆周率的程序 然后将程序跑起来,虽然程序没有输入任何东西,它却占了整个终端shell,此时输入任何命令都是没有用的,这个进程就是一个前台进程 现在改一下刚才的代码,让它不断的打印hello world 此时运行代码,它会死循环的输出hello world,这个就是一个有输出的前台进程,这个有输出的前台进程输出的内容占满了整个终端shell,即使输入任何的命令都是不管用的,因为这个前台进程占用了终端shell (2)后台进程 与前台进程相对,没有占用终端的就是后台进程后台进程基本上不和用户进行交互,优先级比前台进程低(因为前台进程要与用户进行交互,因此必须在响应速度或者在别的地方要跟得上,使得与用户交互时更加顺畅)后台进程我们一般是使用&符号结束,这样就可以启动一个后台进程举例: 现在将前边的代码改一下,让它每5秒输出一个hello world,然后以后台进程的方式让它跑起来 此时可以看见,我们以后台进程的方式将它跑起来的时候,它会输出一个进程ID,而且,这个后台进程是不占用shell的,虽然它的内容会打印到终端上,但是我们还是可以正常的使用命令的,同时,我们如果使用Ctrl+C,也是不会将这个后台进程停止的。 (3)守护进程 守护进程(daemon)是特殊的后台进程很多守护进程在系统引导的时候启动,一直运行,直到系统关闭Linux有很多典型的守护进程比如crond,这个就是Linux中定时任务守护进程、httpd是Linux中http服务的守护进程、sshd是平时我们使用ssh登录时候的守护进程、mysqld是数据库的守护进程(进程名字以d结尾的一般都是守护进程) 2、进程的标记 (1)进程ID 进程的ID是进程的唯一标记,每个进程拥有不同的ID进程ID表现为一个非负的整数,最大值由操作系统限定我们使用top命令就可以查看Linux中的所有进程,最左侧的PID列就是进程的ID 操作系统提供了fork()函数来创建进程,所以就可能出现下边这种情况 上边就是进程的层级关系,这中层级关系称之为父子进程关系。进程A通过fork函数创建了进程B,因此进程A是进程B的父进程。进程的父子关系,可以通过pstree命令查看 介绍几个特殊的进程 ID为0的进程为idle进程,是系统创建的第一个进程 ID为1的进程为init进程,是0号进程的子进程,负责完成系统的初始化(init进程是所有用户进程的祖先进程) (2)进程的状态标记 在Linux中,可以使用man ps命令来了解各种进程状态的标记,这里只挑几个比较重要的进行介绍 现在将刚才上边写的死循环计算圆周率的代码以后台进程的方式跑起来,并且将一个死循sleep的代码也以后台进程的方式跑起来,然后看一下这两个进程的状态标记 此时两个进程分别处于运行状态和睡眠状态 二、操作Linux进程的相关命令 ps命令(主要是用来查看进程) top命令(主要是查看Linux进程的使用内存或者是一些别的状态) kill命令(主要是用来给进程发送信号的) 1、ps命令 (1)列出当前进程:ps (2)查看进程详细信息:ps -aux (3)查看指定用户进程:ps -u username查看所有root用户的进程:ps -u root (4)查看指定进程:ps -aux|grep 指定进程信息 (5)查看进程树(查看进程的父子关系):ps -ef --forest (6)将进程按使用cpu的频率来进行排序:ps -aux --sort=pcpu ...

June 28, 2020 · 1 min · jiezi

计算机操作系统基础四进程管理之进程同步

引言本文为第四篇,进程管理之进程同步,本文主要介绍为什么需要进程间同步以及进程间同步的原则和线程同步 一、为什么需要进程间同步通过两个例子了解一下什么是进程同步以及为什么需要进程同步 (1)生产者-消费者问题 问题描述:有一群生产者进程在生产产品,并将这些产品提供给消费者进程进行消费,生产者进程和消费者进程可以并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程需要将所生产的产品放到一个缓冲区中,消费者进程可以从缓冲区中取走产品消费 生产和消费的过程 当生产者生产了一个产品之后,缓冲区里的产品就会+1,同样,如果消费者从缓冲区里边消费一个产品,缓冲区里的产品就会-1,在生活中这种模型是没有问题的(比如生产手机的工厂,流水线上生产完一个手机,就会放在仓库里边,消费者从仓库中取出手机消费,这个生产者-消费者模型从宏观的角度上看没有问题) 上边的模型在宏观的角度上看没有问题,但是在计算机微观的角度去看就会有问题。在计算机中,这个缓冲区是位于高速缓存或主存上边的,如果说生产者或消费者要操作里边的数据时,就分为三个步骤: a、取出数据放到寄存器中 register=count b、在CPU的寄存器中将register+1、register=register+1 表示说生产者完成了一个产品 c、将register放回缓冲区 count=register 这三步就是就是我们操作缓冲区必须的三个步骤。我们就可以将缓冲区看作是仓库,将register寄存器看作是生产者的地方或者消费者的地方,这个模型我们乍一看,好像也没什么问题 单从生产者程序或者消费者程序去看是没问题的,但是如果两者并发的去执行的时候就有可能出现差错 下边红色部分为生产者生产的过程,蓝色的为消费者消费的过程 将register和count看作是两个部分的值(假设为10), 假设此时执行生产者的第一步,也就是register=count,此时两者均为10,接着执行生产者的第二步,register=register+1,此时寄存器中的值+1了,那么此时register=11,count=10,假设生产者程序和消费者程序是并发的执行的,那么第三步就有可能轮到消费者去执行了,那么假设此时到了消费者的第一步register=count,那么这个时候消费者的进程里边的寄存器的值就是10,接着执行第四步,假设第四步执行到消费者的第二步,也就是register=register-1,此时消费者的进程的寄存器的值就变成9了,而缓存里边的值还是10,接着执行第五步,第五步假设执行到消费者的第三个步骤count=register,也就是把寄存器里边的值写回到缓冲区里边,此时缓冲区和消费者的寄存器的值都是9了,这里就完成了消费者的操作,接下来还有一个生产者的操作,将生产者的register写回到缓冲区里边,那么在刚才,生产者的register是等于11,那么执行完这一步,它会将register重新的写回到缓冲区中,那么缓冲区中得值就变成了11,count=register。那这个样子其实就有问题了,刚开始缓冲区的值是10,而在执行的过程中进行了+1和-1的操作,那么它的值应该还是10才对,但是租后却变成了11,说明这个数据是错误的,错误的原因就在于这两个进程在并发的执行了,他们轮流的在操作缓冲区,导致缓冲区中的数据不一致,这个就是生产者-消费者的问题 下边看一个实际执行的例子,下边是一个简单的程序,使用了两个线程模拟生产者和消费者的过程: #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <vector>pthread_ mutex t mutex = PTHREAD MUTEX INITIALIZER;int num = 0;//全局变量,初始值为0void *producer(void*){//生产者 int times = 10000000 ; while(times -- ){//生产者将num循环+1很多次,表示生产过程,消费者是循环-1 //pthread mutex_ lock (&mutex) ; num+=1; //pthread mutex unlock (&mutex) ; }}void *comsumer (void* ){//消费者 int times = 10000000 ;while(times -- ){ //pthread mutex lock (&mutex) ; num -= 1; //pthread mutex unlock (&mutex) ; }}//在main函数中创建了两个线程来模拟两个进程,一个线程执行producer的逻辑,一个线程执行comsumer的逻辑int main(){ printf("Start a main function."); pthread_t thread1,thread1; pthread_create(&thread1, NULL, &producer, NULL); pthread_create(&thread1, NULL, &comsumer, NULL); pthread_join(thread1, NULL); pthread_join(thread2, NULL); printf("Print in main function: num = %d\n", num); retuen 0}因为生产者和消费者循环的次数都是一样的,那么执行的结果应该是0才对,那实际的执行结果是不是呢?我们会发现不是,那么这个就是生产者和消费者的问题。上边例子中的缓冲区和num就是临界资源 ...

June 27, 2020 · 1 min · jiezi

计算机操作系统基础三进程管理之五状态模型

引言本文为第三篇,进程管理之五状态模型,进程在操作系统里边是有多个状态的,本文就是了解进程在操作系统中的多个状态 1、进程的五个状态创建状态就绪状态阻塞状态执行状态终止状态2、进程处于这五种状态时在做什么(1)就绪状态 当进程被分配到除CPU以外的所有必要资源后,就处于就绪状态只要再获得CPU的使用权,就可以里立即运行其它资源都准备好,只差CPU资源的状态,就是就绪状态其它资源包括进程控制块(PCB)、内存、栈空间、堆空间等 在操作系统里边,我们知道,多个程序可以并发的运行,这个时候就可能存在多个就绪状态的进程,这些进程通常会排成一个队列,这个队列就称为就绪队列,在就绪队列里边有多个就绪的进程 (2)执行状态 进程获得CPU使用权,其程序正在执行,称为执行状态在单处理机(一个CPU只有一个核的情况),在某个时刻只能有一个进程是处于执行状态(3)阻塞状态 进程由于某种原因,如:其它设备未就绪而无法继续执行,从而放弃CPU的状态,就称为阻塞状态 比如说有个进程要请求打印机,但是由于打印机正处于被占用的情况,进程收不到回应,那么就会处于阻塞状态。当多个进程同时请求打印机时,也会处于阻塞状态,此时也有阻塞队列的概念 (4)创建状态 创建状态分为两步: a、分配PCB b、插入就绪队列 创建进程时,拥有PCB,但其它资源尚未就绪的状态称为创建状态 (5)终止状态 终止状态也分为两步: a、系统清理 b、归还PCB 进程结束由系统清理或者归还PCB的状态称为终止状态 3、就绪、阻塞、执行三种状态之间的切换当进程发生进程调度的时候,就会由就绪状态变为执行状态,当某一个进程发生进程调度的时候就会获取到CPU的资源,当执行状态的进程的CPU资源用完了,它就会切换回就绪的状态,插入到就绪队列中,这里的CPU资源用完指的是,分配给某一个进程执行CPU的时间用完了 当执行状态的进程发生IO请求的时候就有可能变成阻塞状态(前边有说到请求打印机的例子)。当发生IO完成的时候,就会由阻塞状态切换到就绪状态 在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践

June 26, 2020 · 1 min · jiezi

一周信创舆情观察615621

一、一周舆情要点 进入6月,多地信创项目开始大面积铺开。本周,江苏、云南、湖南、厦门等省市相继在信创领域放出大招。预计未来一段时间,各地将进入信创政策落实期,地方招商引资有望提速。 Matlab禁运事件将给国产工业软件带来发展机遇。平安证券认为,继Matlab之后,AutoCAD、EDA、CAE等核心工业软件未来存在管控风险。长期来看,国家需要加大对工业软件的扶持力度。 科技巨头加码新基建,多方入局电力市场。本周,百度发布两个500万计划,宣布未来十年将继续加大在人工智能、芯片、云计算、数据中心等新基建领域的投入,到2030年百度智能云服务器数量超500万台。15日,国家电网发布“数字新基建”十大重点建设任务,与华为、阿里、腾讯、百度等41家合作伙伴签署战略合作协议,有分析人士认为,互联网巨头主要作为技术提供商加入。 二、舆情传播分析 6月15日0时~6月21日23时,全网关于“信创”的舆情总量共5441条,环比下降13.3%。从传播趋势看,工作日期间舆情走势相对平稳,周末声量出现明显下降。 媒体类型方面,6月15日~21日,“信创”相关舆情主要集中在新闻APP平台,占比达40.93%;其次是新闻网站,占26.85%;微信、微博平台分别占21.63%和5.35%;论坛平台占4.36%;数字报、博客、问答等平台相关舆情较少,累计占比不足1%。 话题方面,本周舆论聚焦的信创热点主要包括“上证综指修改编制方式”、“杜家豪主持召开信息化创新工程联席会议”、“机构信创观点”、“国家存储器基地项目二期开工”和“世界智能大会”。 文章层面,6月18日,今晚报发布的文章《大数据云计算、信息安全、工业机器人……天津智能科技产业形成九大优势领域》热度最高,全网累计传播了112次。文章指出,目前,天津市已形成大数据云计算、信息安全、工业机器人、智能安防、智能医疗、智能软件、智能网联汽车、先进通信、智能终端九大特色优势领域,产业集聚度不断提升。 “网信河东”6月16日发布的《世界智能大会在津开花结果》一文排在热度榜第二名。文章提到,世界智能大会为天津市带来丰硕战略合作成果。目前,天津市已与工信部、科技部、中国工程院、中国科协等单位签署“部市”“院市”战略合作协议5个;与华为、百度、腾讯等行业领军企业、单位签约200项。 环球网6月16日发布的《江苏省信创产业生态基地揭牌 360成首批入驻企业》排在热度榜第三名,累计在20个网站传播55次。文章称,6月15日,“江苏省信息技术应用创新大会”在无锡市召开。本次大会上,江苏省信息技术应用创新产业生态基地正式揭牌,360等25家企业首批入驻。 北京新基建方案相关解读文章排在热度榜第四名,本周累计在5个网站传播了54次,其中大多分布在微信平台。 湖南日报18日发布的《杜家毫主持召开信息化创新工程联席会议》排在热度榜第五名。文章指出,要进一步增强紧迫感和自觉性,立足湖南产业基础和优势,抢抓中央实施扩大内需、新增地方政府债券等重大机遇,把推进信创产业发展作为保产业链供应链稳定安全的重要内容。 三、政策动态 1、六部门联合印发《国家电子政务标准体系建设指南》 近日,市场监管总局办公厅、中共中央办公厅机要局、国务院办公厅电子政务办公室、中央网信办秘书局、国家发展改革委办公厅和工业和信息化部办公厅六部门联合印发了《国家电子政务标准体系建设指南》(以下简称《指南》)。《指南》提出,到2022年,全面覆盖电子政务基础共性标准、关键应用标准、安全保障标准,建立较为先进的国家电子政务标准体系,有效指导电子政务建设,建设电子政务标准应用服务平台,提升标准服务能力,提高标准应用水平。 其中,基础设施标准包括政务硬件设施标准、政务软件设施标准和政务网络标准。政务硬件设施标准与政务软件设施标准聚焦于电子政务公共基础设施的集约化,对政务信息系统的基本要求、功能要求等基础性要求进行规范,大力推广政务云平台,推动计算资源、存储资源、服务支撑、安全保障等共性基础资源的集约共享;政务网络标准围绕电子政务网络建设中的技术、管理提出要求,指导电子政务网络、业务专网建设与运行。(市场监管总局网站) 四、重点舆情摘要 1、地方信创大面积铺开 招商引资提速 6月15日,江苏省信息技术应用创新产业生态基地揭牌,25家企业现场签约;16日,云南云岭信创伙伴计划发布会召开,50余家集成商和厂家被授予“云岭信创伙伴纪念牌”;18日,湖南省委书记杜家豪主持召开信息化创新工程联席会议,强调加大信创产品应用场景开放和推广力度;19日,厦门市信息技术应用创新工作委员会成立,103家信创企业加入。 【划重点】 进入6月,多地信创项目开始大面积铺开,信创企业集中签约、信创产业联盟相继成立。预计未来一段时间,各地将进入信创政策落实期,地方招商引资有望提速。地方政府作为信创需求方之一,对打造信创产业链有着较高的积极性。一方面,推进信创产业建设是落实国家战略的重要行动,另一方面,信创产业引入也是推动当地经济发展的重要抓手。从目前各地推进情况看,除了鼓励信创企业落户、联合本地企业投资等,更多的是选择打造信创生态体系达成战略协议。 2、Matlab禁运 国产工业软件迎发展机遇 上周网络热议的Matlab禁令事件有了新解释:一、凡在美国商务部列出“实体清单”内的院校、机构及公司,使用 MATLAB均会受到一定影响;二、禁令不影响已购买版本的使用,但将限制未来新版本的采购及配套服务。(安信证券) 【划重点】 中美科技战持续激化,平安证券认为,美国对国内大学的制裁或只是个开始,未来相关研究工具,尤其是类似Matlab、AutoCAD、EDA、CAE等核心工业软件可能受到更严格的限制。此次制裁短期内对我国理工类研发工作影响较大,研究人员需要加快寻找替代品;长期来看,国家需要加大对工业软件的扶持力度,引导科研院所、高校和科技企业积极投身工业软件研发。 安信证券认为,软件相比芯片更容易解决“卡脖子”的问题。一方面在生产流程上,软件相较芯片产业较长的产业链,上游受限制风险极小;在交付方式上,芯片存在运输限制风险,而软件产品可直接通过互联网分发。 五、地方动态 1、湖南省委书记杜家豪主持召开信息化创新工程联席会议 6月18日,湖南省委书记杜家豪主持召开信息化创新工程联席会议。杜家豪强调,要牢牢抓住应用这个核心,着力加大信创产品应用场景开放和推广力度,加强技术研发、保障和应用场景攻关,强化湖南省相关优势产品的需求牵引。同时,要强化标准建设,推动更多优势企业和产品嵌入信创产业链;要加大信创人才引进和培养力度,着力打造特色产业园。(湖南省人民政府网站) 2、江苏省信息技术应用创新产业生态基地揭牌 6月15日,江苏省信息技术应用创新大会在无锡召开。会议期间,由省工信厅和无锡市联合共建的江苏省信息技术应用创新产业生态基地以“一基地、四中心”的创新模式正式揭牌。据了解,生态基地由省信息技术应用创新攻关基地、省信息技术应用创新测试中心、省信息技术应用创新培训中心、省信息技术应用创新联盟展示中心和省密码技术应用创新促进中心组成,江苏省信创攻关基地首批共建企业25家在现场正式签约。(新华网) 3、云南云岭信创伙伴计划发布会召开 将组建产业联盟助推信创产业发展 6月16日,云岭信创伙伴计划发布会在昆明市云投集团召开,来自全国IT行业50余家企业参加。会议指出,新一轮科技革命与产业变革给“数字云南”建设指出了新方向、提出了新要求。下一步,云南将着力打造信创基础设施平台,加快产业体系构建,建设面向南亚东南亚数字枢纽,发挥资金、资源、项目优势,携手云岭信创伙伴打造信创生态圈,推动信创产业做大做强。大会发布共同倡议,点亮云岭信创伙伴计划,向50余家集成商和厂家授予“云岭信创伙伴纪念牌”。(云南网) 4、厦门市信息技术应用创新工作委员会成立 6月19日,厦门市信息技术应用创新工作委员会(以下简称“信创工委会”)正式成立。信创工委会是由从事软硬件关键技术研究、应用和服务的单位发起建立的非营利性社会组织,是厦门市信息协会的分支机构,受厦门市信息协会管理。信创工作委员会作为厦门市信创供需双方的服务窗口,将在产业交流、人才培训、投融资、产品适配、场景应用等方面营造良好的信创产业生态环境,带动全产业链协同发展,努力为党政机关和信创企业提供全面全方位服务。目前,已有浪潮、统信、麒麟、奇安信等来自全国各地103家信创企业加入。(厦门市信息协会官网) 5、重庆计划到2022年累计投入3983亿元布局“新基建” 6月19日,重庆市政府网公开《重庆市新型基础设施重大项目建设行动方案(2020—2022年)》(以下简称《方案》)。《方案》提出,到2022年,重庆将总投资3983亿元,滚动实施和储备375个新基建重大项目。具体来看,这批重大项目包含了信息基础设施、融合基础设施、创新基础设施等3个方面,将突出新型网络、智能计算、信息安全、转型促进、融合应用、基础科研、产业创新等7大板块。目前,在建项目152个,总投资2101亿元,主要任务是提速建设,对冲疫情影响、稳定经济增长;新开工项目102个,总投资831亿元,主要任务是加快启动,进一步扩大有效投资、培育新增长点;储备项目121个,总投资1051亿元,主要任务是聚焦引领实体经济转型升级、激活发展新动能,为“十四五”及中长期发展提供坚实支撑。(重庆市政府网站) 6、湖北出台新基建三年行动方案 6月15日,湖北省印发《湖北省新型基础设施建设三年行动方案》。未来三年,湖北将围绕信息基础设施、融合基础设施、创新基础设施三个方面展开建设。到2022年底,全省建成6万个以上5G宏基站,武汉市和省内其他市州主城区5G网络覆盖率达到100%;同时,全省5G网络覆盖率和建设水平领先中部,新型基础设施规模进入全国第一方阵。(湖北日报) 7、中国电子与山东签署战略合作协议 6月15日,中国电子与山东省人民政府签订战略合作框架协议,双方将围绕新一代信息技术产业高质量发展,开展全方位、多层次的交流合作,聚焦网络安全、现代数字城市、工业互联网、区块链、健康医疗大数据等领域,加速双方资源有效对接,优化山东省信息技术产业生态,助力建设新时代现代化强省,实现中国电子与山东省共赢发展。(证券时报) 8、安徽省人民政府与阿里巴巴集团、蚂蚁集团签署战略合作协议 6月15日,安徽省人民政府与阿里巴巴集团、蚂蚁集团签署战略合作协议。根据战略合作协议,安徽省人民政府、阿里巴巴集团、蚂蚁集团三方将深化合作,带动物联网、大数据、人工智能、区块链等高技术产业在安徽集聚发展,共同打造长三角地区政府与企业合作新典范。仪式上,合肥、蚌埠、滁州、芜湖、黄山、宿州等市与阿里巴巴集团、蚂蚁集团分别签署了合作协议。(安徽日报) 9、郑州与阿里巴巴深化战略合作 6月16日,郑州市与阿里巴巴集团签署深化战略合作协议,合力推动数字化,宣布联手打造“中部数字经济第一城”。双方当天签署了一系列具体项目协议,包括郑州“城市大脑”二期项目、2020年数字郑州生态联盟、数字郑州人才战略合作等。阿里巴巴集团董事局主席张勇表示,阿里巴巴将在三个重要方向助力郑州的数字化发展——“共建平台,共创生态,共育人才”。(河南省政府网站) 六、行业动态 1、西湖论剑·网络安全线上峰会首次聚焦信息技术应用创新 6月16日,2020西湖论剑·网络安全线上峰会首次开设“信息技术应用创新网络安全”分论坛。来自国内芯片、安全、应用等厂商的多位专家齐聚于此,共同围绕信息技术应用创新网络安全新生态、新创新的话题展开讨论。浙江省经济和信息化厅副厅长吴君青在致辞中表示,下一步,浙江将推进信息技术自主创新产业基地建设,实施一批试点工程。(中国日报) 2、腾讯安全推出新一代云防火墙 6月16日,腾讯安全举办线上新品发布会,宣布推出战略级新品——新一代SaaS化云防火墙。相比云平台自带的免费安全组,腾讯安全云防火墙能为上云企业提供更精细的访问控制和安全服务,包括基于SaaS的云上资产自动识别与一键开关、集成IPS入侵防御系统拦截网络攻击、威胁情报与智能分析加持、安全日志审计以及多VPC场景管理等多元化功能。(经济日报) 3、中国移动自研物联网操作系统OneOS正式商用 6月17日,中国移动在网络云平台正式召开“创新2020,云上科技周”。中移物联网有限公司总经理乔辉在会上正式发布了中国移动物联网操作系统OneOS。OneOS是中国移动从2018年投入研发的一款面向物联网领域推出的轻量级实时操作系统,具有可裁剪、跨平台、低能耗、高安全等特点。中国移动OneOS支持跨芯片平台,提供互联互通组件、端云融合组件与安全性设计架构。中国移动表示,OneOS未来将被运用到智能穿戴、智能门锁、智慧充电、环境监测等智慧系统。(IT之家) 4、微软收购行业数据模型供应商ADRM,以创建智能数据库 6月19日消息,微软收购了ADRM软件,把ADRM的数据模型与Azure存储和计算相结合,以创建智能数据库,将来自多个行业的信息汇集在一起。ADRM是一家提供大规模的行业特定数据模型的公司,其数据模型覆盖了通信、金融服务和医疗保健等多个行业。消息称,该交易的财务条款尚未披露。(DoNews) 5、SAS与微软就云服务达成合作以推进数据分析和人工智能 SAS(赛仕软件)和微软于17日宣布双方就技术范围和市场战略方面达成合作,以扩展双方业务,从数字转型计划中释放关键价值。作为合作的一部分,微软会成为SAS云服务的首选云平台提供商,SAS的分析产品和行业解决方案随后也会被转移至Azure平台,这些内容都将为微软在医疗保健、金融服务和许多其他行业的客户带来附加价值。(新浪财经) ...

June 24, 2020 · 1 min · jiezi

一周信创舆情观察615621

一、一周舆情要点 进入6月,多地信创项目开始大面积铺开。本周,江苏、云南、湖南、厦门等省市相继在信创领域放出大招。预计未来一段时间,各地将进入信创政策落实期,地方招商引资有望提速。 Matlab禁运事件将给国产工业软件带来发展机遇。平安证券认为,继Matlab之后,AutoCAD、EDA、CAE等核心工业软件未来存在管控风险。长期来看,国家需要加大对工业软件的扶持力度。 科技巨头加码新基建,多方入局电力市场。本周,百度发布两个500万计划,宣布未来十年将继续加大在人工智能、芯片、云计算、数据中心等新基建领域的投入,到2030年百度智能云服务器数量超500万台。15日,国家电网发布“数字新基建”十大重点建设任务,与华为、阿里、腾讯、百度等41家合作伙伴签署战略合作协议,有分析人士认为,互联网巨头主要作为技术提供商加入。 二、舆情传播分析 6月15日0时~6月21日23时,全网关于“信创”的舆情总量共5441条,环比下降13.3%。从传播趋势看,工作日期间舆情走势相对平稳,周末声量出现明显下降。 媒体类型方面,6月15日~21日,“信创”相关舆情主要集中在新闻APP平台,占比达40.93%;其次是新闻网站,占26.85%;微信、微博平台分别占21.63%和5.35%;论坛平台占4.36%;数字报、博客、问答等平台相关舆情较少,累计占比不足1%。 话题方面,本周舆论聚焦的信创热点主要包括“上证综指修改编制方式”、“杜家豪主持召开信息化创新工程联席会议”、“机构信创观点”、“国家存储器基地项目二期开工”和“世界智能大会”。 文章层面,6月18日,今晚报发布的文章《大数据云计算、信息安全、工业机器人……天津智能科技产业形成九大优势领域》热度最高,全网累计传播了112次。文章指出,目前,天津市已形成大数据云计算、信息安全、工业机器人、智能安防、智能医疗、智能软件、智能网联汽车、先进通信、智能终端九大特色优势领域,产业集聚度不断提升。 “网信河东”6月16日发布的《世界智能大会在津开花结果》一文排在热度榜第二名。文章提到,世界智能大会为天津市带来丰硕战略合作成果。目前,天津市已与工信部、科技部、中国工程院、中国科协等单位签署“部市”“院市”战略合作协议5个;与华为、百度、腾讯等行业领军企业、单位签约200项。 环球网6月16日发布的《江苏省信创产业生态基地揭牌 360成首批入驻企业》排在热度榜第三名,累计在20个网站传播55次。文章称,6月15日,“江苏省信息技术应用创新大会”在无锡市召开。本次大会上,江苏省信息技术应用创新产业生态基地正式揭牌,360等25家企业首批入驻。 北京新基建方案相关解读文章排在热度榜第四名,本周累计在5个网站传播了54次,其中大多分布在微信平台。 湖南日报18日发布的《杜家毫主持召开信息化创新工程联席会议》排在热度榜第五名。文章指出,要进一步增强紧迫感和自觉性,立足湖南产业基础和优势,抢抓中央实施扩大内需、新增地方政府债券等重大机遇,把推进信创产业发展作为保产业链供应链稳定安全的重要内容。 三、政策动态 1、六部门联合印发《国家电子政务标准体系建设指南》 近日,市场监管总局办公厅、中共中央办公厅机要局、国务院办公厅电子政务办公室、中央网信办秘书局、国家发展改革委办公厅和工业和信息化部办公厅六部门联合印发了《国家电子政务标准体系建设指南》(以下简称《指南》)。《指南》提出,到2022年,全面覆盖电子政务基础共性标准、关键应用标准、安全保障标准,建立较为先进的国家电子政务标准体系,有效指导电子政务建设,建设电子政务标准应用服务平台,提升标准服务能力,提高标准应用水平。 其中,基础设施标准包括政务硬件设施标准、政务软件设施标准和政务网络标准。政务硬件设施标准与政务软件设施标准聚焦于电子政务公共基础设施的集约化,对政务信息系统的基本要求、功能要求等基础性要求进行规范,大力推广政务云平台,推动计算资源、存储资源、服务支撑、安全保障等共性基础资源的集约共享;政务网络标准围绕电子政务网络建设中的技术、管理提出要求,指导电子政务网络、业务专网建设与运行。(市场监管总局网站) 四、重点舆情摘要 1、地方信创大面积铺开 招商引资提速 6月15日,江苏省信息技术应用创新产业生态基地揭牌,25家企业现场签约;16日,云南云岭信创伙伴计划发布会召开,50余家集成商和厂家被授予“云岭信创伙伴纪念牌”;18日,湖南省委书记杜家豪主持召开信息化创新工程联席会议,强调加大信创产品应用场景开放和推广力度;19日,厦门市信息技术应用创新工作委员会成立,103家信创企业加入。 【划重点】 进入6月,多地信创项目开始大面积铺开,信创企业集中签约、信创产业联盟相继成立。预计未来一段时间,各地将进入信创政策落实期,地方招商引资有望提速。地方政府作为信创需求方之一,对打造信创产业链有着较高的积极性。一方面,推进信创产业建设是落实国家战略的重要行动,另一方面,信创产业引入也是推动当地经济发展的重要抓手。从目前各地推进情况看,除了鼓励信创企业落户、联合本地企业投资等,更多的是选择打造信创生态体系达成战略协议。 2、Matlab禁运 国产工业软件迎发展机遇 上周网络热议的Matlab禁令事件有了新解释:一、凡在美国商务部列出“实体清单”内的院校、机构及公司,使用 MATLAB均会受到一定影响;二、禁令不影响已购买版本的使用,但将限制未来新版本的采购及配套服务。(安信证券) 【划重点】 中美科技战持续激化,平安证券认为,美国对国内大学的制裁或只是个开始,未来相关研究工具,尤其是类似Matlab、AutoCAD、EDA、CAE等核心工业软件可能受到更严格的限制。此次制裁短期内对我国理工类研发工作影响较大,研究人员需要加快寻找替代品;长期来看,国家需要加大对工业软件的扶持力度,引导科研院所、高校和科技企业积极投身工业软件研发。 安信证券认为,软件相比芯片更容易解决“卡脖子”的问题。一方面在生产流程上,软件相较芯片产业较长的产业链,上游受限制风险极小;在交付方式上,芯片存在运输限制风险,而软件产品可直接通过互联网分发。 五、地方动态 1、湖南省委书记杜家豪主持召开信息化创新工程联席会议 6月18日,湖南省委书记杜家豪主持召开信息化创新工程联席会议。杜家豪强调,要牢牢抓住应用这个核心,着力加大信创产品应用场景开放和推广力度,加强技术研发、保障和应用场景攻关,强化湖南省相关优势产品的需求牵引。同时,要强化标准建设,推动更多优势企业和产品嵌入信创产业链;要加大信创人才引进和培养力度,着力打造特色产业园。(湖南省人民政府网站) 2、江苏省信息技术应用创新产业生态基地揭牌 6月15日,江苏省信息技术应用创新大会在无锡召开。会议期间,由省工信厅和无锡市联合共建的江苏省信息技术应用创新产业生态基地以“一基地、四中心”的创新模式正式揭牌。据了解,生态基地由省信息技术应用创新攻关基地、省信息技术应用创新测试中心、省信息技术应用创新培训中心、省信息技术应用创新联盟展示中心和省密码技术应用创新促进中心组成,江苏省信创攻关基地首批共建企业25家在现场正式签约。(新华网) 3、云南云岭信创伙伴计划发布会召开 将组建产业联盟助推信创产业发展 6月16日,云岭信创伙伴计划发布会在昆明市云投集团召开,来自全国IT行业50余家企业参加。会议指出,新一轮科技革命与产业变革给“数字云南”建设指出了新方向、提出了新要求。下一步,云南将着力打造信创基础设施平台,加快产业体系构建,建设面向南亚东南亚数字枢纽,发挥资金、资源、项目优势,携手云岭信创伙伴打造信创生态圈,推动信创产业做大做强。大会发布共同倡议,点亮云岭信创伙伴计划,向50余家集成商和厂家授予“云岭信创伙伴纪念牌”。(云南网) 4、厦门市信息技术应用创新工作委员会成立 6月19日,厦门市信息技术应用创新工作委员会(以下简称“信创工委会”)正式成立。信创工委会是由从事软硬件关键技术研究、应用和服务的单位发起建立的非营利性社会组织,是厦门市信息协会的分支机构,受厦门市信息协会管理。信创工作委员会作为厦门市信创供需双方的服务窗口,将在产业交流、人才培训、投融资、产品适配、场景应用等方面营造良好的信创产业生态环境,带动全产业链协同发展,努力为党政机关和信创企业提供全面全方位服务。目前,已有浪潮、统信、麒麟、奇安信等来自全国各地103家信创企业加入。(厦门市信息协会官网) 5、重庆计划到2022年累计投入3983亿元布局“新基建” 6月19日,重庆市政府网公开《重庆市新型基础设施重大项目建设行动方案(2020—2022年)》(以下简称《方案》)。《方案》提出,到2022年,重庆将总投资3983亿元,滚动实施和储备375个新基建重大项目。具体来看,这批重大项目包含了信息基础设施、融合基础设施、创新基础设施等3个方面,将突出新型网络、智能计算、信息安全、转型促进、融合应用、基础科研、产业创新等7大板块。目前,在建项目152个,总投资2101亿元,主要任务是提速建设,对冲疫情影响、稳定经济增长;新开工项目102个,总投资831亿元,主要任务是加快启动,进一步扩大有效投资、培育新增长点;储备项目121个,总投资1051亿元,主要任务是聚焦引领实体经济转型升级、激活发展新动能,为“十四五”及中长期发展提供坚实支撑。(重庆市政府网站) 6、湖北出台新基建三年行动方案 6月15日,湖北省印发《湖北省新型基础设施建设三年行动方案》。未来三年,湖北将围绕信息基础设施、融合基础设施、创新基础设施三个方面展开建设。到2022年底,全省建成6万个以上5G宏基站,武汉市和省内其他市州主城区5G网络覆盖率达到100%;同时,全省5G网络覆盖率和建设水平领先中部,新型基础设施规模进入全国第一方阵。(湖北日报) 7、中国电子与山东签署战略合作协议 6月15日,中国电子与山东省人民政府签订战略合作框架协议,双方将围绕新一代信息技术产业高质量发展,开展全方位、多层次的交流合作,聚焦网络安全、现代数字城市、工业互联网、区块链、健康医疗大数据等领域,加速双方资源有效对接,优化山东省信息技术产业生态,助力建设新时代现代化强省,实现中国电子与山东省共赢发展。(证券时报) 8、安徽省人民政府与阿里巴巴集团、蚂蚁集团签署战略合作协议 6月15日,安徽省人民政府与阿里巴巴集团、蚂蚁集团签署战略合作协议。根据战略合作协议,安徽省人民政府、阿里巴巴集团、蚂蚁集团三方将深化合作,带动物联网、大数据、人工智能、区块链等高技术产业在安徽集聚发展,共同打造长三角地区政府与企业合作新典范。仪式上,合肥、蚌埠、滁州、芜湖、黄山、宿州等市与阿里巴巴集团、蚂蚁集团分别签署了合作协议。(安徽日报) 9、郑州与阿里巴巴深化战略合作 6月16日,郑州市与阿里巴巴集团签署深化战略合作协议,合力推动数字化,宣布联手打造“中部数字经济第一城”。双方当天签署了一系列具体项目协议,包括郑州“城市大脑”二期项目、2020年数字郑州生态联盟、数字郑州人才战略合作等。阿里巴巴集团董事局主席张勇表示,阿里巴巴将在三个重要方向助力郑州的数字化发展——“共建平台,共创生态,共育人才”。(河南省政府网站) 六、行业动态 1、西湖论剑·网络安全线上峰会首次聚焦信息技术应用创新 6月16日,2020西湖论剑·网络安全线上峰会首次开设“信息技术应用创新网络安全”分论坛。来自国内芯片、安全、应用等厂商的多位专家齐聚于此,共同围绕信息技术应用创新网络安全新生态、新创新的话题展开讨论。浙江省经济和信息化厅副厅长吴君青在致辞中表示,下一步,浙江将推进信息技术自主创新产业基地建设,实施一批试点工程。(中国日报) 2、腾讯安全推出新一代云防火墙 6月16日,腾讯安全举办线上新品发布会,宣布推出战略级新品——新一代SaaS化云防火墙。相比云平台自带的免费安全组,腾讯安全云防火墙能为上云企业提供更精细的访问控制和安全服务,包括基于SaaS的云上资产自动识别与一键开关、集成IPS入侵防御系统拦截网络攻击、威胁情报与智能分析加持、安全日志审计以及多VPC场景管理等多元化功能。(经济日报) 3、中国移动自研物联网操作系统OneOS正式商用 6月17日,中国移动在网络云平台正式召开“创新2020,云上科技周”。中移物联网有限公司总经理乔辉在会上正式发布了中国移动物联网操作系统OneOS。OneOS是中国移动从2018年投入研发的一款面向物联网领域推出的轻量级实时操作系统,具有可裁剪、跨平台、低能耗、高安全等特点。中国移动OneOS支持跨芯片平台,提供互联互通组件、端云融合组件与安全性设计架构。中国移动表示,OneOS未来将被运用到智能穿戴、智能门锁、智慧充电、环境监测等智慧系统。(IT之家) 4、微软收购行业数据模型供应商ADRM,以创建智能数据库 6月19日消息,微软收购了ADRM软件,把ADRM的数据模型与Azure存储和计算相结合,以创建智能数据库,将来自多个行业的信息汇集在一起。ADRM是一家提供大规模的行业特定数据模型的公司,其数据模型覆盖了通信、金融服务和医疗保健等多个行业。消息称,该交易的财务条款尚未披露。(DoNews) 5、SAS与微软就云服务达成合作以推进数据分析和人工智能 SAS(赛仕软件)和微软于17日宣布双方就技术范围和市场战略方面达成合作,以扩展双方业务,从数字转型计划中释放关键价值。作为合作的一部分,微软会成为SAS云服务的首选云平台提供商,SAS的分析产品和行业解决方案随后也会被转移至Azure平台,这些内容都将为微软在医疗保健、金融服务和许多其他行业的客户带来附加价值。(新浪财经) ...

June 24, 2020 · 1 min · jiezi

一周信创舆情观察-68614

一、一周舆情要点 2020年将成为信创规模化落地元年。5月份以来,电信、金融行业公开招标中信创占比提升,目前地方政府已陆续启动招标,预计6~7月信创招标有望全面铺开。 美国“实体名单”影响扩大,哈工大、哈工程被禁用MATLAB软件,此举将进一步激活信创概念。 北京新基建提速,信创应用生态建设纳入规划。6月10日,北京披露新基建方案,聚焦“新型网络基础设施、数据智能基础设施、生态系统基础设施、科创平台基础设施、智慧应用基础设施、可信安全基础设施”六大方向。信创方面,《方案》提出依托信创园,提升研发底层软硬件协同研发能力,建设“两中心三平台”信创应用生态。 二、政策动态 1、工信部发布2020第一批行业标准制修订计划 工信部网站6月12日消息,根据工业和通信业行业标准制修订工作的总体安排,工信部编制完成2020年第一批行业标准制修订项目计划,并发布了《关于印发2020年第一批行业标准制修订项目计划的通知》。 制修订项目计划中包含5G及下一代移动统信标准项目计划表、人工智能标准项目计划表、工业互联网标准项目计划表和网络数据安全标准项目计划表等。 制修订项目计划中提到,2020年第一批共安排项目计划415项。其中制定287项,修订128项;重点专项标准177项、基础公益类标准39项、一般标准199项;产品类标准396项,节能与综合利用标准19项。(工信部网站) 2、北京披露新基建行动方案 聚焦生态系统基础设施等六大方向 6月9日,北京印发《关于加快培育壮大新业态新模式促进北京经济高质量发展的若干意见》,提出打造“1+5+N”的政策体系。作为“5方案”之首,《北京市加快新型基础设施建设行动方案(2020-2022年)》被视为促进北京经济平稳增长和高质量发展的重要举措。 此次披露的新基建行动方案,聚焦“新型网络基础设施、数据智能基础设施、生态系统基础设施、科创平台基础设施、智慧应用基础设施、可信安全基础设施”六大方向,暨“新网络、新要素、新生态、新平台、新应用、新安全”,实施30个重点任务。目标是到2022年,北京基本建成网络基础稳固、数据智能融合、产业生态完善、平台创新活跃、应用智慧丰富、安全可信可控的具有国际领先水平的新型基础设施。 其中在信创领域,《方案》提出要依托信创园,提升研发底层软硬件协同研发能力,建设“两中心三平台”信创应用生态。支持搭建支持多端多平台部署的大规模开源训练平台和高性能推理引擎,形成面向产业应用、覆盖多领域的工业级开源模型库。鼓励企业研发、运营开源代码托管平台,支持基于共享平台开展共享软件、智能算法、工业控制、网络安全等应用创新,促进形成协同研发和快速迭代创新生态。推动国家北斗创新应用综合示范区建设,打造“北斗+”融合应用生态圈。(经济日报) 三、重点舆情摘要 1、信创招投标提速 2020或成业绩兑现元年 资料来源:政府采购网 5月份以来,中国电信、中国移动等运营商和以农行、工行为代表的国有大行纷纷开启国产设备采购模式。兴业证券认为,金融、电信等行业业务复杂度高、风险容忍度低,因此对IT设备采购较为严苛,从目前信创招投标情况看,最难啃的金融、电信行业正在加速落地。 另外,根据近期各地政府公开的信息,部分省市已经启动招标。天风证券认为,6 月底至7月,党政等领域的信创招标有望全面铺开,今年将会成为信创规模化落地的第一年。软件方面,统信和麒麟将是操作系统市场主要厂商,统信在 PC 市场有望占据一定份额,行业市场统信优势突出,服务器市场后续将加大投入;办公软件金山一家独大;中间件领域东方通占优,但价格竞争压力加大。(天风观点) 四、地方动态 1、天津成立信息技术应用创新工作委员会 6月12日,天津市信息技术应用创新工作委员会成立。市信创工委会首任理事长、麒麟软件有限公司执行总裁孔金珠介绍,市信创工委会成立后,将在关键共性技术与标准、生态搭建与应用推广、人才培养等三个重点方面开展工作。(今晚报) 2、《杭州市强化数字赋能、推进“六新”发展行动方案》将于近日下发 6月14日,杭州市召开推进“六新”发展媒体交流会,会议透露,经过前期谋划研究,目前已形成《杭州市强化数字赋能、推进“六新”发展行动方案》。近期将由市委市政府下发实施。根据《方案》,杭州将在六个方面通过一系列举措,其中在推进新基建方面,提出要加快推进5G建设、加快绿色示范数据中心建设、加快建设空地一体无人系统、建设“云计算之城”、加快建设重大科学基础设施等5条举措。(钱江晚报) 3、泉州将建设12个新基建新经济基地 总投资2000多亿元 6月12日,泉州市举行新基建新经济基地建设比拼动员会。会议提到,泉州将建设12个新基建新经济基地,涉及新基建新经济项目总投资2000多亿元。12个新基建新经济基地分布在鲤城、丰泽、洛江、晋江、南安等8个县(市、区),包括传感智能制造产业基地、古城数字文创动漫基地、时空产业基地、智能装备制造集成电路基地、人机交互产业基地、数字福建(安溪)产业基地、“芯谷”南安基地、新型数字显示产业基地、软件与工业设计基地、知创产业基地、智慧物流产业基地、智能电网电器产业基地等。(闽南网泉州) 五、行业动态 1、美国“实体名单”影响扩大,哈工大、哈工程被禁用MATLAB软件 据机器之心等媒体报道,哈工大、哈工程师生使用的正版 MATLAB最近无法被激活了,已经激活的正版 MATLAB 跳出反激活的通知,继而显示授权许可无效,网页无法登录哈工大域名的账户。MathWorks方面回应称,刚接到通知,根据美国政府最新的进出口管制名单,无法再提供服务,后续请关注学校的通知。哈工大负责技术支持的老师回应表示,自2020年6月6日开始,因哈工大被列入美国商务部实体名单的原因,影响到了学校MATLAB的正常使用,目前正在和美国MathWorks公司方面进行积极沟通。(IT之家) 2、开源BeOS操作系统Haiku R1/beta2发布 开源 BeOS 操作系统 Haiku 在发布第一个 beta 版本 20 个月之后释出了第二个 beta 版本。BeOS 操作系统在 2001 年被 Palm 收购后停止开发,Haiku 项目在这之后不久正式启动,2002 年发布了首个版本,2012 年发布 Haiku R1 Alpha 4.1,六年后发布了 Haiku R1/beta1。beta2 相比 beta1 改进了硬件支持和整体稳定性。 ...

June 18, 2020 · 1 min · jiezi

操作系统之内存管理

操作系统内存管理一、内存管理策略1.背景基本硬件(基地址与界限地址) 地址绑定(编译时、加载时、 运行时) 逻辑地址空间与物理地址空间 动态加载 动态链接与共享库(与静态库对比) 2.交换(内存与磁盘间)维护着一个可运行进程就绪队列,进行内存与磁盘间线程的载入与存出。 3.连续内存分配内存分区之可变分区的思想,将内存分成一个个孔(hole),使用一张表维护hole的使用情况。 存在碎片问题(分为外碎片与内碎片) 首次适应--首个足够大的孔(50%规则,描述碎片多)最优适应--最小合适的孔最差适应--最大孔外部碎片大,解决思路有 紧缩 与 分页、分段(运行物理地址不连续的策略) 4.分段将内存分为不同长度的段,维护分段硬件支持段表 <段名称s,段偏移d> 5.分页物理内存分为固定大小的块,称为帧。逻辑内存也分为同样大小的块,称为页。 <页码p,页偏移> 与对应的页表 TLB 带Hash页表--转换表缓冲区 保护机制与共享页 6.页表结构补充分层页表 哈希页表(数组+链表) 倒置页表 二、虚拟内存管理1.背景使用虚拟内存来逻辑内存容量--分配出去但未使用的内存空间,通过伪分配实现扩容。 2.请求调页概念:仅在需要时,才加载页面。 调页程序--惰性变换器实现 一般缺页错误的处理很简单: 检查这个进程的内部表,以确认该引用是有效的还是无效的内存访问。如果引用无效,那么终止进程。如果引用有效但是没有调入内存,那么现在就调入。找到一个空闲帧。调度一个磁盘操作,以将所需页面读到刚分配的帧。磁盘读取完成,修改进程内部表和页表。以指示该页现在处于内存中。重新启动被陷入中断的指令。该进程能访问所需要的页面,就好像原来他就在内存中一样。 缺页处理的时间花费主要体现在:处理缺页中断、读入页面、重新启动进程 3.写时复制(父子进程间)4.页面置换 当用户进程在执行时,可能发生缺页错误。操作系统确定所需要页面的磁盘位置,但是却发现内存上没有空闲的帧。所有内存都在使用。此时,它会选择交换出一个进程,以释放它在所有帧并降低多道程序。 在没有空闲帧的情况下,那么就要查找当前不在使用的一个帧,并释放它,牺牲帧,他被换出到交换空间,并修改它的页表。可以看到当没有空闲帧的情况下,需要两个页面传输(一个传入,一个传出)。这种情况世界加倍了缺页错误处理时间,并增加了有效的访问时间。 为了减少置换的时间,系统提供了一个修改位,两者的关联采用硬件。每当一个页面内的任何字节被写入时,它的页面修改位会由硬件来设置,以表示该页面被修改过。当要选择一个页面置换时,它会先看这个页面或者帧有没有被修改过,如果没有修改过就不用将它换出,直接进行换入,将它的空间覆盖。 页面置换算法FIFO 先进先出OPT/MIN 最优置换LRU 最近最少使用近似LRU 额外引用位算法 (多位标志位)第二次机会算法(1位标志位)增强型第二次机会算法-分类(元组分类出最近使用与需要写回)基于计数 LFU 最不经常使用MFU 最经常使用搭配上页面缓冲算法--最近被淘汰的页面被放置在高速磁盘区,减少淘汰错误页面下次换回的代价 5.帧分配分配算法--平均与比例 全局分配与局部分配(区别,是否面向所有进程的内存暑假页) 6.系统抖动频繁发生页面置换 7.内存映射文件与IO

June 6, 2020 · 1 min · jiezi

操作系统与通用计算机组成原理简论

在学NIO的时候,需要用到一点操作系统和计算机组成原理的知识,于是就又复习了一下计算机组成原理和操作系统。可能一些程序员心中的程序执行模型是这样的: 在使用IO流复制文件的时候,都是认为程序将位于磁盘上的文件读入内存然后在输出的磁盘上指定的位置。这是一个相当粗糙而不精准的模型,在这个模型中CPU和操作系统被隐藏,好像根本就没有参与工作一样。程序并不能直接读取文件,它需要向操作系统的申请,操做系统会给程序回应。程序是无法直接接触到硬件的,在现代计算机中,一切资源都必须向操作系统申请。还有一些程序员认为32位操作系统最多只能够使用4GB(232)的RAM,而64位操作系统则最多只能使用264字节的RAM。这是一种谬误,要解释清楚这些问题,并没有那么简单。但是了解这些,将会让你成为一名大牛,你将看到隐藏在海面下的八分之七。 通用硬件组成 这张图是近期Intel系统产品族的模型,可能你还不大清楚这张模型图中有些名词的意思。但是不要担心,我将会为你逐个介绍。 总线 贯穿这个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间进行传递。通常总线被设计成传送定长的字节块,也就是字。字中的字节数(即字长)是一个基本的系统参数,各个系统中都不尽相同。现在大多数机器字长要么是4个字节(32位),要么是8个字节(64位)。 我们常说从磁盘加载进内存,那么磁盘和内存是如何交换信息的呢,就是通过I/O总线。I/O设备 I/O(输入/输出) 设备是系统与外部与世界的联系通道,是主存和外部设备(例如磁盘驱动器、终端和网络)之间复制数据的过程。输入操作是从I/O设备复制数据到主存,而输出操作是从主存复制到I/O设备。I/O是一种抽象的概念,网络从某种意义上来说,只是另一种I/O设备,是数据源和数据接收方。 每个I/O设备都通过一个控制器或适配器与I/O总线相连。控制器和适配器之间的区别主要在于它们的封装方式。控制器是I/O设备本身或者系统主板上的芯片组。而适配器则是一块插在主板插槽上的卡。无论如何,它们的功能都是在I/O总线与I/O设备之间传递信息。处理器 中央处理单元(CPU),简称处理器,是执行存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),或称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。 从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向的指令,再更新程序程序计数器,使其指向下一条指令。处理器看上去是按照一个非常简单的指令执行模型来操作的,这个模型是由指令集架构决定的。 什么是指令集架构? 粗略的说这个就是我们所说的机器语言,但是要讲清楚指令集体系架构是什么并不容易,这不是本篇的主题,需要结合CPU去讲,会专门再开一门博客去讲。 在这个模型中,指令按照严格的顺序执行,而执行一条指令包含一系列的步骤。处理器从程序计数器指向的内存处读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC,使其指向下一条指令,这条并不一定和内存中刚刚执行的指令相邻。 这样的简单操作并不多,它们围绕着主存、寄存器文件(register file) 和算术/逻辑单元(ALU)进行。寄存器文件时一个小的存储设备,由一些单个字长的寄存器租场,每个寄存器都有唯一的名字。ALU计算新的数据和地址值。下面是一些简单操作的例子,CPU在指令的要求下可能会执行这些操作。加载: 从主存复制一个字节或者到一个字到寄存器,以覆盖寄存器原来的内容。存储: 从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖掉这个位置原来的内容操作: 把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖这个位置上原来的内容。跳转: 从指令本身中抽取一个字,并将这个字复制到PC中,以覆盖PC中原来的值。顺便提一下 USB也是总线: 通用串行总线。主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存储器(DRAM)芯片组成的。从逻辑上来说,存储器上是一个线性的字节数组,每个字节都有唯一的地址(数组索引),这些地址是从零开始的,突然想起了C语言的指针。操作系统简论与IO接口各位还记得hello world吗? 相信这是很多学习高级语言的人,写的第一个程序。 在键盘上输入文字在显式器上显示,然后程序被执行,在控制台输出。在这个过程中我们写的程序是没有直接访问显示器、磁盘、内存。取而代之的是,他们依靠操作系统的服务。这也是java中读文件的方法都是native方法的原因。在现代操作系统中,I/O是计算机完成各种功能的一个重要方面。处理器负责执行各种计算任务,并且通过内存总线操纵整个内存空间,但是仅仅这些还是不够的,还要有各种外部设备的参与才可使计算机做到真正"有用"。尽管这些设备的功能和用途各式各样,但是处理器利用了标准的接口技术,通过设备的控制器与他们打交道。因此,从硬件层面上,处理器支持的接口技术是计算机系统能够协作运行的基础。 从软件层面上,操作系统提供相应的软件来操作设备的控制器,并且定义对应的软件接口或系统服务。使得应用程序可以方便地操纵或使用外部设备。操作系统的I/O系统复杂而精巧的,我们不可能用一篇博客来完全讲清楚,以上引入的概念只是为了介绍程序的执行过程和程序在执行过程中读写文件的时候都发生了些什么。现代的高级语言设计的十分精巧,经常让一些程序员有一种错觉,觉得读写文件时,就是程序将文件读入内存,然后对文件做操作,然后输出到磁盘。但是这种模型十分经不起推敲,已经不能说是粗糙,应该是错误的。 我们可以将操作系统看成应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作尝试必须经过操作系统。再强调一遍,所有应用程序对硬件的操作尝试必须经过操作系统。操作系统有两个基本功能: (1) 防止硬件被失控的程序滥用 (2) 向应用程序提供简单一致的机制来控制复杂而又通常不相同的低级硬件设备。 一个典型的I/O请求过程绝大多数I/O系统并不涉及I/O系统的所有组件。典型的I/O请求首先从"一个应用程序执行一个I/O相关的函数开始", 我们可以将其理解为程序调用操作系统提供的I/O接口,然后该请求将由I/O管理器、一个或多个设备驱动程序和HAL来处理。什么,你问什么是HAL? HAL: Hardware Abstraction Layer 硬件抽象层。最早由微软提出,微软发现,程序直接与硬件通信,是造成系统不稳定的主要原因。硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 程序读写文件时发生了什么?这里我不准备介绍I/O 设备是如何工作的,这是一个庞大的主题。只做概要描述,便于理解程序在执行时发起I/O请求,请求读写文件时,CPU从磁盘读数据时发生的步骤。CPU使用一种称为内存映射I/O(memory-mapped I/O)的技术向I/O设备发射命令。在使用内存映射I/O的系统中,地址空间中有一块地址是为与I/O设备通信保留的。每个这样的地址称为一个I/O端口(I/O port)。当一个设备连接到总线时,它与一个或多个端口相关联。 有了内存映射I/O(memory—mapped I/O)这个概念之后,我们接着来介绍CPU从磁盘数据的步骤。我们知道CPU的执行单位是指令。假设磁盘控制器被映射到某个端口,随后,CPU可能通过执行三个对地址0xa0的存储指令,发起磁盘读: 第一条指令是发送一个命令字,告诉磁盘发起一个读,同时还发送了其他的参数,例如当读完成时,是否中断CPU(如果你不懂什么是中断的话,没关系,等着我)。第二条指令指明应该读的逻辑块号。第三条指令指明应该存储磁盘山区内容的主存地址。 当CPU发出了请求之后,在磁盘执行读的时候,CPU出于等待状态,磁盘是很慢的,此时让CPU一直陷入等待是一种极大的浪费。操作系统的CPU调度器通常会让CPU去做其他事情。 在磁盘控制器收到来自CPU的读命令之后,它将逻辑块号翻译成一个扇区地址,读该扇区的内容,随后将这些内容直接传送到主存,不需要CPU的干涉。设备可以自己执行读或者写总线事务而不需要CPU的过程,我们称为直接内存访问(Direct Memory Access,DMA)。这种数据传统称为DMA传送(DMA transfer)。写到这里突然想起java NIO中的transferTo方法,高效的文件拷贝。试想如果是CPU再干涉,那么CPU就需要向内存发送写指令,而CPU不会被单个进程独占。 在DMA传送完成,磁盘扇区的内容被安全地存储在主存中以后,磁盘控制器通过给CPU发送一个中断信号来通知CPU。 操作系统的结构与CPU态结构接下来我们来讲程序执行模型,也就是进程,程序是如何被执行起来的。要介绍程序是如何执行的,我们首先要介绍操作系统。首先我们来认识现代操作系统的逻辑结构,那么什么是操作系统的逻辑结构呢? 那就是操作系统的设计和实现思路。一般来说有三种: 整体式结构整体式结构以模块为基本单位构建,将系统拆分成一个一个模块。 特点:- 模块设计、编码和调试独立- 模块调用自由- 模块通信多以全局变量形式完成缺点:信息传递随意,维护和更新困难。层次式结构层次结构的软件例子: TCP/IP协议栈 所有功能模块按照调用次序排成若干层,相邻层间只有单向依赖或单向调用。层次结构的优点: - 结构清晰,避免循环调用- 整体问题局部化,系统的正确性容易保证- 有利于操作系统的维护、扩充、移植。微内核结构(客户/服务器结构)操作系统= 微内核+核外服务器。 ...

June 6, 2020 · 1 min · jiezi

华为今年年内没有推出搭载鸿蒙操作系统手机的计划

10 月 12 日消息,有网络传言称,华为将在 10 月 17 日推出一款更具创新的全面屏手机,同时还有可能搭载鸿蒙系统。 对此,华为方面表示,该消息不属实,今年年内,华为都没有推出鸿蒙操作系统手机的计划。 华为相关人士表示:“之前余总(华为消费者业务 CEO)已经说得很清楚了,今年内鸿蒙操作系统都不会用在手机上,目前还是专注于打造华为 HMS 生态。” 据悉,传闻中 10 月 17 日推出的更具创新的全面屏手机,应该是指华为的 Nova 5T,华为将在法国等欧洲市场上线这款产品。

October 14, 2019 · 1 min · jiezi

Alibaba-Cloud-Linux-2阿里云Linux操作系统全面解析

2019年9月26日星期四,在杭州云栖大会的阿里云系统软件开发者专场上,来自阿里云智能基础软件技术专家贾正华(花名:晓贾)做了主题为《Alibaba Cloud Linux 2-阿里云Linux操作系统》的技术分享,主要就Alibaba Cloud Linux 2(原Aliyun Linux 2)如何为云上客户提供一个优秀的的操作系统展开了全面的解析。 很多观众肯定会想知道为什么阿里云要做一个Linux操作系统,其实阿里巴巴从09年开始就在做操作系统相关的研究、开发工作,只是以前定制的操作系统主要是用在内部的一些应用上,而随着阿里巴巴技术的演进,我们觉得有必要将内部这么多年的经验和积累与客户一起分享,而且现在云上用户也对操作系统反馈了很多诉求,所以我们为阿里云和阿里云上的客户量身定制了Alibaba Cloud Linux 2。 在谈到云上用户对于操作系统的安全诉求时,贾正华谈到Alibaba Cloud Linux 2主要通过三个措施来保障操作系统安全: 通过Alibaba Cloud Linux 2 CIS benchmark(注1)可以帮助用户选择配置最适合自己的系统安全,包括但不限于系统初始化安全配置、系统服务安全配置、网络安全配置、日志监控安全配置等等,涵盖了整个系统安全配置的方方面面;通过对操作系统kernel、服务、配置等方面进行精细化的裁剪,大大降低了系统的受攻击面;最后得益于阿里巴巴安全技术团队为操作系统提供全方位的安全保障,包括:漏洞挖掘、全域CVE监测、环境模拟攻击等等措施保障系统安全。而且安全团队还可以从组织或者参与的安全社区从全社会获取安全情报,提前发现威胁、消除威胁;在性能方面,Alibaba Cloud Linux 2也做了非常多的工作,使启动时长下降了30%,运行时性能提升10%~30%: 在介绍Alibaba Cloud Linux 2为什么能够提升如此多的性能,贾正华谈到,启动时长得益于操作系统团队对OS的精细化裁剪和对内核启动阶段部分流程的代码优化,而运行时性能得益于我们选择了更优的4.19 LTS内核版本,并且结合阿里云基础设施对内核进行了多方面的优化,包括调度、内存、网络等。 在生态方面,Alibaba Cloud Linux 2为了让用户得到一个功能丰富全面、云上配置使用简单的OS,首先在保证全面兼容CentOS和多个upstream社区的同时,也天生搭载阿里巴巴技术例如Alibaba Cloud CLI、Alibaba Cloud OPENAPI,方便用户开箱即用,而且Alibaba Cloud Linux 2是一个完全开源(注2)、开放的系统,代码人人可见,人人可以用: 对于很多企业都关心的稳定性,Alibaba Cloud Linux 2依托于多个活跃稳定的强大社区base、阿里巴巴经济体海量应用的规模化验证、操作系统团队端到端的维护,极大的保证了线上操作系统的质量: 操作系统对于很多上层应用软件来说太底层了,甚至于应用可能完全没法感知的到,所以可能很多企业或者个人没法对其实施很多运维动作,肯定希望我们能够提供操作系统的服务,所以Alibaba Cloud Linux 2向用户提供包括但不限于问题支持、系统优化、特性订制等服务。 阿里云的用户可以通过阿里云工单系统来直接与我们联系,其他用户可以通过Alibaba Cloud Linux 2社区和钉钉来与我们联系。最重要的一点是操作系统团队所提供的服务都是“免费”的。 用户可以使用以下的方式与操作系统团队联系: Linux操作系统是一个非常庞大而复杂的系统,没有任何一个团体或者个人说我们已经能够完全掌控住他了,整个系统的持续演进不仅仅需要专业的团队进行维护,也希望有更多的企业、个人、社区一起参与共建。 注释:1、针对Alibaba Cloud Linux 2定制的CIS benchmark,详情参见:https://workbench.cisecurity.org/benchmarks/22282、Alibaba Cloud Linux 2代码完全开源,github地址:https://alibaba.github.io/cloud-kernel/zh/os.html ...

September 30, 2019 · 1 min · jiezi

五分钟了解操作系统内核

操作系统和内核关于操作系统是这样定义的:操作系统(英语:Operating System,缩写:OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。 对我们来说,操作系统最直观的感受就是桌面系统,以及上层的应用程序,而后面的资源处理等等就是操作系统背后的黑盒。 读者朋友们现在阅读我的这篇文章,是在浏览器,或者某个应用程序上进行的。而一个应用程序是要运行在特定的操作系统上的。操作系统,则是要运行在硬件上的。所以这三者关系如图。 再来看看内核的定义:“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。 简单来说,内核是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,决定着系统的性能和稳定性。是连接应用程序和硬件的桥梁。 内核就是操作系统背后黑盒的核心。 这时候我们回过头来看看操作系统和内核的定义,是不是有些明白了呢。 内核的分类既然我们知道了内核是什么,接着来看看内核的分类,现在内核的主要分类有四类: 宏内核(单内核),微内核,混合内核,外内核。 什么是宏内核我们上面说到,内核管理着操作系统的内存,文件,IO,网络等等,每个功能可以看做一个模块,在宏内核中,这些模块都是集成在一起的,运行在内核进程中,模块之间的交互直接通过方法调用。 什么是微内核而在微内核中,内核只提供最核心的功能,比如任务调度,内存管理等等,其他模块被移出内核,运行在不同的进程中,这样即使某一个模块出现问题,只要重启这个模块的进程即可,不会影响到其他模块,稳定性大大增加。甚至可以在系统运行过程中替换现有模块的实现。而且由于模块独立的性质,可以做到模块的按需加载。但是模块间的相互调用需要通过进程间通信,通信效率相对较低。 什么是混合内核我们上面看了宏内核和微内核的实现,就会发现,两者各有千秋,也各有缺点,所以混合内核就是集中了两者的特点,让微内核中的一些核心模块运行在内核中,从而使内核效率更高一些。 什么是外内核外内核是把硬件暴露给应用程序,应用程序可以直接访问硬件,外内核对系统提供保护。目前还在研究阶段。 宏内核 微内核对比看了上述宏内核和微内核的实现,我们可以总结一下:宏内核最大的特点就是模块集成在一起,而微内核是模块间分离。基于此点出发,对比如下: 宏内核微内核通信效率高(函数调用)低(进程间通信)稳定性低(模块集成在一起)高(模块间互不影响)扩展性低(模块集成在一起)高(模块间互不影响)代码量多(需要实现所有模块)少(只需要实现核心功能)当前主流操作系统内核宏内核 Linux Windows 9X 系列 MacOS 8.6 版本之前 微内核 Fuchsia 鸿蒙 Minix 混合内核 Windows XP Windows 7 Mac OS X XNU 外内核Nemesis 参考资料https://zh.wikipedia.org/wiki... https://www.cnblogs.com/smwik... https://zh.wikipedia.org/wiki... https://www.oschina.net/news/...

September 10, 2019 · 1 min · jiezi

浅析-Linux-进程与线程

简介进程与线程是所有的程序员都熟知的概念,简单来说进程是一个执行中的程序,而线程是进程中的一条执行路径。进程是操作系统中基本的抽象概念,本文介绍 Linux 中进程和线程的用法以及原理,包括创建、消亡等。 进程创建与执行Linux 中进程的创建与执行分为两个函数,分别是 fork 和 exec,如下代码所示: int main() { pid_t pid; if ((pid = fork() < 0) { printf("fork error\n"); } else if (pid == 0) { // child if (execle("/home/work/bin/test1", "test1", NULL) < 0) { printf("exec error\n"); } } // parent if (waitpid(pid, NULL) < 0) { printf("wait error\n"); }}fork 从当前进程创建一个子进程,此函数返回两次,对于父进程而言,返回的是子进程的进程号,对于子进程而言返回 0。子进程是父进程的副本,拥有与父进程一样的数据空间、堆和栈的副本,并且共享代码段。 由于子进程通常是为了调用 exec 装载其它程序执行,所以 Linux 采用了写时拷贝技术,即数据段、堆和栈的副本并不会在 fork 之后就真的拷贝,只是将这些内存区域的访问权限变为只读,如果父子进程中有任一个要修改这些区域,才会修改对应的内存页生成新的副本,这样子是为了提高性能。 fork 之后父进程先执行还是子进程先执行是不确定的,所以如果要求父子进程进行同步,往往需要使用进程间通信。fork 之后子进程会继承父进程的很多东西,如: 打开的文件实际用户 ID、组用户 ID 等进程组当前工作目录信号屏蔽和安排...父子进程的区别在于: ...

July 16, 2019 · 2 min · jiezi

工具资源系列之给-windows-虚拟机装个-mac

众说周知,Mac 很好但也很贵,对一般大众而言,漂亮简洁高颜值,对软件开发者而言,方便省心有点贵. 好到什么程度?内置大量常用的开发工具,省去了初学者安装配置环境的麻烦,版本控制工具 svn 默认已安装,web 服务器 apache 默认已安装,编程开发环境 php 默认已安装等等,例子很多就不一一列举了.除此之外,Mac 系统不同于 Windows 系统,Mac 系统是一种类 Unix 操作系统,命令行工具很好用,相当于提前熟悉 Linux 语法了,这一点是 Windows 望尘莫及的. 贵到什么程度?随随便便的普通版七八千,如果再稍微挑挑拣拣,起码一两万! 如果预算不够但又想体验一下 Mac 电脑,该怎么办? 答案很简单,直线去去线下苹果体验店啊! 哈哈,我是开玩笑的,言归正传,买不起真实的苹果笔记本也没关系,我们可以像安装普通软件那样,安装一个苹果笔记本! 下面我们将介绍一种方法,让你能够在 Windows 电脑上安装一个苹果笔记本,用起来和真的一样,只不过你我都心知肚明,那并不是真实的机器! 知识扫盲虚拟机是相对于真实的物理机而言的概念,是在我们当前正在使用的计算机基础上,通过软件或硬件的方式创造的新的计算机.VMware 是常用的虚拟机软件之一,物理机安装好 VMware 软件就可以利用该软件虚拟出任意计算机即虚拟机.VMware 支持 Windows ,Mac 和 Linux 等常见操作系统,是名副其实的跨平台软件. 镜像 是一种特殊格式的文件,文件后缀名一般是 .iso ,但也要例外,比如本文安装的 macOS Mojave 10.14 18A391 Lazy Installer(MD5-CDD5EDA714D8BCC8E799F8272556CF3B).cdr 的后缀名却是 .cdr ,镜像文件就是创建虚拟机的必要程序,有了它 VMware 软件才能创建出虚拟机.总的来说,VMware 软件加载 xxos.iso 镜像文件创建出 xxos 虚拟机. 所以,阅读教程前请务必准备好 VMware 虚拟机以及相应的镜像文件. ...

July 13, 2019 · 2 min · jiezi

浪漫又务实的华为自研之路-始于情怀终于智能

最近一周以来,关于华为的消息一则接一则,备受大家关注,很多人也为华为捏着一把汗。 先是 5 月 16 日,美国商务部产业与安全局(BIS)将华为及其 68 个非美国子公司纳入 「实体清单」(这份清单实际上就是一份「黑名单」,一旦被列入这个清单,就失去了在美国的贸易机会,会遭到技术封锁和国际供应链隔离); 谷歌、微软、ARM 相继拒绝对华为提供服务 紧接着是 5 月 20 日谷歌限制华为访问其 Android 操作系统和应用程序,Gmail,YouTube 和谷歌地图都不能在华为手机使用,随后微软也默默地将华为笔记本电脑从其线上商店下架; 然后是 5 月 23 日,孙正义旗下的芯片设计公司 ARM 暂停与华为及其芯片公司海思的一切业务往来…… 真是一波未平一波又起。此时此刻,华为面临着极其严峻的挑战。而对此,华为始终沉着冷静,并硬气回应:我们能够自主设计,不惧断货。 居安思危的华为其实,早在 2012 年,任正非就已经未雨绸缪。 他在 2012 年 9 月的「诺亚方舟实验室」专家座谈会上,对中外专家表示:「我们现在做终端操作系统是出于战略的考虑,如果他们突然断了我们的粮食,Android 系统不给我用了,Windows Phone 8 系统也不给我用了,我们是不是就傻了?」 居安思危的华为,这些年一直都在做着最坏的打算,为脱离美国的供应做着准备。 过去十年,华为的研发投入将近 4000 亿人民币,其中投入到芯片研发上的大约占 40%,也就是 1600 亿人民币左右。 而负责操作系统研发的华为内核 OS 实验室也早就成立,属于华为 2012 实验室的中央软件院,与海思平级。 华为在研发上的高投入是大家都有所耳闻的,他们去年研发投入 1015 亿元,位列全球第四。 巨大的投入与付出之后,现在,大概也到了该收获的时候了吧。 EMUI:基于安卓,情感化升级用华为手机的朋友都知道,现在华为手机都搭载的自家系统 EMUI,它是华为基于安卓 9.0 打造和升级的情感化操作系统,被华为称为 人工智能 操作系统。当初是为了提供给用户更好的体验而进行开发的。 EMUI 最早在华为 P6 就已经使用,目前升级至 EMUI 9.1 ...

May 24, 2019 · 1 min · jiezi

学习笔记关于操作系统学习顺序引导

1. 堆栈什么是栈函数调用的栈的管理什么是堆堆的分类,不同的申请和释放方式2. 进程进程与进程组各种不同的进程一个进程的演变

May 22, 2019 · 1 min · jiezi

学习笔记各种不同的进程todo

0. 进程组具体的介绍,请参考 1. 前台进程2. 后台进程3. 守护进程4. 僵死进程5. 孤儿进程6. 0号进程和1号进程这个请参考 一个进程的演变

May 21, 2019 · 1 min · jiezi

学习笔记进程与进程组todo

好烦啊,写了好久的文章,按了 ctrl + shift + H 莫名其妙的页面就关闭了1. 进程关于进程的结构和性质,就不做过多介绍,具体的可以参考下之前的几篇文章。 通常而言,我们打开的一个软件(QQ和微信),执行的一个脚本(hello.c、hello.php/hello.java :可以当做运行的一个程序)都是通过进程的形式。 下图:查看的是所有运行中的进程 所以无论打开图形界面一个软件,或者终端运行 ,都是包装成一个进程的形式运行 进程的退出 : 是通过信号 退出的2. 子进程以nginx 和 php-fpm 为例,他们都是通过父进程,fork 多个子进程。来执行并发请求。子进程共享父进程的资源和堆栈信息,父进程便于管理子进程。相当于同时打开多个QQ页面,每一个窗口页面和一个好友聊天,接受和发送当前好友的消息。 需要注意的是:fork 子进程,会返回二个值。 分别是当前父进程和新生成的子进程。可以分别对他们得逻辑分别处理。 先运行父进程逻辑,再运行子进程逻辑。(当前可以通过vfork等暂停父进程的继续流程) 3. 进程的状态3.1 进程状态进程的系统状态有一下几种 各个状态的调用和切换如下图 IPC 进程通信,也会影响状态3.2 查看进程的状态PS : process status 是一个管理进程状态的内核命令 和系统状态值对应,有以下集中状态值: 最常用的,我们运行的状态值 R : 可运行l : 表示进程是多线程的PS的参数信息: -a 是所有的终端-A: 包括内核的-r : running 包括正在运行的-o : 分类输出 3.3 procproc 里面包含什么信息 3.4.1 查看程序的执行文件 ...

May 21, 2019 · 1 min · jiezi

学习笔记一个进程的演变todo

介绍下 linux 进程的演变 1. 0号进程在此之前,先简单的介绍下 各个主进程 rest_init() 就会创建进程(创建0号进程)init_task : 0号进程 (不是通过fork ,系统启动的时候创建) 然后创建1号进程,2号进程。1号进程是所有进程的祖先 : 用户空间 /sbin/init2号负责管理内核中的进程,线程 : 内核空间 kthreadd 具体逻辑如下 : 系统中的所有进程,都是通过 这二个进程派生的 系统级别的,都是2号进程派生的用户基本的,都是1号进程派生的 2. 1号进程先简单的介绍下操作系统 中间的还没有登录,处于 getty 状态 然后login进程之后-bash 3. 用户进程的过程 4. init进程的演变4.1 init进程演变的类别 4.2 启动脚本

May 21, 2019 · 1 min · jiezi

学习笔记内存的-chunk-和-bins

todo 详细的介绍下chunk 的结构 和 bins 的各种类型

May 13, 2019 · 1 min · jiezi

学习笔记内存的申请和释放

todo 只是简单的说下 顺序。 各个bins 的介绍,参考另外一篇文章

May 13, 2019 · 1 min · jiezi

操作系统学习一NetCore-实现模拟多道程序设计的简单处理机调用

前言道程序设计中,经常是若干个进程同时处于就绪状态,为了使系统中的各进程有条不紊地运行,必须选择某种调度策略,以选择一个进程占用处理机。本次实验设计一个模拟单处理机调度的算法,以加深对处理机调度算法的理解。 要求按照时间片轮转算法设计模拟调度程序。输出进程的调度过程。思路分析由于本实验是按照处理机调度算法模拟实现处理机的调度,与真正的处理机调度过程并不完全相同,比如没有实现中断(时间片设为1),进程的运行也不是真正的运行,而是在屏幕上打印其运行时间等。所以要以文件的形式给出进程的信息,文件信息可参考如下: 进程ID 到达时间 估计运行时间 优先级0 0 3 21 2 6 42 4 4 03 6 5 34 8 2 1 以下是实验的大致思路: 建立三个队列:PCB队列,就绪队列,完成队列。PCB队列:保存将进入系统的进程。(由于没有实现中断,所以将进入系统运行的进程必须在程序运行前给出)。就绪队列:到达进程进入系统的时间,将该进程放入就绪队列,等待调度。完成队列:将“运行”完的进程放入完成队列。 进程运行过程是在屏幕上打印相关信息。使用轮转算法调度的进程应打印的信息包括:进程占用处理机序列,该进程每次占用处理机的开始时间与结束时间。 统计出进程的周转时间T和带权周转时间W。流程图 实现代码ProcessControlBlock.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace OperatingSystemExperiment.Exp1 { enum ProcessStatus { Ready, Run, Finish } /// <summary> /// 进程控制块 PCB /// </summary> class ProcessControlBlock { /// <summary> /// 进程号 /// </summary> public int ID; /// <summary> /// 进程状态 /// </summary> public ProcessStatus Status; /// <summary> /// 进程到达时间 /// </summary> public int ArriveTime; /// <summary> /// 估计运行时间 /// </summary> public int Time; /// <summary> /// 已运行时间 /// </summary> public int RunTime = 0; /// <summary> /// 等待时间 /// </summary> public int WaitTime; /// <summary> /// 优先级 /// </summary> public int Priority; /// <summary> /// 链接指针 /// </summary> public ProcessControlBlock Next; /// <summary> /// 开始时间 /// </summary> public int StartTime; /// <summary> /// 结束时间 /// </summary> public int FinishTime; public void Run() { this.Status = ProcessStatus.Run; if (RunTime >= Time) { this.Status = ProcessStatus.Finish; return; } this.RunTime++; } public void Wait() { this.WaitTime++; } public override string ToString() => String.Format("{0} {1} {2}", ID, StartTime, FinishTime); }}CentralProcessUnit.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.IO;namespace OperatingSystemExperiment.Exp1 { class CentralProcessUnit { private List<ProcessControlBlock> PCBList = new List<ProcessControlBlock>(); private Queue<ProcessControlBlock> FinishQueue = new Queue<ProcessControlBlock>(); private Queue<ProcessControlBlock> ReadyQueue = new Queue<ProcessControlBlock>(); public CentralProcessUnit() { LoadPcbList(); } /// <summary> /// 生成进程列表 /// </summary> /// <param name="count">进程数量</param> public static void GenerateProcessList(int count) { var processListFile = Path.Combine(Environment.CurrentDirectory, "process_list.txt"); var writer = new StreamWriter(processListFile); var rnd = new Random(DateTime.Now.Millisecond); for (var i = 0; i < count; i++) { var runTime = rnd.Next(1, 10); writer.WriteLine("{0} {1} {2} {3}", i, Math.Pow(2, i), runTime, rnd.Next(0, 4)); } writer.Close(); } /// <summary> /// 加载PCB列表 /// </summary> private void LoadPcbList() { var processListFile = Path.Combine(Environment.CurrentDirectory, "process_list.txt"); var reader = new StreamReader(processListFile); while (!reader.EndOfStream) { var line = reader.ReadLine(); var procInfo = line.Split(' '); PCBList.Add(new ProcessControlBlock { ID = int.Parse(procInfo[0]), ArriveTime = int.Parse(procInfo[1]), Time = int.Parse(procInfo[2]), Priority = int.Parse(procInfo[3]) }); } } /// <summary> /// CPU运行 /// </summary> public void Run() { var times = 0; while (true) { // 如果所有进程运行完,则退出循环 if (FinishQueue.Count == PCBList.Count) { break; } // 遍历所有进程列表 foreach (var p in PCBList) { // 根据进程到达时间判定是否有新进程加入,然后将进程状态设置为就绪 if (p.ArriveTime == times++) { Console.WriteLine("时间:{0},进程 {1} 到达", times, p.ID); p.Status = ProcessStatus.Ready; } // 讲就绪状态进程加入就绪列表 if (p.Status == ProcessStatus.Ready) {// Console.WriteLine("时间:{0},进程 {1} 加入就绪列表", times, p.ID); ReadyQueue.Enqueue(p); } // 如果就绪队列为空则进入下一次循环 if (ReadyQueue.Count == 0) {// Console.WriteLine("时间:{0},没有就绪进程,进入下一个循环", times); continue; } // 从就绪队列中取出一个进程运行 var currentProcess = ReadyQueue.Dequeue(); Console.WriteLine("时间:{0},运行进程 {1}", times, p.ID); currentProcess.Run(); // 将运行完毕进程加入完成列表 if (currentProcess.Status == ProcessStatus.Finish) { Console.WriteLine("时间:{0},进程 {1} 运行完毕,总运行时间:{2}", times, p.ID, p.RunTime); FinishQueue.Enqueue(currentProcess); } else currentProcess.Status = ProcessStatus.Ready; } } } }}Main.csnamespace OperatingSystemExperiment.Exp1{ public class Main { public static void Run() { CentralProcessUnit.GenerateProcessList(5); new CentralProcessUnit().Run(); } }}运行结果生成的process_list.txt内容:0 1 8 31 2 3 12 4 8 03 8 6 34 16 4 1控制台输出时间:1,运行进程 0时间:2,运行进程 1时间:3,运行进程 2时间:4,运行进程 3时间:5,运行进程 4时间:6,运行进程 0时间:7,运行进程 1时间:8,运行进程 2时间:9,进程 3 到达时间:9,运行进程 3时间:10,运行进程 4时间:11,运行进程 0时间:12,运行进程 1时间:13,运行进程 2时间:14,运行进程 3时间:15,运行进程 4时间:16,运行进程 0时间:17,运行进程 1时间:17,进程 1 运行完毕,总运行时间:3时间:18,运行进程 2时间:19,运行进程 3时间:20,运行进程 4时间:21,运行进程 0时间:23,运行进程 2时间:24,运行进程 3时间:25,运行进程 4时间:25,进程 4 运行完毕,总运行时间:4时间:26,运行进程 0时间:28,运行进程 2时间:29,运行进程 3时间:31,运行进程 0时间:33,运行进程 2时间:34,运行进程 3时间:34,进程 3 运行完毕,总运行时间:6时间:36,运行进程 0时间:38,运行进程 2时间:41,运行进程 0时间:41,进程 0 运行完毕,总运行时间:8时间:43,运行进程 2时间:43,进程 2 运行完毕,总运行时间:8 ...

May 11, 2019 · 3 min · jiezi

学习笔记函数调用的栈的管理

记在最初,如果发现有专业术语的错误,请记得及时改正。 这个真的很重要。1. 无参数传递的函数调用本例会实际演示一个 只有函数局部变量赋值的demo会先看一下C语言源代码和编译代码,然后一步一步的推演栈的空间使用1.1 函数源码C语言源码: 注释: 这个脚本中,main 函数调用 f 函数,各自函数里面有局部变量的定义,函数调用没有参数传递。 编译代码: 汇编指令: 1.2 编译step过程todo 2. 有传参的函数调用100. 致敬如有不详,请参考王老师的精彩讲解 堆栈管理学习过程中,获得了极大的满足感,把之前的一些东西串联了起来。十分感谢 王利涛老师。在此表示感谢。PS:本文中所有的资源和图片均来自视频中

May 9, 2019 · 1 min · jiezi

学习笔记栈的基本知识

1. 什么是栈2. 栈在内存中的map3. 栈溢出4. 栈帧100. 致敬如有不详,请参考王老师的精彩讲解 堆栈管理学习过程中,获得了极大的满足感,把之前的一些东西串联了起来。十分感谢 王利涛老师。在此表示感谢。PS:本文中所有的资源和图片均来自视频中另外十分推荐一本书 深入理解计算机系统

May 9, 2019 · 1 min · jiezi

学习理解文件系统的解读

结合自己所学,补充下自己的系统理解 todo

May 4, 2019 · 1 min · jiezi

搞定操作系统面试看这篇就够了

<section data-role="outer" label="Powered by 135editor.com"> <section data-role="outer" label="Powered by 135editor.com"> 点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 作者:CyC2018 链接:https://github.com/CyC2018/CS... <section> 一、概述基本特征1. 并发并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。 并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。 操作系统通过引入进程和线程,使得程序能够并发运行。 2. 共享共享是指系统中的资源可以被多个并发进程共同使用。 有两种共享方式:互斥共享和同时共享。 互斥共享的资源称为临界资源,例如打印机等,在同一时间只允许一个进程访问,需要用同步机制来实现对临界资源的访问。 3. 虚拟虚拟技术把一个物理实体转换为多个逻辑实体。 主要有两种虚拟技术:时分复用技术和空分复用技术。 多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占有处理器,每次只执行一小个时间片并快速切换。 虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。 4. 异步异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。 基本功能1. 进程管理进程控制、进程同步、进程通信、死锁处理、处理机调度等。 2. 内存管理内存分配、地址映射、内存保护与共享、虚拟内存等。 3. 文件管理文件存储空间的管理、目录管理、文件读写管理和保护等。 4. 设备管理完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。 主要包括缓冲管理、设备分配、设备处理、虛拟设备等。 系统调用如果一个进程在用户态需要使用内核态的功能,就进行系统调用从而陷入内核,由操作系统代为完成。 <figure></figure> Linux 的系统调用主要有以下这些: TaskCommands进程控制fork(); exit(); wait();进程通信pipe(); shmget(); mmap();文件操作open(); read(); write();设备操作ioctl(); read(); write();信息维护getpid(); alarm(); sleep();安全chmod(); umask(); chown();大内核和微内核1. 大内核大内核是将操作系统功能作为一个紧密结合的整体放到内核。 由于各模块共享信息,因此有很高的性能。 2. 微内核由于操作系统不断复杂,因此将一部分操作系统功能移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。 在微内核结构下,操作系统被划分成小的、定义良好的模块,只有微内核这一个模块运行在内核态,其余模块运行在用户态。 因为需要频繁地在用户态和核心态之间进行切换,所以会有一定的性能损失。 <figure></figure> 中断分类1. 外中断由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。 2. 异常由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。 3. 陷入在用户程序中使用系统调用。 ...

May 4, 2019 · 3 min · jiezi

阿里云首次在ASPLOS19发布重磅论文揭秘帮助ECS快速迭代的热升级技术

摘要: 阿里云首次在ASPLOS上发表论文,第24届ACM编程语言和操作系统(ASPLOS'19),于2019年4月13日至17日,在普罗维登斯召开,阿里云高级技术专家郑晓代表团队在会上发表了技术报告。第24届ACM编程语言和操作系统(ASPLOS'19),于2019年4月13日至17日,在普罗维登斯召开,阿里云高级技术专家郑晓代表团队在会上发表了技术报告。 论文主题为《Fast and Scalable VMM Live Upgrade in Large Cloud Infrastructure》,作者是张献涛,郑晓,沈益斌等。这篇论文被计算机系统结构的顶级会议ASPLOS'19接受,是业界对于VMM热升级这项突破性技术的认可。 论文ACM下载地址:https://dl.acm.org/citation.cfm?id=3304034PDF下载地址:https://yq.aliyun.com/download/3532 该论文系统的阐述了当前云计算领域面临的基础架构带业务热升级问题。提出了一种新型的,比热迁移更行之有效的方法,特别适合超大规模集群范围的使用,解决了困扰云计算行业多年的问题。该方案在阿里云大规模采用,服务百万级别的客户虚拟机数量。论文解决了在客户业务不中断的情况下以毫秒级的速度更换底层虚拟化组件。 阿里云热升级技术特点决定了可以同时热升级任意数量任意规格的虚拟机,并且升级时间恒定。更难得的是,在业界尚未有异构计算设备热迁移方案的情况下,阿里云热升级技术同时支持异构计算等以设备直通方式工作的虚拟机。帮助ECS在过去五年进行了快速的升级迭代,保障了产品和业务的快速奔跑。 ASPLOS(编程语言和操作系统的体系结构支持会议)会议全称为ACM International Conference on Architectural Support for Programming Languages and Operating Systems,是综合体系结构、编程语言和操作系统三个方向的计算机系统领域顶级会议,为CCF A类会议。从1982年创办至今的三十多年里,ASPLOS推动了多项计算机系统技术的发展,包括(但不限于)RISC、RAID、大规模多处理器、Cluster架构和网络存储等。 本文作者:阿里云头条阅读原文 本文为云栖社区原创内容,未经允许不得转载。

April 23, 2019 · 1 min · jiezi

Linux 内核101:NUMA下的竞争管理

本文参考了以下这篇论文:A Case for NUMA-aware Contention Management on Multicore Systems 直接点击链接就可以下载回顾一下上篇文章上一篇文章 简单地介绍了一下多 CPU 下的 NUMA 架构。NUMA 架构中将内存划分为多个不同的区域,将CPU 和临近的内存组成一个 node 节点,OS 调度的时候会优先使用临近的内存,从而解决了之前 UMA 架构下 BUS 带来的性能问题(因为多个 CPU 会对这一条总线产生竞争)。同时也讲到了在MySQL在 NUMA 架构下遇到的 “swap insanity”问题,也就是当MySQL 占用的内存超过 (100 / node 总数) % 时,由于『优先使用临近内存』这个调度模式的存在,造成了内存分配不均,导致系统整体内存充足的情况下,依然出现大量『不正常』的的 swap 现象。如下图所示:本文内容概括本文将从『资源竞争管理』的角度切入,将会看到UMA 时代的竞争管理算法将不再适用于 NUMA,并给出具体的原因分析和解决方案。看完之后相信你一定会对 NUMA有更加深刻的理解,并对多CPU 时代的编程有个感性的认识。UMA 竞争管理算法对 NUMA 不适用有共享资源的地方,就会有竞争。有竞争,就会有性能损失。一直以来,多核系统的共享资源竞争都是一个大问题。内核之间互相竞争共享资源,比如 last-level cache(LLC)、系统请求队列和内存管理器等。目前比较流行的解决方案叫做 contention-aware scheduler(竞争感知调度程序,下面简称为 CAS),也就是说它能够区分在互相竞争共享资源的 threads,然后把他们分开到不同的 domain。有数据显示,这种调度方法可以提高最坏情况下80%、平均10%的性能。这种算法在 UMA 中是有效的。但是需要考虑到的是, NUMA 相比 UMA 有一点很大的不同,那就是 UMA 只有一个 memory node,配备一个 memory controller;而 NUMA中 每个 node 里面都有一个 memory node,各自配备了一个 memory controller,如下图所示:16个核被分为了4个 node,每个 node 有一个独立的 memory(当然每个核都可以访问任意位置的内存)。那么这种调度方式到底起不起作用呢?如果只是简单的想一下的话,也许会觉得为什么不行呢?如果同一个 node 里面的 threads 竞争特别激烈,那我就把其中一个移到另一个 node 上,虽然说这会带来一定的延迟,但是竞争就解决了啊。然后,事情没那么简单,一切真理都来自于实践,实践发现,在 NUMA 上面实施这种调度算法的时候,非但没能很好地解决竞争,反而性能下降了30%。至于原因,下文将会给出。为什么不适用?在 NUMA 架构下,CAS 会感知有哪些相互竞争的 threads,然后把其中一个移到不同的 domain 中。这会导致一种情况:thread的内存没有分配在该thread 运行的那个 node 里面,比如说上图中,一个 thread 本来运行在 c1上,之后由于竞争被移到 c5上了,但是它的 memory 还在 M1。我们把这种由于移动 thread,导致 thread 和它的内存分家的行为称作『NUMA-agnostic migrations』(agnostic 中文意思是不可知,自已意会一下~)。NUMA-agnostic migrations导致了一些问题,比较明显一点的是thread 获取内存的延迟提高了,不过这还不是关键。更重要的是,NUMA-agnostic migrations无法缓解一些关键资源(memory controller)的竞争问题,甚至还引起对更多资源(interconnect connection)的竞争。下面这张图很重要,请仔细看:解释一下:T 和 C 分别表示两个程序(thread)图0:两个程序相安无事,没有竞争关系。图1:CT 的内存在一个 node,对 memory controller(MC) 产生了竞争关系。(应该还有访问延迟,图中可能忘记标注了)图2: 两个程序都需要试用进行CPU 之间的快速通道,产生了interconnect connection(IC)竞争。同时还有访问远程 memory 带来的访问延迟(RL)。图3:memory controller (MC)竞争,加上远程访问延时(RL)。图4:TC 位于一个 CPU 里面,对 last-level cache(CA) 产生竞争关系。图5:CA + RL图6:CA + MC图7:最坏的情况,CA + MC + IC + MC实验发现,图3的性能下降了110%。原因在于 threads 还是在相互竞争 memory controller。NUMA-agnostic migrations在迁移 thread 的时候,很有可能最后会导致这种情况出现。假如现在有两个threads,A 和 B,A 运行在图一中的 c1上,B 运行在 c2上,他们之间存在竞争关系(竞争last-level cache)。现在有一个 contention-aware 调度器检测到了 A 和 B 的竞争关系,于是把 B 移动到 c5上去了,现在A 和 B 不再竞争 last-level cache 了。事实上在 UMA 系统中这的确是起作用了(虽然对于 memory controller 的竞争还是存在的)。但是对于 NUMA,A 和 B 的 memory 还在一个地方,对于 最关键资源memory controller 的竞争没有得到解决。而且还引来了两个问题,这两个问题会严重影响 B 的性能。interconnect connection。(这点影响会很严重)remote access。总结一下NUMA-agnostic migrations无法提高 甚至还会降低NUMA竞争管理的性能,按照对性能的影响程度排序有:没能够解决对 memory controller 的竞争关系(memory 还在原来那个地方)。引起了额外的 interconnect connection。引起了额外的 remote access。原论文中还提到了作者自己研究出的一种解决方案,有兴趣的同学可以去啃一下原文。相信你看完了,应该对 NUAM 架构有了一个比较感性的认识了吧。觉得写的不错(看在gakki 的情面上)不点个赞鼓励一下?广告时间,欢迎大家关注我的微信公众号。同时本文同步于 github: https://github.com/liaochangjiang/TechDaily ...

April 18, 2019 · 1 min · jiezi

从进程到线程学习记录

一. 进程1. 为什么使用进程?为了使参与并发执行的每个程序都能独立运,并且可以对并发执行的程序加以描述和控制.2. 进程的定义1.进程是程序的一次执行2.进程是再处理机上顺序执行所发生的活动.3进程是系统资源分配和调度的独立单位.3. 进程的特征1.动态性: 创建而产生,调度而执行,撤销而消亡.具有生命周期.2.并发性: 与其他进程实体并发执行.3.独立性: 独立获取资源和独立接受调度的基本单位.4.异步性: 进程各自独立,不可预知的向前推进.4. 进程的状态4.1 三个基本状态1.就绪: 进程等待CPU调度,调度即执行2.执行: 进程的执行状态.3.阻塞: 进程发起I/O等操作,即阻塞,可能会设置多个阻塞队列.4.2 再加两个状态:创建和终止1.创建: 如果创建一个进程时系统资源并不能满足他,于是进程所处的状态即为创建状态.2.终止: 进程执行完后,PCB释放后就达到进程生命的结束.4.3 引入挂起操作挂起操作,需要两个原语:挂起(Suspend)和 激活(Active)1.从活动就绪到静止就绪2.从活动阻塞到禁止阻塞4.4 三类状态总结在一张图上:PCB的组织方式1.线性方式:线性查找,最慢2.链接方式:每种状态:都设置一个头指针,一共四个链表,线性查询,速度较快.3.索引方式: 建立索引表,,不同状态对应不同索引表,查找速度最快.二. 线程线程是比进程更小的基本单位.是作为调度和分派的基本单位.1. 引入线程的优势1.调度的基本单位: 线程切换代价小2.并发性: 进程内部可以并发3.系统开销: 进程开销明显大于线程开销.

March 28, 2019 · 1 min · jiezi

进程与线程

进程的定义一个进程实体包括三部分:程序段,数据段,pcb,这个进程实体就简称为进程进程的特征动态性进程由创建而产生,由调度而执行,由撤销而消亡有一定生命期进程的实质是进程实体的执行过程并发性指多个进程实体能够同时存在内存中,且能够在一段时间内同时运行。这也正是引入进程概念的目的异步性每个进程都是按各自独立的、不可预知的速度向前推进正是由于有异步性,os 才会引进相应的同步机制,才能保证进程并发执行的结果是可再现的独立性进程是独立运行,独立接受调度的基本单位进程的基本状态及转换创建、就绪、执行、阻塞、终止切记,创建完并非立即执行,而是就绪状态,当 CPU 调度时才转变为执行状态执行->就绪,是由于时间片用完,让出 CPU 资源,变回就绪状态就绪状态:指进程已经处于准备好运行的状态,那具体什么是准备好呢?即进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU,便可立即执行创建、静止就绪、活动就绪、执行、静止阻塞、活动阻塞、终止创建 -> 活动就绪:在当前系统的性能和内存的容量均允许的情况下,完成对进程创建的必要操作后,进程便为活动就绪状态创建 -> 静止就绪:不分配给新建进程所需资源,主要是主存,所以该进程被安置在外存,不参与调度,状态转为静止就绪状态操作系统内核定义将一些与硬件紧密联系的模块(如中断处理程序等)、各种常用设备的驱动程序、运行频率较高的模块(如时钟管理,进程调度),都安排在紧靠硬件的软件层次中,将它们常驻内存,即通常称为 OS 内核。目的或者有点有两个:对这些软件进行保护,防止遭受其他应用程序的破坏提高 OS 的运行效率(因为常驻内存)OS 内核两大功能:支撑功能中断处理内核最基本的功能各种类型的系统调用、键盘命令的输入、进程调度、设备驱动等,都依赖于中断时钟管理内核的一项基本功能例如时间片轮转调度中,每当时间片用完时,便由时钟管理产生一个中断信号,促使调度程序重新进行调度实时系统中的截止时间截止、批处理系统中的最长运行时间控制等也依赖于时钟管理原语操作所谓原语,就是由若干条指令组成的,用于完成一定功能的一个过程。原子操作是指一个操作中的所有动作要么全做,要么全不做。它是一个不可分割的基本单位。资源管理功能,包括进程管理、 存储器管理、设备管理进程和线程的区别从调度性、并发性、系统开销、拥有资源、独立性、支持多处理机系统方面比较调度性线程是调度的基本单位,是能独立运行的基本单位,线程切换代价低只有从一个进程中的线程切换到另一个进程中的线程时,才会引起进程的切换拥有资源进程是拥有资源的基本单位,而线程仅有一点必不可少,能保证独立运行的资源而已那线程拥有哪些必不可少的资源呢?如线程控制块 TCB,程序计数器,保留局部变量,少数状态参数和返回地址等的一组寄存器和堆栈多个线程共享所属进程拥有的资源并发性进程之间可以并发执行,一个进程中的多个线程之间也可以并发执行独立性同一进程下的线程之间的独立性低,不同进程之间的独立性高每个进程都拥有一个独立的地址空间和其他资源,除了共享全局变量外,不允许其他进程的访问同一进程的不同线程,共享进程的内存地址空间和资源,如一个线程的堆栈可以被其他线程读写系统开销创建和撤销进程,系统要为之分配和回收 PCB 以及其他资源如内存空间和 I/O 设备而线程由于共享进程所拥有的资源,所以线程的创建、撤销快,上下文切换也快线程之间的同步和通信也比进程的简单多处理机系统支持传统的进程,即单线程进程,无论有多少处理机,该进程只能运行在一个处理机上但对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上,并行执行多进程和多线程的应用场景首先,多进程单线程模型,简称为多进程;单进程多线程模型,简称为多线程。多进程模型优点编程相对容易;通常不需要考虑锁和同步资源的问题。更强的容错性:比起多线程的一个好处是一个进程崩溃了不会影响其他进程。有内核保证的隔离:数据和错误隔离。对于使用如C/C++这些语言编写的本地代码,错误隔离是非常有用的采用多进程架构的程序一般可以做到一定程度的自恢复(master守护进程监控所有worker进程,发现进程挂掉后将其重启)案例nginx主流的工作模式是多进程模式(也支持多线程模型)几乎所有的web server服务器服务都有多进程的,至少有一个守护进程配合一个worker进程,例如apached,httpd等等以d结尾的进程包括init.d本身就是0级总进程,所有你认知的进程都是它的子进程;chrome浏览器也是多进程方式。redis也可以归类到“多进程单线程”模型(平时工作是单个进程,涉及到耗时操作如持久化或aof重写时会用到多个进程)多线程模型优点创建速度快,方便高效的数据共享多个线程之间可以共享相同的地址空间适用场景线程间有数据共享,并且数据是需要修改的(不同任务间需要大量共享数据或频繁通信时);提供非均质的服务(有优先级任务处理)事件响应有优先级;单任务并行计算,在非CPU Bound的场景下提高响应速度,降低时延;与人有IO交互的应用,良好的用户体验(键盘鼠标的输入,立刻响应)如何选用单进程多线程和多进程单线程,2种模式如何取舍?进程线程间创建的开销不足以作为选择的依据,因为一般我们都是使用线程池或者进程池,在系统启动时就创建了固定的线程或进程,不会频繁的创建和销毁;首先,根据工作集(需要共享的内存)的大小来定;如果工作集较大,就用多线程,避免cpu cache频繁的换入换出;比如memcached缓存系统;其次,选择的依据根据以上多线程适用的场景来对比自身的业务场景,是否有这样场景需求:数据共享、提供非均质的服务,单任务拆散并行化等;如果没有必要,或者多进程就可以很好的胜任,就多用多进程,享受单线程编程带来便利;RCU的发明者,Paul McKenny 在《Is Parallel Programming Hard, And, If So, What Can You Do About It?》说过: 能用多进程方便的解决问题的时候不要使用多线程。引用出处https://blog.csdn.net/PirLCK/…汤小丹-计算机操作系统(第四版)

March 15, 2019 · 1 min · jiezi

备战2019计算机912考研系列笔记绪论

计算机912考研系列笔记本笔记记录从2019年3月份到12月份,准备计算机912考研相关内容与912考研进度历程。一方面是给后人提供一些参考,一方面方便自己消化咀嚼知识。912与408区别balabalatop5学校分析balabala复习(学习)计划四大专业课:数据结构操作系统计算机组成原理计算机网络

March 11, 2019 · 1 min · jiezi

Zephyr Project RTOS - 开源实时操作系统的首次功能安全认证提交

作者:Amber Hibberd,博士。英特尔功能安全工程经理和Zephyr项目成员免费的开源RTOS…旨在通过安全认证!连接设备的持续增长,暴露了物联网市场的明显差距:需要免费的、允许许可证的开源实时操作系统,该系统已获得国际电工委员会(International Electrotechnical Commission,IEC)和国际标准化组织(International Organization for Standardization,ISO)的功能安全认证。Zephyr项目旨在满足这一需求,并计划成为此类别中第一个提交其核心操作系统,包括长期支持(long term support,LTS)发布的内核和操作系统服务以进行认证。这些证书很重要,因为它们表明产品已经过仔细审查和测试,并且在安全相关系统中被认为是值得信赖的。什么是功能安全?根据IEC,“功能安全依赖于主动(active)系统,例如通过传感器检测烟雾以及随后智能激活灭火系统。”此外,“功能安全本质上是端到端的,它必须将组件或子系统的功能视为任何系统的整个自动保护功能的一部分。”另一方面是提供的安全程度。IEC定义了安全完整性等级(safety integrity level,SIL),ISO规定了汽车安全完整性等级(automotive safety integrity level ,ASIL)。从本质上讲,这些衡量了危险失败的可能性。IEC 61508标准定义了四个级别,SIL 4是最可靠和最严格的。Zephyr RTOS将包含Zephyr软件的硬件系统针对SIL 3。这解决了为功能安全而设计的绝大多数设备用例。针对汽车,我们将提交ISO 26262 ASIL D,以获得许多自动汽车系统的使用资格。ZEPHYR在做什么?Zephyr认证范围适用于跨所选体系结构的核心操作系统,包括内核和操作系统服务。Zephyr有许多RTOS元素仍然不在第一次提交的范围内,如平台驱动程序、板级支持包、平台特定的电源管理实现、文件系统和传感器驱动程序实现。Zephyr项目已经开始致力于在开源环境中开发功能安全认证的RTOS。我们正在与证书颁发机构合作,以确保我们有提交的基础。开源的一个关键方面是邀请社区贡献。我们正在修改我们的开发流程以保持社区参与,同时确保高完整性代码所需的严格流程控制,和开发工具分析。在某些情况下,开源可以更安全,因为开发的透明性和来自不同社区人士注视代码的眼球数量。Zephyr RTOS功能安全评估分两个阶段进行:概念审查和功能安全管理阶段,以及详细的测试阶段。第一阶段包括Zephyr软件安全要求和架构规范,以及验证和确认计划。阶段二包括在软件的所有级别(例如软件模块、软件集成),故障注入测试和编码指南合规性的测试。最后,认证将建立软件故障避免和控制措施到目标完整性水平。开发者可以期待什么?我们的LTS版本将在年中向开发者提供。这是开始对证书提交代码进行测试和原型设计的好方法。一旦我们完成认证,产品设计者就可以使用符合安全要求的最终Zephyr OS内核来创建他们的硬件和应用软件系统。这将缩短构建需要功能安全环境的产品的路径。我们期待为工业、汽车、智能城市和其他产品开发商提供支持,因为他们将Zephyr RTOS集成到他们的安全驱动解决方案中。有关我们免费、安全认证的RTOS的更多信息,请通过Zephyr网站与我们联系。我们很乐意在你的产品中使用我们的代码!要了解更多信息或提出问题,请注册Zephyr Project的Slack频道。KubeCon + CloudNativeCon和Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon和Open Source Summit赞助方案KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon和Open Source Summit购票窗口,立即购票!

March 8, 2019 · 1 min · jiezi

【技术性】Linux与操作系统知识

持续更新。Ctrl+R搜索command历史grep:grep pattern files, e.g.grep “aug” sample.txtinput | grep pattern, e.g.ls -l | grep -i “*.txt"其中-i意思是大小写不敏感cat sample.txt | grep “aug”

February 18, 2019 · 1 min · jiezi

记一次性能优化,单台4核8G机器支撑5万QPS

前言这篇文章的主题是记录一次Python程序的性能优化,在优化的过程中遇到的问题,以及如何去解决的。为大家提供一个优化的思路,首先要声明的一点是,我的方式不是唯一的,大家在性能优化之路上遇到的问题都绝对不止一个解决方案。如何优化首先大家要明确的一点是,脱离需求谈优化都是耍流氓,所以有谁跟你说在xx机器上实现了百万并发,基本上可以认为是不懂装懂了,单纯的并发数完全是无意义的。其次,我们优化之前必须要有一个目标,需要优化到什么程度,没有明确目标的优化是不可控的。再然后,我们必须明确的找出性能瓶颈在哪里,而不能漫无目的的一通乱搞。需求描述这个项目是我在上家公司负责一个单独的模块,本来是集成在主站代码中的,后来因为并发太大,为了防止出现问题后拖累主站服务,所有由我一个人负责拆分出来。对这个模块的拆分要求是,压力测试QPS不能低于3万,数据库负责不能超过50%,服务器负载不能超过70%, 单次请求时长不能超过70ms,错误率不能超过5%。环境的配置如下:服务器:4核8G内存,centos7系统,ssd硬盘数据库:Mysql5.7,最大连接数800缓存: redis, 1G容量。以上环境都是购买自腾讯云的服务。压测工具:locust,使用腾讯的弹性伸缩实现分布式的压测。需求描述如下:用户进入首页,从数据库中查询是否有合适的弹窗配置,如果没有,则继续等待下一次请求、如果有合适的配置,则返回给前端。这里开始则有多个条件分支,如果用户点击了弹窗,则记录用户点击,并且在配置的时间内不再返回配置,如果用户未点击,则24小时后继续返回本次配置,如果用户点击了,但是后续没有配置了,则接着等待下一次。重点分析根据需求,我们知道了有几个重要的点,1、需要找出合适用户的弹窗配置,2、需要记录用户下一次返回配置的时间并记录到数据库中,3、需要记录用户对返回的配置执行了什么操作并记录到数据库中。调优我们可以看到,上述三个重点都存在数据库的操作,不只有读库,还有写库操作。从这里我们可以看到如果不加缓存的话,所有的请求都压到数据库,势必会占满全部连接数,出现拒绝访问的错误,同时因为sql执行过慢,导致请求无法及时返回。所以,我们首先要做的就是讲写库操作剥离开来,提升每一次请求响应速度,优化数据库连接。整个系统的架构图如下:将写库操作放到一个先进先出的消息队列中来做,为了减少复杂度,使用了redis的list来做这个消息队列。然后进行压测,结果如下:QPS在6000左右502错误大幅上升至30%,服务器cpu在60%-70%之间来回跳动,数据库连接数被占满tcp连接数为6000左右,很明显,问题还是出在数据库,经过排查sql语句,查询到原因就是找出合适用户的配置操作时每次请求都要读取数据库所导致的连接数被用完。因为我们的连接数只有800,一旦请求过多,势必会导致数据库瓶颈。好了,问题找到了,我们继续优化,更新的架构如下我们将全部的配置都加载到缓存中,只有在缓存中没有配置的时候才会去读取数据库。接下来我们再次压测,结果如下:QPS压到2万左右的时候就上不去了,服务器cpu在60%-80%之间跳动,数据库连接数为300个左右,每秒tpc连接数为1.5万左右。这个问题是困扰我比较久的一个问题,因为我们可以看到,我们2万的QPS,但是tcp连接数却并没有达到2万,我猜测,tcp连接数就是引发瓶颈的问题,但是因为什么原因所引发的暂时无法找出来。这个时候猜测,既然是无法建立tcp连接,是否有可能是服务器限制了socket连接数,验证猜测,我们看一下,在终端输入ulimit -n命令,显示的结果为65535,看到这里,觉得socket连接数并不是限制我们的原因,为了验证猜测,将socket连接数调大为100001.再次进行压测,结果如下:QPS压到2.2万左右的时候就上不去了,服务器cpu在60%-80%之间跳动,数据库连接数为300个左右,每秒tpc连接数为1.7万左右。虽然有一点提升,但是并没有实质性的变化,接下来的几天时间,我发现都无法找到优化的方案,那几天确实很难受,找不出来优化的方案,过了几天,再次将问题梳理了一遍,发现,虽然socket连接数足够,但是并没有全部被用上,猜测,每次请求过后,tcp连接并没有立即被释放,导致socket无法重用。经过查找资料,找到了问题所在,tcp链接在经过四次握手结束连接后并不会立即释放,而是处于timewait状态,会等待一段时间,以防止客户端后续的数据未被接收。好了,问题找到了,我们要接着优化,首先想到的就是调整tcp链接结束后等待时间,但是linux并没有提供这一内核参数的调整,如果要改,必须要自己重新编译内核,幸好还有另一个参数net.ipv4.tcp_max_tw_buckets, timewait 的数量,默认是 180000。我们调整为6000,然后打开timewait快速回收,和开启重用,完整的参数优化如下#timewait 的数量,默认是 180000。net.ipv4.tcp_max_tw_buckets = 6000net.ipv4.ip_local_port_range = 1024 65000#启用 timewait 快速回收。net.ipv4.tcp_tw_recycle = 1#开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接。net.ipv4.tcp_tw_reuse = 1我们再次压测,结果显示:QPS5万,服务器cpu70%,数据库连接正常,tcp连接正常,响应时间平均为60ms,错误率为0%。结语到此为止,整个服务的开发、调优、和压测就结束了。回顾这一次调优,得到了很多经验,最重要的是,深刻理解了web开发不是一个独立的个体,而是网络、数据库、编程语言、操作系统等多门学科结合的工程实践,这就要求web开发人员有牢固的基础知识,否则出现了问题还不知道怎么分析查找。ps:服务端开启了 tcp_tw_recycle 和 tcp_tw_reuse是会导致一些问题的,我们为了优化选择牺牲了一部分,获得另一部分,这也是我们要明确的,具体的问题可以查看耗子叔的文章TCP 的那些事儿(上)

January 31, 2019 · 1 min · jiezi

如何定制Linux外围文件系统?

本文由云+社区发表作者:我是乖宝宝哦一般来说,我们所说的Linux系统指的是各种基于Linux Kernel和GNU Project的操作系统发行版。为了掌握Linux操作系统的使用,了解 Linux操作系统的运作过程,理解内核与外围支撑系统的关系,加深对开源操作系统的认识,我决定造个轮子——自己定制一个Linux文件系统。这里有两种实现方法:直接自己实现init***(M1)加载bios 的硬件信息-> 读取MBR –>执行Grub ->加载kernel–> 加载驱动–> init –> 执行bash利用系统/sbin/init*(M2)加载bios 的硬件信息-> 读取MBR –>执行Grub ->加载kernel–> 加载驱动–> init –> /sbin/init -> 取得run-level信息 -> /etc/rc.d/rc.sysinit -> services –> /etc/rc.d/rc.local –> mingetty –> login我们先选择M1。思路利用原有系统复制必备部件到新存储器利用initrd.img机制在RAM Disk中测试搭配原文件内核和模块启动Step1:获得shell版本的initrd.img首先,我们可以写一个脚本init,使得内核用该文件系统启动后能够直接获得一个Bash。创建脚本 init其中:/bin目录下是常用命令,init是自己写的脚本,/lib64目录下是应用程序所依赖的动态库。init 内容现在我们需要使用命令行,创建bin和sbin目录,向其中添加bash、ls、rm、cp、mv、echo、cat、less等基础命令。由于这些命令需要依赖/lib64等目录下的一些动态链接的共享库,所以需要将依赖的库拷贝到小系统对应的目录下,用ldd命令查询应用程序及其依赖的动态库。完成之后,执行:find . | cpio -H newc -o | gzip > /boot/initrd.img将根文件系统打包成initrd.img放到/boot目录下。启动时系统会自动执行initrd.img中的init。费了这么大劲生成initrd.img,如何测试新建的initrd.img呢,需要在grub启动配置文件当中增加一个入口用于测试。title CentOS 6 Miniroot (hd0,0)kernel /vmlinuz-2.6.32-642.el6.x86_64initrd /initrd.img这样重启之后就会出现启动选项了。Step2:完成挂载原系统能力为了能挂载原系统,必须在initrd.img中加载原系统运行所必须的驱动模块,比如ext4文件系统的驱动、scsi设备的相关驱动等,/sbin/modinfo 配合/sbin/insmod,驱动放到/moduleStep3:完成拥有管理设备能力(udev)利用管理、监控主机设备的服务程序udevd来自动加载所需的驱动模块,比我们自己实现更加可靠。udevd的规则文件在/lib/udev/目录下,配置文件在/etc/udev/目录下,同时还需要/etc/nsswitch.conf配置的名称服务交换,其依赖的库为/lib目录下以libnss开头的文件,将上述文件拷贝到我们的目录下,然后使用/sbin/start_udev命令可以启动udevd服务。(udevd需要调用一些其他的系统命令,如/sbin/modprobe,可用strace进行跟踪获取)。小系统的目录文件其中:/dev目录下是系统存放可用设备的目录,/log是使用strace命令生成的log记录文件。Step4:完成拥有login登录能力由于login的机制比较复杂,涉及进程管理机制和进程组、控制台等许多方面,因此我们采用M2,将/sbin/init命令拷到小系统目录下,init脚本改为#!/bin/bashexec /sbin/init将控制权交给/sbin/init之后,系统启动时就必须等到它完成一系列调用之后,进入login界面,用户才能重新获得控制权。/sbin/init的过程大致分为三块:第一块是udevd加载驱动模块、文件系统检查和根切换,相关配置在/etc/rc.sysinit中;第二块是启动各项服务,相关配置在/etc/rc.d/目录下;第三块是登录部分,需要调用/sbin/mingetty和/bin/login等命令。将上述所涉及的命令及文件拷贝到小系统对应的目录下,并对配置进行修改。由于小系统启动之后initrd.img作为临时根文件系统直接在内存中运行,而我们小系统不需要进行根切换,故将/etc/rc.sysinit中remount_needed()函数体注释掉,这样就不会根切换了。由于系统采用了全新的Upstart启动方式(/sbin/init程序已经改由upstart软件包提供),将与Upstart启动相关的配置文件拷贝至小系统目录下:/etc/inittab 配置默认运行级别/etc/init/rcS.conf 加载rc.sysinit脚本,完成系统初始化任务/etc/init/rc.conf 兼容脚本,负责各运行级别的调用处理/etc/init/rcS-sulogin.conf 为单用户模式启动/sbin/sushell环境/etc/init/control-alt-delete.conf 控制终端下的Ctrl+Alt+Del热键操作/etc/init/start-ttys.conf 配置tty终端的开启数量、设备文件/etc/sysconfig/init 控制tty终端的开启数量、终端颜色方案/etc/init/tty.conf 控制tty终端的开启将bootmini/etc/inittab的运行优先级改为2,那么系统启动时/sbin/init将执行bootmini/etc/rc.d/rc2.d/目录下以S开头的文件,将一些不需要开启的服务文件名改为K开头。在bootmini/etc/rc.d/rc.local文件中可以加入用户需要系统开机启动后自动执行的操作。login程序基于认证体系PAM, 配置文件在/etc/pam.d/目录下,相关库文件有/lib64/security/及其依赖的库文件;login还涉及用户组管理/bin/chgrp、/bin/chown、/bin/chmod等,保存用户名的文件/etc/passwd、/etc/group,用户密码文件为/etc/shadow。其他一些涉及的文件可通过strace来帮助分析。可在真机上运行的完整版小系统部分目录文件:/etc/bin/sbin/usr/bin/usr/sbin至此,文件系统算是可以跑了。下一篇我们再造个轮子——进行Linux内核的裁剪。真机效果也将在下篇看到。此文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

January 28, 2019 · 1 min · jiezi

这一次,真正明白进程与线程

引言作为软件工程师,进程与线程应该是我们必备的知识了,从年年各大企业的面试题就能看出来!必考题:进程与线程的区别小生本学期学习了操作系统这门课,最大的收获就是学会了这道“必考题”。最开始觉得自己学明白了,自己写本文的时候,才觉得这里牵扯到好多东西。操作系统什么是操作系统?说到操作系统,大家一定都不会陌生,我们用的手机内置了Android/iOS操作系统,我的开发用的电脑,Mac OS、Linux、Windows等操作系统。操作系统的非官方描述:操作系统是管理计算机硬件与软件资源的系统软件。发展史想真正明白进程与线程,我们需要了解一下计算机操作系统的历史。手工操作阶段最原始的时候,计算机没有操作系统,只有单独的机器,像下面这样:以一个现代人的眼光来看:没有操作系统,这个机器怎么用啊?反正给我一堆硬件,我是不能让这些硬件跑起来。前人们也是非常厉害的。他们使用记录有程序和数据的卡片(前期用卡片,后来逐渐发展为使用打孔纸带)去操作机器。程序读入机器后,机器就开始工作直到程序停止。据说图灵能非常熟练地用这种方法操作Manchester Mark I机器。缺点用户独占全机CPU速度快,需等待人工操作,资源利用率低批处理操作系统为了解决人工操作速度远慢于CPU的问题,引入了脱机输入/输出系统。计算机能够自动地、成批地处理一个或多个用户的作业,这就不需要手工输入了,这就快了。单道批处理操作系统每次只加载一道作业到内存中执行。多道批处理操作系统每次加载多道作业到内存中并发执行,各个作业轮流使用处理机和其他系统资源,最终依次完成。在内存中同时存放多道相互独立的程序,这些程序共享系统资源,在操作系统的控制下交替在CPU上执行。以后发展的操作系统,我们就不需要知道了,了解到这就足够了。进程与线程程序并发执行程序并发执行时,多道程序共享系统资源,此时,程序的运行失去了封闭性。程序在并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行失去了封闭性。这样,某程序在执行时,必然会受到其它程序的影响。当多个程序并发执行时,我们期望的是运行变快,增加系统吞吐量。但是,就如该图一样,某些程序必须在某些程序执行之后才可继续执行,不能让这个程序想执行就执行,我们要对其进行控制。为了更方便地进行控制,我们就引入了进程的概念。进程在早期,进程是资源分配与调度的基本单位。引入进程,我们发现解决了上述的问题,可以对I1、I2等等都建立进程,并按我们想法的前趋图对进程执行进行约束,达到我们预期的效果。然后程序对我们的进行进行调度,以达到并发执行的效果。然后怎么控制就是PV操作,信号量,进程同步与互斥,这就不属于本文的范围了,大家可以自行学习。进程不足又过了好多年,人们发现最初的进程设计得有些缺点。原始进程两特点:资源分配的基本单位。调度的基本单位。所以,在仅有进程的系统中,想实现并发,需要进行下列操作:创建进程:创建进程PCB,并为它分配资源。撤销进程:回收系统资源,撤销PCB。进程切换:从一个进程环境切换到另一个进程环境。还是这个图为例,我需要创建12个进程,然后进行进程控制,让它们并发执行。创建进程12次,分配12次资源,分配资源消耗了大量的资源。因为进程间的资源相互独立,所以进程间切换是资源的切换,开销相当大。程序结束时,撤销12次资源,回收资源时也有很大的开销。我们有没有一种方法,可以减少创建、撤销以及切换的开销呢?然后,引入了线程的概念。线程进程是携带资源的,切换时开销太大,所以我们需要将资源分配与调度分开来。在现代操作系统中,进程是资源分配的基本单位,线程是调度的基本单位。一个进程中有多个线程,多个线程共享该进程的资源,CPU直接调度进程。还是这张图,如果我们创建1个进程,12个线程会怎么样?程序运行开始,创建一个进程,分配资源1次。创建12个线程,注意,这里是在进程内创建线程,所以,线程无需分配资源,直接使用其进程的资源即可,这开销就非常少了。12个线程并发执行,这12个线程是共享一块系统资源,所以在线程切换时,是不需要切换资源的,开销大大减少。撤销时呢?撤销线程12次,撤销进程,回收资源1次。总结所以,这就是进程与线程的发展,了解了这些历史,我想那些答案再也不用背了吧?CPU的一个核心只能执行一个线程,多个核心可以并发执行,但线程并行数最多不超过核心数。4核的,在不添加新技术的情况下,最多并行4个线程。嗯?Core i7不是4核8线程吗?为什么英特尔的4个核心能跑8个线程?这就是英特尔大名鼎鼎的超线程技术,它将处理机核心中未利用的资源利用起来,再模拟出一个核心,虽然是4核心的处理机,所以在用户看来,该CPU有8个逻辑核心。在桌面端很有用,但是到了服务器端,超线程技术会有些问题。这只是我看了很多篇关于服务器端批判超线程的运维博客之后的看法,待日后,我们再对该技术进行讨论。

January 22, 2019 · 1 min · jiezi

构筑敏捷能力中心,打造下一代数字银行“操作系统”!

摘要: 构筑敏捷能力中心,打造下一代数字银行“操作系统”!小蚂蚁说:近年来,越来越多国内外领先银行全力投入数字化转型。数字化转型是技术与商业模式的深度融合,最终结果是商业模式的变革。银行数字化转型是一个逐步递进的旅程,敏捷能力中心的打造如同建设下一代数字银行“操作系统”,在银行数字化之旅中具有里程碑意义。银行业已进入全面数字化时代,数字化转型将从改善客户连接的1.0时代,进入到以敏捷能力为核心的数字化2.0时代。蚂蚁金服认为,打破过去独立分散的系统架构,铸造以分布式平台为支撑的金融敏捷能力中心,将成为银行机构全面数字化转型、提升客户服务能力的重要引擎。2018年11月29至30日,由《当代金融家》全媒体集团、鸿儒金融教育基金、蚂蚁金服主办的2018年(第七届)中国中小银行发展高峰论坛在广州举办,论坛围绕新时代中小银行金融科技与风险防控展开,来自监管层、股份制银行、国内城商行、农商行代表及相关机构领约300位专业人士出席峰会。在演讲中指出,银行数字化转型是一个逐步递进的旅程,敏捷能力中心的打造如同建设下一代数字银行“操作系统”,在银行数字化之旅中具有里程碑意义。他解释道,“敏捷能力中心从根本上解决企业的管理效率,以及服务终端、前台创新的问题,可助力银行不断快速响应、探索、挖掘、引领用户的需求,提升用户体验,降低服务成本,在全面数字化时代领先行业。”曾经,金融行业由于对可靠性和风险管理的要求高于一般行业,而后台修改的成本和风险较⾼,所以驱使他们会尽量选择保持后台系统稳定性的IT建设模式,把大量的业务逻辑(业务能力)直接部署在前台系统中,形成厚重的前台系统。这样便形成业务联系彼此割裂的状态,并未能很好地支撑前台快速创新响应用户的需求,降低了用户体验。随着IT技术的不断发展,曾经微服务、DevOps等技术也给出了技术上实现敏捷能力的“银弹”。但局部的方案未能从根本上解决全行级敏捷问题,银行的业务部门、研发中心、数据运维中心各自都是拿着拼图的一部分寻找方向。峰会上,蚂蚁金服结合自己的实践,从自身的实践总结出覆盖技术、数据、业务多个维度的敏捷能力中心,与广大银行业伙伴共享,以助力各家银行机构打造自身的“数字化操作系统”。据介绍,数字化时代敏捷能力中心包括以下几个方面:敏捷技术中心:把分布式架构体系涉及到的研发、测试、治理、运维、风险形成完整的支持全行应用的技术平台。除此之外还有三地五中心的灾备架构、免疫架构、防御资金安全和不断地、主动地发现故障等。这些技术能力体现蚂蚁技术敏捷中心不断追求的在分布式架构下的敏捷与自愈能力,将“不确定性变为确定性”。敏捷智能中心:把数据智能计算、数据研发、数据资产有机组合形成全行统一数据平台和金融智能应用,例如针对全行风险八大领域,构建全行级风险平台,实现风险管理统一化、风险技术平台化、风险数据规划化。敏捷业务中心:沉淀分布式架构下组件化、服务化的业务核心能力,向上提供平台化领域服务、开放式的编程接口来帮助快速构建存贷汇、互金等各类业务产品;同时封装了金融级分布式架构中的技术复杂性,降低分布式转型的学习曲线,提升分布式转型速度。纵观银行数字化发展历程,数字化1.0从移动端开始,着力于改善客户连接,提升业务触达能力。而刘伟光分析道,到数字化2.0时代,银行等企业机构重点在于通过分布式架构,获得数字化原生企业的标准技术栈能力,来建立与数字化原生企业相对标的三大核心竞争力:技术敏捷能力、数据智能驱动能力、业务敏捷能力,打造面向下一代数字化转型的数字银行“操作系统”。基于这些能力,银行可在未来的数字化3.0时代,建设多方位的生态合作新型银行模式:对内进行业务场景接入,对外通过API Bank向企业开放、建设基于API的应用生态市场模式,构建基于金融组件化操作系统的开放生态银行。本文作者:平生栗子阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 5, 2018 · 1 min · jiezi