自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 golang中如何利用并行高效的解决问题(附代码)

背景笔者在工程中经常使用golang来进行开发,用go来写高并发程序也确实是爽的不要不要的。前段时间在读了William Kennedy的文章Scheduling In Go : Part III - Concurrency后对如何使用并行更高效的优化golang代码有了进一步的理解,在此记录一下。原文地址:https://www.ardanlabs.com/blog/2018/12/sche...

2020-03-23 23:00:18 634

原创 在下图的基础上,一笔写出“田”字

背景昨天在商场吃饭,看到一个很有趣的问题,大致描述如下:// 问题描述:// 如下图,如何在下图的基础上,一笔完成一个"田"字// __// |//// "田"字样式// _____// |__|__|// |__|__|想了一会,想出了一个解,解答如下:回家的路上,就一直在想,是否还有别的答案,准备写一段程序验证一下,经过了一晚上的苦战,终于写出了答案,代码如下:package mainimport "fmt"// 问题描述:// 如下图,如何在

2021-07-03 14:26:58 4110 1

原创 对缓存一致性算法(MESI)的理解

一:背景缓存一致性算法是为了解决多核处理器之前独占缓存的缓存一致性问题而提出的。现代计算机架构,根据成本和IO速度将存储分为了寄存器、l1/l2/l3cache、ssd、hdd等多种存储介质,其中在多核处理器中,由于每个处理器有自己的l1\l2cache,那么如何保证多个处理器之间的l1\l2cache的数据一致性成为了一个问题。并且如何保证cache尽可能少的和主存进行读写也是一大问题。二:概念在了解MESI协议之前,我们需要知道几个概念:cache:这里特指处理器的l1\l2缓存,因为这两

2020-09-13 19:40:15 541

原创 APUE读书笔记(21) 守护进程

一:守护进程  守护进程是一类生存周期较长的进程,一般在系统开启的时候产生,系统关闭的时候才销毁。守护进程在后台运行,帮助UNIX系统执行日常事务活动。二:守护进程的特征  通过ps命令可以查看进程列表,可以展示进程号,父进程号等信息。父进程号为0的个进程一般为内核进程。内核进程的生命周期与整个系统的生命周期一样,它以超级用户权限执行,无控制终端,无命令行。  进程1为init进程,他是一...

2019-09-29 23:27:34 171

原创 APUE读书笔记(20) 线程控制(下)

一:线程特定数据:  线程特定数据也称为线程私有数据,是存储和查询某个特定线程相关数据的一种机制。线程模型是可以共享进程中的一些数据,但是为什么又需要有线程特定数据呢?这主要基于两点:  第一:有时候需要维护基于每线程的数据。虽然线程id是一个整数且唯一,但是基于线程id作为数组的索引会有不够安全(不太清楚这里的不安全指的是什么)。作者提到:我们希望可能有一些额外的保护,防止某个线程的数据与其...

2019-09-23 00:03:24 128

原创 APUE读书笔记(19) 线程控制(上)

第十二章 线程控制一:线程限制:  Single Unix定义了一线线程操作的限制,和其他的限制一样,可以通过sysconf来查询。和其它的限制使用目的一样,为了应用程序的在不同操作 系统的可移植性。 一些限制:  PTHREAD_DESTRUCTOR_ITERATIONS: 销毁一个线程数据最大的尝试次数,可以通过_SC_THREAD_DESTRUCTOR_ITERATIONS作为sysc...

2019-09-15 22:35:24 147

原创 APUE读书笔记(18)线程

第十一章 线程一:主要内容:  线程可以在单进程环境中执行多个任务,并且一个进程中的所有线程都可以访问该进程的组成部件,比如内存和文件描述符。多线程使得单个资源会被多个用户共享,所以同步机制在多线程中是至关重要的。二:线程概念  典型的UNIX进程可以看成只有一个控制线程:一个进程在同一时间只能做一件事情。一个进程对应多个线程有以下好处:  1.通过对每种事件分配一个单独的处理线程,可以...

2019-09-09 00:30:47 133

原创 APUE读书笔记(17) 信号(下)

