![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LINUX系统
文章平均质量分 81
不会code的菜鸟
这个作者很懒,什么都没留下…
展开
-
五种IO模型:同步阻塞I/O、同步非阻塞I/O、同步I/O复用模型、同步信号驱动I/O、异步I/O模型
阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行,全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。同步:执行一个操作之后,进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是否完成,等待结果,然后才继续执行后续的操作。原创 2023-03-18 22:01:10 · 887 阅读 · 1 评论 -
操作系统——存储器管理习题和笔记
摘自:计算机操作系统第四版什么是对换技术?对换,指的是把内存中暂时不能运行的进程或者暂时不用的数据和程序换出到外存上,以便腾出足够的内存空间,再把已具有运行条件的进程或进程所需要的程序和数据换入内存。为什么要引入对换?对换可分为哪几种类型?一方面,在内存中的某些进程由于事件尚未发生而被阻塞运行,但它却占用大量的内存空间,甚至有时出现内存中的所有进程都被阻塞,而无可运行之进程。迫使CPU停下来等待的情况。另一方面,又有着许多作业,因为内存的空间不足,一直驻留在外存上,而不能进入内存运行,这显然是对系原创 2021-02-16 00:58:47 · 1039 阅读 · 0 评论 -
进程同步与互斥——相关问题汇总(源码+伪代码)
问题描述:某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一个人通过。参观者的活动描述如下:cobegin参观者进程i:{ //进门 //参观 //出门}coend请添加必要的信号量和P、V(或wait()、signal())操作,以实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。问题分析://错误的解法,该题中提到了只有一个出入口,就是只有一个门,可以是出,也可以入,每次只能一个人过semaphore out = 1;semaph原创 2021-02-15 18:25:01 · 8018 阅读 · 1 评论 -
进程同步与互斥——吸烟者问题源码实现(cigarette smoker’s problem)
问题描述:假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但要卷起并抽掉一支烟, 抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草,第二个拥有纸,第三个拥有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者一个信号告诉已完成,此时供应者就会将另外两种材料放到桌上,如此重复(让三个抽烟者轮流地抽烟)。问题分析:1)关系分析。供应者与三个抽烟者分别是同步关系。由于供应者无法同时满足两个或以上原创 2021-02-13 17:21:11 · 2109 阅读 · 0 评论 -
进程同步与互斥——哲学家就餐问题源码实现(dining philosopher’s problem)
哲学家就餐问题哲学家就餐问题(dining philosopher’s problem)是一个著名的并发问题,它由Dijkstra提出来并解决。这个问题之所以出名,是因为它很有趣,引人入胜,但其实用性却不强。可是,它的名气让我们在这里必须讲。实际上,你可能会在面试中遇到这一问题,假如老师没有提过,导致你们没有通过面试,你们会责怪操作系统老师的。因此,我们这里会讨论这一问题。假如你们因为这个问题得到工作,可以向操作系统老师发感谢信,或者发一些股票期权。这个问题的基本情况是:假定有5位“哲学家”围着一个原创 2021-02-13 16:19:33 · 2719 阅读 · 0 评论 -
进程同步与互斥——读者/写者问题源码实现(reader-writer lock)
摘自:操作系统导论读者——写者锁另一个经典问题源于对更加灵活的锁定原语的渴望,它承认不同的数据结构访问可能需要不同类型的锁。例如,一个并发链表有很多插入和查找操作。插入操作会修改链表的状态(因此传统的临界区有用),而查找操作只是读取该结构,只要没有进行插入操作,我们可以并发的执行多个查找操作。读者—写者锁(reader-writer lock)就是用来完成这种操的。typedef struct _rwlock_t { sem_t lock; // binary semaph原创 2021-02-13 15:41:01 · 1914 阅读 · 0 评论 -
进程同步与互斥——生产者/消费者(有界缓冲区)问题源码实现
摘自:操作系统导论第一次尝试第一次尝试解决该问题时,我们用两个信号量empty和full分别表示缓存区空或者满。put()和get()函数,下面是我们尝试解决生产者/消费者问题的代码。int sem_wait(sem_t* s) //请求一个单位的资源{ decrement the value of semaphore s by one wait if value of semaphore s is negative}int sem_post(sem_t* s) //释放一个单位原创 2021-02-13 15:05:30 · 3809 阅读 · 1 评论 -
进程同步与互斥——信号量(实现锁、条件变量)
摘自:操作系统导论我们现在知道,需要锁和条件变量来解决各种相关的、有趣的并发问题。多年前,首先认识到这一点的人之中,有一个就是Edsger Dijkstra。他出名是因为图论中著名的“最短路径”算法,因为早期关于结构化编程的论战“Goto语句是有害的”,还因为他引入了名为信号量的同步原语,正是这里我们要学习的。事实上,Dijkstra及其同事发明了信号量,作为与同步有关的所有工作的唯一原语。你会看到,可以使用信号量作为锁和条件变量。信号量的定义信号量是有一个整数值的对象,可以用两个函数来操作它。在PO原创 2021-02-13 15:01:06 · 2277 阅读 · 0 评论 -
进程同步与互斥——理发师问题源码实现(sleeping barber problem)
理发师问题描述:(1)理发店里有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子(2)如果没有顾客,理发师便在理发椅上睡觉(3)一个顾客到来时,它必须叫醒理发师(4)如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开问题分析:1、对于理发师问题而言,是生产者-消费者(有界缓冲区)模型的一种。其中理发师和顾客之间涉及到进程之间的同步问题,理发师是生产者,顾客是消费者,生产者生产的速度(理发师理发的速度),和消费者消费的速度(顾客来到理发店的时间),这两者肯定是不同的原创 2021-02-13 12:27:42 · 10563 阅读 · 12 评论 -
设置线程锁属性,用mutex实现两个进程对同一数据进行处理
Q1:通过设置线程锁属性,用mutex实现两个进程各加2千万,最终实现4千万。#ifndef __HEAD_H__#define __HEAD_H__#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#include <sys/types.h>#include <diren原创 2021-02-07 23:31:36 · 294 阅读 · 0 评论 -
Linux 内存映射mmap原理分析
一、内存映射简介内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。以下是一个把普遍文件映射到用户空间的内存区域的示意图。二、基本函数mmap函数是unix/linux下的...转载 2020-04-02 00:43:30 · 354 阅读 · 0 评论 -
Linux C 时间轮:对基于排序链表的定时器进行改进
摘自:Linux 高性能服务器编程基于排序链表的定时器存在一个问题:添加定时器的效率偏低。而时间轮可以解决这个问题上图所示的时间轮内,(实线)指针指向轮子上的一个槽(slot)。它以恒定的速度顺时针转动,每转动一下就指向下一个槽(虚线指针指向的槽),每次转动称为一个滴答(tick)。一个滴答的时间称为时间轮的槽间隔si (slot interval),它实际上就是心搏时间。该事件轮共有N个槽...原创 2020-04-01 23:44:08 · 281 阅读 · 0 评论 -
Liunx C 线程池模型:实现多线程并发传输文件服务 2.0
源代码如下:head.h#ifndef __HEAD_H__#define __HEAD_H__#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#include <sys/...原创 2020-04-01 23:24:54 · 538 阅读 · 0 评论 -
Linux C语言实现对MySQL数据库中表的内容进行增删查改操作
query.c#include <mysql/mysql.h>#include <stdio.h>#include <string.h>int main(int argc,char* argv[]){ if(argc!=2) { printf("error args\n"); return -1; ...原创 2020-04-01 23:13:03 · 688 阅读 · 0 评论 -
Liunx C 线程部分的习题:主线程,子线程,清理函数,加锁解锁等问题
Q1: 创建一个子线程,传入数值1,在子线程中能够获取并打印,子线程退出,返回数值2,主线程通过pthread_join获取等待子线程结束并获取子线程的退出值并打印。#include <func.h>void* threadFunc(void* p){ printf("I am child thread %d\n",*(int*)p); pthread_exit((v...原创 2020-03-30 22:45:51 · 246 阅读 · 0 评论 -
Liunx C 线程池模型:实现多线程并发传输文件服务 1.0
代码如下,有时间再补代码的设计说明:服务器端:head.h#ifndef _HEAD_H_#define _HEAD_H_#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#in...原创 2020-03-31 09:57:01 · 276 阅读 · 0 评论 -
Linux 定时器:采用基于升序双向链表的定时器处理非活动连接
lst_timer.h#ifndef LST_TIMER#define LST_TIMER//#pragma once#include <func.h>#define BUFFER_SIZE 64class util_timer; /*向前声明*///用户数据结构、客户端socket地址、socket文件描述符、读缓存器和定时器struct client_data...原创 2020-03-29 23:34:21 · 335 阅读 · 0 评论 -
Linux 信号再探:统一事件源,信号的处理机制,异步—同步
信号是一种异步事件,信号处理函数和程序的主循环是两条不同的执行路线。很显然,信号处理函数需要尽可能快地执行完毕,以确保该信号不会被屏蔽(为了避免一些竞态条件,信号在处理期间,系统不会再次触发它)太久。一种典型地解决方案是:把信号地主要处理逻辑放到程序的主循环中,当信号处理函数被触发时,它只是简单地通知主循环程序接收到信号,并把信号传递给主循环,主循环再根据接收到的信号值执行目标信号对应的逻辑代码...原创 2020-03-29 16:13:59 · 288 阅读 · 0 评论 -
浅谈可重入函数与不可重入函数
转载链接:https://blog.csdn.net/tennysonsky/article/details/45127125在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。相反,肯定有一个安全的函数,这个安全的函数又叫...转载 2020-03-29 11:17:20 · 113 阅读 · 0 评论 -
Liunx C 进程池模型:实现多进程并发传输文件服务 1.0
基本思路如下图所示:服务器端代码process_pool.h头文件#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#include <sys/types.h>#in...原创 2020-03-28 00:30:05 · 361 阅读 · 0 评论 -
Linux C语言 线程池模型:线程池的创建、销毁、扩容、减容,模拟线程处理任务过程,加锁、解锁、回调函数
线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 例如,线程数一般取cpu数量+2比较合...转载 2020-03-26 23:25:54 · 660 阅读 · 0 评论 -
Linux 基于文件描述符的文件操作 open,close,read,write,lseek,stat,fstat,ftruncate
打开、创建和关闭文件#include <sys/types.h> //头文件 #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); //文件名 打开方式 int open(const char *pathname, int fla...原创 2020-03-15 18:30:03 · 660 阅读 · 0 评论 -
Linux IPC 计时器与信号:发送信号,睡眠函数,真实计时器,虚拟计时器,实用计时器
Linux IPC 信号用程序发送信号kill 信号发送函数睡眠函数模拟睡眠3秒时钟处理函数函数getitimer()函数setitimer()函数time()函数gmtime()采用实用计时器统计1秒中机器浮点乘法运算的次数采用真实计时器统计1秒中机器浮点乘法运算的次数用程序发送信号kill 信号发送函数函数原型:#include <sys/types.h>#include...原创 2020-03-15 18:04:12 · 306 阅读 · 0 评论 -
Linux IPC 管道:标准流管道,无名管道(PIPE),命名管道(FIFO)
Linux IPC 管道标准流管道函数popen()函数pclose()popen_ls.cpopen_read_print.cprint.cpopen_write_add.cadd.c无名管道PIPE管道通讯原理无名管道的特点函数 pipe()SIGPIPE信号pipe_sigpipe.cpipe_father_write_son_read.c命名管道FIFO创建FIFO文件 mkfifocre...原创 2020-03-15 12:43:03 · 879 阅读 · 0 评论 -
Linux IPC 信号量:PV原语,PV操作,函数semget,函数semop、函数semctl、生产者和消费者模型
Linux IPC 信号量什么是信号量信号量的分类原语信号量PV操作的原语描述P原语(申请资源)操作V原语(释放资源)操作PV原语的执行顺序PV原语如何实现互斥访问System V IPC:信号量函数 semget()函数semop()函数semctl()生产者和消费者模型什么是信号量信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。信号量是进程/线程同步的一种方式。有...原创 2020-03-15 00:14:48 · 1491 阅读 · 0 评论 -
Linux IPC 消息队列 创建访问 msgget,发送信息 msgsnd,接受信息 msgrcv,删除 msgctl
System V IPC 机制:消息队列消息队列函数 msgget()msgget.c函数msgsnd()和函数msgrcv()msgget_msgsnd.cmsgget_msgrcv.cmsgget_msgrcv_nowait.c函数msgctl()msgget_msgctl.c消息队列消息队列与 FIFO 很相似,都是一个队列结构,都可以有多个进程往队列里面写信息,多个进程从队列中读取信息...原创 2020-03-14 21:24:27 · 915 阅读 · 0 评论 -
Linux IPC 共享内存 ,System V 共享内存机制: shmget,shmat,shmdt,shmctl
System V 共享内存机制原理及实现:system V IPC 机制下的共享内存本质是一段特殊的内存区域,进程间需要共享的数据被放在该共享内存区域中, 所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。这样一个使用共享内存的进程可以将信息写入该空间, 而另一个使用共享内存的进程又可以通过简单的内存读操作获取刚才写入的信息, 使得两个不同进程之间进行了一次信息交换, ...原创 2020-03-14 19:49:06 · 1067 阅读 · 1 评论 -
Linux IPC 信号 kill,signal,sigaction,sigprocmask,sigpending信号处理机制
LINUX IPC 信号什么是信号signal 信号处理机制signal.csignal_sleep_recover.csignal_read_block.csignal_two_kind.c什么是信号信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件)。信号是硬件中断的软件模拟(软中断)。每个信号用一个整型常量宏表示,以 SIG 开头,比如 SIGCHLD、SIGINT 等,它...原创 2020-03-14 01:33:43 · 554 阅读 · 0 评论 -
linux 文件及目录操作 chmod,getcwd,chdir,mkdir,rmdir,opendir,readdir,seekdir,telldir、closedir、stat、fstat
改变目录或文件的访问权限:#include <sys/stat.h> int chmod(const char* path, mode_t mode); //path 参数指定的文件被修改为具有 mode 参数给出的访问权限获取、改变当前目录:#include <unistd.h> //头文件 char *getcwd(char *buf, size_t...原创 2020-03-08 23:28:51 · 718 阅读 · 0 评论 -
添加SSH公钥来实现免密码登录
首先需要生成公钥其中id_rsa为私钥,id_rsa.pub为公钥打开路径cd ~/.ssh/执行命令生成公钥ssh-keygen //一直按Enter键就Ok打开公钥cat id_rsa.pub复制内容,然后将其粘贴到gitee网页个人设置中的SSH公钥设置,添加即可如果需要在比如其它服务器实现无密码登录则需要在其他服务器~/.ssh/路径下的authorized_k...原创 2020-03-02 00:51:17 · 479 阅读 · 0 评论 -
linux中文件操作的常用命令总结
目录及文件操作:1、查看文件或目录ls [选项] [目录或文件]常用选项:-a 显示指定目录下所有子目录与文件-l 列出指定目录下所有目录及文件的详细信息使用 ls –l 命令显示的信息中 ,开头是由 10 个字母构成的字符串,其中第一个字符表示文件类型,它可以是下列类型之一:- :普通文件 d : 目录 l :符号链接 b :块设备文件 c :字符设备文件 ...原创 2020-03-02 00:08:37 · 360 阅读 · 0 评论 -
vim编辑器的常用命令
vim的常用状态:命令状态和编辑状态在命令状态下,所键入的字符系统均作命令来处理在编辑状态下,进行编辑文字代码当刚进入vim时,会先进入命令状态。在命令状态下,按 i 或者a 可以进入编辑状态,在编辑状态,按ESC键进入命令状态。在命令状态下://新增a 从光标后面开始添加文本A 从光标所在行的末尾开始添加文本//插入i 从光标前面开始插入文本I 从光标所在行的开始...原创 2020-03-01 21:33:53 · 527 阅读 · 0 评论 -
gdb调试工具的基本命令
gdb可以用来调试C和C++程序gdb常用命令gcc -Wall -g filename.c -o filename //编译时需要加-g参数gdb filename //进入调试l(list) //显示代码b(break) //设置断点bn //在第n行设置断点r(run) //运行程序n(next) //下一步,但不进入函数...原创 2020-03-01 19:55:51 · 278 阅读 · 0 评论 -
实现简单的Makefile工程管理器
Makefile工程管理器能根据文件的时间发现更新过的文件而减少编译的工作量,避免仅仅修改数个文件而将工程中的所有文件重新编译的情况。Makefile格式target:dependency_files //目标项:依赖项 command //tab键开头,command为编译命令例如:main.exe : main.o func.o gcc -o mai...原创 2020-03-01 17:37:05 · 239 阅读 · 0 评论 -
实现简单函数的动态库和静态库的建立
gcc的库选项-static 进行静态编译,即链接静态库,禁止使用动态库-shared 进行动态编译,尽可能地链接动态库,没有动态库时才会链接同名地静态库-lname 链接名称为libname.a(静态库)或者libname.so(动态库)的库文件。若两个库都存在,则根据编译方式进行链接-fPIC 生成使用相对地址的位置无关的目标代码(Position Independent Cod...原创 2020-03-01 15:56:05 · 324 阅读 · 0 评论 -
gcc编译工具的基本操作命令
一个编译过程包括下面几个阶段:(1)预处理:预处理器将对源文件中的宏进行展开。(2)编译:gcc将c文件编译成 汇编文件。(3)汇编:as将汇编文件编译成机器码。(4)链接:将目标文件和外部符号进行连接,得到一个可执行二进制文件。gcc所支持的文件后缀名test.c 表示c原始程序test.i 表示经过预处理后的程序test.s 经过编译后的汇编语言程序test.o 通过...原创 2020-03-01 13:24:22 · 371 阅读 · 0 评论 -
采用git修改某个远程仓库的文件并上传的操作命令
先安装gitsudo apt install git再定义使用git用户的姓名和邮箱git config --global user.name XXXgit config --global user.email XXX然后克隆远程仓库的文件到本地git clone 远程仓库地址然后向该文件中添加或修改其中的内容,再从远程仓库origin拉取指定分支master的代码到本地并和当...原创 2020-03-01 12:49:15 · 685 阅读 · 0 评论 -
安装vimplus后,youCompleteme插件安装失败的解决方案
以下步骤仅供参考背景:作为LINUX的小白,实在头疼网上安装ycm的教程,所以想通过安装vimplus来自动安装ycm插件,结果发现ycm不能使用。我刚开始以为是vimplus安装过程中出现了问题,然后重新安装了vimplus,在更新的时候也出现了一些error下列软件包有未满足的依赖关系: python3-dev : 依赖: python3 (= 3.6.5-3) 但是 3.6.7-1~...原创 2020-03-01 12:05:42 · 3234 阅读 · 1 评论 -
因为存在依赖问题使ubuntu18.04下apt-get install gcc g++安装失败的解决方案
命令:sudo apt-get install gcc出现如下错误:正在读取软件包列表… 完成正在分析软件包的依赖关系树正在读取状态信息… 完成有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件包尚未被创建或是它们已被从新到(Incoming)目录移出。下列信息可能会对解决问题有所帮助:下列...原创 2020-02-26 01:24:36 · 8595 阅读 · 5 评论