
Linux
文章平均质量分 57
操作系统
chirrupy_hamal
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
用 System V IPC 共享内存实现简单的 Client&Server 通信
占用。原创 2024-05-16 15:14:45 · 332 阅读 · 0 评论 -
System V IPC 共享内存
共享内存是最快的进程间通信方式,一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说,进程不再通过执行进入内核的系统调用来传递彼此的数据。原创 2024-05-14 17:13:40 · 287 阅读 · 0 评论 -
用 System V IPC 消息队列实现简单的 Client&Server 通信
【代码】用 System V IPC 消息队列实现简单的 Client&Service 通信。原创 2024-05-14 10:11:12 · 202 阅读 · 0 评论 -
ftok()
【代码】ftok()传参需知。原创 2024-03-26 17:17:46 · 199 阅读 · 0 评论 -
System V IPC 消息队列
这是 System V IPC 用到的一个公共结构体,其中,ipc_perm.key 被称之为 ipckey,进程间通信本质上其实就是在内核中申请一定的资源,ipckey 就描述着内核中唯一一个消息队列(一块共享内存/一个信号量集)这样的资源,毕竟一个操作系统可以创建出很多个消息队列。原创 2024-03-21 14:53:24 · 344 阅读 · 0 评论 -
命名管道打开规则
4、O_NONBLOCK enable: open 调用返回 -1,errno 值为 ENXIO(6)1、O_NONBLOCK disable:open 调用阻塞,直到有进程为写而打开该 FIFO。3、O_NONBLOCK disable:open 调用阻塞,直到有进程为读而打开该 FIFO。2、O_NONBLOCK enable: open 调用返回文件描述符。原创 2024-03-19 10:58:52 · 519 阅读 · 0 评论 -
IPC之管道
一个进程通过系统调用 pipe 创建出一个匿名管道,操作系统就会在内核中创建一块没有明确标识的缓冲区,并返回给创建进程两个文件描述符作为管道的操作句柄供进程来操作管道,一个描述符用于从管道中读,另一个用于往管道中写。其中,fd[0]表示读端,fd[1]表示写端。因此匿名管道只能用于具有亲缘关系的进程间通信,因为子进程能复制父进程的文件描述符表。4、进程退出,匿名管道被释放,也就是匿名管道的生命周期随进程,这里的进程指持有匿名管道的最后一个进程,当然也可以主动关闭所有进程的有关匿名管道的那两个文件描述符。原创 2024-03-15 16:33:51 · 642 阅读 · 0 评论 -
进程间通信(IPC)
进程间具有独立性(每个进程都有自己的一份独立的虚拟地址空间,一个进程只能访问自己的虚拟地址空间,但不包括内核空间,不能访问其他进程的),如果多进程之间想相互通信,此时无法直接进行(一个进程不能读取其他进程的虚拟地址空间中的内容,更不能去修改),因此需要操作系统提供一些公共资源(内存、文件等)来让多个进程都能通过访问这个媒介进行通信。2、System V IPC:一套较古老的标准。3、POSIX IPC:一套跨平台的新标准。操作系统为用户提供的几种进程间的通信方式。1、管道:最古老的通信形式。原创 2024-03-15 14:45:21 · 485 阅读 · 0 评论 -
Pipe Capacity(管道容量)
【代码】Pipe Capacity(管道容量)原创 2024-03-06 13:10:29 · 500 阅读 · 0 评论 -
管道读写规则及 PIPE_BUF 涉及的写原子性问题
【代码】管道读写规则及 PIPE_BUF 涉及的写原子性问题原创 2024-03-06 15:16:25 · 605 阅读 · 0 评论 -
《深入分析Linux内核源码》
《Linux操作系统内核分析》1《Linux操作系统内核分析》2《深入分析Linux内核源码》原创 2020-10-15 12:15:52 · 343 阅读 · 0 评论 -
线程池
线程池(一种线程使用模式):至少包含有一个线程+任务队列,也就是一个线程也可以组成一个线程池。线程池有什么用?应用场景,双十一,在淘宝买东西,给服务器发送请求,一瞬间几百万个请求就过去了,淘宝创建线程去处理请求,你不可能创建几百万个线程,大量线程的创建有可能瞬间耗光资源,服务器就崩溃了,也就是说创建线程也得有个上限,但是这些请求怎么办?这么多线程只能处理这么多,其余的只能丢掉了,所以就得有地...原创 2019-10-31 17:54:04 · 144 阅读 · 0 评论 -
线程安全的同步与互斥总结
互斥的实现:互斥锁、信号量同步的实现:条件变量、信号量原创 2019-10-31 17:30:02 · 169 阅读 · 0 评论 -
生产者与消费者模型+POSIX信号量
生产者与消费者模型(以做面与吃面为例)一个场所(只有一口锅,也就是放置数据的地方只有一个)、两种角色、三种关系(生产者之间互斥(我放的时候,你就不能放,因为会造成数据混乱)、消费者之间互斥(因为你们俩没必要抢同一数据处理吧)、生产者与消费者之间是同步+互斥(总不能面做到一半你就吃吧))。这个模型用来:解耦和(如果在没有场所保存数据的情况下,也就是生产者生产出数据就得交给消费者来处理数据,如果直...原创 2019-10-31 17:24:05 · 830 阅读 · 0 评论 -
线程安全=同步+互斥
线程安全:多个线程同时对临界资源(例如,全局变量)(临界区:对临界资源操作的代码,说白了临界区就是对临界资源的操作)进行访问而不会造成数据二义。大部分情况,线程使用的数据都是局部变量(全局变量是直接共享的,堆区和局部变量需要通过create函数的参数4传参进去才能间接共享),变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。但有时候,很多变量都需要在线程间共享,...原创 2019-10-31 16:54:29 · 347 阅读 · 0 评论 -
线程
多线程?从进程开始延伸:执行流:其实,多个进程就是多个执行流。进程是程序运行的基本单位,进程也是资源分配的基本单位。cpu调度就是调度一个进程。一个执行流指的就是能够独立地执行一段代码和处理数据。其实,线程也是一个执行流。当我们有多个任务想要同时处理的时候,可以选择多进程,也可以选择多线程。只不过多线程所占用的资源相较于多进程要更少。那究竟什么是线程?线程:线程是一个执行流,独立地执...原创 2019-10-30 18:29:37 · 329 阅读 · 0 评论 -
sleep函数
sleep函数的实现,先alarm定时器,然后pause暂停,SIGALAM的默认处理动作会导致进程退出,修改SIGALAM的处理方式,但是可以打断当前的阻塞操作,pause被打断,程序继续往下走。但是这个sleep是有问题的。alarm(3);pause();alarm(3);和pause();之间并不是原子操作,这时候来了一个其他信号,这个信号的回调函数只干了一件事,sleep(10)...原创 2019-10-30 18:03:34 · 717 阅读 · 0 评论 -
可重入函数
可重入函数和不可重入函数,这也是一种竞态条件/竞争执行。#include<stdio.h>#include<unistd.h>#include<signal.h>int a = 1, b =1;int sum(int *b, int *a){ (*a)++; sleep(3);//sleep只是放大了这一过程,方便看清情况 (*b)++;...原创 2019-10-30 17:57:29 · 1195 阅读 · 0 评论 -
SIGCHILD信号
SIGCHILD信号,子进程先于父进程退出的话,操作系统通过此信号通知父进程,这个信号的默认处理方式是忽略处理。这就是为什么子进程退出,父进程没有任何反应的原因。正是父进程对这个信号采用默认的忽略式处理,导致父进程不知道子进程到底什么时候退出,因此导致wait阻塞等待,自定义SIGCHILD,在回调函数中调用waitpid/wait来处理这个子进程。但是SIGCHILD是个非可靠信号,一个父进程...原创 2019-10-30 17:51:29 · 1973 阅读 · 0 评论 -
进程信号
注意:信号不是信号量用户输入命令,在shell(bash)下启动一个前台程序。用户按下“Ctrl+c”,这时 键盘输入 产生一个硬件中断,被操作系统获取,并解释成信号,发送给目标前台进程,前台进程因为收到信号,进而引起进程退出。注意:1、“Ctrl+c”产生的信号只能发给前台进程,一个命令后面加个&就可以放到后台运行(fg:把后台运行的进程放到前台来执行),这样bash不必等待进程结束就可以接受新的命令,启动新的进程了。2、bash可以同时运行一个前台进程和任意多个后台进程,只有前台进程才原创 2019-10-28 16:55:52 · 871 阅读 · 0 评论 -
进程间通信之System V共享内存
共享内存:最快的进程间通信方式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说,进程不再通过执行进入内核的系统调用来传递彼此的数据。管道通信:通信的本质是通过内核的缓冲区来实现通信进程一:将数据从用户态自己定义的缓冲区拷贝到内核态缓冲区进程二:将数据从内核态缓冲区拷贝到用户态自己定义的缓冲区struct shmid_ds:共享内存数据结构1、在...原创 2019-10-28 16:53:13 · 234 阅读 · 0 评论 -
进程间通信之System V消息队列
struct ipc_perm:这是System V版本系列进程间通信所用到的一个公共版结构体。也就是Linux内核为每个IPC对象维护一个数据结构。第一字段,这个属性非常重要,它称之为ipckey。进程间通信的方式其实本质上它们都得在内核中申请一定的资源,而ipckey其实就是在描述着内存中惟一 一个消息队列/一块共享内存/一个信号量集这样的资源,因为一个操作系统可以创建很多个消息队列。S...原创 2019-10-28 16:37:28 · 482 阅读 · 0 评论 -
管道的原子性问题
管道(匿名/命名管道)的写数据大小在不超过PIPE_BUF(65536字节)时,内核能保证操作的原子性。如果写入的数据大小超过PIPI_BUF,内核很有可能会把此数据与其它进程的对此管道的写操作交替起来,这样的话,数据就乱了。POSIX规定,小于PIPE_BUF的写操作必须是原子操作:要写的数据应该被连续地写到管道;大于PIPE_BUF的写操作可能是非原子的:内核可能会将数据与其他进程写入的数据...原创 2019-10-28 15:56:30 · 874 阅读 · 0 评论 -
Linux背景
1.发展史Linux从哪里来?它是怎么发展的?在这里简要介绍Linux的发展史。要说Linux,还得从UNIX说起。UNIX发展史1968年,一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念。1969-1970年,AT&T的贝尔实验室研究人员Ken Tompson和Denn...原创 2019-10-28 14:02:24 · 1070 阅读 · 0 评论 -
进程间通信之管道
进程间通信(IPC):操作系统为用户提供的几种进程间的通信方式进程之间具有独立性:一个进程是不能修改另一个进程内存中的数据的,也不能去读另一个进程的虚拟地址空间中的内容。而且用户的程序也不能访问内核空间。每个进程都有自己的一份独立的虚拟地址空间。一个进程只能访问自己的虚拟地址空间。虚拟地址空间有个非常大的好处,那就是使进程间互不干扰,相互独立。但是,进程的独立性也有一个问题,如果多个进程之间想相互沟通,此时却无法直接进行通信,因此需要操作系统提供一些公共的媒介来让多个进程都能通过访问这个媒介进行通信原创 2019-10-27 18:47:22 · 731 阅读 · 0 评论 -
Linux之基本指令
常见指令原创 2019-09-07 23:26:36 · 176 阅读 · 0 评论 -
bash
Linux是一类操作系统的统称,严格地讲,它是操作系统的内核(kernel),凡是使用这种内核的操作系统都可以称之为Linux。但是我们一般用户不能直接使用kernel。而是通过kernel的“外壳”程序(shell)来与kernel沟通。从技术角度来讲,shell的最简单定义:命令行解释器(Command Interpreter)1、将使用者的命令翻译给kernel进行处理;2、将ker...原创 2019-09-08 09:38:31 · 138 阅读 · 0 评论 -
Linux权限
Linux下有两种用户:超级用户(root)、普通用户。超级用户:可以在linux下做任何事情,不受限制。普通用户:在linux下只能做有限的事情。超级用户的命令提示符是“#”,而普通用户的命令提示符是“$”。命令:su [用户名]功能:切换用户例如,要从root用户切换到普通用户user,则使用 su user/Ctrl+d/exit。 要从普通用户user切换到root用户则使用 ...原创 2019-09-08 10:39:42 · 301 阅读 · 0 评论 -
Linux基础开发工具的使用
一、Linux编辑器-vim二、Linux软件包管理器-yum在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序,但是这样太麻烦了, 于是有些人就把一些常用的软件提前编译好,并做成软件包(可以理解成Windows上的安装程序)放在一个服务器上, 通过软件包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。软件包和软件包管理器, 就好比 “A...原创 2019-09-08 16:35:02 · 357 阅读 · 0 评论 -
操作系统
操作系统(OS):一款搞管理的软件。对下管理硬件设备,各种各样的硬件设备;对上要管理各种各样的软件,并给其提供一个稳定的运行环境。这些其实都在描述操作系统的内核。如何理解 “管理”?首先,描述被管理对象,用struct结构体;其次,组织被管理对象,用链表或其他高效的数据结构。设计OS的目的1、与硬件交互,管理所有的软硬件资源2、为用户程序(应用程序)提供一个良好的执行环境...原创 2019-09-14 13:16:47 · 101 阅读 · 0 评论 -
进程基础1
进程(process进度/task任务):进程是程序(.exe:可执行程序,也称可执行文件)在操作系统中运行的实例。其实进程就是正在执行的程序,就是你在双击.exe让它跑起来的时候,操作系统会根据.exe在内存中创建一个进程。我们所看到的可执行程序只是一个普通的文件,当它运行起来的时候,操作系统就会创建出对应的进程。从操作系统管理进程的角度来进一步地了解进程管理:描述被管理的对象+把被管理的...原创 2019-09-14 14:34:13 · 776 阅读 · 1 评论 -
进程进阶2
一、进程创建-fork()vfork()不推荐使用,因为坑多。通过系统调用fork()来创建进程#include<unistd.h>//该头文件是系统编程领域最重要的头文件,没有之一,里面包含了大部分系统调用的API函数声明。pid_t fork(void);返回值:成功的话,父进程返回子进程的pid,子进程返回0。printf("%d\n", fork());失败的话,父进程返回-1。这时候会设置一个errno错误码。perror(“fork”);fork()返回值的含义:1、原创 2019-09-14 17:35:32 · 296 阅读 · 0 评论 -
进程的“虚拟”地址空间
2、但地址值是一样的,说明,该地址绝对不是物理地址!而是虚拟地址,是因为这个地址编号并不是真实内存这个硬件设备物理内存上的一个真实的地址,而是由操作系统封装出来的一层虚拟地址。3、我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。发现,父子进程,输出地址是一致的,但是变量内容不一样!之前说“程序的地址空间”是不准确的,准确的应该说成“进程地址空间”。1、变量内容不一样,所以父子进程输出的变量绝对不是同一个变量。1、用户态 3G用户空间。原创 2019-09-14 21:36:07 · 289 阅读 · 1 评论 -
环境变量概念
环境变量就是指操作系统它在运行某个程序的时候,所指定的描述运行环境的参数。描述一下环境变量的结构是什么样子的?键(key)值(value)对。等号左边的就是key,右边的就是value。二叉搜索树、哈希表例如:给你一篇英文文章,让你统计出每个单词出现的次数Key:单词,字符串比较规则->字典序Value:出现的次数然后构造一个二叉搜索树遍历文章,依次取出每个单词,在二叉搜索...原创 2019-09-15 20:15:04 · 577 阅读 · 1 评论 -
进程程序替换
进程的程序替换进程程序替换并没有创建新的进程什么样算是新建了一个进程?创建好task_struct,再把task_struct插到双向链表里面,这才是创建好了一个进程所谓的进程程序替换就是把物理内存上的数据和代码替换成了另外一个磁盘上的可执行文件的数据和代码,说白了,我们前面写的一些程序都是把它编译成一个可执行程序,一个可执行文件,而这个可执行文件非得是通过./文件名才能把它运行起来,这样一...原创 2019-09-15 20:16:43 · 341 阅读 · 2 评论 -
简易版 shell 实现
实现一个迷你版的shell程序员和操作系统之间沟通的桥梁,媒婆敲下的指令都是在shell中执行的,当前系统中默认的那个shell叫做bash,也可以自己实现一个简单版本的shellShell基本的运行原理首先当我把shell先启动起来的时候,它其实是在等待用户进行输入,敲下键盘再敲下回车这才算是一条输入,接下来当用户输入指令之后,shell进程就需要解析指令,得弄清楚指令到底要干什么,指...原创 2019-09-15 20:18:02 · 614 阅读 · 1 评论