操作系统
以掌握操作系统重点要点为目的,逐步学习。
code配上格子衫
终身学习
展开
-
乐观锁悲观锁CAS锁自旋锁你了解吗?
文章目录一,概念,使用场景1. 乐观锁2. 悲观锁3. 适用场景二,实现方式1. 版本号机制2. CAS锁3. 乐观锁的缺点1)ABA问题2)循环时间长开销大3)只能保证一个共享变量的原子操作一,概念,使用场景1. 乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提原创 2020-10-19 21:04:24 · 546 阅读 · 0 评论 -
如何避免死锁(死锁检测算法) —— 银行家算法
一,死锁概念死锁指的是两个或两个以上的进程在对临界资源竞争或者通信过程中, 因为某些处理不当,而造成各个进程彼此等待,无法继续向下推进,此使系统处于死锁状态, 这些互相等待的进程成为死锁进程。二,死锁产生必要条件1. 互斥条件指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进 程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。2. 请求和保持条件指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求原创 2020-10-19 20:07:05 · 1644 阅读 · 0 评论 -
带你搞定多线程(下) —— 彻底理解线程池
线程池线程池概念线程池字面意思就是一个池子里面有很多线程,在Linux我们将线程装在线程池中,等到有任务需要处理就可以从池子中取出线程进行任务处理。线程池的应用场景:有大量的数据请求,需要多执行流并行/并发进行处理。线程池的优点:处理任务时从线程池中拿出线程,避免了频繁创造与销毁线程造成的资源成本的浪费。线程池的限制:一般线程池的线程的数量都是有限制的,必须综合考虑系统资源。自主编写线程池编写思路:线程池构成:多个线程+任务缓冲队列将任务传入线程池,并且传入任务的处理方法,即一个函数原创 2020-07-26 14:53:09 · 335 阅读 · 0 评论 -
带你搞定多线程(中) ——通过互斥锁,条件变量,信号量实现线程安全
线程安全概念线程安全的概念就是多个执行流对临界资源进行争抢访问但是不会出现数据二义性。线程安全的实现主要是通过同步与互斥。同步:通过条件判断保证对临界资源访问的合理性互斥:通过同一时间对临界资源访问的唯一性实现对临界资源访问的安全性我们通过互斥锁,条件变量,信号量来实现同步与互斥,下面对其逐一介绍。互斥锁条件变量信号量...原创 2020-07-25 22:47:19 · 577 阅读 · 0 评论 -
带你搞定多线程(上) —— 线程概念与线程控制
线程概念理解线程当操作系统开始运行一个进程的时候,也就意味着操作系统会创建一个pcb对我们的进程进行描述,并且会为该进程创建自己的虚拟地址空间。如下图:最右边是我们需要执行的任务,我们可以选择串行处理,就是处理完一个再去处理第二个。但是学习了线程之后我们的进程就可以同时处理下面这三个任务。Linux下没有其实没有线程的具体说法,Linux下的线程是通过轻量化进程实现的,所谓轻量化进程就是一个进程中可以存在多个pcb,这些pcb共用一个虚拟地址空间 每一个线程都是进程中的一个执行流,因此多个执行流原创 2020-07-24 22:39:14 · 204 阅读 · 0 评论 -
Linux进程信号详解 -- 图文并茂!!!
信号概念信号其实就是一个软件中断,操作系统通过信号告诉进程发生了某个事件,从而打断进程当前的动作,去处理这个事件。linux下信号的产生有两种方式:硬件:ctrl+c/z/|软件:kill/raise(int signum)/abort()/alarm(int seconds)…Linux下命令的分类其中1-31是非可靠信号(普通信号) 34-64信号是可靠信号(实时信号)。62种(kill -l)1-31号从unix借鉴而来,有具体对应的系统事件, 34-64后期扩充。没有32 33号原创 2020-07-22 18:19:31 · 375 阅读 · 0 评论 -
深入理解Linux进程间通信IPC -- 管道,共享内存,消息队列,信号量
文章目录进程间通信管道匿名管道命名管道共享内存消息队列信号量进程间通信每个进程都有自己独立的虚拟地址内存空间,因此不同的进程具有独立性,一般情况下,是不会互相影响的。但是不同进程经常需要进行数据传输或者数据共享等一些操作。于是便引出了进程间通信IPC这个概念。进程间通信的作用和目的:数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:一个进程需要向另一个原创 2020-07-21 12:46:07 · 670 阅读 · 0 评论 -
静态库动态库的打包和使用
以Linux平台为基准进行分析基本概念:首先我们知道,在windows平台和linux平台下都大量存在着库。库中存着的就是我们需要使用的代码。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。通俗的说就是把这些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用。在使用函数时,只需要包对应的头文件即可。按照库的使用方式又可分为动态库和静态库,在不同平台下对应后缀也有所不同。WINDOWS下:.原创 2020-07-20 11:29:49 · 739 阅读 · 0 评论 -
理解文件系统
以Liunx下的ext2文件系统为例文件系统概念文件系统说白了就是磁盘上进行文件管理的系统。想要理解文件系统我们就要对其构成进行分析。磁盘分为交换分区和正常存储文件的区域。交换分区是当内存不够用时,将内存中的某个进程转移到硬盘上存储的时候使用的。而剩下的就是filesystem分区了。文件系统分区中分为data,inode,data_bitmap,inode_bitmap,以及超级块这五大部分。data:存储文件的具体数据。分块存储,一个块4096字节。inod: 存储文件的描述信息。da原创 2020-07-19 23:37:25 · 172 阅读 · 0 评论 -
带你理解文件描述符与文件流指针
文件描述符文件描述符简单来说就是一个操作文件的句柄,一个非负整数。具体分析当我们打开一个文件的时候,这个文件就会被加载在内存上,linux总是会对文件进行描述组织的进行管理,因此这个文件的一系列相关信息就会被描述起来,进行描述的是一个叫做struct file的结构体。我们知道,每个进程都是由一个pcb进行描述的,而在这个pcb中有一个叫做 struct files struct 的结构体,这个结构体中存储了每个已经打开文件的描述信息,也就是struct file结构体,这些结构体是由一个数组进行管原创 2020-07-19 22:45:41 · 337 阅读 · 0 评论 -
基础IO -- Linux与标准库下的文件IO操作
前言在进行Linux的学习过程中,我们会接触到一系列与IO操作相关的函数。一般而言,我们将其分为三类,分别是:文件IO、标准IO和库函数。其中,文件IO顾名思义便是对文件进行操作的函数,再加上在Linux系统中,一切皆文件,所以当我们在之后的时间内进行更加深入的学习之后,文件IO的操作函数将会使用的越来越多。所以,今天,我们首先从将从常见的文件IO函数开始进行学习。标准库的文件IO接口代码举例首先来看下面一段代码,我们用fopen打开文件然后进行写操作,完毕之后fclose关闭文件。文件IO操作原创 2020-07-18 22:42:41 · 157 阅读 · 0 评论 -
进程控制 -- 程序替换到底做了些什么
在使用fork创建了子进程之后,我们经常需要对子进程进行程序替换,去让子进程干别的事情。替换之后,进程的用户空间代码和数据完全被新程序替换。值得注意的是程序替换并不是创建新的进程因此被替换的进程id是不变的。exec系列函数#include <unistd.h>`int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(原创 2020-05-26 21:13:03 · 210 阅读 · 0 评论 -
进程控制 -- 进程的创建,终止与等待
在前面的学习中我们已经了解了进程相关的基本概念,接下来我们来谈谈进程创建与进程等待。进程创建fork函数在linux中fork函数的作用是从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。#include <unistd.h>pid_t fork(void);返回值:自进程中返回0,父进程返回子进程id,出错返回-1当操作系统调用fork函数时候,操作系统会进行什么操作呢?分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系原创 2020-05-26 20:43:58 · 286 阅读 · 0 评论 -
进程地址空间 -- 分页式,分段式,段页式内存管理与缺页中断
平台32位操作系统进程地址空间计算机物理内存的大小是固定的,就是计算机主板内存槽上的实际物理内存,cpu可以直接进行寻址,物理内存的容量是固定的,但是寻址的空间取决于cpu地址线的数量。在32位系统上,线性地址空间可达4G(2^32);这4G一般是按照3:1的比例进行分配,用户进程享有3G的空间,而内核独自享有剩下的1G内存但是我们所看到的这个空间并不是真是存在的而是计算机操作系统为我们描述出来的一个虚拟的空间。有兴趣验证的朋友可以通过以下代码进行验证#include <stdio.h&原创 2020-05-26 19:37:42 · 1389 阅读 · 1 评论 -
环境变量到底是什么
环境变量基本概念Linux变量分为本地变量和环境变量 环境变量具有继承性环境变量(ev)指的是在操作系统中用来指定操作系统运行环境的一些参数举个例子Linux的 ls 命令默认从哪些路径进行文件的查找编译链接的时候,我们不知道动态库静态库的位置还是可以链接成功常见环境变量PATH : 指定命令的搜索路径HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)SHELL : 当前Shell,它的值通常是/bin/bash相关命令查看时需要加$ 因为环境变量相当于原创 2020-05-25 11:29:59 · 4383 阅读 · 1 评论 -
进程的基础知识 -- 进程概念 ,PCB,进程状态(僵尸进程孤儿进程),进程优先级
进程基本概念宏观:执行中的一个程序,一段指令的集合微观:分配系统资源的一个基本单位PCB - 进程控制块操作系统中一个进程的各种信息都被一个PCB(进程控制块)所描述起来,我们可以将其理解为进程属性的集合。在Linux下的pcb是一个 task _struct 的结构体task _struct是Linux内核的一种数据结构,被装载到RAM里面task _struct内部信息标示符: 描述本进程的唯一标示符,用来区别其他进程。状态: 任务状态,退出代码,退出信号等。优先级: 相对于其他进程原创 2020-05-25 10:54:08 · 585 阅读 · 0 评论 -
冯诺依曼体系与操作系统简介
冯诺依曼体系结构我们目前使用的计算机主要是基于冯诺依曼体系结构设计的,与之对应的哈佛体系结构 。下面是典型的冯诺依曼体系结构标题冯诺依曼体系结构的五大部件存储器 用来存放数据和程序运算器 主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中控制器 主要用来控制和指挥程序和数据的输入运行,以及处理运算结果输入设备 用来将人们熟悉的信息形式转换为机器能够识别的信息形式,常见的有键盘,鼠标等输出设备 可以将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等冯诺依曼体系结构的主原创 2020-05-25 09:24:18 · 1619 阅读 · 0 评论