linux
文章平均质量分 70
维欣~
这个作者很懒,什么都没留下…
展开
-
【Linux】多线程与线程池的区别
多线程1、解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是由CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。2、由于不同进程中的线程可能并发执行,因而Windows支持进程间的并发性。此外,同一个进程中的多个线程可以分配给不同的处理器并且同时执行。一个含有多线程的进程在实现并发时,不需要使用多进程的开销。同一个进程中的线程可以通过它们的公共地址空间交换信息,并访问进程中的共享资源。不同进程中的线程可以通过在两个进程间建立的共享内存交换信息。3、(插入)并发与并行的关系:原创 2020-06-30 23:25:38 · 662 阅读 · 0 评论 -
【Linux】了解I/O复用的LT模式和ET模式
LT模式和ET模式1、LT模式:内核如果检测就绪事件并将其通知给应用程序后,应用程序可以不立即处理该事件,因为下次调用epoll _wait时,还会将此事件通知给应用程序。2、ET模式:内核如果检测就绪事件并将其通知给应用程序后,应用程序必须立即处理该事件,否则下次调用epoll wait时,不会将此事件再通知给应用程序。3、select和poll只能工作在LT模式下,epoll支持高效的ET模式实例说明1、epoll在默认情况下是LT模式,如果想要让他支持ET模式,可以在获取新连接的代码下在事件原创 2020-06-29 18:54:12 · 574 阅读 · 0 评论 -
【Linux】I/O复用之poll和epoll的用法
select系统调用可参见此博客poll1、原型:#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);2、fds:用户数组的首地址,记录所有文件描述符以及关注的事件类型,将用户空间的数据传递给内核,在poll返回时,也用于将内核检测到就绪事件通知给应用程序。struct pollfd结构如下:struct pollfd{ int fd; //文件描述符 shor原创 2020-06-28 22:20:43 · 278 阅读 · 0 评论 -
【Linux】I/O复用之select的用法
I/O复用概念一个单进程、单线程的服务器程序同时监听多个文件描述符上是否有关注的事件发生,如果某些文件描述符上有事件发生,则程序接着处理有事件发生的文件描述符,没有事件发生的文件描述符则不予理会。这样就可以极大的提高程序的性能。1、I/O复用使得程序能同时监听多个文件描述符,这对于提高程序的性能至关重要。2、通常,网络程序在下列情况下需要使用1/O复用技术(1)TCP服务器同时要处理监听套接字和连接套接字。(2)服务器要同时处理TCP请求和UDP请求。(3)程序要同时处理多个套接字。(4)客户原创 2020-06-27 21:43:35 · 177 阅读 · 0 评论 -
【计算机网络】TCP的报文头部
怎样保证TCP的可靠性?(1)保证数据能够到达对方(2)保证数据不重复、不乱序应答确认、超时重传滑动窗口:发送方发送数据,接收方速率匹配拥塞控制算法:发送方发送数据的速率,与当前网络情况的匹配(3)保证数据不失真16位校验和,冗余检验、TCP头部和数据部分TCP的报文头部1、序号(seq):在一个TCP连接中传送的每一个字节流中的每一个字节都按顺序编号。序号值由系统初始化的某一个随机值ISN和本报文段第一个字节数据在整个字节流中的偏移量组成。2、确认号(ack):用作对另一方发送的tc原创 2020-06-25 16:23:00 · 742 阅读 · 0 评论 -
【面试题】TCP的建立和断开连接(三次握手和四次挥手)相关考点
TCP建立连接的三次握手客户端①[CLOSED -> SYN_SENT] 客户端调用connect, 发送同步报文段;③[SYN_SENT -> ESTABLISHED] 接收到服务器端发送的SYN报文,并向服务器端发送SYN确认报文。此时connect调用成功, 则进入ESTABLISHED状态, 开始读写数据;服务器端①[CLOSED -> LISTEN] 服务器端调用listen后进入LISTEN(监听)状态, 等待客户端连接;②[LISTEN -> SYN原创 2020-06-22 17:35:18 · 346 阅读 · 0 评论 -
【计算机网络】UDP协议的编程流程
1、UDP相比于TCP是无连接的,所以在进行服务器与客户端的建立时是不需要建立连接的。2、服务器流程(被动)及函数调用(1)int socket();创建一个用于监听客户端连接的网络套接字(2)int bind();将创建的套接字与本段的地址信息进行绑定。(3)int recvfrom();接收任意一个客户端的数据原型ssize_t recvfrom(int sockfd,void *buf,size_t len,unsigned int flags, struct socka原创 2020-06-21 17:58:14 · 448 阅读 · 0 评论 -
【Linux】线程与fork的联系以及线程中子进程的锁的状态?
多线程中有一个线程调用fork,创建的子进程中会有几个线程?创建的子进程中,只有调用fork的线程被启动,其他线程并没有执行。实例:多线程创建子进程,并且在创建之前有对互斥锁加锁,子进程中锁的状态如何?答案:在子进程中出现了死锁,因为在子进程中只有一个线程被启动起来,而执行时他已经是加锁状态。即子进程会继承父进程的锁状态。实例:如何解决子进程中出现的死锁?有一个线程库的方法prepre对所有的锁执行加锁操作。其保证在fork执行过程中,所有的锁都是加锁状态的。...原创 2020-05-28 20:10:20 · 386 阅读 · 0 评论 -
【Linux】了解线程安全
什么是线程安全?线程安全,即就是在多线程运行时,不论线程的调度顺序怎样,最终的结果都是一样的、正确的,那么就说这些线程是安全的。保证线程安全的条件(1)对于线程同步,保证同一时刻只有一个线程访问临界资源。(2)在多线程中使用线程安全的函数(可重入函数),所以线程安全的函数指的是如果一个函数能够被多个线程同时调用,且不发生竞态事件,则我们认为是线程安全的。什么是重入?重入是指同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,我们称之为重入。一个函数在重入的情况下不会原创 2020-05-28 19:32:06 · 136 阅读 · 0 评论 -
【Linux】对线程同步的总结
一、前言1、 一个进程在同一时刻能够处理多个线程,每个线程处理各自独立的任务,用线程操作能够简化异步事件。2、程序可以通过使用线程得以简化,即使多线程程序在串行化任务时不得不阻塞, 由于某些线程在阻塞的时候还有另外一些线程可以运行。所以多线程程序在单处理器上运行仍然能够改善,响应时间和吞吐量。3、每一个进程有一个进程ID,是唯一的,进程ID用pid_t数据类型来表示。每一个线程有一个线程ID,但线程ID只在他所属的进程环境有效,线程ID用pthread_t数据类型来表示。4、当多个线程共享相同的内原创 2020-05-27 22:47:31 · 258 阅读 · 0 评论 -
【Linux】线程同步——信号量、读写锁和条件变量
一、信号量1、和进程类似,信号量就是特殊的计数器。可以参考进程间通信——信号量2、多线程的信号量操作是在全局进行定义信号量类型sem_t3、初始化int sem_init(sem_t *sem, int shared, int val);4、P操作int sem_wait(sem_t *sem);5、V操作int sem_post(sem_t *sem);6、销毁int sem_destory(sem_t *sem);...原创 2020-05-27 22:40:23 · 228 阅读 · 0 评论 -
【Linux】线程同步——互斥量(互斥锁)
一、基础1、线程同步的目的是不管线程之间的执行如何穿插,其运行结果都是正确的。即保证多线程执行下结果的确定性。2、同步就是让所有线程按照一定的规则执行,使得其正确性和效率都有迹可循,即线程同步就是对线程之间的穿插进行控制。3、每个对象都对应于一个**" 互斥锁"** 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。4、互斥锁线程在进入临界区之前加锁操作为了保证不同时访问一个资源。就要使临界区的代码不被同时执行线程在退出临界区之后解锁操作5、锁的特性:初始状态必须是打开的原创 2020-05-26 12:05:46 · 240 阅读 · 0 评论 -
【Linux】了解线程实现方式以及相关函数
一、线程的相关1、概念(1)线程是进程内部的一条执行序列(执行流),一个进程包含多个线程。(2)将main 函数执行的线程称为主线程,其他线程称为函数线程。main函数为进程执行入口,函数线程在创建线程时指定线程的执行序列。(3)一个线程就是一个执行流,是一组有序指令。2、函数调用int main(){ fun();}函数调用时,main函数的线程和fun方法的线程是串行执行的,fun函数执行完后才会继续进入main执行下一条指令。3、函数线程int main(){ pthr原创 2020-05-25 17:57:26 · 175 阅读 · 0 评论 -
【Linux】【面试题】进程与线程的区别
进程与线程的区别1、进程是资源分配的最小单位,线程是CPU调度的最小单位。2、进程有自己的独立地址空间,线程共享进程中的地址空间。进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间;而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。3、进程的创建消耗资源大,线程的创建消耗相对较小。4、进程的切换开销大,同一个进程中的线程的切换相对较小。5、进程是在CPU上实现共享,对CPU的操作只有操作系统内核原创 2020-05-25 17:15:44 · 798 阅读 · 1 评论 -
【Linux】总结进程间通信以及相关面试考点
一、相关知识点1、进程地址空间分布图:2、什么是临界资源?临界资源同一时刻只允许一个进程访问的资源叫临界资源。3、什么是临界区?临界区访问临界资源的代码段叫临界区。4、全双工和半双工通信有什么区别?半双工数据可以从A到B发送,也可以从B到A发送,但同一时刻只能是一个方向的。全双工数据在任意时刻都可以在两个方向同时进行。即A到B和B到A二、管道详细讲述管道以及实现1、什么是有名管道?有名管道FIFO:在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,没有血缘关系的进程也可以原创 2020-05-19 15:29:46 · 572 阅读 · 0 评论 -
【Linux】了解进程间通信——共享内存
一、共享内存1、进程的地址空间都是独立,受保护的。2、A、B进程有一块逻辑地址空间共同映射到同一块物理内存上,作为共享内存。用内核对象来保存。二、相关函数1、shmget函数得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符(1)原型:int shmget(key_t key, size_t size, int flg);(2)key:共享内存标识(3)size:共享内存大小例如:申请128字节会映射到4k大小的物理内存,但是使用也只是使用128字节,其他的用不了,但内原创 2020-05-19 14:36:30 · 258 阅读 · 0 评论 -
【Linux】了解进程间通信——信号量
一、概念1、 信号量相当于一个计数器,它用于多进程对共享数据对象的访问。2、信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待( P )和发送(V)。最常见的也就是只能取0和1的二进制信号量。3、信号量的两种操作:P 操作(等待操作):如果信号量sv的值大于0,就给他 -1,如果sv的值等于0,就挂起该进程。V 操作(发送信号):如果有其他进程因等待sv而被挂起,就让他恢复运行;如果没有进程因等待sv而挂起,就给他+1。举例:两个进程共享信号量sv,一旦其中一个进程进行了P操原创 2020-05-18 21:35:25 · 364 阅读 · 0 评论 -
【Linux】了解进程间通信——消息队列
1、理解消息队列消息:类型+数据队列:先进先出一、消息队列相关函数1、msgget函数创建一个新消息队列或打开一个已有的消息队列int msgget(key_t key, int msgflg);(1)返回值:成功返回内核对象的ID值,失败返回-1(2)key:用户标识,如果多个进程想通过同一消息队列完成数据通信,则每个进程使用相同的key值,创建或者获取同一个消息队列的内核对象ID。(3)msgflg:标志位IPC_CREAT:新建一个消息队列IPC_EXCL:与IPC_CREA原创 2020-05-16 23:32:57 · 241 阅读 · 0 评论 -
【Linux】了解进程间通信——管道
一、进程间通信1、 进程都是独立的个体,每个进程之间数据是不共享的。2、在之前学习的文件中我们知道可以利用,fork之后父、子进程可以共享fork之前打开的文件描述符,来实现进程间通信。例如:父进程给子进程发送"hello world"int main(){ int fd = open("a.txt",O_RDWR ); assert(fd != -1); if(pid == 0) { sleep(1);//保证父进程已经将字符串写入到文件中。原创 2020-05-16 22:59:32 · 319 阅读 · 1 评论 -
【Linux】Linux仿写bash程序(二)
1、上一个我们只是简单的写了bash程序,但是如果要用bash实现一些自己实现的命令,比如pwd、ls等命令。仿写bash程序2、将这些文件存放在一个文件夹中,在bash中调用即可。3、pwd实现int main(){ char path[128] = { 0 }; getcwd(path,127); printf("%s\n",path); exit(0);}在bash.c 的外置命令中将路经改成pwd所在路经即可。如:4、ls 实现(1)ls 为默认显示当前共工作路径下的原创 2020-05-15 15:39:53 · 278 阅读 · 0 评论 -
【Linux】Linux仿写bash程序(一)
一、分析1、输入一些提示符信息提示符信息的格式一般是这样的:[用户名@主机名 当前工作目录]标识符例如:[zwx@localhost Desttop]$2、等待用户输入命令3、完成简单的解析也就是对命令进行简单划分:(1)没有输入命令(2)内置命令(cd、exit)集成到 bash 程序中(3)外置命令(ls)外置命令是单独实现的,之后再用exit替换举例:为什么bash创建的子进程会执行用户输入的命令???原因:在 /bin 下存储了 ps 程序,再进行进程替换将 bas原创 2020-05-14 19:53:14 · 287 阅读 · 0 评论 -
【Linux】利用信号解决僵死进程
1、遗留问题僵死进程及其解决代码在之前我们实现了用 wait 解决僵死进程的问题,但是调用 wait 也就是等待子进程的结束,它遗留的问题是wait本身会阻塞,等待事件发生,本身会挂起,直到有一个任意子进程退出,然后才会执行父进程。2、利用信号(1)利用信号实现子进程结束会给父进程发送信号SIGCHLD,当父进程接收到信号时,再调用wait,这样父进程就不会阻塞(2)但是我们如何知道父进程哪些代码能够保证在收到信号之后执行?给信号绑定一个信号处理函数,信号处理函数收到信号才会被调用。3、实现代原创 2020-05-14 09:20:31 · 147 阅读 · 0 评论 -
【Linux】Linux中的信号
1、概念信号是系统预先定义好的某些特定的事件,信号可以被产生,也可以被接收,产生和接收的实体都是进程,信号的作用就是一个进程向另一个进程通知某一件事情的发生。2、信号的定义文件在终端上输入vim /usr/include/bits/signum.n3、当进程收到信号时,他会做出默认、忽略或捕获的处理4、修改信号的响应方式typedef void(*Fun)(int);Fun signal(int signum,Fun fun);signum未信号类型名称;fun为信号响应函数。5、在原创 2020-05-13 19:29:41 · 148 阅读 · 0 评论 -
【Linux】僵死进程和进程替换
一、僵死进程1、了解进程的结构(1)进程分为两部分:PCB(进程控制块):控制一个进程,相当于一个struct。记录一个进程的相关执行过程和内存位置。进程实体:指定进程的操作。(2)创建进程:先申请一个PCB结点,再加载程序生成进程实体。(3)进程结束:先结束进程实体,再释放PCB。2、什么是僵死进程?(1)从结构上来说:进程实体已经被释放,但PCB结点并没有被释放。因为在PCB中有一个退出码,用来查看进程退出原因,如果进程实体被释放,用户就要查看进程退出原因,所以如果要看退出码原创 2020-05-13 17:42:58 · 123 阅读 · 0 评论 -
【Linux】进程原理及写时拷贝技术
一、进程原理1、什么是进程?进程就是执行中的程序。从物理内存的分配来看,每个进程占用一片内存空间,即进程就是内存的某片空间,由于CPU只能执行一条指令,所以执行指令的顺序由程序计数器决定。从逻辑上看,每个程序可以执行也可以暂时挂起让别的程序执行,之后又可以接着继续执行。所以每个进程都有一个计数器,记录下一条指令的位置,从而使继续接着运行时能找到正确地址。从时间上看,在运行一定时间后,进程都已经完成了一定的工作量,即,每个进程都必须向前推进。2、进程的产生与消失(1)对于进程,所做的就是:原创 2020-05-13 14:31:11 · 178 阅读 · 0 评论 -
【Linux】利用文件操作的系统调用实现普通文件的cp命令
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<assert.h>#include<fcntl.h>#include<sys/stat.h>//有可能的情况// argv[0] = "./mycp"//路经+源文件 argv[1] = "./main.c"//目录路径 argv[2] = "原创 2020-05-12 21:41:44 · 334 阅读 · 0 评论 -
【Linux】系统调用以及文件描述符
windows下的C语言的库函数与Linux下的系统调用是可以相互参考学习的C语言——文件及其库函数一、Linux下的系统调用在Linux下可以用 man 2 系统调用 来查看系统调用手册要用到的头文件为#include<fcntl.h>1、open打开文件原型:int open(const char* pathname, int flags, mode_t mode);(1) pathname为打开文件的路经(2)flags为文件操作方式其中可以用按位或来设置多种操作方原创 2020-05-12 19:14:33 · 315 阅读 · 0 评论 -
【Linux】进程的创建方法以及实例
一、前言1、启动进程方法:用户操作方法:路经 + 程序名称程序进行启动进程:通过一个进程创建另一个进程的方法二、方法头文件:#include <unistd.h>1、fork() 方法:具有创建进程的功能原型:pid_t fork( void );调用fork的进程称为父进程新生成的进程称为子进程从父进程到子进程的过程我们可以理解为是将原代码复制了一份。fork() 方法调用后,父子进程都从fork调用之后的指令开始执行,这样就不会造成一直调用fork() 无限循环的情原创 2020-05-10 17:02:00 · 1043 阅读 · 0 评论 -
【Linux】输出缓冲区
执行结果是:先睡眠5秒钟,在打印出helloworld原因是:printf先将hello写入输出缓冲区中,再去执行sleep,sleep执行结束后,printf再将world写入输出缓冲区中,但world后面有一个 \n 会将输出缓冲区中的内容刷新到界面上。将输出缓冲区中的内容刷新到界面上的条件**1、"/n"2、手动刷新 fflush(stdout);3、缓冲区满4、进程结束_exit(0);没有打印结果,直接结束进程,不刷新缓冲区exit(0);会打印出结果,刷新缓冲区,再.原创 2020-05-10 13:13:31 · 433 阅读 · 0 评论 -
【Linux】Linux下常出现的问题
1、error: ‘for’ loop initial declarations are only allowed in C99 modefor循环中参数定义在windows下我们通常会写这样的表达式,但是在Linux下是错误的for(int i = 0;i < 5;i++){}Linux下编译器会提示main.c:9: error: ‘for’ loop initial declarations are only allowed in C99 modemain.c:9: note:原创 2020-05-10 12:28:13 · 214 阅读 · 0 评论 -
【Linux】编译器gcc的安装
进入vim后编辑以下代码:原创 2020-05-07 01:25:57 · 159 阅读 · 0 评论 -
【Linux】简单配置vim
在终端写入命令行 vim ~/.vimrc在编辑模式下写入以下命令:原创 2020-05-07 01:14:13 · 240 阅读 · 0 评论 -
Linux 自动化创建工具——make/makefile
一、基本概念1、make是命令,makefile是文件2、makefile带来的好处是“自动化编译”二、项目清理1、工程是需要被清理的2、 clean没有被第一个目标文件直接或者间接关联,那么他后面所定义的命令将不会被自动执行,不过我们可以显示要make执行,即命令——"make clean",以此来清除所有的目标文件,以便重编译3、一般来说,clean的目标文件,我们将它设置为伪目标...原创 2019-05-17 10:59:04 · 305 阅读 · 0 评论 -
【Linux】gcc/g++的使用
背景知识一、预编译(预处理)1、将所有的#define删除,并展开所有的宏定义2、处理所有的预编译的指令 eg:#if、#elif、#else、#endif3、处理#include预编译指令,将被包含的文件插入到预编译指令的位置4、删除所有的注释5、保留所有的 #pragma 编译指令,因为在编写程序时,我们经常要用到 #pragme 指令来设定编译器的状态活指示编译器完成一些特定的...原创 2019-05-12 11:11:33 · 167 阅读 · 0 评论 -
【Linux】函数库——静态库和共享库
库文件:特定功能的实现,为用户提供一些调用接口一、静态库1、定义静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,后缀名一般为“.a”2、静态链接优点:对库依赖性低,可移植性强缺点:可执行程序体积大3、把功能代码编译成中间文件gcc -c *.c ——> *.o4、命令ar crv lib___.a *.o3、使用 gcc -o main mmain...原创 2019-05-15 23:42:18 · 338 阅读 · 0 评论