自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 进程通信之管道通信

管道通信是常见的进程通信方式之一,其原理是借助操作系统,在内核区创建一块缓冲区,由两端的进程分别写入、读出数据。创建管道的函数的原型:int pipe(int filedes[2]);其参数为一个大小为2的整形数组,在pipe()方法结束后,若管道创建成功,则该数组会被填入两个文件描述符,其中fd[0]默认为读端,fd[1]默认为写端。若创建失败,则返回值为-1。管道通信特点:(1)半双工,数据在同一时刻只能在一个方向上流动(2)管道不是普通的文件,不属于某个文件系统,其只存在于内存中(3)管

2021-12-07 23:37:00 444

原创 读者-写者问题解决方式

上一篇博客记录了如何解决多生产者多消费者的问题,这篇文章用来讲一讲如何解决读者-写着问题。读者-写者问题:系统中有多个读进程和写进程共同访问一个文件资源,读进程只是读取文件内容,而写进程则会修改文件内容。不难看出读进程之间是可以同时访问共享资源的,但一个写进程必须要保证和其他写进程、读进程互斥访问文件资源。因为每个写进程是需要和其他写进程读进程互斥访问文件资源的,因此需要设置一个信号量rw=1,在写进程进入临界区前后分别对rw执行PV操作,但读进程呢?如果读进程也只是简单的在读文件资源前后对rw执行P

2021-10-10 16:58:16 658

原创 多生产者多消费者解决方式

在上一篇博客中记录了如何解决普通生产者消费者的问题,这篇讲一下如何解决多生产者多消费者问题。多生产者多消费者问题案例:一家四口围着一个盘子,盘子中最多放两个水果。爸爸不断向盘子中投放苹果,儿子不断从盘子中拿走苹果,妈妈不断向盘子中投放橘子,女儿不断从盘子中拿走橘子。这里需要指明的是,“多生产者多消费者”不是指多个生产者多个消费者,而是指多类生产者多类消费者。还是一样的思路,分析该问题中存在的同步关系:1.存放水果的盘子需要互斥访问,这是很明显的。设置一个信号量mutex,初值为12.只有当盘子中还

2021-10-10 16:22:18 398

原创 使用信号量机制解决生产者消费者问题

生产者消费者问题是经典的同步问题,这篇文章用来记录一下如何使用信号量机制解决。信号量机制(Semaphore)是解决同步问题常用解法,所谓信号量其实就代表着对应共享资源的数量。对于信号量只允许三种操作,分别是初始化、P操作、V操作。P、V操作都是具有原子性的。P操作会减少信号量的值(假设一次减1),如果信号量成为负数,就代表着资源不够,调用线程会进入该信号量的等待队列,变为阻塞状态。V操作会增加信号量的值(假设一次加1),并唤醒处于等待队列头部的线程。信号量机制用法灵活,既可以用来实现互斥,也可以实

2021-10-06 15:29:04 4569

原创 进程/线程互斥的实现方式

首先介绍几个相关概念。临界资源:在同一时刻,只能被一个进程/线程所使用的资源。临界区:访问临界资源的代码段。因此同一时刻只能有一个进程/线程进入临 界区。进入区:进入临界区之前的代码段,一般用来做加锁操作。退出区:临界区执行之后的代码段,一般用来释放锁。下面介绍几种进程/线程同步的实现方式1.硬件方式-关中断。在代码执行处于进入区时,执行关中断指令,在退出区时执行开中断指令。CPU忽略中断信号,自然就不会发生进程/线程调度,保证了单核情况下只有一个进程/线程访问临界资源。然而只有执行了关中

2021-10-04 21:45:18 1823

原创 进程的状态及转换

进程的状态:运行,就绪,阻塞,创建,终止。三种基本状态:1.运行态:持有CPU使用权,正在执行的状态。2.就绪态:所有资源都已准备完毕,只差CPU使用权的状态3.阻塞态:进程所等待的事件尚未完成(比如发出系统调用,或者需等待其他进程的执行结果),该进程需要此事件完成,此时的状态称为阻塞态。另外两种状态:1.创建态:在一个进程开始执行之前,操作系统需要为其创建并初始化PCB,分配内存空间,这一时刻的进程处于创建态。2.终止态:当一个进程执行完毕,或者遇到某种错误而无法继续执行,此时需要终止该进程