一:函数sigprocmask  一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用函数 sigprocmask可以检测或更改 (或两者 ) 进程的信号屏蔽字。原型如下:  首先,如果oset是一个非空的指针,那么进程的当前信号屏蔽字通过oset返回。  其次,若set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。SIG_BLOCK是或操作,而SIG_SETMAS...

2019-08-25 21:29:57 107

原创 APUE读书笔记(16) 信号(中)

一:可重入函数  简单的来说,当一个进程捕捉到了信号,那么这个进程将会执行该信号处理程序中的指令,这个是绝对的。但是我们可能会想到一个问题,假设该进程正在执行一些比较特殊的指令,比如malloc;这时进程捕获到了一个信号,该信号处理程序执行也为malloc,那么会发生什么?这很有可能会对进程造成一个极为严重的影响,甚至直接杀死进程。  那么由上可知,类似于malloc这种函数是【不可重入函数】...

2019-08-04 23:00:10 145

原创 APUE读书笔记(15) 信号(上)

第十章 信号一:主要内容:  信号属于软件中断,它提供了一种异步处理事件的方式。本章对信号机制进行综述,说明每一种信号的用法,然后分析早期实现的问题,之后说明解决问题的方法。二:信号概念  每个信号都有名字,他们都是以SIG开头,信号在signal.h文件中被定义为正整数常量,并且不存在编号为0的常量。  产生信号的方式多种多样,比如最常见的就是在终端中ctrl+c,就可以产生中断信号。...

2019-07-28 23:08:22 137 1

原创 Leetcode解题之路(golang版):41. 缺失的第一个正数(First Missing Positive)

41. 缺失的第一个正数给定一个未排序的整数数组,找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: 1说明:你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。解法一:排序法空间复杂度:$O(n)$...

2019-07-23 21:48:03 212

原创 Leetcode解题之路(golang版):5. 最长回文子串(Longest Palindromic Substring)

5. 最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"解法一:中心扩散法空间复杂度:$O(1)$时间复杂度:$O(n2)$func longestPalindrome(s string...

2019-07-21 22:35:40 495

原创 APUE读书笔记(14) 进程关系(下)

一:会话  会话是一个或者多个进程组的集合,如下图中一个会话有三个进程组:  会话中的进程组通常是由shell中的管道(|)进行连接的,比如上图的安排可能是有如下命令形成的:p1 | p2 & p3 | p4 | p5,进程调用setsid函数可以建立一个新会话。  如果调用这个函数的进程不是一个进程组的组长,那么将会发生以下三件事情:  1.该进程变成新会话的会话首进程,并且该...

2019-07-21 22:24:34 101

原创 APUE读书笔记(13) 进程关系(上)

第九章 进程关系一:主要内容:  进程之间具有关系,每个进程都会有一个父进程,当子进程退出时,父进程可以得到通知并能取得子进程的退出状态。二:终端登录  对于BSD终端登录,当系统自举时(不清楚什么时自举),内核会创建ID为1的进程,也就是init进程。init进程使系统进入多用户模式,init读取文件/etc/ttys,对每一个允许登录的终端设备,init调用一次fork,他所生成的子进...

2019-07-14 23:04:22 109

原创 APUE读书笔记(12) 进程控制(下)

一:竞争条件  当多个进程都企图对共享数据进行处理,而最后的结果又取决于进程运行的顺序时,我们认为发生了竞争条件。父进程等待子进程返回可以使用wait函数,子进程等待父进程返回可以使用轮询的方式,每隔1s都去询问一次。但是这样浪费CPU时间,所以多个进程之间需要有某种形式的信号发送和接受的方式来进行处理多个进程间通信的问题。在第十节将会说明这个问题。二:函数exec  fork函数创建新的子...

2019-07-07 14:43:20 116

原创 APUE读书笔记(11) 进程控制(中)

一:函数exit  进程有五种正常终止的方式和三种异常终止的方式。五种正常的退出方式为:  1.main中调用return,等效于调用exist  2.调用exit函数  3.调用_exit和_Exit函数。  4.进程的最后一个线程启动例程中调用return语句。  5.进程的最后一个线程调用pthread_exit函数。  三种异常的退出方式为:  1.调用abort。  2...

