
操作系统
文章平均质量分 61
一只老风铃
欣于所遇,暂得于己,快然自足。
展开
-
操作系统 段页式内存分配
一.分页存储管理1.基本思想用户程序的逻辑地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。管理将内存空间划分成等长的若干物理块,成为物理页面也成为物理块,每个物理块的大小一般取2的整数幂。内存的所有物理块从0开始编号,称作物理页号。系统将程序的逻辑空间按照同样大小也划分成...原创 2019-04-05 17:48:00 · 3358 阅读 · 0 评论 -
linux虚拟内存④:段与缺页
Linux虚拟内存系统Linux将进程的地址空间,将虚拟内存区域组成一些区域(段)的集合。一个区域就是已分配的虚拟内存连续片(chunk),这些段通过某种方式相互链接。一个进程的地址空间由下而上由多个不同类型的连续区域(段)组合而成:代码段、初始化数据段、未初始化数据段、运行时堆区域、共享库的映射区域、运行时栈区域、内核代码和数据段(多个进程通过虚拟内存方式共享)、内核为每个进程维护的元数据(页表、task_struct、mm结构)它们在虚拟地址空间中内部连续,中间则存在空隙,内核通过链表(原创 2021-03-18 10:48:00 · 403 阅读 · 0 评论 -
信号与不可重入
信号信号是软件中断。提供了一种处理异步事件的方法。例如当用户在终端输入中断键(ctrl+c),会向前台进程发送一个中止信号SIGINT,以此来中止一个进程。信号通常以SIG3个字符开头作为命名,例如SIGABRT是夭折信号;当进程调用abort函数时发出这种信号。SIGALARM是闹钟信号,由alarm函数设定的定时器超时后将产生这种信号。几种常见的信号类型:①当用户在终端输入某些键时,引起终端产生相应的信号。例如按下DELETE键或者Ctrl+C键将产生中断信号SIGINT。该信号用于停止一个原创 2020-12-05 00:37:17 · 382 阅读 · 0 评论 -
存储器层次②:局部性与高速缓存
局部性一个计算机程序常常具备良好的局部性。其含义是程序在未来总是倾向于访问那些最近使用过的数据周围附近的数据,或者是引用那个最近使用的数据本身。这就是局部性原理。局部性通常包含两种形式:①:时间局部性:一个被引用的内存位置在不久的将来很可能继续被访问②:空间局部性:一个内存位置被引用,其周围的附近位置很可能不久被访问。具备良好的局部性特性的程序通常有更好的性能。原因在于计算机系统中采取缓存保存那些最近使用的数据,那么在下一次访问到该数据时将大大缩短时间。另外,一些系统也采取预加载的技术,一次将原创 2020-11-13 21:44:39 · 541 阅读 · 0 评论 -
pthread②:双线程交替打印
两个线程交替打印0=>100 。【错误思路】采取一个互斥锁,一个全局变量flag,线程申请互斥锁:若线程1申请成功,且当前flag=true 线程1打印偶数 若线程2申请成功,且当前flag=false 线程2打印奇数static bool flag=true;void* func1(void*){ for(int i=0;i<50;i++) { pthread_mutex_lock(&mutex); cout..原创 2020-10-26 10:54:16 · 671 阅读 · 0 评论 -
Linux控制流②:处理器模式与上下文切换
【内核模式与用户模式】操作系统为进程提供两个抽象:处理器抽象与内存抽象,使得应用程序进程仿佛拥有全部的处理器时间,和一个私有地址空间。处理器需要提供一种机制,限制一个应用可以执行的指令以及可以访问的地址空间。处理器通过一个控制寄存器的模式位来控制当前执行进程的指令执行权限。设置了模式位:进程处于内核模式,可以执行处理器指令集的全部指令以及访问任何一个内存位置。未设置模式位:进程处于用户模式,用户模式只能执行处理器指令集中的部分指令,即不允许执行特权指令:停止处理器(关机)、.原创 2020-10-19 00:36:58 · 310 阅读 · 0 评论 -
Linux控制流①:异常与异常处理
计算机在运行过程中,其程序计数器PC的数值从时间轴上看是一个序列:a0 a1 a2 a3 a4 a5 a6 .... 其中第k个对应于指令Ik的地址,每次从k到k+1 的过程发生控制转移。而这样的序列称为控制流。如果k到k+1在地址上不连续,那么发生控制突变,通常由于跳转、调用、返回引起。计算机执行过程中,可能发生三大类型的控制突变,即异常控制流:硬件层面,硬件检查到事件发生,触发控制转移到异常处理程序 系统层面,内核通过上下文切换context_switch将控制转移到另一个用原创 2020-10-18 23:39:22 · 443 阅读 · 0 评论 -
Linux系统级IO②:RIO-带缓冲区IO实现
UNXI系统级的IO函数,在某些情况下,传送的字节数比用户要求的少,会出现不足值(short count)主要原因为:①读取时遇到EOF:文件的大小不足以填充read需要读取的字节数,那么返回不足值0表示提前遇到EOF ②从终端读取文本行:read函数每次传送一个文本行,返回的不足值表示文本行的大小 ③读写网络SOCKET:由于网络延迟等原因,对Linux套接字执行read可能返回不足值(数据还没有接受完)一种策略是反复调用read函数,直到将所需要的字节全部读取完毕。另一种思路采取缓冲区方式:原创 2020-10-16 12:34:25 · 1135 阅读 · 1 评论 -
Linux系统级IO①:文件描述符表与IO重定向
输入输出是主存和外部设备(磁盘、终端、网络)之间数据传送的过程:输入:从IO设备传送数据到内存输出:从内存传送数据到IO设备高级语言都提供处理IO的高级别工具:ANSI C提供的标准IO库,printf scanf带有缓冲区的格式化函数,C++通过重载<< >>提供带缓冲区的格式化函数。而在一个Unix系统中,底层的系统级IO即为Unix IO ,C中的标准IO是对它的封装和完善,同时诸如RIO等封装库也基于此:关于IO,UNIX设计哲学为:一切I.原创 2020-10-15 20:40:37 · 310 阅读 · 0 评论 -
虚拟内存③:mmap文件内存映射
内存映射是虚拟内存系统的重要特性,即虚拟内存中的虚拟页(Virtual Page)总是对应于磁盘上的物理页(Physical Page)。内存映射:将虚拟地址空间中的虚拟页与磁盘上的文件对象对应起来内存映射技术,可以使得使用文件来初始化虚拟内存的内容(只在第一次引用到相应内存时,才会缓存进主存):普通磁盘文件:将普通磁盘文件按照4096字节大小分片,映射到虚拟内存的虚拟页。 匿名文件:驻留内存的,由内核创建并赋值为0,虚拟内存映射到匿名文件时,即为请求二进制0Linux进程中可以使用mm.原创 2020-10-14 17:08:57 · 1200 阅读 · 0 评论 -
Linux线程间同步③:自旋锁Spinlock
对于Mutex互斥锁,其同一时间只能被一个线程所占有,其它申请该锁的线程会进入阻塞休眠态,让出CPU时间片。其一般使用在临界区逻辑较长的程序中,使得多线程互斥的访问临界资源。而Linux中引入自旋锁主要是解决多处理器对内核数据结构的互斥访问。确保其访问的原子性,基本流程为:锁定=》操作=》解锁自旋锁其功能和互斥锁类似,目的是保护一小段临界区的原子性,其本质为一个原子变量atomic,主要包含两种状态:locked unlocked当一个任务希望执行访问临界资源的临界区时,需要检查这个原创 2020-10-14 14:24:37 · 359 阅读 · 0 评论 -
Linux线程间同步②:条件变量Condtion
互斥锁提供了一种线程互斥访问临界资源的方式,但其存在一个问题:调用pthread_mutex_lock 线程在没有申请到锁时将一直阻塞等待。调用pthread_mutex_trtlock 线程虽然无需一直等待,但可能需要不停的检查锁是否可用而条件变量提供了一种阻塞=》唤醒方式,即线程A发现条件不成立时,执行wait_condition进入block,加入到条件阻塞队列, 而其它线程B在修改了条件后,发出一个signal信号唤醒阻塞队列,使线程A继续执行。这样一来避免了线程无目的的等原创 2020-10-14 01:09:40 · 282 阅读 · 0 评论 -
Linux线程间同步①:互斥锁Mutex
进程间通信往往意味着系统调用,内核态,用户态的切换,其代价是不容忽视的。而线程是进程中的具体执行流,一个进程中多个线程共享进程的资源,包含进程的虚拟地址空间,进程打开的文件描述符,进程组ID等。而线程间的通信和同步由于处于同一地址空间下,也更加轻易和轻量级。多线程之间访问共享变量时,这些共享变量若每次只能被一个线程进行访问,称为临界资源。而对临界资源的访问在多线程环境下,如果不加以控制,很容易出现不一致性。最常见的便是多线程售票问题。由于每个线程在执行售票(取得票数=》扣款=》票数i--=》写回原创 2020-10-13 22:11:15 · 402 阅读 · 0 评论 -
Linux进程间通信⑤:IPC-消息队列
Linux System V IPC三大类通信方式:共享内存、信号量、消息队列其基于统一的ftok获取IPC资源的key 并执行相应的系统调用semget shmget创建相应的IPC资源。消息队列,顾名思义,进程可以向消息队列中写入消息,而其它进程可以从消息队列中读取消息。消息队列通过执行系统调用,由内核创建和维护,并向用户进程提供读写窗口,从而实现进程间通信。其关键函数如下:int msgget(key_t key,int msgflag)key:由ftok获取的IPC资...原创 2020-10-13 01:45:51 · 349 阅读 · 0 评论 -
Linux进程间通信④:IPC-信号量
信号量是操作系统中线程、进程间访问临界资源的同步方式。当信号量>0时,表示当前临界资源的数量。 当信号量=0时,表示当前没有可用的临界资源。 当信号量<0时,表示当前等待该临界资源的进程数量。其有两个关键操作:P:申请临界资源,申请成功那么信号量-1V:释放临界资源,释放成功那么信号量+1System V IPC资源包含共享内存、消息队列、以及信号量。其关键函数如下:int semget(key_t key,int num_sems,int sem_flags).原创 2020-10-13 00:39:03 · 436 阅读 · 0 评论 -
Linux进程间通信③:IPC-共享内存
共享内存是基于虚拟内存的机制,在进程的地址空间中,共享区域的虚拟页通过内核中的页表映射到实际的物理页中,当多个进程都映射到同一块物理页,那么它们访问的就是同一片物理内存,即共享内存。此时基于同一片内存,进程间进行信息传输的速度将非常快,每个进程相当于访问自己地址空间内的内存数据。关键函数:key_t ftok(const char* pathname,int proj_id)该函数通过将一个Linux目录名和一个项目ID生成唯一的一个IPC键值。目录必须存在,并且目录不变时..原创 2020-10-12 21:34:48 · 337 阅读 · 0 评论 -
虚拟内存②:Linux虚拟内存系统
Linux系统为每一个进程维护一个单独的地址空间,包含了进程的内存分区即:代码段、数据、运行时堆栈,共享库等部分。除了进程私有的虚拟地址空间外,内核虚拟内存地址包含内核的代码和数据,所有进程的这部分区域被映射到同一个物理页面。另外,与每一个进程相关的进程信息,例如进程的页表,mm内存映射结构等也存放在内核地址空间中,由内核进行维护。Linux将这些不同区域称为段(segement)一个段包含若干的个连续的虚拟页。不同的区域之间在地址空间中不一定连续。例如:Linux中进程的s.原创 2020-10-12 00:37:53 · 470 阅读 · 1 评论 -
虚拟内存①:虚拟内存与物理内存
在物理内存空间大小受限的时期,虚拟内存的概念被提了出来,其提供了一种对主存的抽象。虚拟内存机制使得对于每一个进程,其能够提供一个足够大、私有的地址空间。虚拟内存主要的三大能力:主存是一个对存储在磁盘上的地址空间的缓存,主存只存放那些活动页面,并根据需要在磁盘和主内存之间进行数据传送。 为每一个进程提供一致的地址空间,从而简化了内存管理,避免直接操纵物理内存的复杂性。 为每个进程提供的地址空间是私有的,确保进程与进程之间的地址空间不被破坏。物理寻址:将计算机的物理内存看作一个由M个字节单.原创 2020-10-11 22:40:23 · 1062 阅读 · 0 评论 -
Linux进程间通信②:有名管道FIFO
常规的匿名管道通过pipe创建一片内存缓冲区,并对外提供两个文件描述符,用于只读或者只写操作。但其使用范围很小,只能用于父、子进程间的通信。因此Linux还提供有名管道的支持。管道的本质是一片可以读写的缓冲区域,Linux将其描述为文件(UNIX思想:一切IO皆是文件) 对于有名管道,其主要特点是:存在于文件系统中,包含文件名,管道文件被组织成树状结构 两个进程之间无需有联系,可以通过管道进行通信 对有名管道的操作和文件操作类似,支持读,写【有名管道的创建】mkfifo(const.原创 2020-10-11 12:13:13 · 373 阅读 · 0 评论 -
Linux进程间通信①:匿名管道PIPE
对于多线程,其共享同一进程下进程的虚拟地址空间。包括运行时堆区域,进程的.text代码段,.rodata只读数据段,以及.data全局数据段,以及共享库。另外,进程是操作系统进行资源分配的基本单位,多线程还可以共享进程的打开文件(FD),进程的Pid等。由于处于同一个地址空间,线程之间通信可以方便自然的进行。而进程与进程之间由于处于不同的虚拟地址空间,它们之间的通信采取其它的机制。早期的Linux对进程间通信支持的良好,以至于在很长一段时间内,Linux不支持多线程。管道是一种特殊的文件,.原创 2020-10-11 11:02:51 · 306 阅读 · 0 评论 -
Linux IO同步复用②
IO复用通过时分复用的形式,多个socket连接使用同一个IO线程,IO线程通过系统调用的方式获知被监视的文件标识符列表中就绪的文件,执行IO操作。这里的同步指代在执行IO操作时,会等待动作完成再继续执行,复用是采取一个线程完成对多个IO流的处理。Linux中poll方式是对select的改进,select存在一个文件描述符监视数量上限,即1024 而改进的poll去除了该上限。poll方式维护一个监听数组,数组中的元素是一个结构体,结构体形式如下:struct pollfd{ in.原创 2020-10-06 13:48:26 · 219 阅读 · 0 评论 -
Linux IO同步复用①
关于同步与异步:同步:调用者在执行一个调用时,一直等待调用完成返回后才进行后续操作。异步:调用者执行一个调用时,立即返回,继续进行后续操作而不关心调用是否完成。异步与同步是对通信机制的描述,而阻塞、非阻塞关心的是调用者的状态:阻塞:当执行一个调用时,调用者线程一直被挂起(CPU时间片切换给其它线程),直到调用完成返回。非阻塞:当执行一个调用时,调用者线程仍然活跃。值得注意的是同步调用过程,在等待过程线程可能并没有挂起,而只是一直等待(占用着资源)。IO多路复用:是一种..原创 2020-10-06 01:48:09 · 354 阅读 · 0 评论 -
操作系统 动态链接库与静态链接库区别
1 静态链接库的优点代码装载速度快,执行速度略比动态链接库快; 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。2 动态链接库的优点(1) 更加节省内存并减少页面交换;(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;(3) 不同编程语言编...原创 2020-07-08 20:51:08 · 409 阅读 · 0 评论 -
操作系统 死锁
死锁线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。 四个...原创 2019-02-20 13:30:38 · 164 阅读 · 0 评论 -
操作系统 进程间通信方式
——管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 ——有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 ——信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访...原创 2019-02-19 21:24:13 · 366 阅读 · 0 评论 -
操作系统 进程与线程
进程 (Process)是计算机中的程序关于某数据集合上的一次运行活动——是系统进行资源分配和调度的基本单位,是操作系统结构的基础。——进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。——进程的地址空间,一般情况下,包括文本 区域(text region)、数据区域(data region)和堆栈 (stack region)。1 文本区域存储处理器执行的代码;...原创 2019-02-19 21:24:25 · 210 阅读 · 0 评论 -
操作系统 进程调度算法
——先来先服务(FCFS)调度算法最简单的调度算法,在进程调度中,FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。FCFS调度算法属于不可剥夺算法。从表面上看,它对所有作业都是公平的,但若一个长作业先到达系统,就会使后面许多短作业等待很长时间常被结合在其他调度策略中使用。例如,在使用优先级作为调度...原创 2019-02-23 13:39:03 · 1128 阅读 · 0 评论 -
操作系统 并发执行
两个等价线程并发的执行下列程序,a为全局变量,初始为0,假设printf、++、--操作都是原子性的,求所有可能输出void foo() {if(a <=0) { a++;}else { a--;}printf("%d", a);}——输出 1 0——输出 1 2——...原创 2019-03-01 12:18:21 · 1209 阅读 · 0 评论 -
操作系统 页面置换LRU算法
操作系统中可以使用LRU(least recently used)内存淘汰旧数据的策略,如果内存需要加载新数据但空间又不足,则会按照最近访问时间进行排序,并将最老的数据淘汰,假设现在内存空间大小为5,原本内存中没有数据,对内存中数据的访问顺序如下: 1,2,5,3,4,6,1,4,3,6,7,8,3,9 求发生的缺页次数——页面置换过程1 2 5 ...原创 2019-03-05 12:28:27 · 1405 阅读 · 0 评论 -
操作系统 内核态与用户态
——为什么要有用户态和内核态? 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态——内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. ——用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他...原创 2019-02-26 17:56:44 · 3878 阅读 · 0 评论 -
操作系统 固定分区与可变分区
页:一个固定长度的数据块,存储在二级存储器中(如磁盘)。数据页可以临时复制入内存的页框中。 段:一个变长的数据块,存储在二级存储中,整个段可以临时复制到内存的可用区域(分段),或者将段分成许多页,将页单独复制到内存中(分段分页相结合)。——重定位:就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程 操作系统存储至少要分成两级:内存和外存。内存提供快速的访问,成本相对较高,是...原创 2019-03-19 15:25:22 · 8513 阅读 · 0 评论 -
操作系统 文件索引结构
好久没更新了,忙着毕业论文(◒。◒)索引结构指一个文件的信息存放在若干不连续的物理块中,系统为每个文件建立一个专用的数据结构——索引表,并将这些块的块号存放在索引表中。有点是保留了链接结构的优点,同时解决了其缺点,即能顺序存取,又能随机存取,满足了文件动态增长,插入删除的需求,也能充分利用外存空间。缺点是索引表本身带来一定的系统开销。为了提高文件的检索效率,可以采用索引方法...原创 2019-05-04 09:41:26 · 12737 阅读 · 0 评论 -
操作系统 预防死锁银行家算法
银行家算法:参与者有客户,银行家以及资金。 客户相当于是申请资源的进程,银行家相当于是操作系统,而资金就相当于是资源。银行家给客户分配资源之前,会预先估计资金分配的安全性。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。否则,就不给顾客分配。...原创 2019-08-25 10:24:45 · 340 阅读 · 0 评论 -
操作系统 进程控制块
进程控制块的定义:进程控制块(Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态。进程控制块的信息:进程标识符:每个进程都必须有一个唯一的标识符,可以是字符串,也可以是一个数字。UNIX系统中就是一个整型数。在进程创建时由系统赋予。 进程当前状态:说明进程当前所处的状态。为了管理的方便,系统设计时会将相同的状态的进程组成一个队列,如就绪进...原创 2019-08-23 14:37:12 · 1852 阅读 · 0 评论 -
操作系统 磁盘调度算法
——FCFS 先来先服务,即按照请求到来的顺序依次处理进程,优点是实现简单,缺点是平均寻道时间变长public class fcfs { private Scanner x=new Scanner(System.in); private int num; private int[] position; public fcfs() { System.out.p...原创 2019-02-23 13:27:43 · 649 阅读 · 0 评论