操作系统
文章平均质量分 77
樱满无门
这个作者很懒,什么都没留下…
展开
-
POSIX下简单线程池的实现
POSIX下简单线程池的实现什么是线程池?为什么要有线程池?进程是资源分配的基本单位线程是能独立运行的基本单位一个进程内的线程共享资源因此,线程的创建开销小于进程——不需要执行进程复制、分配页表等操作线程的同步开销小于进程——不需要进程间通信,因为线程之间能共享资源在客户机-服务器模型中,每当添加一个新的连接时,就需要创建一个新的线程进行响应。当连接结束后,需要释放当前的线程。线程的开销虽然小,但是并不是意味着没有开销并且,更加严重的问题是,如果同时有大量连接产生,那么,分配的线程的数量很原创 2021-05-07 16:41:32 · 210 阅读 · 2 评论 -
Fork杂谈——printf
Fork杂谈——printf在一本书上看到这样子的两段代码:int main(){ printf("Hello, world!\n"); fork(); return 0;}int main(){ printf("Hello, world!"); fork(); return 0;}它们的运行结果分别是Hello, world!和Hello, world!Hello, world!出现这种情况的原因在于,printf函数的缓冲区是行刷新的(原谅我不知道那个术语是什么),就是原创 2021-04-14 08:05:52 · 228 阅读 · 1 评论 -
Linux下进程间通信
Linux下进程间通信进程各自的用户地址空间是相互独立的内核必须提供一种进程间相互交互的方法——即IPCLinux内核支持POSIX规范中的标准IPC和很多UNIX中广泛使用的IPC管道FIFO文件消息队列共享内存Socket管道最早的UNIX IPC方式使用是最简单的,局限也是最大的管道是半双工的两端进程必须是父子关系或者有共同祖先使用方式:一个进程使用系统调用pip(int fd[2])创建管道,fd[0]为读端、fd[1]为管道的写端接下来,调用fork调用创建原创 2021-04-14 01:01:50 · 69 阅读 · 0 评论 -
Linux下同步机制
Linux下同步机制当Linux刚刚开始支持多处理器/SMP时,内核态需要获得BKL(Big Kernel Lock)。现在,只有很少的地方需要BKL进行保护了。处理器数据(percpu data)(我看不懂。。。)严格地说不算时同步机制,它可以解决一些本来需要同步机制来处理的问题,从而提高性能。典型例子有:伙伴内存分配器中buddy system里维护的每个CPU可分配页的表(pcp list)(我不知道是什么东西);还有slab分配器中的每个CPU的可用和已被分配列表(我也不知道是什么东西)将原创 2021-04-05 11:42:53 · 322 阅读 · 0 评论 -
Linux内核编译概述
Linux内核编译概述Linux 2.6内核编译概述Linux 2.6内核使用kbuild机制——使用make menuconfig将配置信息保存在.config文件中,当该文件被改变后再重新编译内核,以保证最小化的编译。Linux 2.6 编译系统 主要包括的文件有:交互配置工具Kconfig文件.config文件Makefile*.cmd文件交互配置工具编译生成的可执行文件,与用户交互,将用户配置保存在.config文件中Kconfig文件位于各个子目录,符合kcon原创 2021-04-04 15:40:27 · 149 阅读 · 0 评论 -
并发控制原理(二)
并发控制原理(二)同步原语简介(续)信号量生产者-消费者问题(有界缓冲区问题):两个分别为生产者和消费者的进程共享了一块固定大小的公共缓冲区,生产者产生数据信息,消费者消耗数据信息。整个过程遵循:缓冲区被填满时,生产者需要停止生产缓冲区为空时,消费者需要停止消耗解决方法:缓冲区被填满时,生产者进入睡眠,直到缓冲区不为空;消费者发现缓冲区为空,进入睡眠,直到缓冲区不为空。解决的主要途径:信号量(semaphore)记录缓冲区的元素个数,并规定关于信号量的操作必须为原子操作:P操作、V原创 2021-04-04 13:20:46 · 278 阅读 · 0 评论 -
x86的寄存器
x86的寄存器包括:32位的通用寄存器:EAXEBXECXEDXEBPESPESIEDI16位段寄存器:CSDSSSESFSGS32位标志寄存器 EFLAGS32位指令指针寄存器:EIP32位控制寄存器:CR0CR1CR2CR348位全局描述符表寄存器:GTDRIDTR16位局部描述符表寄存器:LDTR任务状态描述符寄存器:TR32位调试寄存器:DR0~DR7CR0寄存器结构:位置名称功能原创 2021-04-03 21:00:17 · 338 阅读 · 0 评论 -
保护模式(二)
保护模式(二)——分段机制,系统门分段机制分段机制是历史遗留,实际使用的时候尽量不使用,建议少花时间BASE:OFFSET表示一个地址。BASE、OFFSET都是16位,若将其当作高位、低位地址,能表示4GB空间。在此基础上实现了保护模式和虚拟内存模式。因此,不使用分页、只使用分段也可以完成权限保护和虚拟内存管理。后来,更优越的分页机制占据了主流。出于兼容的目的保留了分段机制。段寄存器CS、DS、ED、SS、FS、GS作为段选择子使用(16位,不可表示基址)段基址和其他属性被组织为段描述符表原创 2021-04-03 17:34:18 · 75 阅读 · 0 评论 -
并发控制原理(一)
并发控制原理(一)多任务的操作系统在单一CPU上运行时,通过快速切换造成并发的假象。早期多任务操作系统只在用户态可以抢占,即进程运行在内核态时不可能被切换到别的进程。(大迷惑,只是不会被抢占,为什么不会被切换到别的进程?有没有懂哥告诉我?)(可能的解答:内核线程运行到一半是不会被优先级更高的其他线程取代的)(迷惑之二,到底什么是进程的内核态?是内核的进程,还是用户进程调用系统调用?)但是,操作系统仍然需要关心:阻塞操作中断阻塞操作进程在等待某些资源的时候,会进入阻塞状态。这个时候原创 2021-04-03 15:34:15 · 314 阅读 · 0 评论 -
保护模式(一)
早期计算机处理器支持的是单用户、单任务的系统。从80286后,为了兼容8086处理器,引入了处理器的工作模式的概念。常见的处理器工作模式有:实模式、保护模式、虚拟8086模式保护模式(一)任何复杂的设计都是由一个简单的机制发展来的,因此,理解一个复杂的东西,要从最简单的地方入手保护模式分为:分页机制分段机制分页机制在单任务时代,计算机的物理内存分为两个部分,一个部分给操作系统使用,另一个部分给应用程序使用。到了多任务时代,由于程序的全局变量、程序起始地址……都在编译期就已经确定了.原创 2021-04-02 16:25:39 · 758 阅读 · 0 评论 -
进程调度(三)
进程调度(三)抢占抢占(preempt):低优先级的进程在执行时,高优先级的进程若已经就绪,则可以马上抢占CPU开始执行。Linux的抢占是有限的抢占,不是所有时刻都会被抢占。当进程处于内核态时,它可以设置禁止被抢占的代码段,执行完那些代码后才会被抢占;当进程处于用户态时,它随时随地都会被抢占。Linux提供了两个函数:preempt_disable、preempt_enable注意,有些函数会间接使用这两个函数。调度的时间复杂度调度算法的时间复杂度和很多因素相关:进程数目、CPU数目、实原创 2021-04-02 11:11:53 · 128 阅读 · 0 评论 -
进程调度(二)
进程调度(二)进程调度的触发和进程切换的时机进程调度的核心任务由schedule函数处理:选择,并切换到下一个合适的进程进程调度的触发则分为多种情况时钟中断触发进程主动调用唤醒优先级更高的进程创建新的进程调用EXEC时钟中断触发前面说过时间片的概念:为每个进层分配时间片,每过一个tick就将其时间片减1,当其为1的时候退出进程。例如,进程运行了一个时间片的时间之后,时钟中断触发,CPU由用户态转变为内核态,内核接收到中断后调用中断处理函数,检查进程的时间片,若等1,则进入进程调度程原创 2021-04-01 14:38:25 · 275 阅读 · 1 评论 -
进程调度(一)
进程调度(一)进程调度是影响系统性能和进程响应时间的重要因素传统进程调度主要使用优先级的方法,优先级高的进程先运行。进程调度必须防止进程饿死,即其一直得不到运行Linux进程切换进程切换是操作系统调度的基本功能。主要包括:硬件上下文切换任务状态段切换内核堆栈浮点数寄存器硬件上下文切换主要是寄存器。例如,i386中CR3保存页表的起始地址,若两个进程不共享物理空间,则其必须切换,否则第二个进程会访问到第一个进程的数据。通用寄存器是进程相关的,需要切换。切换主要是通过保存和恢复原创 2021-03-31 19:22:26 · 209 阅读 · 0 评论 -
进程的创建和结束(二)
进程的创建和结束(二)结束进程的结束程序调用exit()系统调用结束一个进程该调用接收一个退出原因代码,父进程使用wait()系统调用来获取该代码kernel中对应的的系统调用为sys_exit_group它的作用是唤醒一个进程中所有线程,使其执行do_exit基本流程:将信号SIGKILL加入其他线程的信号队列,并唤醒这些线程。它们被唤醒后会调用get_signal_to_deliver,这个调用会调用do_group_exit之后它们开始执行do_exit()来退出,执行exit()原创 2021-03-30 17:16:50 · 254 阅读 · 0 评论 -
进程的创建和结束(一)
进程的创建和结束(一)Linux中,进程使用**fork和vfork创建它们生成一个父进程的复制品**创建forkfork对应sys_fork,该函数简单调用do_fork函数一个简单的do_fork如下:分配进程号。alloc_pid()复制进程,将父进程的运行环境复制到新的子进程。copy_process(),它做了fork的大部分事情。计算新进程的优先级、调度参数等,将新的进程加入进程调度队列,并设置为可调度的。wake_up_new_task()copy_process()原创 2021-03-30 09:19:35 · 102 阅读 · 0 评论 -
线程的原理和实现
线程的原理和实现进程是程序的一次执行,同时也是资源分配的基本单位。线程是比进程更小的、能独立运行的基本单位。线程的基本概念线程与进程的区别和联系:进程是资源分配的基本单位。一个进程中的所有线程共享进程的所有资源线程是最小的调度单位。一个进程至少有一个线程。线程的优点线程的创建开销小于进程:共享进程资源,不需要申请新的资源线程的同步开销小于进程:进程有各自的堆栈、堆空间,要同步必须通过内核的进程通信模块;线程共享进程的所有的地址空间线程易于调度:因为共享,线程切换需要保存的现场更少原创 2021-03-29 11:01:07 · 491 阅读 · 0 评论 -
进程的原理和实现(三)
进程的原理和实现(三)进程的标识进程的唯一标识:进程ID例外:Linux中,每一个逻辑CPU有一个IDLE进程,所有IDLE的ID为1Linux中,一般进程使用task_struct的地址作为唯一标识内核定义宏current指向task_strcut的地址进程描述符在内存中的组织形式在i386架构下,内核为每一个进程分配4096B×2=8192B4096B\times 2 = 8192B4096B×2=8192B的物理页面这两个连续的物理页面按照8192B8192B8192B对齐,内核堆栈从原创 2021-03-29 10:18:54 · 190 阅读 · 0 评论 -
进程的原理和实现(二)
进程的原理和实现(二)进程控制块进程是操作系统资源分配、调度的单位。它由内核进行管理。在内核中使用一个名为进程控制块(Process Control Block)PCB的数据结构进行管理。进程由进程控制块、代码、数据组成。进程控制块描述的内容主要有:进程标识符进程上下文进程调度信息进程控制信息进程控制块组织方式进程标识符用于标识一个进程,包括id、名字、拥有该进程的用户标识等。进程上下文指进程运行时的CPU各寄存器的内容进程调度信息包括进程状态、调度策略、优先原创 2021-03-28 09:22:44 · 121 阅读 · 0 评论 -
进程的原理和实现(一)
进程的原理和实现(一)一切串行执行的程序都具有:顺序执行资源独占结果无关由于作业之间具有一定的独立性,相互之间的依赖性较小,一定程度上可以实现并性处理,因此出现了多任务处理。计算机中,总存在一些相对独立又能并发执行的程序段。这些程序段在同一个时间内可以被多个作业调用,因此,程序和“计算”就不具备“一一对应”的关系。这些并发的程序,组成了一个并发环境。在多道程序的环境下,程序不能独立运行作为资源分配和独立运行的基本单位是进程,操作系统的所有特征都是通过进程体现的进程是操作系统中的可执行原创 2021-03-27 16:19:47 · 205 阅读 · 1 评论 -
Linux内核的结构及主要组成部分
Linux内核的结构及主要组成部分Linux内核系统体系结构Linux内核主要五个子系统组成:进程调度内存管理虚拟文件系统网络接口进程间通信进程调度(SCHED)控制进程对CPU的访问由进程调度系统选择最值得运行的进程内存管理(MM)允许多个进程安全的共享主内存区域。支持虚拟内存。虚拟文件系统(VFS)隐藏了各种硬件的具体细节,为所有的设备提供了一个统一的接口分为逻辑文件系统和设备驱动程序。网络接口(NET)提供对各种网络标准的存取和各种网络硬件的支持原创 2021-03-26 19:53:30 · 376 阅读 · 0 评论 -
操作系统的内核体系结构模型
操作系统的内核体系结构模型操作系统是一个大型软件操作系统的结构,指的是操作系统个部分程序的存在方式以及相互关系模块接口结构:程序模块方式存在,相互之间通过调用建立联系进程结构:各程序以进程的方式存在,相互之间通过通信建立练习模块层次结构:按照模块的调用顺序或主进程的信息发送顺序把模块进程分层、各层之间只能单向以来常见的操作系统体系结构有:整体式层次式微内核(客户/服务器)……整体式先确定总体功能,再将总功能分解为若干个子功能,直至每个模块仅包含单一功能或紧密联系的小功能位置原创 2021-03-25 15:23:06 · 669 阅读 · 0 评论 -
操作系统的发展历史与分类
操作系统的发展历史与分类操作历史的发展历史手工操作阶段->监控程序阶段->多道批处理阶段->分时/实时系统阶段->UNIX系统->PC->分布式、集群、嵌入式手工操作阶段最开始的时候,没有高级语言,甚至连汇编语言也没有,程序员把机器语言在卡片上打孔,然后交给计算机进行处理。这个时候的程序员兼职计算机的操作员。监控程序后来出现了汇编语言以及一系列的初级的高级语言,这个时候程序员需要把打孔的卡片放在盒子里交给操作员,操作员带入输入室,计算机将输出的结果输出原创 2021-03-25 12:53:24 · 598 阅读 · 0 评论 -
什么是操作系统?操作系统的定义、功能、特性
什么是操作系统?操作系统的定义、功能、特性什么是操作系统?首先,计算机的资源可以分为硬件资源和软件资源。CPU、存储设备、各种类型的输入输出设备与外设等,共同构成计算机的硬件资源各种程序、数据构成链计算机的软件资源任何程序的执行都占用了计算机资源。一个程序要执行,首先要从外存加载到内存,再通过CPU进行执行,可能还会调用公共服务子程序和共享文件以及其他外设,这些都是计算机资源各个程序对计算机资源的需求可能会造成冲突。如果没有规则或者程序对这些需求进行管理,势必会引起混乱。同时,对计算机资源进原创 2021-03-24 09:25:14 · 5154 阅读 · 1 评论 -
寒假OS学习第七天
# 寒假OS学习第七天学不动了,后面的有点复杂总结一下,搭建一个基于GRUB引导程序的toy OS kernel需要哪些知识Linux下的存储维护相关的命令用于制作GRUB引导盘汇编语言,NASM或者AT&T。在x86架构下进行汇编的能力NASM和Intel汇编语法一样,更简单,AT&T也有学的必要C语言的高级用法需要看一遍《C语言专家编程》,掌握一些C语言的高级用法GCC的使用起码知道做一个内核要用GCC的哪些参数链接器ld的使用要做到会写ld脚原创 2021-02-05 21:49:12 · 167 阅读 · 0 评论 -
寒假OS学习第六天
寒假OS学习第六天Hurlex——完成中断请求和定时器中断中断服务请求外设的所有中断都由中断控制芯片8259A汇集后连接到CPU的INTR引脚8259A PIC每一片能管理8个中断源。使用级联功能时钟中断连接在主片的IR0引脚,键盘中断连接在IR1引脚因为0~31号中断是CPU自己用的,所以IR0开始对应的就是32号中断号要完成中断请求,首先要进行初始化static voidpic_init(){ // 进行初始化 outb(main_pic_port, 0x11); outb(原创 2021-01-30 10:51:41 · 79 阅读 · 0 评论 -
寒假OS学习第五天
寒假OS学习第五天Hurlex学习——添加中断描述符表中断是事件的基础。在多道程序运行的时候,依靠中断来切换CPU的工作状态软件引发的中断叫陷阱当某个中断发生时,典型的处理方式就是CPU会打断当前的任务,保留当前的执行现场后再转移到该中断事先安排好的中断处理函数中断由中断控制器产生,通过两条中断线和CPU相连因此,不同的设备的中断有编号CPU的中断有两类——非屏蔽中断(NMI)和屏蔽中断(INTR)非屏蔽中断的意思是需要进行无条件立即处理,意味着CPU遇到了不可挽回的错误我们关注的是屏蔽原创 2021-01-28 13:35:36 · 151 阅读 · 0 评论 -
寒假OS学习第四天
寒假OS学习第四天hurlex学习——添加全局段描述符表接下来将进入x86保护模式编程的一些细节。从80386处理器开始,CPU有了四种运行模式实模式保护模式虚拟8086模式SMM模式工作模式是指CPU的寻址方式、寄存器大小等。几种模式CPU的实模式在8086时代,CPU以实模式运行CPU刚刚上电后,也以实模式启动参考资料:https://zhuanlan.zhihu.com/p/42309472https://baike.baidu.com/item/%E5%AE%9E%E原创 2021-01-27 13:17:32 · 108 阅读 · 0 评论 -
寒假OS学习第三天
寒假OS学习第三天解决调试的问题完成printk函数与部分string类函数打印函数调用栈Hurlex学习继续调试bochs自带调试功能,但是它只能做到asm级别即汇编级别的调试使用apt install bochs下载的bochs本身并没有调试功能,需要从https://nchc.dl.sourceforge.net/project/bochs/bochs/2.6.11/bochs-2.6.11.tar.gz下载最新的源代码并进行编译使用sudo apt purge bochs卸原创 2021-01-25 20:58:33 · 383 阅读 · 0 评论 -
printk函数的实现
printf函数的模拟实现:printk在照着教程写内核的时候,需要写自己的printf函数用来打印调试信息,暂且叫它printk函数吧,print kernel的意思实现这个函数的主要难点有两个,一个是变长参数,另一个是格式字符串的判断变长参数,参考这篇文章https://www.cnblogs.com/mysky007/p/11204296.html我把我写的vargs.h亮出来#ifndef INCLUDE_VARGS_#define INCLUDE_VARGS_#define va原创 2021-01-25 11:53:42 · 550 阅读 · 0 评论 -
寒假OS学习第二天
寒假OS学习第二天今天准备完成的事情:跟着教程完成字符模式下的显卡驱动看操作系统概念,理论知识不能落下来!!认真学习multiboot规范认真学习makefile的进阶语法Hurlex学习笔记——字符模式下的显卡驱动32位最多能寻址到4G4G的地址空间里面分给一部分给了其他外设在PC上显示文字需要显示器和显卡显卡负责提供内容显卡有自己的存储区域,叫做VRAM访问显存需要地址显卡有两种模式:文本模式和图形模式显卡在文本模式的显示规则显卡会内置一套关于基本英文字符的显示。在P原创 2021-01-24 12:09:44 · 149 阅读 · 0 评论 -
multiboot规范
multiboot规范什么是multiboot规范背景每种操作系统基本上都有自己的引导程序在计算机上共存多个操作系统是很麻烦的一件事情系统自带的引导程序不符合你的预期或者不能运行是一件很麻烦的事情人们迫切需要这样子的一种规范:它不依赖于任何操作系统它不关心引导程序的细节它规范了引导程序与操作系统之间的接口使用multiboot规范的操作系统与引导程序能很好地实现操作系统共存但是,该规范只适用于自由操作系统细节该规范的目标:x86架构,32位操作系统,自由操作系统OS映原创 2021-01-24 01:00:15 · 1048 阅读 · 0 评论 -
计算机启动过程
计算机启动过程本文主要参考阮一峰的博客:http://www.ruanyifeng.com/blog/2013/02/booting.html深入解析linux0.11计算机的启动是一个很矛盾的事情:在计算机启动后计算机才能正常运行程序,计算机启动又需要运行程序。为了解决这个矛盾,计算机科学家把开机程序放到计算机的某个地方,计算机通电后,第一件事情就是读取这个程序。这个程序被称之为BIOS,Basic Input and Output SystemBIOS首先会检查这台计算机能不能被启动。原创 2021-01-23 12:49:13 · 85 阅读 · 0 评论 -
操作系统概念(二)——操作系统结构
操作系统结构从多个角度研究操作系统:考察提供的服务考察为用户和程序员提供的接口研究系统的各个组成部分以及相互关系本章目的:研究操作系统提供的服务研究操作系统的不同设计方法研究计算机的启动过程服务操作系统提供了一些操作系统服务来帮助用户:界面共有命令行界面、批界面与图形化界面程序执行提供执行程序并指明程序错误的服务I/O操作文件系统操作文件系统是组织信息的方式通信通信主要有两种方式:进程间通信、网络间通信错误检测另外一组操作系统函原创 2021-01-23 11:54:29 · 148 阅读 · 0 评论 -
寒假OS笔记第一天
寒假OS笔记第一天本次寒假的目标:自制一个toy kernal今天准备完成的事情:找到自制OS所需要的资料开始第一行代码寻找资料在知乎的这个专题和这个专题找到了很多很有帮助的回答:https://www.zhihu.com/question/25628124https://www.zhihu.com/question/22463820从中总结出来的是:一个人写一个Demo级别的OS是绝对可行的《30天自制操作系统》这本书只适合beginner,不适合计算机专业的学生看英文材料是必经原创 2021-01-20 12:15:24 · 500 阅读 · 3 评论