操作系统

pkzd之进程设计策略之进程调度

六眼飞鱼酱① 提交于 2021-02-13 07:32:08
本文主要讨论单处理器上的进程调度算法,在讨论具体的算法之前先假设存在一个具体的操作系统比如pkzd。 假设该系统pkzd并不存在抢占进程调度,然后我们考虑接下来的情况: 假设在内存中同时存在进程p1, p2, p3(此处为了方便不讨论进程换出的情况), p1, p2, p3的运行时间分别为10ms, 100ms, 1000ms, 如果系统依次运行进程,那么平均的等待时间约为40ms, 如果进程达到的顺序为p3, p2, p1,那么平均的等待时间约为370ms。进程的平均等待时间因为进程达到的顺序而存在巨大的差距,更有甚者,如果存在一个进程的运行时间为无穷,那么它将占用所有的cpu时间,这明显是不合理的,所以必须引入一种机制来保证公平调度。注: 非抢占式系统存在很多的调度算法,有的算法能缩小因为进程达到顺序不同而造成的平均等待时间之间的差距,但是有的算法实现并非很简单,比如SJF算法。另外所有的非抢占式系统都无法很好的处理永远不会终止的进程(比如系统中存在很多的死循环)。 单处理器中进程调度所要达到的目标就是让所有的进程公平的分配cpu时间,我们先来讨论其中一种比较古老又简单质朴的办法: RR算法,该算法主要的想法是给所有的进程分配一个时间片,一个进程至多占用一个时间片,一旦时间片用完就必须调用其他的进程。可以用链表实现该算法(当然这不是最好的实现办法, 也不一定是最简单的

Windows 操作系统引导过程 BIOS & EFI

对着背影说爱祢 提交于 2021-02-12 08:59:14
引导过程 引导过程指的是从计算机通电那一瞬间到CPU开始执行操作系统代码时的整个过程。在这个非常初期的阶段汇总,CPU执行标准的启动代码。这部分代码需要对硬件设备进行探测,寻找最有可能启动的操作系统并且根据用户定义的参数启动这个操作系统。 传统形式的引导:BIOS 大部分PC机仍然使用BIOS引导,默认(通用)的引导加载器(boot loader)。BIOS是一种类型的固件,提供一些简单的菜单项,用户通过这写菜单项可以修改主板参数、引导设备顺序等内容。固件(firmware)可以看做一种软件,这种软件被写入芯片,所以是“固化”的。固件代码本身可以保存在只读存储器(ROM)中。也可保存在可编程只读存储器(PROM)或者电可擦除只读存储器(EEPROM)中,后两种形式更为常见。 BIOS芯片主要存放: 自诊断程序:通过读取CMOS中的硬件配置,并对其自检和初始化 CMOS设置程序:引导过程中,用特殊热键启动,进行设置后,存入CMOS RAM中 系统自举装载程序(bootstrap):在自检成功后将磁盘相对0道0扇区上的引导程序装入内存运行 主要I/O设置的驱动程序和中断服务 BIOS和固件的功能是一样的:加载一些基本的自举(bootstrap)代码给CPU执行。自举程序和BIOS或者固件的职责是:初始化硬件、检测硬件、定位这些引导设备、执行引导加载器程序;引导加载器程序的职责是

用信号量机制解决生产者消费者问题

南笙酒味 提交于 2020-12-14 09:15:33
使用POSIX标准中的Pthreads API来创建多个生产者、消费者线程 定义线程:pthread_t tid 创建线程:pthread_create(&tid,&attr,runner,argv[1]); join线程:pthread_join(tid,NULL); 使用PthreadsAPI的信号量机制互斥与同步 定义信号量:sem_t sem 初始化信号量:sem_init(&sem, 0, n); P操作:sem_wait(&sem); V操作:sem_post(&sem); #include <stdio.h> #include <pthread.h> #include <semaphore.h> #define BUFF_SIZE 5 // 定义缓冲区buffer大小为5 int buffer[BUFF_SIZE]; // 用循环队列模拟缓冲区 int in = 0; // 产品进缓冲区时的缓冲区下标 int out = 0; // 产品出缓冲区时的缓冲区下标 int productID = 0; // 产品号 int consumeID = 0; // 将被消耗的产品号 sem_t s; // 定义互斥信号量, 互斥锁s sem_t n; // 定义同步信号量n, buffer中已放入的产品个数 sem_t e; // 定义同步信号量e, buffer中空单元个数

理发店问题--操作系统进程互斥

六眼飞鱼酱① 提交于 2020-05-05 01:34:34
假设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容 纳 4 个顾客坐等理发的沙发。此外还有一间等候室,可容纳 13 位顾客等候进入理发 室。顾客如果发现理发店中顾客已满(超过 20 人),就不进入理发店。 在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空 出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完后,可向任何一位 理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。 理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、 睡眠上。 请利用 linux 系统提供的 IPC 进程通信机制实验并实现理发店问题的一个解法。 参考解法伪代码: 理发师程序(Barber) { 建立一个互斥帐本信号量: s_account,初值=1; 建立一个同步顾客信号量: s_customer,初值=0; 建立沙发消息队列: q_sofa; 建立等候室消息队列:q_wait; 建立 3 个理发师进程: b1_pid, b2_pid, b3_pid; 每个理发师进程作: while(1) { 以阻塞方式从沙发队列接收一条消息, 如果有消息,则消息出沙发队列(模拟一顾客理发); 唤醒顾客进程(让下一顾客坐入沙发)。 用进程休眠一个随机时间模拟理发过程。 理完发,使用帐本信号量记账。 互斥的获取账本 记账

Cosmos的基石:IL2CPU编译器--C#开源操作系统学习系列三

蹲街弑〆低调 提交于 2020-03-16 19:15:53
某厂面试归来,发现自己落伍了!>>> 本文的代码包以 cosmos-12304.zip 为例(从这个包开始, COSMOS 的内核算是有了个基本的雏形,就像是一颗大树在出芽前会先长出庞大的根系,现在就要破土长出第一颗芽了) IL2CPU 之于 COSMOS 就相当与 GCC 之于 LINUX ,查看 COSMOS 的源代码,可以发现没有一行汇编代码,就连 BOOTLOADER 也是使用 C# 语言来完成的,在 COSMOS 中很对与硬件相对应的类,如屏幕、键盘等,然后在编译的时候再由 IL2CPU 识别出这些特定的类并转换成机器指令代码代码。 由于是纯 C# 的开发环境,因此 IL2CPU 责任重大,需要实现 C# 语言的各种特性,包括对象的初始化、多态、事件、委托等等,当然到 cosmos-12304 为止,这些特性还没有全部实现(后面的应该会一步一步的都实现,不过还没有看过后面的源代码,只是猜测而已)。除此之外, IL2CPU 还负责处理对 .net 的运行库(这个运行库并不是 .net framework ,这个库是 COSMOS 自己实现的与 .net framework 类似但要小很多很多的一个库,以后再讲这一部分) cosmos-12304 这个版本的代码和现在最新的代码在文件结构上有很大的差别,之所以文章从这个代码包开始,是因为小弟从第一个源代码包开始

《操作系统》知识点复习

佐手、 提交于 2020-03-04 15:43:38
定义:操作系统是对计算机资源(硬件、软件)管理、为用户提供服务(交互、运行环境)的软件、是种系统软件。 计算机用户与硬件之间一直运行的一个程序,狭义称为内核(kernel)程序 目标:方便用户解决问题、使用计算机,通过管理软件有效使用计算机硬件资源 结构:层次 用户—》应用程序-》操作系统-》硬件 组织:启动:先确认每个设备是否正常->开启引导程序Bootstrap(主板):设备初始化、操作系统载入内存、运行进程 中断 :一个事件的触发是由软中断、硬中断实现 Ctrl+Alt+Delete快捷启动是什么中断? 软中断是执行中断指令产生的,而硬中断是由外设引发的。 硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。 硬中断是可屏蔽的,软中断不可屏蔽。 有专门的文件标识符 标准输入:键盘 标准输出:显示器 多道程序设计的基本特征:无序性、多道性、间断性 分时系统追求:快速响应用户 I/O结构 :设备控制器有本地缓冲器,CPU负责内存与本地缓冲器之间的数据传递,设备控制器控制本地缓冲器和外设之间的。通过中断通知I/O设备操作完成 所以为了提高cpu利用率,采用DMA直接访问内存方式,以块为单位完成传送触发中断 I/O操作:同步:只有I/O结束后,用户程序才能运行 异步:I/O期间,用户程序也能运行 存储结构:存储设备:1.磁盘 2.闪存 3.固态硬盘

课外扩展(一)

匆匆过客 提交于 2020-03-03 04:31:44
认识嵌入式系统 嵌入式系统简介 嵌入式系统由硬件和软件组成.是能够独立进行运作的器件。其软件内容只包括软件运行环境及其操作系统。硬件内容包括信号处理器、存储器、通信模块等在内的多方面的内容。嵌入式系统是以应用为中心,以现代计算机技术为基础,能够根据用户需求(功能、可靠性、成本、体积、功耗、环境等)灵活裁剪软硬件模块的专用计算机系统。 要点概括: 以应用为中心:强调嵌入式系统的目标是满足用户的特定需求。就绝大多数完整的嵌入式系统而言,用户打开电源即可直接享用其功能,无需二次开发或仅需少量配置操作。 专用性:嵌入式系统的应用场合大多对可靠性、实时性有较高要求,这就决定了服务于特定应用的专用系统是嵌入式系统的主流模式,它并不强调系统的通用性和可扩展。这种专用性通常也导致嵌入式系统是一个软硬件紧密集成的最终系统,因为这样才能更有效地提高整个系统的可靠性并降低成本,并使之具有更好的用户体验。 以现代计算机技术为核心:嵌入式系统的最基本支撑技术,大致上包括集成电路设计技术、系统结构技术、传感与检测技术、嵌入式操作系统和实时操作系统技术、资源受限系统的高可靠软件开发技术、系统形式化规范与验证技术、通信技术、低功耗技术、特定应用领域的数据分析、信号处理和控制优化技术等,它们围绕计算机基本原理,集成进特定的专用设备就形成了一个嵌入式系统。 软硬件可裁剪:嵌入式系统针对的应用场景如此之多

五分钟学编程:当初我要是这么学习操作系统就好了!

点点圈 提交于 2020-02-26 08:33:06
原创声明 本文首发于微信公众号【程序员黄小斜】 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 简介 学习编程,操作系统是你必须要掌握的基础知识,那么操作系统到底是什么呢? 这还用说么,操作系统不就是Windows、Linux、Mac、IOS、Android、IOS这类我们天天都在用的东西么? 此话不假,但是操作系统作为计算机科学里的一门基础学科,肯定不能这么接地气对不对,总的来点高大上的概念,震慑一下你们吧。 根据百度百科的介绍,操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。 这个介绍足够高大上了吧,那么到底啥是操作系统呢,简单来说,操作系统就是管理计算机硬件和软件资源的一种软件,计算机里的硬盘、鼠标键盘、显示器等设备,都要由它来管理,你打开游戏、打开浏览器或者是看电影,也都要通过操作系统来执行。 没有了操作系统,电脑就失去了灵魂,只是一堆硬件而已。 为什么要学操作系统 了解了操作系统的基本概念之后,接下来我们再来看看,为什么我们要学习操作系统呢? 首先,当然是因为面试要考啦。 其次,无论你学习什么编程语言,和都避免不了和操作系统打交道,比如你学习Java

Linux基本介绍和一些简单指令

為{幸葍}努か 提交于 2020-02-26 02:51:38
1.什么是Linux 是一个“操作系统” 最常用的“桌面”操作系统Windows 最常用的服务器端操作系统,Linux 最常用的移动端操作系统IOS,Android(本质也是Linux) 更本质的说,Linux是一个操作系统内核 操作系统=内核+一组配套的应用程序 现在我们使用的Linux系统是Centos6 在Linux内核的基础上,可以包装成很多不太一样的系统,称为“Linux发行版” 常见的发行版:Ubuntu,RedHat,Deepin,Debian,,, 公司中常用的企业级的Linux就是RedHat(红帽) RedHat是收费系统,Centos是免费版 Centos本身的源代码和RedHat几乎一样 2.为啥要学Linux Linux服务器领域中最主要使用的操作系统(没有之一) Linux 嵌入式领域中最主要使用的操作系统(之一) Linux 移动端领域中最主要使用的操作系统(没有之一)Android 不管以后从事什么样的开发岗位,Linux都是必备技能 Linux能不能用于桌面领域?1% 3.对于Java方向的同学Linux要学到什么程度 C++方向的同学来说,学习Linux不光要学习基本操作,还需要学习Linux系统编程内容(API) Java方向的同学来说,学习Java重点是学习基本操作,系统编程是不太需要的,Java是跨平台的 如何获取Linux环境 下策

Serendipity

偶尔善良 提交于 2020-02-10 01:22:15
复利效应的终极体现。 有意用功,无意成功 创造惊喜的6条方法论 2016-01-16李笑来 许多年来,“惊喜”一直是我最痴迷的概念。 科学史上充满了惊喜,阿司匹林、微波炉、X光透视,都是惊喜的产物。再比如,我们今天普遍使用,甚至没有就绝对不行的一种物质,玻璃,也是惊喜的产物。 我有个朋友,闫文闻,一个连续创业者,最近的一个创业项目是音乐笔记,一个手环,可以纪录肌肉电,在弹琴的时候自动生成“音乐笔记”,这可是能让音乐教育发生惊天逆转的事情。他每隔一段时间就说一次: 哎,这好事儿怎么总发生在你身上呢? 或者换个说法: 哎,你咋总能摊上这好事儿呢? 创造惊喜的方法论第一条,就是—— 1 你必须相信自己是好运的 至于那好运是什么,不知道,但它就是会发生的,这事儿你必须提前知道。 在 28 岁之前,我没啥太多的好运,甚至厄运连连。 出生就营养不良,乃至于后面几颗牙齿都发育不全; 上学没多久,滑冰栽倒,脑震荡,后遗症就是原本很会唱歌,结果那次之后就开始五音不全; 初中的时候,晚上回家写作业趴桌子上睡着了,结果三叉神经麻痹 —— 就是面瘫; 又过半年,骑自行车被大卡车从后面“追尾”整个人飞出几米之外; 高二的时候,在一场能决定是否保送清华的计算机竞赛中,我的名额被老师换成了他的侄子; 高考前的三周,急性阑尾炎入院手术…… 我是什么时候开始笃信自己将来一定会有好运的呢?是大学认真研究概率论的时候。