go-内存管理
Go 的内存是自动管理的,我们可以随意定义变量直接使用,不需要考虑变量背后的内存申请和释放的问题。本文意在搞清楚 Go 在方面帮我们做了什么,使我们不用关心那些复杂内存的问题,还依旧能写出较为高效的程序。
Pool程序动态申请内存空间,是要使用系统调用的,比如 Linux 系统上是调用 mmap 方法实现的。但对于大型系统服务来说,直接调用 mmap 申请内存,会有一定的代价。比如:
内核态与用户态之间的切换浪费系统资源
频繁申请小块内存空间容易造成内存碎片
为了保证内存访问具有良好的局部性,开发者需要投入大量的精力去做优化,这是一个很重的负担。
解决方案:对象池(缓存)。
假设系统需要频繁动态申请内存来存放一个数据结构,比如 [10]int 。那么我们完全可以在程序启动之初,一次性申请几百甚至上千个 [10]int 。这样完美的解决了上面遇到的问题:
不需要频繁申请内存了,而是从对象池里拿,程序不会频繁进入内核态。
因为一次性申请一个连续的大空间,对象池会被重复利用,不会出现碎片。
程序频繁访问的就是对象池背后的同一块内存空间,局部性良好。
Golang内存管理Golang ...
Redis基础
NOSQLNOSQL = Not Only SQL
非关系型数据库,为了面对高并发社区.
Redis的基本数据类型基础命令判断一个键是否存在
1EXISTS key
删除键
1DEL key [key...]
获得键值的数据类型
1TYPE key
字符串字符串类型是其他4种数据类型的基础,其他数据类型和字符串类 型的差别从某种角度来说只是组织字符串的形式不同。例如,列表类 型是以列表的形式组织字符串,而集合类型是以集合的形式组织字符串。
命令
赋值与查询
12SET KEY VALUEGET KEY
递增数字
1INCR NUM
当要操作的键不存在时会默认键值为0,所以第一次递增后的结果 是1。当键值不是整数时Redis会提示错误。
增加/减少指定的整数
12INCRBY KEY INCREMENTDECRBY KEY DECREMENT
增加指定浮点数
1INCRBYFLOAT key increment
向尾部追加值
1APPEND key value
APPEND的作用是向键值的末尾追加value。如果键不存在则将该键的值设 ...
http包
Go 语言中的 http 包提供了创建 http 服务或者访问 http 服务所需要的能力,不需要额外的依赖。在这篇文章中,我们会介绍这些功能的使用,以及看一下 http 包的设计思路。
概览http标准库的各个组成部分:
发送GET,HEAD,POST,POSTFORM请求:
12345resp, err := http.Get("http://example.com/")...resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)...resp, err := http.PostForm("http://example.com/form", url.Values{"key":{"Value"}, "id":{"123"}})
客户端必须在结束时关闭响应体。
1234 ...
操作系统课程设计
文章中的代码我都放在了github上,有需要的可以自取 。记得点个star。
基础题目Shell编程编写shell脚本,该脚本接收两个参数,参数1作为要读写的文件,参数2作为标志位,标识是读还是写。功能完成对参数1所示文件的读写,该文件的内容为 “自己学号的后3位 MYFILE”。
这个比较简单,稍微了解一下shell编程和常用命令就能写出来,不多赘述。
12345678910111213141516171819# read_write.shfilename="$1"flag="$2"if [ "$flag" = 0 ]; then # 读取文件内容 content=$(cat "$filename") echo "文件内容:$content"elif [ "$flag" = 1 ]; then # 获取学号后3位 student_id="21069100223" last_three_digits="${ ...
Linux下进程间通信
进程的地址空间是相互独立的,因此进程之间交互数据必须需要专门的通信机制。
概述Linux下的主要IPC手段:
管道pipe。数据只能单方面流通, 只能在父子进程间进行。
有名管道named pipe。半双工通信方式,可用于非父子进程通信。
信号量semophore 进程间或不同进程间的同步手段。
消息队列message queue。消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息量少,管道只能承载无格式字节流以及缓冲区大小受限的缺点。
信号signal
共享内存shared memory。 映射一段能被其他进程访问的内存。共享内存能被一个进程创建但是被多个进程访问。
套接字socket。 可用于不同机器间的通信。
管道管道是一个特殊的文件,这个文件只存在与内存中。创建管道时,系统为管道分配一个页面作为数据缓冲区,进行管道通信的两个进程通过读写这个缓冲区来实现通信。
dup与dup2在子进程调用exec函数执行另外一个程序时,可以将子进程的文件描述符重定向到标准输入,新执行的程序能够从标准输入获取数据,实际上是从父进程获取输入数据。
12345# ...