
linux高级编程
勇士后卫头盔哥
这个作者很懒,什么都没留下…
展开
-
终端与控制台
前言我们知道一个进程的输入输出它是需要终端设备协助下才能去完成的,终端就是计算机外围设备,用来处理用户信息输入和结果输出,终端本身无计算能力,只是一个连接设备(如通过串口连接),后来将通过串口连接的各种设备都称为终端设备,比如串行端口终端:dev/ttySn,伪终端/dev/pty,虚拟终端/dev/tty,控制台/dev/console,对于控制台的概念如下图所示演变终端,控制台慢慢从硬件概念演化成软件概念,就是所谓的虚拟终端,使用软件来模拟以前的硬件终端设备,Linux系统中的6虚拟终端(tty原创 2020-06-13 12:22:23 · 435 阅读 · 0 评论 -
git学习篇之文件操作
忽略文件有些文件不必提交到版本库中,如可执行文件,日志文件,临时文件,库文件,在工作目录下手动创建.gitignore文件,如以下所示我们忽略.bin文件的提交从下图可以看出我们.bin文件就被忽略,检查不到.bin的变化,但是.o,.a文件没有被忽略所以能够看到变化下面我们把.o,.a文件给忽略掉再次查看git状态,可以看出.a,.o文件已经被忽略下图是忽略匹配规则撤销修改在版本提交的过程中我们可能会做出错误的修改,提交到版本库中撤销工作区的修改对工作区的readme进行原创 2020-06-10 16:49:13 · 213 阅读 · 0 评论 -
I/O缓存与内存映射
前言一般来说我们的CPU速度是比较快然而磁盘速度明显是低于CPU的,所以引入了缓存来解决这种速度上的差异,计算中的缓存无处不在,如上图所示,缓存就是为了缓和两个模块之间速率的冲突,也就是说我们去读写磁盘的时候可以将磁盘上的数据先放到缓存中,我们CPU去读写硬盘数据的时候不会去直接读取硬盘的数据而去缓存中读写,在应用层也存在缓存,比如我们在接受串口数据的时候可以开辟一个环形缓冲区来缓存串口的数据,这是在嵌入式系统设备中常有的做法,其目的都是为了更高效的运行页高速缓存页缓存是操作系统层面的概念,其英文原创 2020-06-07 18:07:30 · 680 阅读 · 0 评论 -
System V IPC(二)
System V 消息队列数据结构struct msqid_ds { struct ipc_perm msg_perm; /* Ownership and permissions */ time_t msg_stime; /* Time of last msgsnd(2) */ time_t msg_rtime; /* Time of last msgrcv(原创 2020-05-15 19:07:25 · 188 阅读 · 0 评论 -
System V IPC(一)
1 前言如上图所示是System V IPC相关的接口表,System V IPC未遵循“一切都是文件”的Unix哲学,而是采用标识符ID和键值来标识一个System V IPC对象.每种System V IPC都有一个相关的get调用(表中的“创建或打开对象”一行),该函数返回一个整型标识符ID,System V IPC后续的函数操作都要作用在该标识符ID上.System V IPC对象的作用范围是整个操作系统,内核没有维护引用计数.调用各种get函数返回的ID是操作系统范围内的标识符,对于任何进程,原创 2020-05-15 16:15:33 · 270 阅读 · 0 评论 -
进程间通信---管道
前言管道是最早出现的进程间通信的手段,比如我们在shell执行命令时经常会将上一个命令的输入作为下一个命令的输入就是通过管道来实现的,如下图,进程who的标准输出,通过管道传递给下游的wc进程作为标准输入,从而通过相互配合完成了一个任务,读取管道内容是消耗型的行为,即一个进程读取管道内的一些内容后,这些内容就不会继续在管道之中了管道的作用是在亲缘关系的进程之间传递信息,所谓有亲缘关系,是指有一个共同的祖先,所以管道并非只能用于父子进程之间,也可以用在兄弟进程之间,还可以用于祖孙之间甚至叔侄进程之间,总原创 2020-05-10 12:04:27 · 204 阅读 · 0 评论 -
linux内核链表大剖析
前言链表是linux内核中最简单,最普通的数据结构,链表是一种存放和操作可变数量元素的数据结构,链表和静态数组的不同之处在于,它所包含的元素都是动态创建并插入链表的,在编译时不必知道具体需要创建多少个元素,链表元素在内存中无须占用连续内存区,在linux内核中父子兄弟进程之间的联系,platform总线上的设备,input输入子系统都是用链表组织起来的,可见linux内核链表是多么重要!lin...原创 2020-04-18 14:59:19 · 245 阅读 · 0 评论 -
linux内核中的两个宏
LINUX内核中常用的两个宏就是offsetof和container_of1.offsetof介绍定义:offsetof在linux内核的include/linux/stddef.h中定义#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)offsetof用于计算TYPE结构体中MEMBER成员的偏移位...原创 2020-04-16 22:40:30 · 231 阅读 · 0 评论 -
进程的一生(四)
进程负载均衡linux可能会运行在一个多核的状态下,linux就会在这些多核之间进行负载均衡,每个核的跑的相同的调度算法是我们之前提到的SCHED_FIFO和SCHED_RR和SCHED_NORMAL(CFS),linux就像一个分布式系统一样在不同核之间进行负载均衡,每个核都有可能把自己的task推到另一个核中,另一个核也有可能把task推给自己,对应pull和push,在多核的情况下,每个核...原创 2020-04-08 22:46:38 · 267 阅读 · 0 评论 -
进程的一生(三)
进程的调度吞吐和响应我们先说下吞吐量和响应的概念,响应就是最小化某个任务的响应时间,哪怕牺牲其他的任务为代价,吞吐就是全局视野,整个系统的workload被最大化处理,简单来说响应就是你点击一个按钮的响应速度,吞吐就是整个系统用在工作上的时间比,吞吐和响应是两个拔河的人,响应的提高肯定会以牺牲吞吐为代价,反着也成立,在实时操作系统会发生高优先级抢占,抢占必然会发生吞吐率的下降,时间并没有花在工...原创 2020-04-08 13:38:38 · 193 阅读 · 0 评论 -
进程的一生(二)
进程的fork()我们知道fork()创建的是一个进程,如下图在进程p1中fork出一个子进程p2,p1和p2都有各种的task_struct,在内核的角度上只认得这个task_stuct,只要你是个task_struct就能被调度,linux里面有这么一个逻辑,当p1把p2创建出来的时候,p1就将描述资源的结构对拷给p2,比如我们p1中的当前路径资源也拷贝给了p2,既然是两个进程,那你的资源和...原创 2020-04-07 23:42:21 · 234 阅读 · 0 评论 -
线程的同步机制(二)
前言在线程的同步机制中我们提到互斥锁能够解决资源的互斥访问,但某些情况,互斥并不能解决,线程经常遇到这种情况:要想继续执行,可能要依赖某种条件,如果条件不满足,它能做的事情就是等待,等到条件满足为止,通常条件的达成,很可能取决于另一个线程,例如系统有全局i和全局j,线程A和线程B都要访问,线程A需要互斥的执行i++;j–操作,线程B需要互斥的在i等于j时执行do_work()函数.情况如下如...原创 2020-04-04 23:17:30 · 146 阅读 · 0 评论 -
内存泄漏问题
简单来说,造成内存泄漏的原因就是申请了存储空间但是没有正确释放,造成内存泄漏的原因就是申请了存储空间但是没有正确的释放,造成这种问题的主要原因有3个1.在差错处理时,忘了释放已分配的动态存储空间,如以下代码char *do(......){ char *p,*q; if((q=malloc(1024))==NULL)return NULL; if((p=malloc(1024))...原创 2020-04-03 19:22:29 · 298 阅读 · 0 评论 -
线程的同步机制(一)
目前linux下的线程亦称为轻量级进程,甚至很多地方说linux不区分进程和线程,这是站在内核的角度来看,在创建线程时,linux内核仍然创建一个新的PCB来标识这个线程,而内核对进程/线程的认识来源于PCB,因此,内核并不认为它们有差别,一个进程如果不创建新的线程,可以说它时只有一个线程的进程,如果额外创建了额外的线程,原来的进程亦称为主线程,创建的新线程在用户空间仅申请自己的栈空间,与同进程的...原创 2020-03-06 00:13:49 · 173 阅读 · 0 评论