操作系统
文章平均质量分 65
白帽小丑
只是一个网络安全爱好者
展开
-
ansible的基本安装
ansible是一个同时管理多个远程主机的软件,必须是任意可以通过ssh登录的机器,因此ansible可以管理的机器如远程虚拟机物理机也可以直接管理本机机器ansible通过shh协议实现了,管理节点(老板,安装了ansible服务的机器),被管理节点(员工,被管理的机器节点)的通信。只能是通过ssh协议登录的主机,就可以完成ansible自动化部署操作。ansible通过shh协议实现了,管理节点(老板,安装了ansible服务的机器),被管理节点(员工,被管理的机器节点)的通信。原创 2023-11-22 16:14:56 · 1255 阅读 · 0 评论 -
实时数据备份实践inotify和rsync联动
企业网站和应用都得有完善的数据备份方案,目的都是为了保证数据不丢失。原创 2023-11-22 16:06:15 · 586 阅读 · 2 评论 -
文件系统-
如果基本单位时1Btye那么有一个文件为512B,每一个基本单位为一个逻辑记录,将这512个逻辑记录打包起来,然后存储入一个sector。设置一个指针,只能向前读写或者向后读写,这里还有一个倒带的功能,直接从end到begining。虽然好实现,但所有文件在一个目录里既不好管理也会在文件多的时候让命名变的更困难。磁盘结构第一个部分存的是分区表,第二部分存的就是目录结构。目录就是一个符号表,是将目录项翻译成文件名字。是一个面向用户的可视化管理类型的操作系统。文件就是基本单位的逻辑记录组成的序列。原创 2023-03-03 19:20:42 · 586 阅读 · 0 评论 -
大容量存储(涉及到的硬盘存取的原理)
deadline:两个等待队列,一个读,一个写,每个i/o请求都有一个时间戳,如果达到请求的deadline了那么就调整它为最高的优先级,这里要涉及到一个内容,读的每个i/o请求时间戳都要少很多,那么如果大量读取的请求可以用这个算法。r为转速,代表一分钟转r圈,那转一圈为1/r,N为扇区中的字节数,那么我们要写多少就需要除以这个N,得到b/N,转一圈的时间乘以在这个磁道写入了多少数据就得到了写入数据的时间了,得到T=1/r*b/N。磁头到达所要查找扇区的磁道的时间,这里是厂商设计时决定的,我们无法干扰。原创 2023-03-01 14:52:11 · 433 阅读 · 0 评论 -
虚拟内存原理
但是我们要知道有些程序的代码被执行的几率是很小的,我们要让大概率被执行的代码引用的空间落入cache,其实科学家研究过,一个程序其实只有一部分局部代码在运行时会被访问,并非所有代码都需要被执行。部分装入,虽然内存很小,但是互补之后,我们只需要把不常用的存在低速设备里,常用的放入高速设备里,这就理论上达到无限内存,我们编程就不用担心物理内存的限制。根据下面的图我们可以发现我们可以用置换来解决,也就是我们需要讲一块内存空间存入硬盘,然后再讲我们需要的硬盘数据存入内存,这个过程就叫做页面置换。原创 2023-03-01 14:41:51 · 284 阅读 · 0 评论 -
操作系统页表
整个虚拟地址大小为12287,分页可以得到12287B/2048B左取值得到5,也就是只能分五页,五页离散放入内存中,page-table页只要0-5的下标里有对应的frame number且valid-invalid bit值有效。这个valid-invalid bit可是是bits,因为有些页可能是只读,也能是读写,所以可以添加更多有效位去代表更多属性,但这个是要消耗资源的,所以需要权衡利弊。例如一个50KB的程序,页式分配,不妨设每页4KB,各页地址分别为0~4,4~8 ...... 44~48;原创 2023-03-01 14:35:28 · 855 阅读 · 0 评论 -
分页与分段
我们根据pc+4,且前面2bits的段号并没有变(基址还为0x4000)可以得到0x4000+0x0240+0x0004=0x4244。这里有个基本单元叫做帧也有叫页框的,内存划分的固定大小的区块(注意这里是固定大小不是大小不等),但里面可以离散存放。最前面的2bits 00 代表段号,那么我们可以得到段号为code(0)基址为0x4000。这是一个虚拟地址,这个区间是属于段号1的(也可以根据段号判断这里是01)因为段的大小是不等的,只不过是分的更小一些,那么产生的碎片肯定是会更小的。原创 2023-03-01 14:29:16 · 312 阅读 · 0 评论 -
内存的管理
假设我们是下面大的进程集需要系统分配空间,那么1、2、3进来之后我们有一个洞,这时候4、5、6可以填补这个洞,那么这时2释放空间之后,我们有第二个洞,那么这个洞只有等7来占用,长此以往下去小的洞会越来越多。汇编语句中有一条在内存中取指令,那么我们要取址就需要访问地址,操作系统先访问虚拟地址(变址寄存器),加上基址寄存器中的基址得到物理地址,从而取得想要的数据。这里提到的内存连续性,我们需要关注的是对进程内存的定位、回收、保护。所以p1的进程剩下的2k内存空间就被浪费了,浪费的空间叫做内存碎片。原创 2023-03-01 14:22:01 · 315 阅读 · 0 评论 -
进程内存空间
我们发现这些汇编代码不好阅读,其实这里是因为 这个文件还没有link(链接)如果这里基址为1000,那么main函数的物理入口地址为1000+1141。第一、二个全局变量对应这一行的区间,证明这里是data区域。大家可以看到规律了吧,其实上面的就是一串一串的机器指令串。我们用objdump 查看的就是text代码段的内容。内核指令在内核空间内,程序执行所在的空间是用户空间。我们这里可以查看下data段的数据。我们可以看到两个函数的入口。我们写一个有静态变量的进程。我们可以观察前面的代码输出。原创 2023-02-28 23:08:31 · 105 阅读 · 0 评论 -
unix高级编程-fork和execve
就像Python中的os.system(cmd)这个函数,我们可以用这个函数来执行我们的shell脚本,单独的shell命令,或者是调用其他的程序,我们的execve()这个函数就和Python中的os.system函数类似,可以调用其他程序的执行,执行shell命令,,调用脚本等等功能。格式开头的解释器参数参数。如果是后者,这个解释器必须是一个可执行的有效的路径名,但是不是脚本本身,它将调用解释器作为文件名。argv是要调用的程序执行的参数序列,也就是我们要调用的程序需要传入的参数。原创 2023-02-22 19:22:17 · 395 阅读 · 0 评论 -
unix高级编程-fork之后父子进程共享文件
/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!我们放两个参数就可以了,第一个是文件指针(打开文件的路径),flags我们查看man手册,我们取O_RDWR读写属性。这里我看到的是centos的操作,但我用的是debian系的ubuntu,百度了一下发现debian的在这里。大家可以自行修改想要的编码,修改完重新执行一下用户文件,或者重启,或者重新登陆都是可以的。可以看到并发执行写入的顺序不可控,且是共享的。open打开文件参数。原创 2023-02-22 13:58:16 · 394 阅读 · 0 评论 -
unix高级编程-僵尸进程和孤儿进程
代表子进程死亡不给父进程发信号(ignore),也就是父进程创建子进程不给他“收尸”,那么系统会帮他“收尸”: 一个父进程利用fork创建子进程,如果子进程退出,而父进程没有利用wait 或者 waitpid 来获取子进程的状态信息,:一个父进程退出, 而它的一个或几个子进程仍然还在运行,那么这些子进程就会变成孤儿进程,我们还可以发送一个信号让程序帮我们回收产生的子进程。大家可以尝试改写我的代码,自己写一个孤儿进程。僵尸进程不为子进程“收尸”原创 2023-02-22 13:52:25 · 259 阅读 · 0 评论 -
unix编程-fork
进程因为创建或时间片轮转(抢断)而就绪,因为调度而运行,因为i/o操作过长而等待。这里可以看到stack并不共享,每个并发的进程都有自己的stack。操作系统fork大家可以看我前面的博客,这个章节以实践为主。linux创建0号进程用来调度其他进程。通常调度第一个1号进程(用户进程)linux内核态实现。原创 2023-02-22 13:50:59 · 71 阅读 · 0 评论 -
信号量(上)实验
我们现在有5个线程,但是只有两份资源可用;我们通过信号量去模拟这一种情况,将信号量的值初始化为2。可以看到每五个进程都同时占用了临界区的通道,也就是临界区同时运行了五个进程,这个是有问题的。同一时间段内只有两个能进入到fork里面,执行完成只有,另外两个才能进入。每个fork执行流一次可以跑两个分支,两分支同步。我们先来看一种情况,当没有信号量进行控制的时候。订票终端是解决冲突问题,所以信号量的值是1。第二个进程无限busy waiting。不进行V操作,造成死锁。原创 2023-02-21 13:44:04 · 536 阅读 · 0 评论 -
信号量(上)
先执行到p(原子操作)的车子(蓝色)会先进入critical section,而如果这时候红色车子进来,那么因为mutex=0了,所以此时会进入while循环(busy waiting),等待蓝车通过critical section,红车才会执行,然后蓝车释放,红车通过critical section,红车释放。这里如果road等于0,那么一个是会出现我们前面讲的死锁,这个死锁是任何进程都无法进入road。这里只是一个顺序执行产生的并发流程,其实还有其他的流程。除了二值信号量,其他的信号量都是一般信号量。原创 2023-02-21 13:38:30 · 289 阅读 · 0 评论 -
互斥锁实验
如果一个进程打开了一个锁,但是不去释放这个锁,那么会发生什么呢。这个代码上节我们知道如果进行进程并发执行,那么很可能值不唯一。一直再loop根本运行不下去,这就是死锁。可以看到因为并发的问题执行结果不唯一。我们把释放锁的代码给注释掉。可以看到没有互斥的问题了。原创 2023-02-21 13:35:22 · 210 阅读 · 0 评论 -
互斥锁原理
这里我自己对这个代码分析了一下:tom要执行需要满足alice没留下note,一但留下note,tom就无法喂食,而alice是一定会喂食的,所以这里需要alice这个设备性能比tom好。临界区必须有一个进程,因为如果临界区为空且满足互斥性那么其他进程都无法在临界区运行,临界区运行的程序也不能一直占用临界区,必须要让其他进程等待时间为有限的。解决浪费cpu周期的缺点,我们可以将这个等待进程进入等待队列里,但是我们要注意,万一自旋的时间比切换队列消耗的时间更久,那么这个操作反而浪费了资源。原创 2023-02-21 13:31:13 · 297 阅读 · 0 评论 -
进程间同步
我们可以看到造成这样的原因是因为T是局部变量,每个进程的stack都是独立的,所以才会得到两个程序将全局变量x都赋值了1,即便是线程并发,栈空间也是独立的,所以也可能会出现这样的问题。交互关系之间的关系是很复杂的,假如一个进程需要等待另外一个进程的调用才可以运行,就如下面这个例子。但是不论如何,只要是两个进程或线程并发执行,如果里面有需要交换数据,那么就会有这样问题。那么异步进程我们前面说了,特点就是随机,那么随机的进程就会产生。如果并发线程或进程T1先执行,T2在执行,那么就不会出现问题。原创 2023-02-21 13:23:19 · 317 阅读 · 1 评论 -
Linux线程调度实验
Real_time Schedulig(实时调度):总共有两种:一种是SCHED_FIFO(先来先服务),SCHED_RR(时间片轮转),实时调度的进程总是比正常调度的进程优先级要高,它的优先级数值priority_value∈[1,99],这里和前面我们学的系统优先级不同,1是低优先级,99是高优先级。一个是系统范围,一个是进程范围,如果我有多个线程,那么他们的竞争区间是在自己的进程内,还是整个系统的进程内。实时调度需要延迟非常低才可以实现,所以现在用户模式的进程基本都是一般都是正常调度的。原创 2023-02-21 13:18:09 · 636 阅读 · 0 评论 -
CPU调度
这样我们发现p1只需要等待12秒即可响应,第一种平均等待时间22毫秒,而第三种平均等待时间只要5毫秒,所以我们可以得到如果能优化一下,让开销小的先执行,这样用户感觉会好些,当然解决这个问题,我们还需要有个判优机制,我们需要知道那个进程消耗资源少,那个更多,这个我们后面讨论。如果优先级一直不变会产生一个叫做饥饿现象的现象,也就是说高优先级的进程会长期占据cpu,导致低优先级的进程一直处于"饥饿状态"。长程调度是进程数据在内存———硬盘之间的资源调度,短程是进程在cpu——内存之间的资源调度。原创 2023-02-21 13:09:12 · 211 阅读 · 0 评论 -
Pthreads实验
根据前面进程并发的特点,我们可以分析出,主线程不等待子线程调用执行且父线程执行调用资源很少,那么父进程就会在子进程还没执行时结束(return一个status结束执行流),这样子线程就变成一个孤儿线程了。孤儿线程不像孤儿进程,它时无法再父线程执行玩后执行的,因为主线程结束,代表此进程结束了,线程是无法依赖于一个没执行的进程的。但是我们也可以看到sys(系统执行此函数时间)比单线程短,这是因为我的虚拟机的cpu是多核的,所以线程切换时间并不长。无参数是arg设为NULL即可,线程的执行工作函数。原创 2023-02-20 22:27:53 · 326 阅读 · 0 评论 -
操作系统线程
虽然我们也有多个进程(执行流),在用户感觉上是多个进程并行,但是其实因为我们只有一个内核,所以一次只能运行一个线程,所以这里还是并发,但这里不止是进程的并发,也是线程的并发,上面那个一对多每个进程最少有一个线程可以和其他进程进行并发,这就是单核和多核的区别。多对一模型,用户线程在用户模式下一个进程有多个线程,这个进程对应一个内核线程,这个进程有多个线程,也就达成了多个用户线程对应一个内核线程。上一章我们做的实验可以看出,这里的执行流内存不一样,pid不一样,但子进程的内存数据是clone父进程的。原创 2023-02-20 22:17:20 · 322 阅读 · 0 评论 -
进程章节总结性实验
其实出现这个现象的原因是因为我们没有在父进程中加wait函数,那么父进程由于执行的太快,快到父进程唤醒子进程的过程还没开始,父进程就已经被执行完了,那么父进程已经进入终止状态,cpu使用权回到了systemd这个进程上,那么只能是systemd这个进程去调用子进程,所以现在子进程的父进程号就变成了systemd的进程号了。如果成功创建子进程,对于父子进程fork会返回不同的值,对于父进程它的返回值是子进程的pid号,而对于子进程他返回值是0,这里猜测这个0大概率是内核模式。原创 2023-02-19 23:08:37 · 412 阅读 · 0 评论 -
进程切换-
中断发生根据前面可以判断这里大概率不是调用i/o设备导致的中断,应该是父进程调用子进程产生的并发,如果是这样估计也是主动,但这里只是我的猜想。内终端多由故障终端:程序运行异常,硬件异常,系统调用是更高一级的调用,需要进入内核模式,也算是一个异常中断。进程切换需要保存上下文(context),保存操作系统运行该程序的一些基本信息,保护住此程序的内存区。猜测这里大概是虚内存,估计后面课程会有讲解,因为我们都知道硬件读取都是顺序的。运行状态队列是没有的,理论上来说单核cpu只有一个进程处于运行状态。原创 2023-02-19 22:47:21 · 798 阅读 · 0 评论 -
进程的概念
因为学习过计组之后我们知道单核只有一个pc寄存器,分时任务可以设置中断程序然后让pc数据存入对应堆栈空间,然后执行完相应程序再读取回来,通过cpu流水线进行优化,这样一套流程让我们感觉到多进程是在同时运行的。最后一个等待态是不具备运行条件,下面这个例子是,如果指定到2步输出语句需要调用系统write占用io,如果这个函数执行占用资源很大,那调用2步函数的进程需要进入等待状态让出cpu控制权,等待调用结束。原创 2023-02-19 22:29:51 · 338 阅读 · 0 评论 -
进程-操作系统结构
程序调用时,程序会把需要调用的系统调用好写入一个寄存器,内核从寄存器中读取这个编号,查索引表,确定调用system call函数。system call开放api,程序员只需要放入api需要的对应参数,得到api返回的对应值。程序产生的进程号是一个随机数,也就是一个动态分配的号码,但是此进程所产生的系统调用号是固定的。微内核操作系统:是一个机制和策略分离系统的典型模板如mac os的内核。Unix是要钱的,但是GUN的目的是在付费系统上开放软件代码。那么我们在切换到系统模式的时候还需要调用系统级别的函数。原创 2023-02-19 22:07:41 · 374 阅读 · 0 评论