
操作系统
一纸一清风
滋滋有味的学习 津津有味的生活
展开
-
操作系统——进程
操作系统 首先我先谈一下我关于操作系统的理解,操作系统本身就是一个比较大的进程,他对下负责管理计算机的软硬件以及为软件提供良好的运行环境,对上和用户进行交互。 用户通过shell命令操作系统调用接口,系统调用接口又连接着操作接口,操作接口下则是驱动软件,驱动软件负责调用系统的各种硬件。 所谓的操作系统,就是用户和内核之间的一层壳,因为用户直接使用内核可能会发生各种不可预料的事情,这才有了操作...原创 2019-03-31 18:15:03 · 589 阅读 · 1 评论 -
进程和线程的区别
进程和线程的区别 进程,是计算机中的程序关于某数据集合上的一次活动运行,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。他的执行需要系统分配资源创建实体之后,才能进行。 Linux中的线程不是真正的线程,Linux中的线程是轻量级进程 1).二者的相同点 在系统层面,二者具有的状态都非常相似,所以在多任务程序中,子进程(子线程)的调度一般与父进程(父线程)平等竞争。 2).实现...原创 2019-08-12 15:39:34 · 97 阅读 · 0 评论 -
信号
信号概念 信号就是用来通知打断当前操作,告诉他某件事情发生了,去做另一件事 信号的实质PCB表中的两个位图和指针数组 这两个位图是 blocked 阻塞位图 pending 未决位图 handler 信号递达指针 在这之前,我们需要了解一下什么叫信号的递达,信号的未决,信号的阻塞 信号的递达就是对信号进程处理 信号的未决就是指信号从产生到递达的过程就叫未决 信号的阻塞不是指信号等...原创 2019-08-16 10:23:27 · 134 阅读 · 0 评论 -
线程
Linux下的线程是用PCB模拟实现的,因此Linux下的线程又称为轻量级进程,同一个进程下的所有线程共享进程下的大部分资源 线程概念 在一个程序里的一个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程 线程在进程内部运行,本质是在进程地址空间内运行 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化 透过进程虚拟...原创 2019-08-16 15:17:41 · 126 阅读 · 0 评论 -
线程控制
我们首先要知道Linux下没有真正的线程,Linux下的线程其实是轻量级进程,所以系统也没有为我们提供创建线程的相关接口,但是有大佬帮我们封装了一套 thread 库,使用时直接include<pthread.h> ,在使用时也需要-lpthread 链接库 线程控制 1.创建线程 //功能:创建一个新的线程 //原型 int pthread_create(pthread_...原创 2019-08-16 19:44:59 · 121 阅读 · 0 评论 -
线程间的同步与互斥
进程线程中的互斥需要 临界资源:多线程共享的资源流就是临界资源 临界区:每个线程内部,访问临界资源的代码,就叫做临界区 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用 原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成 互斥锁mutex 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,...原创 2019-08-17 08:27:37 · 466 阅读 · 0 评论 -
死锁的产生与预防
死锁 在多线程中,为了保证线程安全,我们会使用互斥锁,在某些进程或者线程中,使用了某些资源,为了完成任务,需要请求某些进程或线程所拥有的资源,从而形成了永久性等待状态 死锁产生的四个必要条件 1.互斥条件:一个资源每次只能被一个执行流执行 2.请求与保持:一个资源想要获取资源时阻塞,不会释放已有资源 3.不可剥夺条件:一个执行流获取资源后,在未使用完前,不能强行剥夺 4.环路等待条件:...原创 2019-08-17 08:48:41 · 136 阅读 · 0 评论 -
生产者与消费者模型
我在在使用条件变量的时候,如果有很多线程等待在同一个条件变量上,那么当条件满足的时候,唤醒的可能不是我们需要的那个线程,所以我们应该让不同的角色等待在不同的条件变量上,区分唤醒 生产者与消费者模型 生产者与消费者模型不属于23中设计模型中的一种,它只是一种编程的思想 简明来说,所谓生产者与消费者模型其实就是两种角色,三种关系 在生产者与消费者中保证这三种关系的实现,才能保证数据的安全 ...原创 2019-08-17 10:50:31 · 184 阅读 · 0 评论 -
线程池及模拟实现
线程池 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量 线程池的应用场景 1.需要大量的线程来完成任务,且完成任务的事件比...原创 2019-08-17 14:39:45 · 222 阅读 · 0 评论 -
设计模式----单例模式
设计模式 大佬们提供的一些面对经典的常见场景,所给定的一些对应的解决方案 单例模式特点 比如说,某些类,就只能拥有一个对象 实现方式 懒汉模式 在需要用到这个对象时再实例化出对象 懒汉模式的核心思想就是“延时加载”,从而能够优化服务器的启动速度 实现 template <typename T> class Singleton { static T* inst; ...原创 2019-08-17 14:56:37 · 104 阅读 · 0 评论 -
详解IPC中的管道和共享内存
管道 分类:命名管道和匿名管道 命名管道:可以用于本机上的任意进程间通信 匿名管道:只适用于拥有亲缘关系的进程间通信 本质:是内核中开辟的一块缓冲区 特性: 读写特性:当一个进程读或者写时,其他进程不能读或者写 自带同步与互斥 半双工通信:数据只能向一段发送数据,若要双方通信,则要使用两个管道 提供字节流服务 生命周期随进程 匿名管道 原型 int pipe(int fd...原创 2019-08-15 17:20:14 · 323 阅读 · 0 评论 -
进程间通信
什么叫IPC 其实就是操作系统为用户提供的进程间通信的方式 操作系统为什么要给用户提供进程间通信呢? 这是因为进程之间的独立性,每个进程独享一份代码空间和内存地址 那么为什么要提供多种IPC呢 这是为了应对不同的场景 IPC的本质其实就是一块共享的内存区域 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源 通知事件:一个进程...原创 2019-08-15 15:27:21 · 133 阅读 · 0 评论 -
Linux下的重要目录
Linux下一些重要的目录 首先,我们要知道,Linux是一个开放的操作系统,磁盘上的文件和目录被组成一颗目录树,每个节点都是目录或文件,如果每个人都想要针对自己的习惯去配置文件放置的目录,就会造成很多的困扰,于是,这就有了Filesystem Hierarchy Standard(FHS)标准 这个标准并没有规定我们所有的文件应该放在哪里,这是规定了一些大致的方向,于是就有了一些Linux中...原创 2019-03-30 20:34:26 · 246 阅读 · 0 评论 -
Linux - PCB task_struct结构体
task_struct的结构描述 1. 进程状态(州) 进程执行时,它会根据具体情况改变状态。进程状态是调度和对换的依据.Linux中的进程主要有如下状态,如表4.1所示。 内核表示 含义 TASK_RUNNING 可运行 TASK_INTERRUPTIBLE 可中断...转载 2018-11-14 23:12:45 · 326 阅读 · 0 评论 -
操作系统的内存管理
在早期的计算机中,程序是直接运行在物理内存上的,也就是说,程序在运行时所访问的地址都是物理内存。当然,如果计算机同时只运行一个程序,那么只要程序要求内存空间不要超过物理内存的大小,就不会有问题。但事实上为了更有效地利用硬件资源,我们必须同时运行多个程序,正如多道程序、分时系统和多任务一样,当我们能同时运行多个程序时,CPU地利用率将会比较高,那么,如何将计算机上有限地物理内存分配给多个程...原创 2019-07-17 16:20:51 · 278 阅读 · 0 评论 -
深入分析父子线程、进程终止顺序不同产生的结果
一、线程 Linux线程创建函数为pthread_create(),默认规则是谁创建子线程,谁就要负责子线程的资源回收,当父线程退出后,子线程也随着退出。所以,一般情况下,父线程退出时都要确保子线程已经退出,所以会使用pthread_join()函数阻塞等待子线程的退出信号/标识。 pthread_detach(threadid)函数的功能是使线程ID为threadid的线程处于分离状态(可以为非...原创 2019-08-08 17:37:33 · 645 阅读 · 0 评论 -
CloudBackUp
项目介绍 该项目可以完成对一个指定目录下的文件进行监控,并将数据上传到云服务器上进行备份和下载功能。 1. 客户端对指定目录进行监控,对每个文件生成etag信息,鉴别是否需要备份 2. 客户端将需要备份的文件基于http协议的PUT请求上传到服务器端 3. 服务端对于PUT上传的文件进行备份到指定目录下 4.服务端对于热度较低的文件进行压缩存储,并在文件被请求时进行解压缩处理 5...原创 2019-08-08 18:24:40 · 460 阅读 · 0 评论 -
Linux下常用工具
先贴一个链接,可以快速一键将你的vim打造成功能强大的IDE ,全小白操作 https://gitee.com/HGtz2222/VimForCpp?tdsourcetag=s_pctim_aiomsg 在Linux操作系统中,我们使用yum来安装工具,这里我只说几个最常用的指令 yum install package1 安装指定的安装包package1 yum update pac...原创 2019-08-10 08:39:09 · 154 阅读 · 0 评论 -
一键将你的Vim打造成C++ IDE
前一段时间为了打造给我的vim增加功能,发现很多博客都写得很乱,完全不告诉这样做的原因,后来,我找到了一个项目,完全傻瓜式操作,脚本服务,一键OK,而且功能强大,所以特来推荐一下,下面附上链接 https://gitee.com/HGtz2222/VimForCpp?tdsourcetag=s_pctim_aiomsg ...转载 2019-08-10 15:55:01 · 2013 阅读 · 1 评论 -
fork()之后,发生了什么?
我们都知道,在Linux中调用fork()函数,会创建一个子进程,那么在创建这个子进程的过程中,发生了些什么事情? 首先,我们要知道,fork()函数其实是调用发起_fork()系统调用,控制权由用户态转为内核态, 内核会分配新的内存块和内核数据结构给子进程(也就是PCB task_struct结构体), 然后内核会将父进程的部分数据内容以二进制形式拷贝到子进程, 下来再将所谓的子进...原创 2019-08-14 20:58:11 · 1408 阅读 · 0 评论 -
wait()和waitpid()区别
我们知道,wait()和waitpid()都是进程等待的函数,那么为什么要进行进程等待呢? 进程等待的必要性 子进程退出时,父进程如果不管不顾,那么子进程就会变成僵尸进程,造成内存泄漏 如果进程变成僵尸进程,那么连kill -9都无法干掉进程,因为谁都无法杀死一个1已经退出的进程 这是因为子进程需要保存自己的进程状态,需要告诉父进程你交给我的任务完成的怎么样了,而这些信息就保存在PCB中,...原创 2019-08-15 12:24:28 · 305 阅读 · 0 评论 -
一键升级你的g++版本到7.3
使用 devtool 升级 g++ 到 7.3 版本 以下命令在 root 下使用 yum install centos-release-scl -y yum install devtoolset-7 -y 以下命令添加在 bashrc 中 source /opt/rh/devtoolset-7/enable 要是有人不知道bashrc文件是什么 在你的home目...原创 2019-08-28 17:23:22 · 370 阅读 · 0 评论