2021-09-04 21:28:01 312

原创 中断概念、作用及分类

在没有引入中断机制之前,每个程序都只能等待上一个程序运行完毕才能开始执行,程序之间是串行执行的,系统资源利用率极低。而引入中断机制之后,如果发生了中断,CPU将从用户态转变为核心态,CPU的使用权也将交给操作系统内核,由内核程序去处理中断,中断处理完成之后,CPU的使用权返回给用户程序(不一定是之前执行的程序),所以说,中断使得用户程序之间能够并发执行。中断机制的特点:1.一旦发生中断,CPU就从用户态转变为核心态,就需要操作系统介入处理中断。2.中断是CPU由用户态变为核心态的唯一途径。中断的分类

2021-09-04 14:15:05 853

原创 结构体中为什么不能有该结构体类型的成员,而要采用指针?

当我们尝试在结构体A中定义一个A类型的成员时(比如链表),如果像下面一样编写代码,是无法通过编译的。struct A{ int x; struct A a;}正确的方式应该是用指针来实现,如下struct A{ int x; struct A *a;}比较直观的解释是,如果像第一种写法,是无法确定结构体A类型所占内存的大小的,当我们定义一个结构体变量,首先做的就是为其分配内存空间,如果连起大小的不确定,程序自然就无法执行。第一种写法中,结构体A具有两个成员,

2021-08-28 20:06:56 745 1

原创 C语言中返回值为函数指针的函数的写法

写法有点绕,所以写下来记录下。#include<stdio.h>int get_num(int);/*返回值为函数指针的函数: 1.先看 (*get_fun()) ,可知它是一个函数,函数名为get_fun,没有参数,返回值是一个指针,该指针指向什么类型的数据呢? 2.去掉函数名部分,剩下的部分:int (*)(int),容易看出它就是一个函数指针,该指针指向的函数:有一个int型参数,返回值为int型*/int (*get_fun())(int); int

2021-07-25 19:27:39 4099 1

原创 C语言中关于函数中使用数组作为参数的理解

函数中使用数组作为参数时,比如void function(int a[]);我们在调用该函数时,只需要传入一个int型变量的地址即可,该地址将作为参数数组 a[] 的首元素地址,值得注意的是,我们传入的实参,可以是一个int数组中任意元素的地址,比如int array[5]={1,2,3,4,5};function(array); //数组名即首元素地址function(&array[1]); //array[1]的地址将作为形参数组的首元素地址funtion(&array[2

2021-07-25 17:13:07 1057

原创 ThreadLocal实现原理

ThreadLocal,即线程局部变量,其实就是一个容器,每个线程都可通过其set方法保存一份数据,并且在get时只会获取自己线程的数据,是常用的实现线程安全的方式。自己用过许多次了,但没有细究其原理,今天大概看了一下源码,算是明白了一点点0.0直接看ThreadLocal的get方法public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if

2021-03-06 16:03:19 144 2

原创 filter与servlet初始化的差别

从图中可以看出,filter伴随着项目的开始运行就开始构造并且调用init方法初始化了。而servlet只有当用户请求发起,并且需要的是哪个servlet,就构造并且init初始化哪个servlet。

2020-11-28 17:09:43 78

原创 使用Dom4j解析xml文件一般操作

xml文件:<?xml version="1.0" encoding="UTF-8" ?><books> <book sn="SN001"> <name>java</name> <price>33</price> <author>刘德华</author> </book> <book sn="SN002"&gt

2020-11-22 17:47:07 77

原创 哈希函数设计(取模法)素数选择

取模法的素数选择当数据量在32~64之间时,选择53…

2020-11-10 20:39:33 790

原创 堆排序(java)

堆排序(java实现) //将数组调整为堆 (大根堆) public static void makeHeap(int[] arr,int end) { if(arr==null||arr.length==0||end<1) return; int parent=(end-1)/2; for (int i = parent; i >= 0; i--) { while(2*i+1<

2020-11-06 21:11:29 68

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除