2019-06-30 23:14:56 146

原创 APUE读书笔记(10) 进程控制(上)

第八章 进程控制一:主要内容:  本章介绍UNIX系统的进程控制,包括创建新的进程,执行程序,和进程终止。二:进程标识  进程是使用一个ID来进行标识的,应用程序有时候就把进程ID作为名字的一部分来创建一个唯一的文件名。进程ID是唯一的,但是ID却是可以复用的,为了保证新进程的ID不会和最近一个进程的ID重复,大部分的系统都会使用延迟复用算法。三:函数fork  一个进程,包括代码、数...

2019-06-23 22:00:07 117

原创 APUE读书笔记(9) 进程环境

第六章 进程环境一:主要内容:  本章主要介绍进程环境,主要包括程序执行时,main函数的调用过程;命令行参数的传递;典型的存储空间的布局等等。二:main函数  C程序从main函数开始执行,其原型为  其中argc为命令行参数的个数,argv是一个字符串指针数组,表示各参数内容。在调用main函数之前会启动一个特殊的例程,可执行文件将启动例程指定为程序的起始地址。三:进程终止 ...

2019-06-16 22:33:11 125

原创 APUE读书笔记(8) 系统数据文件和信息

第五章 系统数据文件和信息一:主要内容:  本章主要讲述UNIX系统中与系统正常运行有强烈关系的系统数据文件,比如系统口令文件,组文件等。二:口令文件  口令文件包含如下字段:  口令文件在路径/etc/passwd中,并且是一哥ASCII文件,每一行包含上述字段,并且用冒号分隔。有两个函数可以获取口令文件:  其中getpwuid函数由ls程序使用,gwtpwnam函数由logi...

2019-06-09 22:33:34 189

原创 APUE读书笔记(7) 标准IO库(下)

第五章 标准IO库(下)一:每次一行IO  下面的两个函数提供每次输入一行IO的功能:char *fgets(char *restrict buf, int n, FILE restrict fd);char *gets(char *buf);成功返回buf,失败返回NULL  这里我们并不推荐使用gets这个函数,因为他不指定读入缓冲区的数据大小,容易造成缓冲区溢出,当最后一行超过...

2019-06-02 23:42:14 119

原创 Leetcode解题之路(golang版):3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

3. 无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重...

2019-06-02 15:00:20 306

原创 Leetcode解题之路(golang版):2. 两数相加(Add Two Numbers)

2. 两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> ...

2019-06-02 10:42:30 497

原创 Leetcode解题之路(golang版):100. 相同的树(Same Tree)

100. 相同的树给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3]输出: true示例 2:输入: ...

2019-06-02 10:07:19 311

原创 Leetcode解题之路(golang版):88. 合并两个有序数组(Merge Sorted Array)

88. 合并两个有序数组给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = ...

2019-06-02 10:06:04 617

原创 Leetcode解题之路(golang版):83. 删除排序链表中的重复元素(Remove Duplicates from Sorted List)

