
操作系统
文章平均质量分 72
清梦旅人
记录一些遇到的问题
展开
-
LINUX系统中的锁
LINUX系统中的锁说一下LINUX系统中的锁互斥锁,读写锁,自旋锁互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒读写锁:rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒。 注意:写锁会阻塞其它读写锁。当有一个线程获得写锁在写时,读锁也不能被其它线程获取;写者优先于读者(一旦有写者,则原创 2022-03-15 10:35:45 · 818 阅读 · 0 评论 -
存储器层次结构
存储器层次结构存储器层次结构层次结构本地磁盘 -> 主存(DRAM) -> L3高速缓存(SRAM) -> L2高速缓存(SRAM) -> L1高速缓存(SRAM) -> L0寄存器缓存思想位于K层的更快更小的存储设备作为位于K+1层更大更慢的存储设备的缓存K+1层的存储器被划分成连续的数据对象组块,称为块,数据总是以块大小为传送单元在K和K+1层之间来回复制缓存命中当程序需要K+1层的某个数据对象d时,首先在当前存储在K层的块中查找d,若d刚好缓原创 2022-03-15 10:34:32 · 3116 阅读 · 0 评论 -
用户态和内核态
用户态和内核态用户态和内核态概念用户态和内核态是操作系统的两种运行级别,两者最大的区别就是特权级不同。用户态拥有最低的特权级,内核态拥有较高的特权级。运行在用户态的程序不能直接访问操作系统内核数据结构和程序操作系统的数据都是存放于系统空间的,用户进程的数据是存放于用户空间的。* 分开来存放,就让系统的数据和用户的数据互不干扰,保证系统的稳定性。* 分开存放,管理上很方便,而更重要的是,将用户的数据和系统的数据隔离开,就可以对两部分的数据的访问进行控制。这样就可以确保用户程序不能随便操作原创 2022-03-15 10:32:38 · 866 阅读 · 0 评论 -
TLB、程序计数器PC和指令指针寄存器IP
TLB、程序计数器PC和指令指针寄存器IPTLBTLB( Translation Look- aside buffer)专门用于缓存内存中的页表项,一般在MMU单元内部,页表一般存储在屋里内存中。当处理器要访问一个虚拟地址时,首先会在TLB中查询。如果TLB表项中没有相应的表项,称为TLB Miss,那么就需要访问页表来计算出相应的物理地址。如果TLB表项中有相应的表项,那么直接从TLB表项中获取物理地址,称为TLB命中。程序计数器PC和指令指针寄存器IP程序计数器PC用指令事先编好的程序连原创 2022-03-15 10:30:40 · 4573 阅读 · 0 评论 -
进程、线程和协程
进程、线程和协程僵尸进程和孤儿进程当父进程先结束,子进程此时就会变成孤儿进程,孤儿进程会自动向上被init进程收养,init进程完成对状态收集工作。而且这种过继的方式也是守护进程能够实现的因素。如果子进程先结束,父进程并未调用wait或者waitpid获取进程状态信息,回收进程资源,那么子进程描述符就会一直保存在系统中,这种进程称为僵尸进程。僵尸进程是每个子进程退出时必然经历的过程僵尸进程的危害在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留原创 2022-03-15 10:26:55 · 1270 阅读 · 0 评论 -
进程调度知识
进程调度进程调度算法批处理系统批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。先来先服务 first-come first-serverd(FCFS)非抢占式的调度算法,按照请求的顺序进行调度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。短作业优先 shortest job first(SJF)非抢占式的调度算法,按估计运行时间原创 2022-03-15 09:37:06 · 212 阅读 · 0 评论 -
共享内存底层原理
进程间通信进程间通信主要包括管道、系统IPC(包括消息队列、信号、共享内存等)、本地套接字socket。管道(缓冲区有限)无名管道PIPE一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父子进程或兄弟进程)有名管道FIFO一种半双工的通信方式,可以在非亲缘关系的进程间使用消息队列消息队列是消息的链接表,存放在内核中并由消息队列标识符标识消息队列克服了信号传递信息少,管道缓冲区大小受限的缺点一个消息队列由一个标识符(即队列ID)来标记信号信号是一原创 2022-03-11 09:54:56 · 818 阅读 · 0 评论 -
fork() vfork() clone()
进程间同步信号量fork() vfork() clone()进程的四要素: (1)有一段程序供其执行(不一定是一个进程所专有的),就像一场戏必须有自己的剧本。 (2)有自己的专用系统堆栈空间(私有财产) (3)有进程控制块(task_struct)(“有身份证,PID”) (4)有独立的存储空间。 缺少第四条的称为线程,如果完全没有用户空间称为内核线程,共享用户空间的称为用户线程。fork、v_fork、clone底层都是do_fork,追踪发现底层使用的是sy原创 2022-03-11 09:47:18 · 260 阅读 · 0 评论 -
进程与PCB
进程与PCB进程进程是操作系统的资源分配单位,实现操作系统的并发,对于一个进程,它在被执行前其实是一个可执行程序。这个程序是被放在磁盘上的,当它要被执行的时候,它先被加载到内存当中,然后再放入到寄存器中,最后再让cpu执行该程序,这个时候一个静态的程序就变成了进程进程创建时会分配4G的内存,其中0-3G是用户空间,3-4G是内核空间,PCB存在于内核空间进程的用户空间是不同的,内核空间也是不同的。比如每个进程的不同系统调用,是陷入自己独立的内核空间里面,所以每个进程内核的堆栈肯定是不一样的P原创 2022-03-11 09:42:21 · 4636 阅读 · 0 评论 -
并行和并发
并行和并发并发在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。并行在同一时刻,有多条指令在多个处理器上同时执行。计算密集任务和IO密集任务计算密集型任务特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。虽然可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核原创 2022-03-11 09:38:52 · 981 阅读 · 1 评论 -
跨平台技术实现原理
跨平台技术实现原理现有跨平台技术就是通过库函数调用实现的,不使用系统函数调用。Qt如何识别不同系统Qt各个操作系统都有特定的宏,然后代码里面根据不同的宏调用不同平台的API对于程序或框架如何判断自己在什么系统或版本(相同的系统版本不同Api也是有所不同的)下,这个很简单,不同的系统或版本都有自己的特征,可能是独特的宏定义,特定的标志位,或者直接有对应的函数获取。当然,目前平台虽然看似差别很大,但是逐渐已经形成了大家共同承认的一些规范,比如Windows、Linux、Unix目前都已经遵循原创 2022-03-11 09:34:44 · 846 阅读 · 0 评论 -
库函数和系统调用的区别
库函数和系统调用的区别概念库函数调用是语言或应用程序的一部分,而系统调用是操作系统的一部分,跨平台技术的原理就是通过库函数实现的,库函数可以理解为是对系统调用的一层封装,但库函数不是必须包含系统调用。库函数有可能包含有一个系统调用,有可能有好几个系统调用,当然也有可能没有系统调用,比如有些操作不需要涉及内核的功能。区别所有 C 函数库是相同的,而各个操作系统的系统调用是不同的。函数库调用是调用函数库中的一个程序,而系统调用是调用系统内核的服务。函数库调用是与用户程序相联系,而系统调用是原创 2022-03-11 09:32:13 · 2301 阅读 · 0 评论 -
程序的局部性原理
程序的局部性原理基本概念程序倾向于引用临近于其他最近引用过的数据项的数据项,或最近引用过的数据项本身,这种倾向性被称为局部性原理。时间局部性良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次引用空间局部性良好空间局部性的程序中,一个内存位置被引用,程序很可能在不远的将来引用其附近的一个内存位置从硬件和操作系统层面看如何利用局部性硬件层局部性原理允许硬件引入高速缓存存储器这种小而快速的存储器来存储最近被引用的指令和数据,从而提高对主存的访问速度原创 2022-03-11 09:22:35 · 1715 阅读 · 0 评论