Linux & 操作系统
文章平均质量分 80
Linux
小明的笔记仓库
转载笔记来自互联网资料整理。
仅供个人学习用途。
展开
-
Linux优质资源
Shell脚本基础—编写脚本会遇到的各种问题_YAIMZA的博客-CSDN博客_shell脚本基本错误类型原创 2021-12-18 22:36:37 · 86 阅读 · 0 评论 -
文件I/O
文件 I/O文件的读写方式各有千秋,对于文件的 I/O 分类也非常多,常见的有缓冲与非缓冲 I/O 直接与非直接 I/O 阻塞与非阻塞 I/O VS 同步与异步 I/O接下来,分别对这些分类讨论讨论。缓冲与非缓冲 I/O文件操作的标准库是可以实现数据的缓存,那么根据「是否利用标准库缓冲」,可以把文件 I/O 分为缓冲 I/O 和非缓冲 I/O:缓冲 I/O,利用的是标准库的缓存实现文件的加速访问,而标准库再通过系统调用访问文件。 非缓冲 I/O,直接通过系统调用访问文件,不经过标转载 2021-08-18 16:22:47 · 320 阅读 · 0 评论 -
死锁____
这次,我们就来系统地聊聊死锁的问题。 死锁的概念; 模拟死锁问题的产生; 利用工具排查死锁问题; 避免死锁问题的发生; 死锁的概念在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。那么,当两个线程为了保护两个不同的共享资源而使用了两个互斥锁,那么这两个互斥锁应用不当的时候,可能会造成两个线程都在等待对方释放锁,在没有外力的作用下,这转载 2021-08-24 16:15:42 · 170 阅读 · 0 评论 -
多线程同步
前言接下来,用 30+ 张图,带大家走进操作系统中避免多线程资源竞争的互斥、同步的方法。竞争与协作在单核 CPU 系统里,为了实现多个程序同时运行的假象,操作系统通常以时间片调度的方式,让每个进程执行每次执行一个时间片,时间片用完了,就切换下一个进程运行,由于这个时间片的时间很短,于是就造成了「并发」的现象。并发另外,操作系统也为每个进程创建巨大、私有的虚拟内存的假象,这种地址空间的抽象让每个程序好像拥有自己的内存,而实际上操作系统在背后秘密地让多个地址空间「复.转载 2021-08-18 11:56:06 · 671 阅读 · 0 评论 -
操作系统内存管理★★★
版权声明:本文为博主(小林coding)原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原创链接:https://blog.csdn.net/qq_34827674/article/details/107042163每日英语,每天进步一点点前言之前有不少读者跟我反馈,能不能写图解操作系统?既然那么多读者想看,我最近就在疯狂的复习操作系统的知识。操作系统确实是比较难啃的一门课,至少我认为比计算机网络难太多了,但它的重要性就不用我多说了。学操.转载 2021-08-18 10:48:33 · 653 阅读 · 0 评论 -
进程控制块PCB
版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_34827674/article/details/107305756进程的控制结构在操作系统中,是用进程控制块(process control block,PCB)数据结构来描述进程的。知乎搜 PCB 的提示打住打住,我们是个正经的人,怎么会去看那些问题呢?是吧,回来回来。PCB 是进程存在的唯一标识,这意味着一个进程的存在,转载 2021-08-18 11:08:19 · 1380 阅读 · 0 评论 -
分布式锁:互斥锁、自旋锁、读写锁、悲观锁、乐观锁
前言如何用好锁,也是程序员的基本素养之一了。高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则性能会降低。所以,知道各种锁的开销,以及应用场景是很有必要的。接下来,就谈一谈常见的这几种锁:正文多线程访问共享资源的时候,避免不了资源竞争而导致数据错乱的问题,所以我们通常为了解决这一问题,都会在访问共享资源之前加锁。最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等,不同种类的锁自然适用于不同的场景。如果选择了错误的锁,那么在一些高并发的场转载 2021-08-24 16:13:21 · 1476 阅读 · 1 评论 -
Socket内核数据结构
上一节我们讲了 Socket 在 TCP 和 UDP 场景下的调用流程。这一节,我们就沿着这个流程到内核里面一探究竟,看看在内核里面,都创建了哪些数据结构,做了哪些事情。解析 socket 函数我们从 Socket 系统调用开始。SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol){ int retval; struct socket *sock; int flags;...... if (SOCK_NONBL转载 2021-11-03 21:30:56 · 696 阅读 · 0 评论 -
进程间通信——管道
匿名管道我们先来看,我们常用的匿名管道(Anonymous Pipes),也即将多个命令串起来的竖线,背后的原理到底是什么。上次我们说,它是基于管道的,那管道如何创建呢?管道的创建,需要通过下面这个系统调用。int pipe(int fd[2])在这里,我们创建了一个管道 pipe,返回了两个文件描述符,这表示管道的两端,一个是管道的读取端描述符 fd[0],另一个是管道的写入端描述符 fd[1]。我们来看在内核里面是如何实现的。SYSCALL_DEFINE1(pip.转载 2021-11-03 19:48:53 · 723 阅读 · 1 评论 -
进程通信——信号
在 Linux 操作系统中,为了响应各种各样的事件,也是定义了非常多的信号。我们可以通过 kill -l 命令,查看所有的信号。# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2转载 2021-11-02 20:20:24 · 863 阅读 · 1 评论 -
进程间通信IPC★★★
管道模型传统的模型就是软件开发的瀑布模型(Waterfall Model)。所谓的瀑布模型,其实就是将整个软件开发过程分成多个阶段,往往是上一个阶段完全做完,才将输出结果交给下一个阶段。就像下面这张图展示的一样。这种模型类似进程间通信的管道模型。Linux 有下面这样一行命令:ps -ef | grep 关键字 | awk '{print $2}' | xargs kill -9这里面的竖线“|”就是一个管道。它会将前一个命令的输出,作为后一个命令的输入。从管道的这个名称...原创 2021-10-17 10:29:24 · 157 阅读 · 0 评论 -
用户态内存映射 与 mmap()
mmap 的原理在虚拟地址空间那一节,我们知道,每一个进程都有一个列表 vm_area_struct,指向虚拟地址空间的不同的内存块,这个变量的名字叫mmap。struct mm_struct { struct vm_area_struct *mmap; /* list of VMAs */......} struct vm_area_struct { /* * For areas with an address space and backing store, * li转载 2021-10-11 20:52:10 · 633 阅读 · 0 评论 -
Linux 进程的内存管理
mm_struct——待写转载 2021-09-17 20:54:53 · 547 阅读 · 1 评论 -
Linux 进程内存管理
摘要- 内存管理信息在 task_struct 的 mm_struct 中- task_size 指定用户态虚拟地址大小- 32 位系统:3G 用户态, 1G 内核态- 64 位系统(只利用 48 bit 地址): 128T 用户态; 128T 内核态- 用户态地址空间布局和管理- mm_struct 中有映射页的统计信息(总页数, 锁定页数, 数据/代码/栈映射页数等)以及各区域地址- 有 vm_area_struct 描述各个区域(代码/数据/栈...转载 2021-10-09 20:42:27 · 1662 阅读 · 0 评论 -
线程创建的过程
用户态创建线程无论是进程还是线程,在内核里面都是任务,管起来不是都一样吗?但是问题来了,如果两个完全一样,那为什么咱们前两节写的程序差别那么大?如果不一样,那怎么在内核里面加以区分呢?其实,线程不是一个完全由内核实现的机制,它是由内核态和用户态合作完成的。pthread_create 不是一个系统调用,是 Glibc 库的一个函数,所以我们还要去 Glibc 里面去找线索。果然,我们在 nptl/pthread_create.c 里面找到了这个函数。这里的参数我们应该比较熟悉了。n...转载 2021-09-23 19:58:04 · 1554 阅读 · 0 评论 -
fork() 系统调用的过程
fork 系统调用的过程它包含两个重要的事件,一个是将 task_struct 结构复制一份并且初始化,另一个是试图唤醒新创建的子进程。这个过程我画了一张图,你可以对照着这张图回顾进程创建的过程。这个图的上半部分是复制 task_struct 结构,你可以对照着右面的 task_struct 结构图,看这里面的成员是如何一部分一部分的被复制的。图的下半部分是唤醒新创建的子进程,如果条件满足,就会将当前进程设置应该被调度的标识位,就等着当前进程执行 __schedule 了。...原创 2021-09-23 19:28:45 · 472 阅读 · 0 评论 -
Linux进程调度
所谓进程调度,其实就是一个人在做 A 项目,在某个时刻,换成做 B 项目去了。发生这种情况,主要有两种方式。方式一:A 项目做着做着,发现里面有一条指令 sleep,也就是要休息一下,或者在等待某个 I/O 事件。那没办法了,就要主动让出 CPU,然后可以开始做 B 项目。方式二:A 项目做着做着,旷日持久,实在受不了了。项目经理介入了,说这个项目 A 先停停,B 项目也要做一下,要不然 B 项目该投诉了。主动调度进程上下文切换上下文切换主要干两件事情,一是切换进程空间,也即..转载 2021-09-22 11:34:29 · 957 阅读 · 0 评论 -
软连接与硬链接
软链接和硬链接的存储格式还有一种特殊的文件格式,硬链接(Hard Link)和软链接(Symbolic Link)。在讲操作文件的命令的时候,我们讲过软链接的概念。所谓的链接(Link),我们可以认为是文件的别名,而链接又可分为两种,硬链接与软链接。通过下面的命令可以创建。 ln [参数][源文件或目录][目标文件或目录] 复制代码ln -s 创建的是软链接,不带 -s 创建的是硬链接。它们有什么区别呢?在文件系统里面是怎么保存的呢?如图所示,硬链接与转载 2021-09-21 20:09:20 · 290 阅读 · 1 评论 -
Linux 进程数据结构
总结时刻这一节,我们终于把进程管理复杂的数据结构基本讲完了,请你重点记住以下两点: 进程亲缘关系维护的数据结构,是一种很有参考价值的实现方式,在内核中会多个地方出现类似的结构; 进程权限中 setuid 的原理,这一点比较难理解,但是很重要,面试经常会考。 ...原创 2021-09-21 19:58:22 · 162 阅读 · 0 评论 -
Linux 线程创建
如何创建线程?看来多线程还是有很多好处的。接下来我们来看一下,如何使用线程来干一件大事。假如说,现在我们有 N 个非常大的视频需要下载,一个个下载需要的时间太长了。按照刚才的思路,我们可以拆分成 N 个任务,分给 N 个线程各自去下载。我们知道,进程的执行是需要项目执行计划书的,那线程是一个项目小组,这个小组也应该有自己的项目执行计划书,也就是一个函数。我们将要执行的子任务放在这个函数里面,比如上面的下载任务。这个函数参数是 void 类型的指针,用于接收任何类型的参数。我们就可以将要下载的转载 2021-09-17 21:28:56 · 2022 阅读 · 0 评论 -
Linux 命令学习
别出心裁的Linux命令学习法 - 娄老师 - 博客园重要的命令:ac,apt-get,apt-cache bzip2, cat,cd,chgrp,chmod,chown,clear,compress,cp, dd,ddd,df,diff,du,dump, env, find,finger,free, gcc,gdb,grep,gzip, head, kill, less,ln,locate,l,ls, make,man,mkdir,more,mount,mt,mv, netstat,nslooku原创 2021-09-17 20:50:50 · 629 阅读 · 0 评论 -
Linux学习路线
原创 2021-09-17 20:46:44 · 92 阅读 · 0 评论 -
ubuntu 常用命令
ubuntu常用命令source ~/anaconda3/bin/activate rootanaconda-navigator原创 2020-09-04 12:11:09 · 113 阅读 · 0 评论