83. 删除排序链表中的重复元素给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3解法一:没什么好说的,直接遍历去重就好空间复杂度:$O(1)$时间复杂度:$O(n)$/** * Defin...

2019-06-02 10:04:54 193

原创 Leetcode解题之路(golang版)汇总

题号题目名称题目答案链接1两数之和(Two Sum)https://blog.csdn.net/myz123321/article/details/899755987整数翻转(Reverse Integer)https://blog.csdn.net/myz123321/article/details/899758109回文数(Palindrome Nu...

2019-06-01 11:12:49 2062 1

原创 Leetcode解题之路(golang版):70. 爬楼梯(Climbing Stairs)

70. 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. ...

2019-06-01 10:51:02 295

原创 Leetcode解题之路(golang版):69. x 的平方根(Sqrt(x))

69. x 的平方根实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。解法一:空间复杂度:$O(1)$时间复杂度:$O(...

2019-06-01 10:14:36 1782

原创 Leetcode解题之路(golang版):67. 二进制求和(Add Binary)

67. 二进制求和给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。示例 1:输入: a = "11", b = "1"输出: "100"示例 2:输入: a = "1010", b = "1011"输出: "10101"解法一:空间复杂度:$O(n)$时间复杂度:$O(n)$//由于golang中字符串转换太过于麻烦//所...

2019-05-30 22:01:18 593

原创 Leetcode解题之路(golang版):66. 加一(Plus One)

66. 加一给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。...

2019-05-28 22:20:10 284

原创 Leetcode解题之路(golang版):58. 最后一个单词的长度(Length of Last Word)

58. 最后一个单词的长度给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0 。说明:一个单词是指由字母组成,但不包含任何空格的字符串。示例:输入: "Hello World"输出: 5解法一:调库函数法空间复杂度:$O(n)$时间复杂度:$O(n)$//话不多说 先偷鸡 直接掉库函数//但是要注意需要去掉末尾多...

2019-05-28 22:18:47 308

原创 Leetcode解题之路(golang版):53. 最大子序和(Maximum Subarray)

53. 最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。解不出来法一:空间复杂度:$O(1)$时间复...

2019-05-28 21:31:26 459

原创 APUE读书笔记(6) 标准IO库(上)

第五章 标准IO库(上)一:主要内容:  本章主要讲述UNIX系统中标准IO库的实现,包括缓冲区的分配、流的概念、标准IO的效率等。二:流和FILE对象  对于流来说,他又两种模式。我们先不说这两种模式是什么,先来讨论一下字符集。我们通常所使用的字符集为ANSI字符集,ANSI字符集相比较于ASCII字符集多出了一部分数据,这里主要是因为原有的ASCII字符集仅仅适用于英语,不适用于其他语...

2019-05-26 23:10:29 106

原创 golang中可变参数的使用:求最大值和最小值

golang中可以使用可变化的参数来声明函数,比如求一列数中的最大值或者是最小值,传入的参数个数是不固定的,这时就需要使用到可变参数。一:可变参数的生命形式可变参数的声明形式如下:func function(param ...type) type { }具体到本文讲解的求最大值函数max和求最小值函数min的声明会如下形式:func min(num ...int) int { //求...

2019-05-22 10:25:14 6183 1

原创 APUE读书笔记(5) 文件和目录(下)

第四章 文件和目录(下)十一:函数chown、fchown、fchownat和lchown  这几个函数都可用于更改文件的用户ID和组ID。原型如下:#include <unistd.h> int chown(const char *pathname, uid_t owner, gid_t group); int fchown(int fd, uid_t ...

2019-05-17 23:35:37 150

原创 Leetcode解题之路(golang版):38. 报数(Count and Say)

38. 报数报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:1. 12. 113. 214. 12115. 1112211 被读作 "one 1" ("一个一") , 即 11。11 被读作 "two 1s" ("两个一"), 即 21。21 被读作 "one 2", "one 1" ("一个二" ,...

2019-05-14 14:21:40 304

原创 Leetcode解题之路(golang版):35. 搜索插入位置(Search Insert Position)

35. 搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0...

2019-05-13 22:16:12 198

原创 Leetcode解题之路(golang版):28. 实现strStr()(Implement strStr())

28. 实现strStr()实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa...

2019-05-12 21:05:14 296

原创 APUE读书笔记(4) 文件和目录(上)

第四章 文件和目录(上)一:主要内容:  本章主要讲述UNIX系统中文件和目录,与上一章有所区别的是,文件IO主要讨论突通文件进行的;文件和目录主要讲述描述文件系统的其他特征和文件的性质。  由于该章篇幅较长,所以分为两部分来记录。二:函数stat、fstat、fstatat和lstat  首先四个函数的具体定义如下:#include <sys/stat.h> int...

2019-05-12 20:50:26 140

原创 Leetcode解题之路(golang版):27. 移除元素(Remove Element)

27. 移除元素给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums ...

2019-05-12 00:42:09 313

空空如也

空空如也

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

TA关注的人

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