Linux
blank
HELLO WORLD!
KEEP CODING!
展开
-
线程安全的单例模式
单例模式:是非常典型常用的一种设计模式(大佬们针对典型场景设计的解决方案)单例模式的特点:某些类,只应该具有一个对象(实例),就称之为单例。例如一个男人只能有一个媳妇。在很多服务器开发场景中,经常需要让服务器加载很多的数据(上百G)到内存中,此时往往要用一个单例的类来管理这些数据。饿汉方式和懒汉方式吃完饭立刻洗碗,这就是饿汉方式。因为下一顿吃的时候可以立刻拿着碗就能吃饭;吃完饭,先把碗放下,然后下一顿饭用到这个碗了再洗碗,这就是懒汉方式饿汉方式的实现: 使用static就可以—将原创 2020-07-30 15:26:44 · 110 阅读 · 0 评论 -
线程池
在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在操作系统中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。优点:避免峰值压力下,资源耗尽的风险;节省线程创建 / 销毁带来的时间成本封装一个线程池: 一堆已经创建好的线程 + 线程安全的任务队列。为了让每一个线程针对不同的任务,有不同的处理方法,让线程灵活起来。向线程池抛入数据的时候,顺便将处理函数一起抛入,线程池中的线程使用函数处理数据即可,最好这个原创 2020-07-30 14:15:50 · 107 阅读 · 0 评论 -
基于信号量的生产者与消费者模型
信号量本质:计数器 + 等待队列 + 向外提供的使执行流阻塞 / 唤醒的功能接口对资源进行计数,统计当前的资源数量,通过自身的计数,就可以进行条件判断,是否能够进行操作,若不能获取资源,则阻塞当前执行流。在程序初始化阶段,根据实际资源数量初始化信号量计数器数值,在每次获取资源之前,先获取信号量(先去判断计数是否大于0,若大于0,则计数-1,直接返回,获取数据;否则阻塞当前执行流)其它执行流生产一个资源后,先判断计数器是否 <0 ,若小于0,则唤醒一个执行流,然后进行计数 +1接口介绍:se原创 2020-07-30 13:37:56 · 216 阅读 · 0 评论 -
生产者与消费者模型
应用场景:不断的生产数据并且进行处理的场景模型的特点:解耦合,生产者模块与消费者模块并不直接交互,都是仅操作线程安全的队列支持忙闲不均,队列中有多个节点可以起缓冲作用支持并发生产者与消费者模型的实现:一个场所,两种角色,三种关系生产者与生产者应该具备互斥关系消费者与消费者应该具备互斥关系生产者与消费者应该具备同步与互斥关系代码实现:#include <cstdio>#include <iostream>#include <queue>#in原创 2020-07-30 12:44:10 · 145 阅读 · 0 评论 -
如何实现线程安全?
线程安全:在多个执行流对同一个临界资源进行操作访问,不会造成数据二义那么如何实现线程安全?同步与互斥互斥通过保证同一时间只有一个执行流可以对临界资源进行访问(一个执行流访问期间,其它执行流不能访问),来保证数据访问的安全性。如何实现互斥:互斥锁互斥锁:本质上是一个 0/1计数器,0-不可访问 1-可以访问,计数器初值为1。每一个线程访问临界资源之前,先判断计数,当前临界资源的状态(是否有人正在访问,正在访问的线程将状态置为0)接口介绍:pthread_mutex_t //互斥锁变量类型原创 2020-07-30 00:46:59 · 403 阅读 · 0 评论 -
进程信号
信号是什么:信号就是一个软件中断,通知进程发生了某个事件,打段进程当前的操作,去处理这个事件。信号是多种多样的,并且一个信号对应一个事件,这样才能做到收到一个信号后,直到到底是一个什么事件,应该如何处理。(但是要保证必须识别到这个信号)信号种类:62种,1-31是非可靠信号;34-64是可靠信号。信号周期:产生,进程种的注册,进程种的注销,捕捉处理。信号的产生:硬件:ctrl + c , ctrl + | , ctrl + z软件:kill命令:kill -signum pidint k原创 2020-06-15 22:00:20 · 103 阅读 · 0 评论 -
进程间通信
进程间以为每一个进程都有一个虚拟地址空间,在保证了进程独立性的同时,却使得进程间无法直接通信,因此需要操作系统来提供进程间通信方式,并且因为通信场景不同,提供的方式也有多种。进程间通信的目的:数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时需通知父进程)进程控制:有些进程希望完全控制另一个进程的执行(如Debug)进程,此时控制进程希望能够拦截另一个进程的所有陷入和一场原创 2020-06-15 20:22:02 · 120 阅读 · 0 评论 -
网络基础——数据链路层
数据链路层:用于两个设备(同一种数据链路节点)之间进行传递以太网协议mac地址:是一个无符号6个字节的整数 uint8_t mac[6]源端mac / 目的端mac:标识从哪个设备传输到哪个设备——设备之间的识别类型:网络层协议类型——用于数据分用CRC:帧尾校验和ARP协议:地址解析协议,通过IP地址获取指定主机的mac地址——介于网络层与链路层之间的协议。发送端将arp请求...原创 2020-04-19 21:45:33 · 190 阅读 · 0 评论 -
网络基础——网络层
在复杂的网络环境中确定一个合适的路径协议头格式4位协议版本:IPV4 / IPV64位首部长度:记录IP报文长度,因为IP报头中也有40字节的选项数据,以4字节为单位8位TOS字段:3位优先权字段弃用;4位服务类型:最小延时,最大吞吐量,最高可靠性,最小成本;1位保留。16位头部长度:IP报文的长度(包含头部)—64k;IP报文中报头最小长度是20字节,因此IP报文中的数据不能超过6...原创 2020-04-19 17:08:49 · 450 阅读 · 0 评论 -
TCP协议详解
TCP全称为“传输控制协议(Transmission Control Protocol)”,人如其名,要对数据的传输进行一个详细的控制。TCP协议段格式16位源端口/16位目的端口:负责实现应用程序之间的数据传输32位序号/32位确认序号:用于实现tcp在传输层的包序管理——tcp有序交付数据4位头部长度:以4个字节为单位;4位保存的最大数字是15;因此tcp报头最大长度是1...原创 2020-04-16 17:17:17 · 429 阅读 · 0 评论 -
UDP协议
UDP协议端格式16位源端口与16位目的端口:负责应用程序之间的数据传输,标识数据从哪来到哪去16位校验和:校验数据一致性(发送的数据与接收的数据是否一致)——二进制反码求和发送数据的时候,将校验和设置为0,然后从报头第0个字节开始,每个字节进行取反相加,超出16位的部分(求和进位部分)取出来再次与低16位进行相加,最终得到的数据填充到校验和中;接收方同样对接收到的数据进行二进制反码求...原创 2020-04-16 13:12:35 · 163 阅读 · 0 评论 -
HTTP协议
虽然我们说,应用层协议是我们程序员自己定的。但实际上,已经有大佬们定义了一些现成,又非常好用的应用层协议,供我们直接参考使用,HTTP(超文本传输协议)就是其中之一。URL平时我们俗称的“网址”其实就是说的是 URL网址:统一资源定位符。在网络中唯一定位一个服务器上的某个资源例如:http://username:password@baike.baidu.com/item/HTML/97...原创 2020-03-20 17:04:22 · 212 阅读 · 0 评论 -
进程控制
进程创建fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。#include <unistd.h>pid_t fork();//返回值:子进程中返回0,父进程返回子进程id,出错返回-1进程调用fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加...原创 2020-03-19 13:44:12 · 84 阅读 · 0 评论 -
socket编程——tcp通信
tcp通信流程:面向连接,可靠传输,面向字节流客户端(client):创建套接字绑定地址信息(不推荐主动)向服务端发出连接请求收 / 发数据关闭套接字服务端(server):创建套接字——在内核创建socket结构体与网卡建立联系为套接字绑定地址信息——告诉操作系统哪些数据交给我处理—放到我的接收缓冲区开始监听——告诉操作系统可以开始接收哭护短的连接请求—客户端与服务端进...原创 2020-03-17 15:00:52 · 367 阅读 · 0 评论 -
网络编程套接字
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。原创 2020-03-12 14:14:49 · 280 阅读 · 0 评论 -
网络基础_1
1、计算机网络发展独立模式:计算机之间相互独立网络互联:多台计算机连在一起局域LAN:计算机数量更多了,通过交换机和路由器连接在一起广域网WAN:将远隔千里的计算机都连在一起所谓“局域网”和“广域网”只是一个相对的概念交换机:实现主机之间的数据交换路由器:不但实现数据交换,并且实现数据的路径选择网络的划分:局域网,城域网,广域网组网方式:以太网/令牌环网1、在复杂的网络通信...原创 2020-03-09 12:52:44 · 90 阅读 · 0 评论 -
多线程
线程控制线程创建/线程终止/线程等待/线程分离线程控制的接口都是库函数(操作系统并没有向用户提供创建一个轻量级进程的接口,因此大佬们才封装的一套线程控制接口)1、线程创建:int pthread_create(pthread_t *tid,pthread_attr_t *attr,void*(*thread_routine)(void* arg),void *arg)tid:用于获取线...原创 2019-12-20 18:36:59 · 88 阅读 · 0 评论 -
多线程概念
一、线程概念在linux下使用pcb描述实现了程序调度,并且这些pcb共用同一个虚拟地址空间,相当于传统的pcb更加轻量化一点,因此也把linux下的pcb称之为轻量级进程。1、线程的优点:创建一个新线程的代价要比创建一个新进程小得多与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多能充分利用多处理器的可并行数量在等待慢速I/O操作结束的...原创 2019-12-17 16:35:09 · 81 阅读 · 0 评论 -
进程概念
进程概念:冯诺依曼体系结构 / 操作系统基本认识 / 进程概念 / 进程状态 / 环境变量 / 程序地址空间一、冯诺依曼体系结构现代计算机硬件体系结构我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。五大硬件单元:输入设备输出设备存储器运算器控制器所有设备都是围绕存储器工作的——硬件结构决定了软件行为二、操作系统概念任何计算机系统都包...原创 2019-12-17 16:30:41 · 115 阅读 · 0 评论 -
Linux基本命令_2
mv1、移动文件夹或者文件mv [filename] [path] : 将filename移动到path下mv [folder] [path] :将folder移动到path下2、重命名mv [src_filename] [dest_filename]mv [src_folder] [dest_folder]cp1、可以拷贝文件cp [filename][path]2、拷贝文件...原创 2019-10-31 17:08:35 · 74 阅读 · 0 评论 -
Linux基本指令__1
ifconfig作用:查看ip,查看linux系统中的网卡信息ls指令语法:ls[选项][目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:相对路径:以.或者…开始计算当前目录到目标目录的路径绝对路径:从根目录出发到目标目录的路径ls-a :列出目录下的所有文件,包括以.开头的隐藏文件ls-l :查看文件的详细信...原创 2019-10-23 18:32:52 · 107 阅读 · 0 评论